AWSでCentOS6を実行していると、私は困惑しています。
s3fs
には/etc/fstab
マウントがあり、読み取りと書き込みの機能が失われることがあります。私は何ヶ月もうまく機能したcronジョブを持っています。それは、マウントが毎分良好であることをテストするだけで、接続が失われた場合は、共有をumount
とmount
だけにします。マウントは無負荷で、次に実際の負荷で消える傾向があったので、これは素晴らしい解決策でした。
何らかの理由でこれが機能しなくなり、プロビジョニング後にマシンが起動時に最初に行うことはumount
とmount
であるため、マシンは共有から読み取り/書き込みできなくなります。
今、私が読み込もうとしたときに私が得るエラーはこれです:
cp: cannot open `/app/canary.txt' for reading: Input/output error
/var/log/messages
で私はこれを見ます:
kernel: s3fs[3077]: segfault at e66000 ip 00007f833663d94e sp 00007ffc849c5b18
error 4 in libc-2.12.so[7f83365b4000+18a000]
これで、コンソールでrootとまったく同じスクリプトを実行すると、完全に機能します。ドライブをアンマウントおよびマウントし、動作状態のままにします。
私の最初の推測では、環境内の何かが違いを引き起こしていると思ったので、スクリプトにsource /root/.bash_profile
を追加しましたが無駄でした。
/ etc/fstabの行は怪物ですが、これは、微調整を何度も試みた後、最も効果的に機能することがわかったものです。
ourbucket /app Fuse.s3fs _netdev,allow_other,endpoint=us-west-2,url=https://s3-us-west-2.amazonaws.com,use_path_request_style,use_sse,gid=1001,umask=0007,use_cache=/srv/s3fs,retries=20,parallel_count=30,connect_timeout=30,readwrite_timeout=60,stat_cache_expire=86400,max_stat_cache_size=100000 0 0
Cronfileは次のようになります。
* * * * * root /usr/bin/Sudo /root/check_mount.sh
環境に影響を与えるのではないかと思ったので、須藤の有無で試してみました。
スクリプトのさまざまなバリエーションを試しましたが、これらのコマンドのほとんどは、ある時点または別の時点で使用されていました。 umount
のタイプに関係なく、同じ問題が発生します。
\cp /app/canary.txt /tmp/canary.txt
retVal=$?
sleep 1
if [ ${retVal} -ne 0 ]; then
echo "Copy failed, trying to umount"
umount /app
echo "umount returned $?"
sleep 1
echo "Trying umount -f"
umount -f /app
echo "umount -f returned $?"
sleep 1
echo "Trying fusermount -u"
/usr/local/bin/fusermount -u /app
echo "fusermount returned $?"
sleep 1
echo "Trying to mount"
mount /app
echo "mount returned $?"
sleep 1
echo "Trying copy after mount"
\cp /app/canary.txt /tmp/canary.txt
fi
このスクリプトは最初はpython
にあり、キー部分はos.system
にシェルアウトされていましたが、方程式から削除したかったのです。それは同じ問題を与えていました。
これが私の完全な解決策です:
まず、audit.logを視覚的に監査しました。適切なものだけをキャッチするために、私はaudit2allow
を使用してポリシーとタイプ施行ルールを作成しました。
grep mount /var/log/audit/audit.log | audit2allow -R -M mounts3fs
私はマウントをgrepするので、正しいものだけを取得します。
これにより、mounts3fs.ppおよびmounts3fs.teファイルが作成されました。 mounts3fs.teは次のようになります。
policy_module(mounts3fs, 1.0)
require {
type file_t;
type var_t;
type mount_t;
type cert_t;
class dir { write remove_name add_name };
class file { create unlink link setattr };
}
#============= mount_t ==============
#!!!! The source type 'mount_t' can write to a 'dir' of the following types:
# user_home_t, etc_runtime_t, var_run_t, mount_var_run_t, mount_tmp_t, user_home_dir_t, etc_t, nfs_t, tmpfs_t, tmp_t, var_t
allow mount_t cert_t:dir { write remove_name add_name };
allow mount_t cert_t:file { create unlink };
allow mount_t file_t:dir { remove_name add_name };
allow mount_t file_t:file { unlink link setattr };
allow mount_t var_t:file link;
ポリシーをインストールするには、次のコマンドを実行します。
semodule -i mounts3fs.pp
特定の操作にはそれだけでは不十分であることがわかったため、次のような追加のポリシーを作成しました。
module s3fs 1.0;
require {
type file_t;
type mount_t;
class dir create;
class file create;
}
#============= mount_t ==============
#!!!! This avc is allowed in the current policy
allow mount_t file_t:dir create;
allow mount_t file_t:file create;
selinux
はまだ地獄に直行できます。