mount und umount verhalten sich anders, wenn sie unter cron laufen

595
Joshua Grigonis

CentOS 6 in AWS laufen zu lassen, und was ich sehe, verwirrt mich.

Es gibt ein s3fsReittier /etc/fstab, das manchmal seine Fähigkeit zum Lesen und Schreiben verliert. Ich habe einen Cron-Job, der monatelang gut funktioniert hat, der einfach testen würde, dass das Reittier jede Minute gut ist, und wenn es jemals die Verbindung verloren hat, würde es einfach umountund mountder Anteil. Die Halterung neigte sich dazu, häufiger unter Nulllast zu verschwinden, als unter tatsächlicher Last. Dies war also eine großartige Lösung.

Aus irgendeinem Grund funktionierte das nicht mehr, und nun kommen Maschinen nicht mehr in der Lage, aus der Freigabe zu lesen / schreiben. Als erstes tun die Maschinen beim Booten nach der Bereitstellung umountund mountder Freigabe.

Nun ist der Fehler, den ich bekomme, wenn ich versuche zu lesen:

cp: cannot open `/app/canary.txt' for reading: Input/output error 

Im /var/log/messagessehe ich das:

kernel: s3fs[3077]: segfault at e66000 ip 00007f833663d94e sp 00007ffc849c5b18 error 4 in libc-2.12.so[7f83365b4000+18a000] 

Wenn ich jetzt dasselbe Skript in der Konsole als root ausführte, funktioniert es einfach perfekt. Demontieren und montieren Sie das Laufwerk und lassen Sie es in einem Arbeitszustand.

Meine erste Vermutung war, dass etwas in der Umgebung den Unterschied auslöste, also fügte ich source /root/.bash_profilemeinem Skript eine hinzu, ohne Erfolg.

Die Zeile in / etc / fstab ist ein Monster, aber nach vielen Versuchen der Feinabstimmung haben wir festgestellt, dass dies am besten funktioniert:

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 

So sieht die Cron-Datei aus:

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

Ich habe es mit und ohne Sudo ausprobiert, da ich dachte, es könnte die Umwelt beeinflussen.

Ich habe viele Variationen des Skripts ausprobiert, aber die meisten dieser Befehle wurden an der einen oder anderen Stelle verwendet. Das gleiche Problem tritt auf, unabhängig davon, welche Art umountich mache.

\cp /app/canary.txt /tmp/canary.txt retVal=$? sleep 1 if [ $ -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 

Dieses Skript war anfangs in python, mit den Schlüsselstücken, die gerade herausgingen os.system, aber ich wollte das aus der Gleichung entfernen. Es gab die gleichen Probleme.

5
"Das Mount neigte dazu, unter Leerlauf häufiger wegzugehen als unter tatsächlicher Last" - Ich denke, "autofs" könnte Ihr Skript ersetzen; Ich kann jedoch nicht sagen, ob es Ihr Problem löst. Ich schreibe dies nur, um Sie wissen zu lassen, dass ein solches Tool existiert. Vielleicht finden Sie es nützlich. Kamil Maciorowski vor 6 Jahren 0

1 Antwort auf die Frage

4
Joshua Grigonis

Hier ist meine komplette Lösung:

Zuerst habe ich das audit.log visuell geprüft. Um die richtigen Dinge und nur die richtigen zu erfassen, habe ich audit2alloweine Richtlinie und eine Durchsetzungsregel erstellt.

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

Ich grep zum Mount und bekomme nur die richtigen Dinge.

Dadurch wurde eine Datei mounts3fs.pp und mounts3fs.te erstellt. Die mounts3fs.te sieht so aus:

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; 

Zur Installation der Richtlinie führe ich Folgendes aus:

semodule -i mounts3fs.pp 

Ich habe festgestellt, dass dies für bestimmte Vorgänge nicht völlig ausreichend ist. Daher habe ich eine zusätzliche Richtlinie wie diese erstellt:

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 kann immer noch direkt zur Hölle gehen.

Ich werde eine vollständige Lösung posten, sobald ich sie habe. Im Grunde blockiert `selinux 'das Lesen / Schreiben auf dem gemounteten Volume. Joshua Grigonis vor 6 Jahren 2