mount e umount se comportando de maneira diferente quando executado no cron

5

Rodando o CentOS 6 na AWS, e o que estou vendo está me desconcertando.

Existe uma s3fs mount em /etc/fstab que, por vezes, perde a capacidade de ler e escrever. Eu tenho um cron job que funcionou muito bem por meses, que simplesmente testava que a montagem era boa a cada minuto, e se alguma vez perdesse a conexão, seria apenas umount e mount do compartilhamento. A montagem tendia a desaparecer com mais frequência, sem carga, depois sob carga real, por isso esta era uma ótima solução.

Por algum motivo, isso parou de funcionar e agora as máquinas não conseguem ler / gravar no compartilhamento, pois a primeira coisa que as máquinas fazem na inicialização após o provisionamento é umount e mount do compartilhamento.

Agora, o erro que recebo ao tentar ler é este:

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

No /var/log/messages , vejo isto:

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

Agora, quando executo exatamente o mesmo script no console como root, ele simplesmente funciona perfeitamente. Desmontar e montar o inversor e deixá-lo em funcionamento.

Meu primeiro palpite foi que algo no ambiente estava causando a diferença, então adicionei um source /root/.bash_profile ao meu script, sem sucesso.

A linha em / etc / fstab é um monstro, mas é o que descobrimos que funciona melhor depois de muitas tentativas de ajuste:

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

É assim que o cronfile se parece:

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

Eu tentei com e sem o sudo, pois achei que poderia afetar o ambiente.

Eu tentei muitas variações do script, mas a maioria desses comandos foi usada em um ponto ou outro. O mesmo problema surge independentemente do tipo de umount que eu faço.

\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

Esse script estava inicialmente em python , com as peças principais apenas gastando para os.system , mas eu queria remover isso da equação. Estava dando os mesmos problemas.

    
por Joshua Grigonis 08.06.2018 / 06:32

1 resposta

4

Aqui está minha solução completa:

Primeiro, auditei visualmente o audit.log. Para capturar as coisas certas e apenas as coisas certas, usei audit2allow para criar uma regra de imposição de política e tipo.

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

Eu peço para montar, então eu só entendi as coisas certas.

Isso criou um arquivo mounts3fs.pp e mounts3fs.te . O mounts3fs.te se parece com isso:

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 a política, eu corro isto:

semodule -i mounts3fs.pp

Descobri que não era suficiente para determinadas operações, por isso criei uma política adicional como esta:

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 ainda pode ir direto para o inferno.

    
por 08.06.2018 / 20:07