Montare automaticamente unità esterne su / media / LABEL all'avvio senza che un utente abbia effettuato l'accesso?


73

Questa domanda è simile, ma un po 'l'opposto di ciò che voglio. Voglio che le unità USB esterne vengano montate automaticamente all'avvio, senza che nessuno abbia effettuato l'accesso, in posizioni come /media/<label>.

Non voglio inserire tutti i dati in fstab, in parte perché è noioso e fastidioso, ma soprattutto perché non riesco a prevedere cosa ci collegherò o come cambieranno le partizioni in futuro.

Voglio che le unità siano accessibili a cose come MPD e disponibili quando eseguo l'accesso con SSH. gnome-mountsembra montare le cose solo quando si è connessi localmente in una sessione grafica di Gnome.


4
Grande domanda, vorrei avere una risposta per te, ora sono curioso di sapere come questo è risolto.
inverti il

1
Ho aggiornato la mia risposta.
Ryan Thompson,

1
E io, per la cronaca, non ho problemi con l'installazione di Gnome, come già faccio, ma una soluzione per server senza GUI senza testa sarebbe la migliore.
endolith

1
ARRRGHH ... bug nella mia risposta. nel RUN. /usr/local/sbin/udev-automounter.sh mount %kdovrebbe essere /usr/local/sbin/udev-automounter.sh %k. scusa.
Quack Quixote

1
OK, a partire da Update-3, funziona con gli spazi. lo fa usando una versione "codificata" di <LABEL> che converte gli spazi in \x20's. quindi non è carino, ma funzionerà. udev non gestisce bene le etichette con spazi, ma c'è un'altra opzione che usa i trattini bassi invece di quelli \x20(quindi almeno sembra carino). sembra che la gestione dello spazio debba andare negli script shell.
Quack Quixote

Risposte:


74
  • Nota per Ubuntu Server 11.10: questo script ha esito negativo su Ubuntu Server 11.10 a causa del vol_idcomando obsoleto . vol_idè stato sostituito da blkid. Per correggere lo script, sostituire "vol_id" con "blkid -o udev" nello udev-auto-mount.shscript.

Mi sbatto la testa da un po 'di tempo ormai e penso di aver trovato una soluzione funzionante. Questo è sviluppato e testato su un sistema basato su Debian, quindi dovrebbe funzionare su Ubuntu. Sottolineerò i presupposti che fa in modo che possa essere adattato anche ad altri sistemi.

  • Monterà automaticamente le unità USB sul plug-in e non dovrebbe richiedere molto tempo per adattarsi a Firewire.
  • Usa UDEV, quindi niente scimmie con HAL / DeviceKit / GNOME-Anything.
  • Crea automagicamente una /media/LABELdirectory su cui montare il dispositivo.

  • Tuttavia, potrebbe interferire con altri automounter; Non posso provarlo. Mi aspetto che, con Gnome-VFS attivo, entrambi possano provare a fare il mount ... se Gnome-VFS fallisce il mount, potrebbe non configurare un'icona desktop. Lo smontaggio da Gnome dovrebbe essere possibile, ma potrebbe richiedere gksudoo simili.

Non l'ho provato all'avvio del sistema, ma l'unico motivo per cui posso vedere che potrebbe non funzionare è se tenta di montare l'unità USB prima che il sistema sia pronto per il montaggio. In tal caso, probabilmente avrai bisogno di un'ulteriore modifica allo script di mount. (Sto verificando con ServerFault per vedere se c'è qualche consiglio, ma non c'è molto interesse in questo.)

Su di esso, quindi.


Riferimenti UDEV:


Sfondo (UDEV? Whuzzat?)

UDEV è il sistema hotplug del kernel. È ciò che configura automagicamente i dispositivi e i collegamenti simbolici dei dispositivi (ad esempio /dev/disk/by-label/<LABEL>), sia all'avvio sia per i dispositivi aggiunti mentre il sistema è in esecuzione.

D-Bus e HAL vengono utilizzati per l'invio di eventi hardware a listener come ambienti desktop. Quindi quando si accede a GNOME e si inserisce un CD o si collega un'unità USB, quell'evento segue questa catena:

kernel -> udev -> dbus -> hal -> gnome-vfs/nautilus (mount)

E presto, l'unità viene montata. Ma in un sistema senza testa, non vogliamo accedere per ottenere i vantaggi dell'automontaggio.

Regole Udev

Poiché UDEV ci consente di scrivere regole ed eseguire programmi sull'inserimento del dispositivo, questa è la scelta ideale. Trarremo vantaggio dalle regole esistenti di Debian / Ubuntu, consentiremo loro di impostare il /dev/disk/by-label/<LABEL>collegamento simbolico per noi e aggiungere un'altra regola che monterà il dispositivo per noi.

Le regole di UDEV sono mantenute in /etc/udev/rules.d(e /lib/udev/rules.dsu Karmic) e vengono elaborate in ordine numerico. Qualsiasi file che non inizia con un numero viene elaborato dopo i file numerati. Sul mio sistema, le regole HAL sono in un file chiamato 90-hal.rules, quindi ho inserito le mie regole in 89-local.rulesmodo che vengano elaborate prima di arrivare a HAL. In primo luogo, è necessario assicurarsi che queste regole si verifichino dopo il 60-persistent-storage.rules. local.rulespotrebbe essere abbastanza buono.

Inserisci questo nel tuo nuovo file delle regole:

# /etc/udev/rules.d/local.rules 
# /etc/udev/rules.d/89-local.rules
# ADD rule: if we have a valid ID_FS_LABEL_ENC, and it's USB, mkdir and mount
ENV{ID_FS_LABEL_ENC}=="?*",   ACTION=="add",      SUBSYSTEMS=="usb", \
         RUN+="/usr/local/sbin/udev-automounter.sh %k"
  • Assicurati che non ci siano spazi dopo il \, solo un newline( \n).

  • Passare SUBSYSTEMS=="usb"a SUBSYSTEMS=="usb|ieee1394"per supporto Firewire.

  • Se desideri che il dispositivo sia sempre di proprietà di un determinato utente, aggiungi una OWNER="username"clausola. Se hai solo bisogno dei file di proprietà di un determinato utente, modifica invece lo script di mount.

Leggere la regola

Ciò aggiunge un programma da eseguire all'elenco dei programmi del dispositivo da eseguire. Identifica i dispositivi di partizione USB per <LABEL>, quindi passa queste informazioni a uno script che esegue il montaggio. In particolare, questa regola corrisponde:

  1. ENV{ID_FS_LABEL_ENC}=="?*"- una variabile di ambiente impostata da una regola di sistema precedente. Non esiste per i non filesystem, quindi è per questo che lo controlliamo. In realtà vogliamo usarlo ID_FS_LABELper il mount point, ma non ho convinto UDEV a evitarlo per me, quindi lasceremo che lo script di mount lo gestisca.

    Questa e altre variabili d'ambiente sono ottenute da udev usando il vol_idcomando ( obsoleto ). È uno strumento utile per visualizzare dettagli rapidi e piacevoli su una partizione:

    $ sudo vol_id /dev/sdc1
    ID_FS_TYPE=ext2
    ID_FS_UUID=a40d282a-4a24-4593-a0ab-6f2600f920dd
    ID_FS_LABEL=Travel Dawgs
    ID_FS_LABEL_ENC=Travel\x20Dawgs
    ID_FS_LABEL_SAFE=Travel_Dawgs
    
  2. ACTION=="add"- abbina solo addeventi ...

  3. SUBSYSTEMS=="usb"- abbina solo i dispositivi che si trovano sul bus USB. Usiamo SUBSYSTEMSqui perché questo corrisponde ai genitori del nostro dispositivo; il dispositivo a cui siamo interessati sarà effettivamente SUBSYSTEM == "scsi". La corrispondenza con un dispositivo USB principale evita di aggiungere il nostro programma alle unità interne.

  4. RUN+="..."- non una corrispondenza, ma un'azione: aggiungi questo programma all'elenco dei programmi da eseguire. Negli argomenti del programma, %kviene espanso al nome del dispositivo (ad esempio sdc1, non /dev/sdc1) e $env{FOO}ottiene il contenuto della variabile di ambiente FOO.

Test della regola

Il primo link di riferimento (sopra) è un eccellente tutorial di UDEV, ma è leggermente obsoleto. I programmi che esegue per testare le regole ( udevtestin particolare) sono stati sostituiti udevadmdall'utilità catch-all .

Dopo aver aggiunto la regola, collega il dispositivo. Dagli qualche secondo, quindi controlla per vedere a quale dispositivo è stato assegnato:

$ ls -l /dev/disk/by-label/*
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Foo -> ../../sda1
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Bar -> ../../sdb1
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Baz -> ../../sdc1

Se l'unità rimovibile contiene label_Baz, è sul dispositivo sdc1. Esegui questo e guarda l'output verso la fine:

$ sudo udevadm test /sys/block/sdc/sdc1
parse_file: reading (...)                           (many lines about files it reads)
import_uevent_var: import into environment: (...)   (many lines about env variables)
(...)                                               (many lines tracing rule matches & programs run)
update_link: found 1 devices with name 'disk/by-label/LABEL_BAZ'
update_link: found '/block/sdc/sdc1' for 'disk/by-label/LABEL_BAZ'
update_link: compare (our own) priority of '/block/sdc/sdc1' 0 >= 0
update_link: 'disk/by-label/LABEL_BAZ' with target 'sdc1' has the highest priority 0, create it
udevtest: run: '/usr/local/sbin/udev-automounter.sh sdc1 LABEL_BAZ'
udevtest: run: 'socket:/org/freedesktop/hal/udev_event'
udevtest: run: 'socket:@/org/kernel/udev/monitor'

Cerca il nome dello script dalla nostra RUN+=regola nelle ultime righe (3 ° in fondo in questo esempio). Puoi vedere gli argomenti che verrebbero utilizzati per questo dispositivo. È possibile eseguire quel comando ora per verificare che gli argomenti siano validi; se funziona sulla riga di comando, dovrebbe funzionare automaticamente quando viene inserito un dispositivo.

Puoi anche monitorare gli eventi UDEV in tempo reale: esegui sudo udevadm monitor(vedi man udevadmper i dettagli sugli switch). Quindi collega un nuovo dispositivo e guarda scorrere gli eventi. (Probabilmente eccessivo a meno che non ti piacciano i dettagli di basso livello ...)

Ricaricare le regole

Dopo aver verificato che la regola viene letta correttamente, devi dire a UDEV di ricaricare le sue regole in modo che la nuova abbia effetto. Usa uno di questi metodi (se il primo non funziona, il secondo dovrebbe ... ma prova il primo primo):

  • correre sudo udevadm control --reload-rules

  • correre sudo /etc/init.d/udev reload

  • riavvio


Script! In realtà, 2 script ...


Ecco la prima sceneggiatura. Poiché il programma che eseguiamo deve essere completato rapidamente, questo fa girare il secondo script in background. Metti questo in /usr/local/sbin/udev-automounter.sh:

#!/bin/sh
#
# USAGE: usb-automounter.sh DEVICE 
#   DEVICE   is the actual device node at /dev/DEVICE

/usr/local/sbin/udev-auto-mount.sh ${1} &

Ecco la seconda sceneggiatura. Questo fa un po 'più controllo di input. Metti questo /usr/local/sbin/udev-auto-mount.sh. Potresti voler modificare le opzioni di montaggio di seguito. Questo script ora gestisce la ricerca della partizione LABEL da sola; UDEV invia solo il nome del DISPOSITIVO.

Se si verifica un problema con il montaggio delle unità all'avvio , è possibile dedicare molto tempo sleep 60a questo script, per dare al sistema il tempo di arrivare fino in fondo prima che lo script tenti di montare l'unità.

Ho dato un suggerimento nei commenti su come controllare (esegui psper vedere se un server web è in esecuzione), ma ti consigliamo di modificarlo per il tuo sistema. Penso che la maggior parte dei server di rete che potresti utilizzare sarebbe sufficiente per questo scopo - nfsd, smbd, apache, ecc. Il rischio, ovviamente, è che lo script di montaggio fallisca se il servizio non è in esecuzione, quindi forse testare un l'esistenza di un file particolare sarebbe una soluzione migliore.

#!/bin/sh
#
# USAGE: udev-auto-mount.sh DEVICE
#   DEVICE   is the actual device node at /dev/DEVICE
# 
# This script takes a device name, looks up the partition label and
# type, creates /media/LABEL and mounts the partition.  Mount options
# are hard-coded below.

DEVICE=$1

# check input
if [ -z "$DEVICE" ]; then
   exit 1
fi

# test that this device isn't already mounted
device_is_mounted=`grep ${DEVICE} /etc/mtab`
if [ -n "$device_is_mounted" ]; then
   echo "error: seems /dev/${DEVICE} is already mounted"
   exit 1
fi

# If there's a problem at boot-time, this is where we'd put
# some test to check that we're booting, and then run
#     sleep 60
# so the system is ready for the mount below.
#
# An example to experiment with:
# Assume the system is "booted enough" if the HTTPD server is running.
# If it isn't, sleep for half a minute before checking again.
#
# The risk: if the server fails for some reason, this mount script
# will just keep waiting for it to show up.  A better solution would
# be to check for some file that exists after the boot process is complete.
#
# HTTPD_UP=`ps -ax | grep httpd | grep -v grep`
# while [ -z "$HTTPD_UP" ]; do
#    sleep 30
#    HTTPD_UP=`ps -ax | grep httpd | grep -v grep`
# done


# pull in useful variables from vol_id, quote everything Just In Case
eval `/sbin/vol_id /dev/${DEVICE} | sed 's/^/export /; s/=/="/; s/$/"/'`

if [ -z "$ID_FS_LABEL" ] || [ -z "$ID_FS_TYPE" ]; then
   echo "error: ID_FS_LABEL is empty! did vol_id break? tried /dev/${DEVICE}"
   exit 1
fi


# test mountpoint - it shouldn't exist
if [ ! -e "/media/${ID_FS_LABEL}" ]; then

   # make the mountpoint
   mkdir "/media/${ID_FS_LABEL}"

   # mount the device
   # 
   # If expecting thumbdrives, you probably want 
   #      mount -t auto -o sync,noatime [...]
   # 
   # If drive is VFAT/NFTS, this mounts the filesystem such that all files
   # are owned by a std user instead of by root.  Change to your user's UID
   # (listed in /etc/passwd).  You may also want "gid=1000" and/or "umask=022", eg:
   #      mount -t auto -o uid=1000,gid=1000 [...]
   # 
   # 
   case "$ID_FS_TYPE" in

       vfat)  mount -t vfat -o sync,noatime,uid=1000 /dev/${DEVICE} "/media/${ID_FS_LABEL}"
              ;;

              # I like the locale setting for ntfs
       ntfs)  mount -t auto -o sync,noatime,uid=1000,locale=en_US.UTF-8 /dev/${DEVICE} "/media/${ID_FS_LABEL}"
              ;;

              # ext2/3/4 don't like uid option
       ext*)  mount -t auto -o sync,noatime /dev/${DEVICE} "/media/${ID_FS_LABEL}"
              ;;
   esac

   # all done here, return successful
   exit 0
fi

exit 1

Script di pulizia super bonus!

Un'altra sceneggiatura. Tutto ciò che fa è smontare il dispositivo e rimuovere le directory mountpoint. Presuppone che abbia dei priv per farlo, quindi dovrai eseguirlo sudo. Questo script ora prende l'intero mountpoint sulla riga di comando, ad esempio:

$ /usr/local/sbin/udev-unmounter.sh "/media/My Random Disk"

Metti questo in /usr/local/sbin/udev-unmounter.sh:

#!/bin/sh
#
# USAGE: udev-unmounter.sh MOUNTPT
#   MOUNTPT is a mountpoint we want to unmount and delete.
MOUNTPT="$1"

if [ -z "$MOUNTPT" ]; then
   exit 1
fi


# test mountpoint - it should exist
if [ -e "${MOUNTPT}" ]; then

   # very naive; just run and pray
   umount -l "${MOUNTPT}" && rmdir "${MOUNTPT}" && exit 0

   echo "error: ${MOUNTPT} failed to unmount."
   exit 1
fi

echo "error: ${MOUNTPT} does not exist"
exit 1

3
Sei grande! :)
kolypto

1
Se eseguo auto-mount.sh manualmente funziona, ma non se collego un'unità e non all'avvio. : /
endolith

quindi il problema è con le regole UDEV. lasciami espandere un po 'quella sezione per aiutarti a eseguire il debug.
Quack Quixote

3
Ho assemblato tutti gli script su github: github.com/fatso83/Code-Snippets/tree/master/system-utils/… Funzionano bene su Ubuntu 10.10 e includono anche lo smontaggio automatico
oligofren

1
Riferimento: udev_237 - man udev (Ubuntu_18.04) Nota che l'esecuzione di programmi che accedono alla rete o monta / smonta file system non è consentita all'interno delle regole udev , a causa della sandbox predefinita che viene applicata su systemd-udevd.service. fonte: unix.stackexchange.com/questions/200194/… Per una soluzione, dai un'occhiata a serverfault.com/questions/766506/…
Pro Backup il

9

Un'ultima opzione che altri hanno suggerito in rete è ivman, ma sembra dipendere da pmountciò che hai già dichiarato non funziona. pmountè abbandonato ed ivmanè quasi lo stesso.

Il sostituto di ivmanè halevted è disponibile in Karmic. È una reimplementazione di ivman(leggi: "mantenuto" e "non dipende da pmount"). Il pacchetto non è disponibile su Jaunty, anche se potresti non essere in grado di costruirlo da solo se non hai intenzione di aggiornarlo.

Entrambi questi strumenti si trovano sopra i livelli DBus e HAL e rispondono agli eventi da essi. Apparentemente entrambi possono essere eseguiti come daemon di sistema o come gestore di mount di sessioni utente (come Gnome-VFS) - i /etc/defaults/{ivman,halevt}file sono responsabili delle impostazioni di sistema.

Ecco alcune istruzioni per ottimizzare ivmanl'uso dei /media/<LABEL>mountpoint. È probabile che halevtabbia un modo più semplice per farlo, ma forse ti aiuteranno a trovare una risposta.


Lavorare con HALEVT

Aggiornamento : Nell'interesse di ottenere anche supporti per CD automagici, cosa che la mia risposta UDEV non fornisce, ho approfondito halevt. Ho trovato questo post sul blog che mi ha aiutato a spiegare molto sul processo. Ho dovuto compilare il mio halevtpacchetto per Debian Lenny (fortunatamente tutte le dipendenze erano nella sezione lenny-backports). Una volta installato, il processo era per lo più non orribile:

  1. Assicurati che il sistema halevt-daemon sia abilitato in /etc/default/halevt
  2. Consenti all'utente di installare dispositivi in /etc/PolicyKit/PolicyKit.conf(vedi sotto; sorgente )
  3. Modifica il criterio HAL per copiare l'etichetta del volume nel mountpoint preferito in /etc/hal/fdi/policy/preferences.fdi(vedi sotto)
  4. Se desideri il supporto per CD / DVD, prendi lo eject.halscript dal post di blog sopra, modifica e salva /usr/local/bin.
  5. Modifica la configurazione del sistema halevt per abilitare i montaggi /etc/halevt/halevt.xml
  6. Aggiungi il codice agli script pre e post sessione del gestore degli accessi per arrestare il sistema halevt-daemon quando qualcuno accede e riavvialo quando si disconnette.

Se è necessario riavviare i demoni HAL e HALEVT per verificare le nuove configurazioni, utilizzarlo per riportarle nell'ordine giusto:

sudo sh -c "/etc/init.d/halevt stop ; /etc/init.d/hal restart ; /etc/init.d/halevt start"

Passo 1

Check START_DAEMON=yesin /etc/default/halevt.

Passo 2

In /etc/PolicyKit/PolicyKit.conf, aggiungere questo all'interno della <config></config>sezione:

<match action="org.freedesktop.hal.storage.mount-removable">
   <match user="halevt">
      <return result="yes"/>
   </match>
</match>

Passaggio 3

In /etc/hal/fdi/policy/preferences.fdi, aggiungere questo all'interno della sezione `:

<match key="volume.label" empty="false">
    <match key="volume.label" is_absolute_path="false">
        <merge key="volume.policy.desired_mount_point" type="copy_property">volume.label</merge>
    </match>
</match>

Passaggio 4

Lo script è buono ma deve essere eseguito /bin/bash; alcuni sistemi potrebbero effettivamente utilizzare /bin/dashquando /bin/shviene chiamato. Quindi cambia la riga superiore dello script per assicurarti di ottenere quella giusta:

#!/bin/sh         <------ old first line

#!/bin/bash       <------ new first line

Passaggio 5

Questa è la parte divertente. Il tuo sistema potrebbe /etc/halevt/halevt.xmlgià fornire una base , quindi dovrai personalizzarla per il tuo uso personale. Nel mio caso, il mio sistema ha già fornito il montaggio rimovibile di base, ma ho dovuto aggiungere il supporto per il montaggio CD-ROM e il pulsante di espulsione.

Il post sul blog che ho citato ha un buon esempio di configurazione XML per cercare le tue modifiche. Si tratta principalmente di impostare un sostituto di gnome-mount per l' fluxboxambiente dell'autore , quindi il suo esempio XML fa più di quello che vorrai, ma è un ottimo modo per avere un'idea di ciò che puoi fare. Ci sono anche alcuni buoni esempi in /usr/share/doc/halevt/examples.

Ho anche dovuto correre sudo sh -c "mkdir /var/halevt ; chown halevt:plugdev /var/halevt"prima che tutto funzionasse.

Ecco le mie aggiunte per far funzionare il CD / DVD con montaggio automatico:

<!-- CD/DVD mount -->
<halevt:Device match="hal.block.device &amp; hal.block.is_volume = true  &amp; hal.volume.is_disc = true &amp; hal.volume.disc.has_data = true">
   <halevt:Property name="hal.volume.is_mounted">
      <halevt:Action value="true" exec="halevt-mount -u $hal.udi$ -p $hal.volume.policy.desired_mount_point$ -m 002"/>
   </halevt:Property>
</halevt:Device>

<!-- CD/DVD eject button support -->
<halevt:Device match="hal.storage.drive_type = cdrom">
   <halevt:Condition name="EjectPressed" exec='/usr/local/bin/eject.hal $hal.block.device$'/>
</halevt:Device>

Passaggio 6

Una volta che il sistema halevt-daemon funziona, è necessario disabilitarlo quando si accede a GNOME e riavviarlo nuovamente quando si disconnette. (Vedi la mia risposta a questa domanda per i gestori di login non GDM.) Questa roba è teorica poiché non la uso, ma dovrebbe funzionare.

In /etc/gdm/PreSession/Default, aggiungi questo per fermare il sistema halevt-daemon:

/etc/init.d/halevt stop

In /etc/gdm/PostSession/Default, aggiungi questo per riavviare il sistema halevt-daemon:

/etc/init.d/halevt start

3
Per le persone che leggono questo nel 2013, dovrebbero ora sapere che HAL è stato deprecato e dovrebbero ricorrere a soluzioni basate su udev come quella che Quacote ha dato sopra.
oligofren

6

Col passare del tempo, compaiono soluzioni più semplici.

Questa soluzione si basa sul pacchetto software udevil che è stato scritto per questo scopo e non richiede armeggiare con le regole udev. Probabilmente è preferibile (ai vecchi e nuovi utenti) come soluzione diretta.

La devmonsceneggiatura di udevil fa tutta la magia mentre dipende solo da udev e glib. Funziona quasi senza bisogno di configurazione iniziale.

Tutto ciò che ho fatto sulla mia postazione di lavoro è stato chiamare Devmon da rc.localquesto:
devmon 2>&1 >> /var/log/devmon &
Per tua comodità, potresti volerlo incorporare in uno script init invece di rc.localutilizzare uno strumento automatizzato come pleaserunper crearlo: https://unix.stackexchange.com/ a / 124609/42673

Dopo averlo avviato, viene esaminato lo spazio di archiviazione che collego (cerca le partizioni e, se trovato, esamina le etichette dei loro filesystem), quindi viene montato /media/FILESYSTEM_LABEL.
Non potevo immaginare nulla di più semplice di così, tranne forse il fatto che il (in) famoso sistema incorporasse questa funzionalità ad un certo punto in futuro.

udevil At A Glance ( github.io/udevil )
Script: devmon ( igurublog / script-devmon )


3

La risposta di Quack Quixote non funziona su Ubuntu Lucid Lynx (10.04) - non c'è alcun /sbin/vol_idcomando.

Piuttosto che essere fantasiosi e usare udev, inseriscilo nel tuo /etc/rc.local ed esegui:

for dev in $(ls -1 /dev/disk/by-label/* | grep -v EFI) ; do
  label=$(basename $dev)
  mkdir -p /media/$label
  $(mount | grep -q /media/$label) || mount $dev /media/$label
done

1
GRAZIE .. questo era il modo più semplice per quello che volevo realizzare.
Ha

3

Per i sistemi basati su Debian (es. Ubuntu ecc.) C'è il pacchetto usbmount che monta automaticamente le unità USB per te. In pratica utilizza un approccio basato su udev come già delineato - solo che è solo una semplice installazione di pacchetti. Sembra che l' autore originale del pacchetto abbia esaurito il vapore ma Ubuntu / Debian sembra ancora mantenerlo (suppongo che non sia così complesso) - quindi è ancora disponibile nelle ultime versioni.

Gli script installati possono essere configurati (/etc/usbmount/usbmount.conf) per fornire i punti di montaggio appropriati.


1
Usbmount non può essere montato per etichetta, a meno che non si compili l'elenco delle etichette nel file di configurazione.
Gilles 'SO- smetti di essere malvagio' il

1
Vedere post esite.ch/2014/04/11/… se si desidera aggiungere il montaggio all'etichetta su usbmount senza mantenere un elenco.
Oliver Sauder,

3

Per eliminare le eccellenti istruzioni per la rimozione di Quack Quixote:

Aggiungi la seguente riga al file della regola udev creato in precedenza (/etc/udev/rules.d) "

ENV{ID_FS_LABEL_ENC}=="?*",   ACTION=="remove",      SUBSYSTEMS=="usb", \
         RUN+="/usr/local/sbin/udev-autounmounter.sh %k"

Quindi creare il seguente script e eseguirlo (/usr/local/sbin/udev-autounmounter.sh) con i seguenti contenuti:

#!/bin/sh
#
# USAGE: usb-autounmounter.sh DEVICE 
#   DEVICE   is the actual device node at /dev/DEVICE

/usr/local/sbin/udev-auto-unmount.sh ${1} &

Infine lo stesso script di smontaggio (udev-auto-unmount.sh):

#!/bin/sh
#
# USAGE: udev-auto-unmount.sh DEVICE
#   DEVICE   is the actual device node at /dev/DEVICE
# 
# This script takes a device name, looks up the partition label and
# type, creates /media/LABEL and mounts the partition.  Mount options
# are hard-coded below.

DEVICE=$1

# check input
if [ -z "$DEVICE" ]; then
   exit 1
fi

#test that the device is already mounted
MOUNTPT=`mount | grep ${DEVICE} | cut -d ' ' -f 3`
if [ -z "${MOUNTPT}" ]; then
   echo "error: the device is not already mounted"
   exit 1
fi

# test mountpoint - it should exist
if [ -e "${MOUNTPT}" ]; then

   # very naive; just run and pray
   umount -l "${MOUNTPT}" && rmdir "${MOUNTPT}" && exit 0

   echo "error: ${MOUNTPT} failed to unmount."
   exit 1
fi

echo "error: ${MOUNTPT} does not exist"
exit 1

Quindi, con le altre istruzioni, la directory apparirà e scomparirà automaticamente negli eventi udev.


Penso che if [ -n "$device_is_mounted" ]; thendovrebbe essere if [ -z "${MOUNTPT}" ]; then, no?
eresonance,

2

Potresti provare Pysdm


Questo è solo un altro editor fstab, vero?
endolith

Sì, ma "Permette anche la creazione di regole udev per la configurazione dinamica dei dispositivi di archiviazione"
Sathyajith Bhat

La "creazione di regole udev" mi aiuterebbe in qualche modo? Non ho idea di cosa significhi. Monta dispositivi rimovibili precedentemente sconosciuti senza che un utente abbia effettuato l'accesso localmente?
endolith

Spiacente, non ho alcun indizio sulle regole di udev. Si potrebbe avere uno sguardo a fredericiana.com/2006/03/15/writing-udev-rules-short-notes e reactivated.net/writing_udev_rules.html
Sathyajith Bhat

2

Puoi provare a mettere su username -c gnome-volume-managerin /etc/rc.local. Potrebbe essere sufficiente avere semplicemente gnome-volume-manager in esecuzione.

Modifica: sembra che gnome-volume-manager non faccia più parte della distribuzione predefinita, nemmeno sul desktop di Ubuntu.

wajig policy  gnome-volume-manager
gnome-volume-manager:
  Installed: (none)
  Candidate: 2.24.0-0ubuntu1
  Version table:
     2.24.0-0ubuntu1 0
        500 http://ubuntu.secs.oakland.edu jaunty/universe Packages

Tuttavia, forse se lo installi, funzionerà comunque. Vale la pena provarlo. Se non funziona, rimuoverlo di nuovo.

C'è anche il usbmountpacchetto, che fa quello che vuoi, ma potrebbe interferire con il normale montaggio automatico.


Comando sconosciuto "gnome-volume-manager". Sono in Ubuntu Jaunty.
endolith,

C'è un / usr / lib / gnome-volume-manager / gnome-volume-manager, ma non fa nulla.
endolith,

Oh, capisco. C'è anche un pacchetto chiamato gnome-volume-manager. Correlati: crunchbanglinux.org/forums/topic/239/...
endolith

Sembra che gnome-volume-manager usi HAL per montare le cose? E "A partire dal 2009, HAL è in procinto di essere deprecato a favore di DeviceKit." Perché tutto in Linux è sempre così? Cominciano a far funzionare qualcosa quasi nel modo giusto e poi lo eliminano e lo sostituiscono con qualcosa di nuovo che non funziona.
endolith

pmount non funziona nemmeno più. > Pmount / dev / disk / by-label / STORAGE Errore: dispositivo / dev / sdc1 non è rimovibile togaware.com/linux/survivor/Using_Gnome_Volume_Manager.html
endolith

2

I miei addendum modificati per la soluzione basata su udev di Quack Quixote sono stati respinti, quindi li inserirò qui. Si prega di fare riferimento al suo post prima.

Prima di tutto, se si desidera che la regola udev funzioni quando un dispositivo è collegato tramite il sottosistema SCSI (che include sia USB, FireWire ed eSATA), modificare la corrispondenza SUBSYSTEMS nella regola udev in SUBSYSTEMS=="scsi".

Tieni presente, tuttavia, che questo monterà automaticamente praticamente qualsiasi cosa, comprese le unità interne se le colleghi a caldo mentre il sistema è in esecuzione, quindi potrebbe non essere quello che desideri.

In secondo luogo, ecco lo script che sto usando che sostituisce tutti gli script in quel post. Pulisce anche automaticamente i mountpoint creati in / media / non appena viene rimosso il dispositivo a blocchi montato - non è necessario alcun intervento manuale. Inoltre, anziché chiamare uno script diverso da eseguire in background, si mette in background quando non viene eseguito da un terminale (ad esempio quando eseguito tramite udev).

Utilizza inotifywait per attendere fino alla scomparsa del dispositivo montato, quindi rimuove la directory che ha creato. Pertanto, è necessario che inotify-tools sia installato sul proprio sistema. Sulle distribuzioni basate su Debian (incluso Ubuntu), sudo apt-get install inotify-toolsdovrebbe essere sufficiente.

#!/bin/bash
#
# Auto-mounter script, to be executed by udev on the addition of a
# mass storage device.
#
# Takes one argument; the base block device partition, e.g. "sdb3".
#
# Creates a mountpoint for the partition using its FS label, in
# /media/{fslabel} and mounts it there, read-only, unsynced.
#
# If the filesystem has no label, "Untitled" is used instead.
#
# If another filesystem is already mounted at that location, the
# newcomer will be mounted with an integer number appended to its
# label.

MOUNT_OPTS="ro,noatime,nodiratime"



# If we're called from a non-tty and not explicitly told to continue,
# we call ourselves in a subshell and thus return immediately (udev
# gets impatient):
if [[ "$2" != "backgrounded" ]] && ! tty &> /dev/null; then
    ($0 $1 backgrounded &)
    exit
fi



# Determine the desired mountpoint from the label of the fs on the partition:
MOUNTPOINT="/media/$(blkid /dev/$1 | grep LABEL | sed -E 's:^.+LABEL="([^"]+).+:\1:')"

# If it had no label, use "Untitled":
[[ "$MOUNTPOINT" = "/media/" ]] && MOUNTPOINT="/media/Untitled"

# If something's already mounted there, append a number:
if [[ -e "$MOUNTPOINT" ]] && mountpoint "$MOUNTPOINT" &> /dev/null; then
    NUM=1
    while mountpoint "$MOUNTPOINT $NUM" &> /dev/null; do NUM=$((NUM+1)); done
    MOUNTPOINT="$MOUNTPOINT $NUM"
fi

# Create the mountpoint and mount there:
mkdir "$MOUNTPOINT" && mount -o $MOUNT_OPTS /dev/$1 "$MOUNTPOINT"



# Wait until the device is removed (the block device is "deleted"):
inotifywait -e delete /dev/$1

# Then clean up. If it fails, retry every second for up to 5 mins:
TRIES=0
while [[ -e "$MOUNTPOINT" ]] && [[ $TRIES -lt 300 ]]; do
    rmdir "$MOUNTPOINT"
    sleep 1s
    TRIES=$((TRIES+1))
done

Noterai che monto i dispositivi senza sincronizzazione e di sola lettura. Questo è solo perché il 99% delle volte, il mio caso d'uso sta leggendo da un disco esterno e ogni volta che devo scriverlo, sarò comunque attivo sul server e posso facilmente inviare un mount -o remount,rw <mountpoint>comando. Modifica per soddisfare le tue esigenze :)


Come si esegue questo script? halevtnon sembra essere un apt-getpacchetto attualmente in grado per le versioni moderne.
Campbeln,

Eh ... forse se seguo la voce TOP / risposta accettata da Quack Quixote's ... Sarebbe comunque bello avere una risposta più completa qui :)
Campbeln

1

Prova a eseguire la configurazione tramite mountmanager, in modo da non dover inserire i dati manualmente.

Dovrebbe essere una parte del repository ubuntu.


Dovrai abilitare la sezione universo per ottenerlo.
Quack Quixote,

apt: mountmanager? section = universe;)
endolith

Sarà solo per creare un fstab per me?
endolith,

@endolith: apt: apt? install = mountmanager sarebbe più logico? ;)
Bobby,

Quel formato funziona? Non lo dice nella pagina man manpages.ubuntu.com/manpages/karmic/en/man8/apturl.8.html
endolith

-5

Se hai solo un'unità montata alla volta, puoi semplicemente modificarla nel tuo /etc/fstabfile. Qualcosa sulla falsariga di:

/dev/sdb1     /mnt/usbdrive     ext3     defaults 0   0

Questo dovrebbe montarlo all'avvio e renderlo accessibile a chiunque abbia permessi. Se hai più di un'unità, puoi comunque farlo con:

/dev/sdb1     /mnt/usbdrive1     ext3     defaults 0   0
/dev/sdc1     /mnt/usbdrive2     ext3     defaults 0   0

6
chiaramente non quello che pone la domanda.
Quack Quixote,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.