5 votos

mount y umount comportándose de manera diferente cuando se ejecuta bajo cron

Corriendo CentOS 6 en AWS, y lo que estoy viendo, es desconcertante para mí.

Hay un s3fs monte en /etc/fstab que a veces pierde su capacidad de leer y escribir. Tengo un cron job que funcionó muy bien durante meses, que sería simplemente una prueba de que el monte era bueno cada minuto, y si se pierde la conexión, simplemente umount y mount la cuota. El monte tienden a desaparecer más a menudo bajo ninguna carga, entonces bajo carga real, así que esto fue una gran solución.

Por alguna razón, este dejó de funcionar, y ahora las máquinas vienen incapaz de leer/escribir desde el compartir, como la primera cosa que las máquinas de hacer en el momento del arranque después de aprovisionamiento umount y mount la cuota.

Ahora el error al intentar leer es este:

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

En la /var/log/messages veo esto:

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

Ahora, cuando me encuentro con la misma secuencia de comandos en la consola como root, simplemente funciona a la perfección. Desmontaje y montaje de la unidad y lo deja en un estado de trabajo.

Mi primera suposición era que algo en el medio ambiente fue el causante de la diferencia, así que he añadido un source /root/.bash_profile a mi script, fue en vano.

La línea en /etc/fstab es un monstruo, pero esto es lo que hemos encontrado que funciona mejor después de muchos intentos de puesta a punto:

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

Esto es lo que el cronfile parece:

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

He probado con y sin el sudo, como yo creía que pueden afectar el medio ambiente.

He intentado muchas variaciones de la secuencia de comandos, pero la mayoría de estos comandos se utilizan en un momento u otro. El mismo problema surge independientemente de qué tipo de umount hago.

\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

Este script fue inicialmente en python, con las piezas clave sólo los bombardeos a cabo a os.system, pero quería quitar que a partir de la ecuación. Se estaba dando los mismos problemas.

4voto

Joshua Grigonis Puntos 156

Aquí está mi solución completa:

En primer lugar me visualmente auditados de la auditoría.registro. Para coger el derecho de las cosas y sólo las cosas bien, yo solía audit2allow crear una política y un tipo de aplicación de la regla.

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

Yo grep para el montaje de modo que sólo recibe el derecho de las cosas.

Esto creó un mounts3fs.pp y mounts3fs.te archivo. El mounts3fs.te parece a esto:

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;

Para instalar la política, me encuentro con esto:

semodule -i mounts3fs.pp

Me pareció que no era suficiente para determinadas operaciones, por lo que he creado una política adicional como este:

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 todavía se puede ir directamente al infierno.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: