Essa pergunta é semelhante, mas meio oposta ao que eu quero. Eu quero que unidades USB externas sejam montadas automaticamente na inicialização, sem ninguém conectado, em locais como /media/<label>
.
Não quero inserir todos os dados no fstab, em parte porque é tedioso e irritante, mas principalmente porque não posso prever o que vou conectar nele ou como as partições mudarão no futuro.
Desejo que as unidades estejam acessíveis para coisas como MPD e estejam disponíveis quando eu fizer login com SSH. gnome-mount
parece montar coisas apenas quando você está logado localmente em uma sessão gráfica do Gnome.
linux
ubuntu
usb-flash-drive
external-hard-drive
mount
endólito
fonte
fonte
/usr/local/sbin/udev-automounter.sh mount %k
deveria ser/usr/local/sbin/udev-automounter.sh %k
. desculpa.\x20
's. então não é bonito, mas vai funcionar. O udev não está lidando bem com os rótulos com espaços, mas há outra opção que usa sublinhados em vez dos\x20
'(portanto, pelo menos, parece bom). parece que a manipulação de espaço precisa ser inserida nos scripts de shell.Respostas:
vol_id
comando obsoleto .vol_id
foi substituído porblkid
. Para corrigir o script, substitua "vol_id" por "blkid -o udev" noudev-auto-mount.sh
script.Eu já estou pensando nisso há um tempo e acho que encontrei uma solução funcional. Ele foi desenvolvido e testado em um sistema baseado no Debian, portanto, deve funcionar no Ubuntu. Apontarei as suposições que ele faz para que também possa ser adaptado a outros sistemas.
/media/LABEL
diretório para montar o dispositivo.gksudo
ou semelhante.Não testei isso na inicialização do sistema, mas a única razão pela qual vejo que ele pode não funcionar é se ele tentar montar a unidade USB antes que o sistema esteja pronto para montagem. Se for esse o caso, você provavelmente precisará de um ajuste adicional no script de montagem. (Estou verificando com ServerFault para ver se há algum conselho, mas não há muito interesse nele por lá.)
Vamos lá, então.
Referências UDEV:
Antecedentes (UDEV? Whuzzat?)
UDEV é o sistema de hotplug do kernel. É o que configura automaticamente os dispositivos e links simbólicos adequados (por exemplo
/dev/disk/by-label/<LABEL>
), tanto no momento da inicialização quanto para os dispositivos adicionados enquanto o sistema está em execução.D-Bus e HAL são usados para enviar eventos de hardware para ouvintes como ambientes de desktop. Portanto, quando você faz login no GNOME e insere um CD ou conecta uma unidade USB, esse evento segue esta cadeia:
E pronto, sua unidade é montada. Mas em um sistema sem cabeça, não queremos fazer login para obter os benefícios da montagem automática.
Regras do Udev
Como o UDEV nos permite escrever regras e executar programas na inserção de dispositivos, essa é a escolha ideal. Vamos tirar proveito das regras existentes do Debian / Ubuntu, deixá-las configurar o
/dev/disk/by-label/<LABEL>
link simbólico para nós e adicionar outra regra que montará o dispositivo para nós.As regras da UDEV são mantidas em
/etc/udev/rules.d
(e/lib/udev/rules.d
no Karmic) e são processadas em ordem numérica. Qualquer arquivo que não comece com um número é processado após os arquivos numerados. No meu sistema, as regras HAL estão em um arquivo chamado90-hal.rules
, então eu as incluo89-local.rules
para que elas sejam processadas antes de chegarem ao HAL. Principalmente, você precisa garantir que essas regras aconteçam após o60-persistent-storage.rules
.local.rules
pode ser bom o suficiente.Coloque isso no seu novo arquivo de regras:
Verifique se não há espaços após o
\
, apenas umnewline
(\n
).Mude
SUBSYSTEMS=="usb"
paraSUBSYSTEMS=="usb|ieee1394"
para suporte ao Firewire.Se você deseja que o dispositivo sempre seja de propriedade de um usuário específico, adicione uma
OWNER="username"
cláusula. Se você precisar apenas dos arquivos pertencentes a um usuário específico, ajuste o script de montagem.Lendo a regra
Isso adiciona um programa a ser executado na lista de programas do dispositivo a ser executado. Ele identifica os dispositivos de partição USB
<LABEL>
e passa essas informações para um script que executa a montagem. Especificamente, esta regra é correspondente:ENV{ID_FS_LABEL_ENC}=="?*"
- uma variável de ambiente definida por uma regra anterior do sistema. Não existe para sistemas que não são arquivos, é por isso que procuramos por ele. Na verdade, queremos usarID_FS_LABEL
o ponto de montagem, mas eu não convenci o UDEV a escapar dele para mim, então vamos deixar o script de montagem lidar com isso.Esta e outras variáveis de ambiente são obtidas pelo udev usando o
vol_id
comando ( descontinuado ). É uma ferramenta útil para ver detalhes rápidos e agradáveis em uma partição:ACTION=="add"
- corresponder apenas aadd
eventos ...SUBSYSTEMS=="usb"
- corresponda apenas aos dispositivos que estão no barramento USB. UsamosSUBSYSTEMS
aqui porque isso corresponde aos pais do nosso dispositivo; o dispositivo em que estamos interessados será realmente SUBSYSTEM == "scsi". A correspondência com um dispositivo USB pai evita adicionar nosso programa às unidades internas.RUN+="..."
- não uma correspondência, mas uma ação: adicione este programa à lista de programas a serem executados. Nos argumentos do programa,%k
é expandido para o nome do dispositivo (por exemplosdc1
, não/dev/sdc1
) e$env{FOO}
obtém o conteúdo da variável de ambiente FOO.Testando a regra
O primeiro link de referência (acima) é um excelente tutorial UDEV, mas está um pouco desatualizado. Os programas executados para testar suas regras (
udevtest
em particular) foram substituídos peloudevadm
utilitário catch-all .Depois de adicionar a regra, conecte seu dispositivo. Aguarde alguns segundos e verifique para qual dispositivo ele foi atribuído:
Se a sua unidade removível contiver
label_Baz
, ela estará no dispositivosdc1
. Execute isso e observe a saída no final:Procure o nome do script da nossa
RUN+=
regra nas últimas linhas (terceira da parte inferior neste exemplo). Você pode ver os argumentos que seriam usados para este dispositivo. Você pode executar esse comando agora para verificar se os argumentos estão corretos; se funcionar em sua linha de comando, funcionará automaticamente quando um dispositivo for inserido.Você também pode monitorar eventos UDEV em tempo real: execute
sudo udevadm monitor
(consulteman udevadm
para obter detalhes sobre os comutadores). Em seguida, basta conectar um novo dispositivo e assistir a rolagem de eventos. (Provavelmente um exagero, a menos que você goste de detalhes realmente de baixo nível ...)Recarregando as regras
Depois de verificar se a regra está sendo lida corretamente, você precisa dizer ao UDEV para recarregar suas regras para que a nova entre em vigor. Use qualquer um desses métodos (se o primeiro não funcionar, o segundo deve ... mas tente o primeiro primeiro):
corre
sudo udevadm control --reload-rules
corre
sudo /etc/init.d/udev reload
reiniciar
Roteiro! Na verdade, 2 scripts ...
Aqui está o primeiro script. Como o programa que executamos precisa ser concluído rapidamente, isso apenas gera o segundo script em segundo plano. Coloque isso em
/usr/local/sbin/udev-automounter.sh
:Aqui está o segundo script. Isso faz um pouco mais de verificação de entrada. Coloque isso
/usr/local/sbin/udev-auto-mount.sh
. Você pode ajustar as opções de montagem abaixo. Este script agora lida com a localização da partição LABEL por conta própria; O UDEV envia apenas o nome do DISPOSITIVO.Se houver um problema ao montar unidades no momento da inicialização , você pode colocar um bom tempo
sleep 60
nesse script, para dar tempo ao sistema para que ele avance antes que o script tente montar a unidade.Dei uma sugestão nos comentários para saber como verificar (execute
ps
para verificar se um servidor da web está sendo executado), mas você precisará ajustá-la para o seu sistema. Eu acho que a maioria dos servidores de rede que você pode estar usando seria suficiente para esse fim - nfsd, smbd, apache, etc. O risco, é claro, é que o script mount falhe se o serviço não estiver sendo executado, então talvez testando um a existência de um arquivo específico seria uma solução melhor.Script de limpeza de super bônus!
Mais um script. Tudo isso é desmontar o dispositivo e remover os diretórios do ponto de montagem. Ele assume que ele tem privs para fazer isso, então você precisará executá-lo
sudo
. Este script agora pega o ponto de montagem completo na linha de comando, por exemplo:Coloque isso em
/usr/local/sbin/udev-unmounter.sh
:fonte
Uma opção final sugerida por outras pessoas na rede é
ivman
, mas parece dependerpmount
, da qual você já declarou que não funciona.pmount
é abandonado eivman
é quase o mesmo.A substituição para
ivman
éhalevt
e está disponível no Karmic. É uma reimplementação deivman
(leia: "mantido" e "não depende do pmount"). O pacote não está disponível no Jaunty, embora você possa construí-lo você mesmo se não estiver planejando fazer o upgrade.Ambas as ferramentas ficam acima das camadas DBus e HAL e respondem aos eventos delas. Aparentemente, ambos podem ser executados como um daemon do sistema ou como um gerenciador de montagem de sessão do usuário (à la Gnome-VFS) - os
/etc/defaults/{ivman,halevt}
arquivos são responsáveis pelas configurações do sistema.Aqui estão algumas instruções para ajustar o
ivman
uso de/media/<LABEL>
pontos de montagem. É provável quehalevt
tenha uma maneira mais simples de fazer isso, mas talvez eles o ajudem a encontrar uma resposta.Trabalhando com HALEVT
Atualização : No interesse de obter montagens de CD auto-mágicas também, que a minha resposta UDEV não fornece, examinei mais detalhadamente
halevt
. Encontrei este post do blog que ajudou a explicar muito sobre o processo. Eu tive que compilar meu própriohalevt
pacote para o Debian Lenny (felizmente todas as dependências estavam na seção lenny-backports). Uma vez instalado, o processo não era horrível:/etc/default/halevt
/etc/PolicyKit/PolicyKit.conf
(veja abaixo; fonte )/etc/hal/fdi/policy/preferences.fdi
(veja abaixo)eject.hal
script no blog acima, modifique e salve/usr/local/bin
./etc/halevt/halevt.xml
Se você precisar reiniciar os daemons HAL e HALEVT para verificar suas novas configurações, use isso para obtê-los na ordem correta:
Passo 1
Verifique se
START_DAEMON=yes
no/etc/default/halevt
.Passo 2
Em
/etc/PolicyKit/PolicyKit.conf
, adicione isso dentro da<config></config>
seção:etapa 3
Em
/etc/hal/fdi/policy/preferences.fdi
, adicione isto dentro da seção `:Passo 4
O script é bom, mas precisa ser executado
/bin/bash
; alguns sistemas podem realmente usar/bin/dash
quando/bin/sh
é chamado. Portanto, altere a linha superior do script para garantir a correta:Etapa 5
Esta é a parte divertida. Seu sistema já pode fornecer um básico
/etc/halevt/halevt.xml
, portanto você precisará adaptá-lo para seu próprio uso. No meu caso, meu sistema já fornecia montagem removível básica, mas tive que adicionar suporte para montagem de CDROM e o botão de ejeção.A postagem do blog que mencionei tem um bom exemplo de configuração XML para analisar seus próprios ajustes. Trata-se principalmente de configurar uma substituição de montagem gnome para o
fluxbox
ambiente do autor , para que o exemplo de XML faça mais do que você deseja, mas é uma ótima maneira de ter uma ideia do que você pode fazer. Existem também alguns bons exemplos em/usr/share/doc/halevt/examples
.Eu também tive que correr
sudo sh -c "mkdir /var/halevt ; chown halevt:plugdev /var/halevt"
antes que tudo desse certo.Aqui estão minhas adições para fazer o CD / DVD de montagem automática funcionar:
Etapa 6
Depois de colocar o sistema halevt-daemon em funcionamento, será necessário desativá-lo quando você fizer login no GNOME e reiniciá-lo novamente quando sair. (Veja minha resposta a esta pergunta para gerenciadores de login que não são do GDM.) Esse material é teórico, pois eu não o uso, mas deve funcionar.
Em
/etc/gdm/PreSession/Default
, adicione isto para parar o sistema halevt-daemon:Em
/etc/gdm/PostSession/Default
, adicione isto para reiniciar o sistema halevt-daemon:fonte
Com o passar do tempo, soluções mais fáceis aparecem.
Esta solução depende do pacote de software udevil que foi escrito para esse fim e não requer ajustes nas regras do udev. Provavelmente é preferível (para usuários novos e antigos) como uma solução direta.
O
devmon
script do udevil faz toda a mágica, dependendo apenas do udev e do glib. Funciona quase que imediatamente, sem a necessidade de configuração inicial.Tudo o que fiz na minha estação de trabalho foi chamar devmon
rc.local
desta forma:devmon 2>&1 >> /var/log/devmon &
para seu conforto, você pode incorporar isso em um script init em vez de
rc.local
usar uma ferramenta automatizada comopleaserun
criá-lo: https://unix.stackexchange.com/ a / 124609/42673Depois de executá-lo, o armazenamento que eu conecto é inspecionado (ele procura partições e, se encontrado, olha para os rótulos dos sistemas de arquivos) e depois é montado
/media/FILESYSTEM_LABEL
.Não poderia imaginar nada mais simples do que isso, exceto talvez o (in) famoso sistemad para incorporar essa funcionalidade em algum momento no futuro.
Visão Geral do udevil ( github.io/udevil )
Script: devmon ( igurublog / script-devmon )
fonte
A resposta do quack quixote não funciona no Ubuntu Lucid Lynx (10.04) - não há
/sbin/vol_id
comando.Em vez de ser extravagante e usar o udev, coloque isso no seu /etc/rc.local e pronto:
fonte
Para sistemas baseados no Debian (por exemplo, Ubuntu etc.), existe o pacote usbmount que monta automaticamente unidades USB para você. Ele basicamente usa uma abordagem baseada no udev, como já descrito - apenas é apenas uma instalação simples do pacote. Parece que o autor original do pacote ficou sem vapor, mas o Ubuntu / Debian ainda parece mantê-lo (acho que não é tão complexo) - por isso ainda está disponível nas versões mais recentes.
Os scripts instalados podem ser configurados (/etc/usbmount/usbmount.conf) para fornecer os pontos de montagem apropriados.
fonte
Para liberar as excelentes instruções de remoção do Quack Quixote:
Adicione a seguinte linha ao arquivo de regras do udev que você criou anteriormente (/etc/udev/rules.d) "
Em seguida, crie o seguinte script e execute o chmod it (/usr/local/sbin/udev-autounmounter.sh) com o seguinte conteúdo:
Finalmente, o próprio script desmontar (udev-auto-unmount.sh):
Portanto, com as outras instruções, o diretório aparecerá automaticamente e desaparecerá nos eventos do udev.
fonte
if [ -n "$device_is_mounted" ]; then
deveria serif [ -z "${MOUNTPT}" ]; then
, não deveria?Você pode experimentar o Pysdm
fonte
Você pode tentar colocar
su username -c gnome-volume-manager
/etc/rc.local. Pode ser suficiente simplesmente ter o gnome-volume-manager em execução.Edit: Parece que o gnome-volume-manager não faz mais parte da distribuição padrão, mesmo na área de trabalho do Ubuntu.
No entanto, talvez se você o instalar, ele ainda funcionará. Vale a tentativa. Se não funcionar, remova-o novamente.
Há também o
usbmount
pacote, que faz o que você deseja, mas pode interferir na montagem automática normal.fonte
Meus adendos editados para a solução baseada em udev do Quack Quixote foram rejeitados, então eu os colocarei aqui. Por favor, consulte o post dele primeiro.
Antes de tudo, se você deseja que sua regra do udev atue quando qualquer dispositivo é conectado por meio do subsistema SCSI (que inclui USB, FireWire e eSATA), altere a correspondência SUBSYSTEMS na regra do udev para
SUBSYSTEMS=="scsi"
.Lembre-se, no entanto, de que isso montará automaticamente praticamente qualquer coisa, incluindo unidades internas, se você conectá-las enquanto o sistema estiver em execução; portanto, pode não ser o que você deseja.
Em segundo lugar, aqui está o script que estou usando, que substitui todos os scripts desse post. Ele também limpa automaticamente os pontos de montagem criados em / media / assim que o dispositivo de bloco montado é removido - sem necessidade de intervenção manual. Além disso, em vez de chamar um script diferente para ser executado em segundo plano, ele se coloca em segundo plano quando não é executado a partir de um terminal (por exemplo, quando executado via udev).
Ele usa inotifywait para aguardar o desaparecimento do dispositivo montado e, em seguida, remove o diretório que ele criou. Portanto, você precisa ter o inotify-tools instalado no seu sistema. Em distribuições baseadas no Debian (incluindo Ubuntu),
sudo apt-get install inotify-tools
deve ser suficiente.Você notará que eu monto dispositivos sem sincronização e somente leitura. Isso ocorre porque, em 99% das vezes, meu caso de uso é lido em uma unidade externa e, sempre que eu precisar escrever nele, estarei ativo no servidor de qualquer maneira e posso emitir facilmente um
mount -o remount,rw <mountpoint>
comando. Edite para atender às suas necessidades :)fonte
halevt
não parece ser umapt-get
pacote capaz atualmente para versões modernas.Tente configurar via mountmanager, para que você não precise inserir dados manualmente.
Deve fazer parte do repositório do ubuntu.
fonte
Se você tiver apenas uma unidade montada por vez, basta editá-la no seu
/etc/fstab
arquivo. Algo ao longo das linhas de:Isso deve montá-lo na inicialização e torná-lo acessível a qualquer pessoa com permissões permanentes. Se você tiver mais de uma unidade, ainda poderá fazer isso com:
fonte