Como posso criar uma regra do udev para montar uma unidade USB somente para leitura?

6

Estou tentando definir uma unidade USB específica para sempre montar somente leitura. Se eu conectá-lo, ele será visto como sdb com uma única partição, sdb1 . Aqui estão algumas linhas relevantes de udevadm (não a saída inteira, é claro):

$ udevadm info -a -n /dev/sdb1
  looking at device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4/2-1.4:1.0/host21/target21:0:0/21:0:0:0/block/sdb/sdb1':
    KERNEL=="sdb1"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{ro}=="0"
    ATTR{size}=="976768002"
    ATTR{stat}=="     473    30586    33938     3460        5        0       40     1624        0     2268     5084"
    ATTR{partition}=="1"

OK, escrevi a seguinte regra udev e a salvei como /etc/udev/rules.d/10-usbdisk.rules :

SUBSYSTEM=="block",
ATTR{size}=="976768002",
MODE="0555"

De acordo com isso , usar size deve ser suficiente, mas eu também tentei outras permutações. Em qualquer caso, a regra parece ser lida (novamente, linhas de saída selecionadas, você pode ver toda a saída aqui :

$ udevadm test $(udevadm info -q path -n /dev/sdb1) 2>&1
[...]
read rules file: /etc/udev/rules.d/10-usbdisk.rules
[...]
MODE 0555 /etc/udev/rules.d/10-usbdisk.rules:4

Então, parece que a regra seja aplicada e parece que a MODE="0555" seja a sintaxe correta. No entanto, quando eu realmente conecto o disco, posso criar / excluir arquivos nele.

SO: teste Debian (LMDE)

Então, o que estou fazendo de errado? Como posso montar uma unidade USB específica como somente leitura automaticamente usando o udev 1 ?

1 Eu sei como fazer isso com o fstab, mas as configurações do fstab são ignoradas pelo gvfs. Meu objetivo é que isso seja montado automaticamente como somente leitura na GUI. Presumivelmente isso terá que ser feito via udev ou gvfs de alguma forma.

    
por terdon 15.03.2014 / 18:08

3 respostas

8

Ok, o resumo é que o Nautilus usa o GVFS e você precisa dizer ao udev para usar o GVFS também ao ler as entradas do fstab, você pode fazer isso usando:

/dev/block-device /mount/point auto x-gvfs-show,ro 0 0

x-gvfs-show dirá ao udev e a qualquer pessoa interessada em usar o auxiliar GVFS para montar o sistema de arquivos, então o gvfs tem todo o controle de montagem, desmontagem, movimentação de pontos de montagem, etc.

Vamos ver se entendemos como as unidades são montadas em sistemas Linux modernos com GUIs (especificamente o Nautilus):

O Nautilus usa o GVFS como backend para montar FTP, SMB, dispositivos de bloco, entre outras coisas, no sistema de arquivos. A ferramenta que o GNOME projetou para tais propostas é chamada de Discos, é aquela que modifica o comportamento do GVFS. Agora vem a diversão.

O Nautilus ignora qualquer coisa que não tenha sido montado usando o GVFS (como usar fstab) e lhe dá um controle muito rudimentar sobre isso usando o udev (o Nautilus não pede ao GVFS para desmontar ou montar dispositivos que não foram manipulados usando o GVFS, inclui udev, fstab, mount e qualquer outro blob), como apenas desmontar e montar. Usando as permissões e opções armazenadas no fstab / udev, você pode usar esses sistemas de arquivos de acordo, mas não pode modificar o comportamento usando o GVFS. Se algo foi montado usando sudo mount -o rw /dev/sda3 , o nautilus diz ao udev que ele não tem permissões para modificar o ponto de montagem, portanto, ele passa a responsabilidade para o udev, que por sua vez solicita permissões ao polkit. Se você usou o GVFS, o próprio nautilus desmonta o dispositivo sem permissões, nem diálogos, etc.

    
por 15.03.2014 / 20:13
2

Acho que o problema é SUBSYSTEM , você deve alterá-lo para usb em vez de block . Eu adiciono essa linha à minha regra e isso funciona para mim:

SUBSYSTEMS="usb", ENV{ID_FS_USAGE}=="filesystem", ENV{UDISKS_MOUNT_OPTIONS}="ro"
    
por 15.03.2014 / 19:46
2

Você pode tornar um dispositivo de bloco somente leitura com

blockdev --setro /dev/sdb1

Você pode fazer o udev executar este comando (IIRC RUN= ).

    
por 15.03.2014 / 19:47