cron で実行した場合、マウントとアンマウントの動作が異なります

cron で実行した場合、マウントとアンマウントの動作が異なります

AWS で CentOS 6 を実行していますが、表示される内容に困惑しています。

s3fsマウントがあり/etc/fstab、そこからの読み取りと書き込みができなくなることがあります。私は数か月間問題なく動作していた cron ジョブを持っています。これは、マウントが正常かどうかを 1 分ごとにテストし、接続が失われた場合は共有するだけですumountmountマウントは、負荷がかかっているときよりも、負荷がかかっていないときに頻繁に失われる傾向があったため、これは優れたソリューションでした。

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

cronファイルは次のようになります。

* * * * * root /usr/bin/sudo /root/check_mount.sh

環境に影響を与える可能性があると思ったので、sudo ありとなしで試してみました。

スクリプトのさまざまなバリエーションを試しましたが、これらのコマンドのほとんどは、ある時点で使用されていました。どのタイプを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が、これを方程式から削除したいと考えました。同じ問題が発生していました。

答え1

これが私の完全な解決策です:

まず、audit.log を視覚的に監査しました。適切なものだけをキャッチするために、audit2allowポリシーとタイプ適用ルールを作成しました。

grep mount /var/log/audit/audit.log | audit2allow -R -M mounts3fs

mount を grep すると、正しいものだけが取得されます。

これにより、マウント3fs.ppそしてマウント3fs.teファイル。マウント3fs.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まだ地獄に直行できる。

関連情報