Por que meu dispositivo montado no udev não fica parado?

4

Eu tenho um computador rodando o CentOS 7. Estou tentando configurar uma regra do udev para montar automaticamente uma unidade USB (chamada 'sdb1') para / mnt / flash sempre que estiver conectada.

O script do udev não estava funcionando (veja abaixo), então eu coloquei meus comandos em um script bash e fiz o udev executar o script bash para que eu pudesse ver o que estava acontecendo.

Problema # 1: Se eu tentar criar diretamente / mnt / flash a partir do meu script bash, ele falhará devido ao sistema de arquivos raiz ser somente leitura. Eu posso confirmar que o sistema de arquivos raiz NÃO é somente leitura. Meu sistema já está inicializado. No entanto, se eu inserir minha unidade USB, deixe o udev executar meu script, com certeza quando eu executo 'mount | logger 'no meu script mostra que root é somente leitura.

Eu trabalhei em torno dessa questão executando 'mount -o remount, rw /' no topo do meu script.

Problema # 2: Eu sou capaz de criar / mnt / flash e montar / dev / sdb1 para / mnt / flash com sucesso. Eu corro 'montar | logger 'depois de fazer isso e vê-lo montado em / var / log / messages. No entanto, quando tudo estiver dito e feito, / dev / sdb1 não está montado. Eu até coloquei um atraso de 5 segundos no meu script e rodei 'mount | logger 'uma segunda vez. Ambas as horas mostram que / dev / sdb1 está montado em / mnt / flash. No entanto, se eu executar 'mount' a partir de um terminal diferente enquanto tudo isso está acontecendo, nunca vejo / dev / sdb1 montado em qualquer lugar.

Estou ficando louco ou o udev está fazendo coisas estranhas nos sistemas de arquivos enquanto roda?

script udev: /etc/udev/rules.d/99-usb-automount.rules

#Only operate on sdb1
KERNEL!="sdb1", GOTO="usb-automount-end"
ACTION=="add", PROGRAM!="/sbin/blkid %N", GOTO="usb-automount-end"

#import useful variables from blkid program
IMPORT{program}="/sbin/blkid -o udev -p %N"

#ignore anything other than vfat filesystems
ACTION=="add", ENV{ID_FS_TYPE}!="vfat", GOTO="usb-automount-end"

#remount root as read-write.  Not sure why we have to do this!
#ACTION=="add", RUN+="/bin/mount -o remount,rw /"

#mount to /mnt/flash
#ACTION=="add", RUN+="/bin/mkdir -p /mnt/flash"
#ACTION=="add", RUN+="/bin/mount -t vfat -o dmask=000,fmask=111 /dev/%k /mnt/flash"
ACTION=="add", RUN+="/root/test_run.sh", OPTIONS="last_rule"

#clean up after removal
#ACTION=="remove", RUN+="/bin/umount -l /mnt/flash"

#label for goto end
LABEL="usb-automount-end"

Aqui está /root/test_run.sh:

#!/bin/bash -x
logger "running mount"
mount | logger
logger "remounting root"
mount -o remount,rw /  2>&1 | logger
logger "remount done"
mount | logger
logger "Running script.  Adding dir"
mkdir -p /mnt/flash2 2>&1 | logger
logger "Directory added... mounting."
mount -t vfat -o dmask=000,fmask=111 /dev/sdb1 /mnt/flash2 2>&1 | logger
logger "Mounted"
mount | logger

logger "Sleeping 5 then re-checking"
sleep 5

mount | logger

Editar 1: Desabilitando o problema fixo do SELinux # 1. No entanto, ainda não consigo fazer o / dev / sdb1 ficar montado após o udev. Ainda parece haver quase uma segunda tabela de montagem que é mantida dentro do contexto do udev.

    
por KyleL 24.05.2016 / 21:31

1 resposta

3

O problema # 1 foi causado pelo SELinux. Como não preciso disso para esse sistema, simplesmente o desativei.

O problema # 2 foi causado por uma configuração do udev (especificada no script systemd) que faz com que o namespace do udev mantenha uma cópia 'escrava' dos sinalizadores de montagem. Mudar isso para 'compartilhado' resolveu o problema. Veja uma resposta mais detalhada aqui: link

    
por 07.06.2016 / 15:34