Estou executando o Debian Squeeze em um computador com plug-in (apenas SSH, sem GUI) e o que estou tentando fazer é obtê-lo para que, quando um pendrive USB for conectado, ele seja montado automaticamente.
O que eu fiz foi instalar autofs
e, pelo que eu coleciono, lida com a montagem automática, desde que ele saiba onde o dispositivo está /dev
.
O problema é que o pen drive nem sempre tem o mesmo nome de dispositivo. Às vezes é /dev/sdc1
, às vezes /dev/sdd1
, etc.
Entendo que, para remediar isso, preciso usar udev
para garantir que o pendrive sempre tenha o mesmo nome.
Obtive as seguintes informações de udevadm
:
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device '/block/sdd/sdd1':
KERNEL=="sdd1"
SUBSYSTEM=="block"
DRIVER==""
ATTR{partition}=="1"
ATTR{start}=="63"
ATTR{size}=="129339"
ATTR{ro}=="0"
ATTR{alignment_offset}=="0"
ATTR{discard_alignment}=="0"
ATTR{stat}==" 31 244 275 190 0 0 0 0 0 190 190"
ATTR{inflight}==" 0 0"
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/host8/target8:0:0/8:0:0:0/block/sdd':
KERNELS=="sdd"
SUBSYSTEMS=="block"
DRIVERS==""
ATTRS{range}=="16"
ATTRS{ext_range}=="256"
ATTRS{removable}=="1"
ATTRS{ro}=="0"
ATTRS{size}=="129439"
ATTRS{alignment_offset}=="0"
ATTRS{discard_alignment}=="0"
ATTRS{capability}=="51"
ATTRS{stat}==" 56 727 783 520 0 0 0 0 0 520 520"
ATTRS{inflight}==" 0 0"
ATTRS{events}=="media_change"
ATTRS{events_async}==""
ATTRS{events_poll_msecs}=="-1"
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/host8/target8:0:0/8:0:0:0':
KERNELS=="8:0:0:0"
SUBSYSTEMS=="scsi"
DRIVERS=="sd"
ATTRS{device_blocked}=="0"
ATTRS{type}=="0"
ATTRS{scsi_level}=="3"
ATTRS{vendor}==" "
ATTRS{model}=="Flash Disk "
ATTRS{rev}=="2.00"
ATTRS{state}=="running"
ATTRS{timeout}=="30"
ATTRS{iocounterbits}=="32"
ATTRS{iorequest_cnt}=="0x90"
ATTRS{iodone_cnt}=="0x90"
ATTRS{ioerr_cnt}=="0x0"
ATTRS{modalias}=="scsi:t-0x00"
ATTRS{evt_media_change}=="0"
ATTRS{queue_depth}=="1"
ATTRS{queue_type}=="none"
ATTRS{max_sectors}=="240"
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/host8/target8:0:0':
KERNELS=="target8:0:0"
SUBSYSTEMS=="scsi"
DRIVERS==""
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/host8':
KERNELS=="host8"
SUBSYSTEMS=="scsi"
DRIVERS==""
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0':
KERNELS=="1-1.2:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="usb-storage"
ATTRS{bInterfaceNumber}=="00"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bNumEndpoints}=="02"
ATTRS{bInterfaceClass}=="08"
ATTRS{bInterfaceSubClass}=="06"
ATTRS{bInterfaceProtocol}=="50"
ATTRS{modalias}=="usb:v1976p6025d0100dc00dsc00dp00ic08isc06ip50"
ATTRS{supports_autosuspend}=="1"
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2':
KERNELS=="1-1.2"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="80"
ATTRS{bMaxPower}=="100mA"
ATTRS{urbnum}=="383"
ATTRS{idVendor}=="1976"
ATTRS{idProduct}=="6025"
ATTRS{bcdDevice}=="0100"
ATTRS{bDeviceClass}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="12"
ATTRS{busnum}=="1"
ATTRS{devnum}=="11"
ATTRS{devpath}=="1.2"
ATTRS{version}==" 1.10"
ATTRS{maxchild}=="0"
ATTRS{quirks}=="0x0"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{authorized}=="1"
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1':
KERNELS=="1-1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bMaxPower}=="100mA"
ATTRS{urbnum}=="197"
ATTRS{idVendor}=="1a40"
ATTRS{idProduct}=="0101"
ATTRS{bcdDevice}=="0111"
ATTRS{bDeviceClass}=="09"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="01"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="480"
ATTRS{busnum}=="1"
ATTRS{devnum}=="2"
ATTRS{devpath}=="1"
ATTRS{version}==" 2.00"
ATTRS{maxchild}=="4"
ATTRS{quirks}=="0x0"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{authorized}=="1"
ATTRS{product}=="USB 2.0 Hub"
looking at parent device '/devices/platform/orion-ehci.0/usb1':
KERNELS=="usb1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bMaxPower}==" 0mA"
ATTRS{urbnum}=="24"
ATTRS{idVendor}=="1d6b"
ATTRS{idProduct}=="0002"
ATTRS{bcdDevice}=="0206"
ATTRS{bDeviceClass}=="09"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="01"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="480"
ATTRS{busnum}=="1"
ATTRS{devnum}=="1"
ATTRS{devpath}=="0"
ATTRS{version}==" 2.00"
ATTRS{maxchild}=="1"
ATTRS{quirks}=="0x0"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="Linux 2.6.38.8 ehci_hcd"
ATTRS{product}=="Marvell Orion EHCI"
ATTRS{serial}=="orion-ehci.0"
ATTRS{authorized_default}=="1"
looking at parent device '/devices/platform/orion-ehci.0':
KERNELS=="orion-ehci.0"
SUBSYSTEMS=="platform"
DRIVERS=="orion-ehci"
ATTRS{modalias}=="platform:orion-ehci"
looking at parent device '/devices/platform':
KERNELS=="platform"
SUBSYSTEMS==""
DRIVERS==""
Eu tenho tentado escrever udev
regras para forçar o pendrive a usar o nome, /dev/usbstick
mas até agora não obtive sucesso.
Alguém pode ajudar com qual regra eu preciso especificar no meu arquivo de regras para obter esse pendrive sempre com o mesmo nome?
- Ou existe uma maneira muito mais fácil de montar automaticamente o pendrive que estou perdendo por completo?
ATUALIZAR
OK, então eu fiz alguns progressos. Eu adicionei a seguinte regra:
SUBSYSTEMS=="scsi", ATTRS{model}=="Flash Disk ", DRIVERS=="sd", NAME="usbstick-%k" RUN+="mkdir /mnt/usbstick-%k; mount /dev/usbstick-%k /mnt/usbstick-%k"
Eu sei que isso ainda precisa de algum trabalho em termos de manipulação de adicionar / remover, mas é apenas um teste básico por enquanto.
O efeito disso é que agora consigo obter três novos nós de dispositivo /dev
, a saber /dev/usbstick-sdc
, /dev/usbstick-sdc1
e usbstick-sg2
.
No entanto, o que descobri é que o código na RUN
seção é executado apenas uma vez e cria um diretório mnt/usbstick-sdc
. Também descobri que o diretório está sempre vazio, então algo claramente ainda está errado! (embora eu esteja fazendo progresso).
/dev/sdc1
deveria sersdd1
? E você pode usarblkid
para identificar exclusivamente a unidade (bem, na verdade a partição; ela mudará se você reformatar).udev
regra para criar nós de dispositivo para cada partição, mas não sei em que nível deudevadm
saída estar criando regras!ACTION==
, umKERNEL==
e umATTRS{something}==
(é completamente factível - é isso que eu uso). Além disso, considere executar um único script instaurado da cadeia de comandos noRUN+=
.KERNEL=="sd??", NAME="%k", RUN+="mkdir /mnt/usbstick-%k; mount /dev/usbstick-%k /mnt/usbstick-%k"
- mas não, é claro que isso também não funciona. Agora estou ficando cada vez mais frustrado depois de passar quase o dia inteiro simplesmente tentando descobrir como obter um pendrive USB conectado para se montar. As coisas realmente deveriam ser tão difíceis? A saída deudevadm test /sys/block/sdd
é - é claro - praticamente ilegível, então não tenho como saber onde estou errado. Alguém pode me apontar a direção certa sobre isso?Respostas:
Imaginei que deveria haver uma maneira muito mais fácil de resolver um problema tão comum, e existe. Aqui está o que eu tentei no meu servidor wheezy / sid:
Conecte o pendrive, pronto! Agora, meu stick está acessível
/media/usb
.Btw, usbmount não tem uma página de manual, por favor leia
/usr/share/doc/usbmount/README.gz
. Parece que o usbmount monta seu stick com a opção de sincronização por padrão. Pode ser muito melhor para o seu stick montá-lo assíncrono e executarsync
ouumount
antes de desconectá-lo. Isso é configurável.fonte
pumount
usbmount
não é mais compatível com NTFS desde o debian jessie: bugs.debian.org/774149Observe que você não pode apenas ter um nó de dispositivo único para representar qualquer pendrive possível conectado. E se você conectar dois deles? Ou quando o pendrive possui mais de uma partição?
Geralmente, o que você usa para criar um nó de dispositivo com nome personalizado é
SYMLINK+=
. grep para isso nas regras para ver como ele é usado:grep SYMLINK /etc/udev/rules.d/*
. Como em todos os comandos acionados pelo udev, você pode usar algumas variáveis significativas descritas emman udev
. Você pode perceber que realmente não precisa atribuir um nome personalizado ao dispositivo, pois é possível alimentar o nome para um script (por meio da%k
variável).Quanto à solução de montagem automática, dê uma olhada no UAM , que descrevi um pouco na resposta a esta pergunta .
fonte
udev
regras com os scripts que o acompanham. Você pode dar uma olhada nas regras e adaptá-las facilmente às suas necessidades.udevadm
e me dizer qual dispositivo é o dispositivo que eu realmente deveria ter como alvo com a minha regra? Os vários exemplos que eu vi on-line parecem envolver árvores muito mais curtas e cada exemplo parece direcionar para um nível diferente de dispositivo, sem explicação de qual deles deve ser direcionado e por quê.Aqui está como eu fiz recentemente, e estou muito feliz com essa abordagem agora. Isto é para o Ubuntu 12.04 + Gentoo, mas acho que qualquer distro, que permita a instalação do udev e do autofs, deve funcionar.
Pré-requisitos: Você deve ter instalado o udev + autofs.
Passo 1)
Crie o seguinte arquivo "/etc/udev/rules.d/90-usbsd-auto.rules" (é claro que você pode usar qualquer nome desde que termine com ".rules"). :
O que isso faz: Ele cria dois links simbólicos, um para a partição do dispositivo de armazenamento USB em "/ dev / usbdisks / <...>".
O segundo link simbólico será vinculado de "/ media / usb / <...>" para "/ media / autousb / <...>", isto é feito para suporte ao montador automático (consulte a etapa 2).
Para garantir que o udev leia essas regras, use
Nota: Mesmo nome para o mesmo pendrive: Possível, mas talvez perigoso: Você pode usar, por exemplo, "$ env {ID_FS_LABEL_ENC}", em vez de "% k" nas regras UDEV acima. Isso usará o rótulo de volume para criar / media / usb / <...>, mas o que acontece se você conectar dois pen drives e os dois usarem o mesmo rótulo de volume ...
Com esse arquivo de regras do udev, tudo está configurado para montar automaticamente a partição do dispositivo de armazenamento USB. Observe que, no momento, o dispositivo NÃO será montado automaticamente (intencionalmente). Ele será montado automaticamente quando você o usar com
Passo 2)
Configurar autofs para automount / media / autousb / <...>: Adicionei a seguinte linha ao meu arquivo "/etc/auto.master" (para Ubuntu 12.04):
Isso significa que o AutoFS desmontará o dispositivo após 60 segundos de inatividade. Você pode querer usar menos ou mais, dependendo do seu gosto.
Para o Gentoo, você precisa modificar "/etc/autofs/auto.master" para que faça sentido usar
Agora eu criei "auto.usb" com o seguinte conteúdo:
Esse auto.usb precisa ser executável, para que o autofs use isso como um script (bash). Então por exemplo
O que isso faz: Este script informará ao AutoFS (/ usr / sbin / automount) como montar a partição do dispositivo de armazenamento usb.
O script primeiro usará "/ sbin / blkid" para descobrir que tipo de sistema de arquivos está na partição.
O script fornecerá as opções corretas de montagem, dependendo da partição do dispositivo.
Nota: Incluí código de amostra para os sistemas de arquivos "vfat" (provavelmente o mais comum para pendrives), "ntfs" e "ext4". Obviamente, é muito fácil estender isso para suportar mais sistemas de arquivos.
Etapa 3)
Opcional ... Para "ejetar" == desmontar seu (s) pendrive (s) (ou partições no seu pendrive), crie um script em / sbin / usbeject:
Com esse script, você pode usar "sudo usbeject" para desmontar todas as partições de dispositivos USB montadas (dizendo ao automount para desmontá-las).
Claro que você pode simplesmente garantir que a partição não seja usada em nenhum lugar; o montador automático desmontará a partição após o tempo limite de 60 segundos ...
O verdadeiro truque aqui é usar links simbólicos de "/ media / usb" para "/ media / autousb":
fonte
Desculpe responder à minha própria pergunta, e muito obrigado a rozcietrzewiacz por contribuir, mas finalmente consegui fazer alguns progressos importantes usando a seguinte regra após horas lendo online:
SUBSYSTEMS=="scsi", KERNEL=="sd[a-h]1", SYMLINK+="removable", RUN+="/bin/mount /dev/removable /path/to/mount"
Isso montará a primeira partição de qualquer dispositivo SCSI. Acho que a próxima pergunta será como montar várias partições, mas isso é outro problema para outro dia.
fonte
removable
atributo que você deve testar e, emblock
vez descsi
.Descobri que a melhor resposta ficou obsoleta, pois não é mantida e não funciona de / para Jessie (veja o comentário de malat)
Para mim (na Jessie), a solução neste blog funcionou como um encanto.
Créditos para "ddumont", mas postando uma visão geral de seu blog / resposta aqui, para lidar com possíveis rot pods no futuro.
Adicione a seguinte linha ao
/etc/fstab
Você pode fazer isso usando o nano:
Explicação:
/dev/sr0
é o arquivo do dispositivo. Você também pode usar um dos links simbólicos configurados pelo udev em / dev / disk / by-id. Você precisará alterar isso de acordo com o arquivo do seu dispositivo (sudo fdisk -l
para listar dispositivos)/media/bluray
é o ponto de montagem. Você pode escolher outro ponto de montagemnofail
é necessário para evitar o relatório de falha ao inicializar sem um disco na unidade ópticax-systemd.automount
é a opção de configurar o systemd para montar automaticamente o disco inseridoNão especifique noauto: isso impediria que o systemd monte automaticamente um disco, o que anula o objetivo.
Teste
Execute o comando
journalctl -x -f
em um terminal para verificar o que está acontecendo com o systemdRecarregue a configuração do systemd com
sudo systemctl daemon-reload
.coloque um disco na sua unidade óptica
Em seguida, o journalctl deve mostrar algo como:
Mais longe
Para montar com sucesso unidades NTFS, tive que instalar o ntfs-3g (ntfsprogs antigos)
Não precisei instalar o hfsprogs para que um usb formatado em OSX funcionasse, mas você deve verificar isso sozinho.
fonte