Chiavette USB con montaggio automatico su Debian


10

Sto eseguendo Debian Squeeze su un computer plug (quindi solo SSH, nessuna GUI) e quello che sto cercando di fare è farlo in modo che quando viene inserita una chiavetta USB, viene montata automaticamente.

Quello che ho fatto è installare autofsche da quello che raccolgo gestisce l'automount purché sappia dove si trova il dispositivo /dev.

Il problema è che la chiavetta USB non è sempre sullo stesso nome di dispositivo. A volte è /dev/sdc1, a volte /dev/sdd1, ecc.

Capisco che per porre rimedio a questo, devo usare udevper assicurarmi che la chiavetta USB abbia sempre lo stesso nome.

Ho ottenuto le seguenti informazioni da 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==""

Ho cercato di scrivere udevregole per forzare la chiavetta USB a prendere il nome, /dev/usbstickma finora non ho avuto successo.

Qualcuno può aiutare con quale regola devo specificare nel mio file delle regole per ottenere questa chiavetta USB per ottenere sempre lo stesso nome?

- Oppure, c'è un modo molto più semplice per montare automaticamente la chiavetta USB che mi manca del tutto?

AGGIORNARE

OK, quindi ho fatto alcuni progressi. Ho aggiunto la seguente regola:

SUBSYSTEMS=="scsi", ATTRS{model}=="Flash Disk ", DRIVERS=="sd", NAME="usbstick-%k" RUN+="mkdir /mnt/usbstick-%k; mount /dev/usbstick-%k /mnt/usbstick-%k"

So che questo ha ancora bisogno di un po 'di lavoro in termini di gestione dell'aggiunta / rimozione, ma per ora è solo un test di base.

L'effetto di questo è che ora riesco a ottenere tre nuovi nodi di dispositivo /dev, vale a dire /dev/usbstick-sdc, /dev/usbstick-sdc1e usbstick-sg2.

Tuttavia, quello che ho scoperto è che il codice nella RUNsezione viene eseguito solo una volta e crea una directory mnt/usbstick-sdc. Ho anche scoperto che la directory è sempre vuota, quindi qualcosa sta chiaramente ancora andando storto! (anche se sto facendo progressi).


Quel secondo /dev/sdc1doveva essere sdd1? E puoi usare blkidper identificare in modo univoco l'unità (beh, in realtà la partizione; cambierà se riformatti).
Kevin,

Corretto, appena risolto. Tutto quello che voglio succedere è che quando viene inserita una chiavetta USB, questa viene montata in una directory. Sono abbastanza sicuro che dovrei usare una udevregola per creare nodi di dispositivo per ogni partizione, ma non sono sicuro per quale livello udevadmdell'output creare regole!
Jon

La tua regola sembra troppo complicata. Prova a crearne uno semplice, con solo uno ACTION==, uno KERNEL==e uno ATTRS{something}==(è completamente fattibile - questo è quello che uso). Inoltre, considera l'esecuzione di un singolo script instabile nella catena di comandi RUN+=.
rozcietrzewiacz,

Grazie per il consiglio, ma la domanda rimane: a quale livello dell'albero dei dispositivi dovrei puntare con la mia regola? Tutto questo sembra terribilmente confuso e in realtà non ci sono molte informazioni online per spiegarlo. Apprezzo molto il tempo che hai impiegato per spiegarmelo finora, mi sento quasi arrivato ma mi manca il livello di targeting.
Jon

Ora ho provato questa regola di base: KERNEL=="sd??", NAME="%k", RUN+="mkdir /mnt/usbstick-%k; mount /dev/usbstick-%k /mnt/usbstick-%k"- ma no, ovviamente non funziona neanche. Ora sto diventando sempre più frustrato dopo aver trascorso quasi tutto il giorno semplicemente cercando di capire come ottenere una chiavetta USB che è collegata per montarsi. Le cose dovrebbero davvero essere così difficili? L'output udevadm test /sys/block/sddè - ovviamente - praticamente illeggibile, quindi non ho modo di sapere dove sto sbagliando. Qualcuno può indicarmi la giusta direzione su questo?
Jon

Risposte:


13

Pensato che dovrebbe esserci un modo molto più semplice per affrontare un problema così comune, e c'è. Ecco cosa ho provato sul mio server wheezy / sid:

sudo apt-get install usbmount

Collegare la chiavetta USB, fatto! Il mio bastone è ora accessibile attraverso /media/usb.

A proposito, usbmount non ha una pagina man, per favore leggi /usr/share/doc/usbmount/README.gzinvece. Sembra che usbmount monti il ​​tuo stick con l'opzione di sincronizzazione di default. Potrebbe essere molto meglio per il tuo bastone montarlo in modo asincrono ed eseguirlo synco umountprima di scollegarlo. Questo è configurabile.


vedi anchepumount
Alex

Fai attenzione che usbmountnon supporta più NTFS da debian jessie: bugs.debian.org/774149
malat

Eseguendo questo su Debian Jessie, usbmount sembra non montarlo mai. La pagina del pacchetto dice che ora non è mantenuta e che sto eseguendo systemd. Mi chiedo se questo pacchetto non funziona più con le modifiche di systemd?
Travis Griggs,

In effetti, non ha funzionato per me su Jessie, vedi la mia risposta (questo: ddumont.wordpress.com/2015/09/27/… ha funzionato)
Paul,

2

Si noti che non è possibile avere un singolo nodo del dispositivo per rappresentare qualsiasi possibile pendrive collegato. E se ne collegassi due? O quando il pendrive ha più di una partizione?

In genere, ciò che si utilizza per creare un nodo dispositivo con nome personalizzato è SYMLINK+=. grep per esso nelle regole per vedere come viene utilizzato: grep SYMLINK /etc/udev/rules.d/*. Come in tutti i comandi innescati da udev, è possibile utilizzare alcune variabili significative descritte in man udev. Potresti capire che non hai davvero bisogno di dare un nome personalizzato al dispositivo, dal momento che puoi alimentare il suo nome in uno script (tramite la %kvariabile).

Per quanto riguarda la soluzione di montaggio automatico, dai un'occhiata a UAM , che ho descritto un po 'nella risposta a questa domanda .


Capisco questi vincoli. In effetti, ho sempre e solo bisogno di supportare una singola chiavetta USB collegata in qualsiasi momento a questo particolare sistema. Tuttavia, avrei bisogno di supportare più partizioni sulla chiavetta USB (sarebbe bello se questi potessero essere montati in sottocartelle dal punto di montaggio). Dati questi requisiti, hai qualche consiglio per una potenziale soluzione? A causa della natura del progetto, devo evitare di utilizzare software aggiuntivo di terze parti, se possibile.
Jon

Dai un'occhiata alla modifica che ho appena effettuato (la parte centrale). Questo sarebbe abbastanza?
rozcietrzewiacz,

Si noti inoltre che UAM non è in realtà un programma: è un mucchio di belle udevregole con script di accompagnamento. Puoi dare un'occhiata alle regole e adattarle facilmente alle tue esigenze.
rozcietrzewiacz,

Grazie per il consiglio. Un'altra cosa: pensi che potresti guardare il mio output udevadme dirmi quale dispositivo è il dispositivo che dovrei effettivamente prendere di mira con la mia regola? I vari esempi che ho visto online sembrano coinvolgere alberi molto più corti e ogni esempio sembra indirizzare un diverso livello di dispositivo, senza alcuna spiegazione su quale debba essere preso di mira e perché.
Jon

Ho appena aggiunto un aggiornamento sopra, qualche idea? Grazie!
Jon

2

Ecco come l'ho fatto di recente e sono abbastanza contento di questo approccio ora. Questo è per Ubuntu 12.04 + Gentoo, ma suppongo che qualsiasi distro, che consente di installare udev e autofs dovrebbe funzionare.

Prerequisiti: devi aver installato udev + autofs.

Passo 1)

Crea il seguente file "/etc/udev/rules.d/90-usbsd-auto.rules" (ovviamente puoi usare qualsiasi nome purché termini con ".rules"). :

# Add symlink /dev/usbdisks/<label> to /dev/sd[a-z][1-9] 
# for automounter support

ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", \
    SYMLINK+="usbdisks/%k", MODE:="0660", \
    RUN+="/bin/rm /media/usb/%k", \
    RUN+="/bin/ln -sf /media/autousb/%k /media/usb/%k"

# Some FileSystems emit a "change" event when they are unmounted.
# UDEV seems to delete the device symlink in this case :-(
# So we need to re-create it here
ACTION=="change", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", \
    SYMLINK+="usbdisks/%k", MODE:="0660"


# When device is removed, also remove /media/usb/<...>
ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", \
    RUN+="/bin/rm /media/usb/%k"

Cosa fa: Crea due collegamenti simbolici, uno per la partizione del dispositivo di archiviazione USB in "/ dev / usbdisks / <...>".

Il secondo link simbolico si collegherà da "/ media / usb / <...>" a "/ media / autousb / <...>" per il supporto dell'automounter (vedere il passaggio 2).

Per assicurarti che udev legga queste regole usa

sudo udevadm control --reload-rules

Nota: stesso nome per la stessa chiavetta USB: possibile ma forse pericoloso: è possibile utilizzare ad esempio "$ env {ID_FS_LABEL_ENC}", anziché "% k" nelle precedenti regole UDEV. Questo userà l'etichetta del volume per creare / media / usb / <...>, ma cosa succede se si collegano due chiavette USB ed entrambi usano la stessa etichetta del volume ...

Con questo file di regole udev tutto è configurato per montare automaticamente la partizione del dispositivo di archiviazione USB. Si noti che in questo momento, il dispositivo NON verrà montato automaticamente (intenzionalmente). Verrà montato automaticamente dopo averlo utilizzato

Passo 2)

Imposta autofs su automount / media / autousb / <...>: ho aggiunto la seguente riga al mio file "/etc/auto.master" (per Ubuntu 12.04):

/media/autousb /etc/auto.usb --timeout=60

Ciò significa che AutoFS smonterà il dispositivo dopo 60 secondi di inattività. Potresti voler usare meno o più, a seconda dei tuoi gusti.

Per Gentoo devi modificare "/etc/autofs/auto.master" in modo che abbia senso usarlo

/media/autousb /etc/autofs/auto.usb --timeout=60

Ora ho creato "auto.usb" con il seguente contenuto:

#!/bin/bash

key=${1}
fstype=$(/sbin/blkid -o value -s TYPE /dev/usbdisks/${key})
if [ "${fstype}" = "vfat" ] ; then
  echo "-fstype=vfat,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}"
  exit 0
fi
if [ "${fstype}" = "ntfs" ] ; then
  echo "-fstype=fuse.ntfs-3g,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}"
  exit 0
fi
if [ "${fstype}" = "ext4" ] ; then
  echo "-fstype=ext4,sync,nocheck :/dev/usbdisks/${key}"
  exit 0
fi

exit 1

Questo auto.usb deve essere eseguibile, in modo che autofs lo usi come uno script (bash). Quindi per esempio

sudo chmod 0755 /etc/auto.usb

Cosa fa: Questo script dirà ad AutoFS (/ usr / sbin / automount) come montare la partizione del dispositivo di archiviazione USB.

Lo script utilizzerà prima "/ sbin / blkid" per scoprire quale tipo di file system è sulla partizione.

Lo script fornirà quindi le giuste opzioni di montaggio in base alla partizione del dispositivo.

Nota: ho incluso il codice di esempio per "vfat" (probabilmente più comune per le chiavette USB), i file system "ntfs" e "ext4". Ovviamente è abbastanza facile estenderlo per supportare più file system.

Passaggio 3)

Opzionale ... Per "espellere" == smonta le tue chiavette USB (o partizioni sulla chiavetta USB), crea uno script sotto / sbin / usbeject:

#!/bin/bash
# make sure everything is written to USB disk(s)
sync
# sending SIUGSR1 to automount will unmount the media
killall -s SIGUSR1 /usr/sbin/automount

Con questo script potresti usare "sudo usbeject" per smontare tutte le partizioni di dispositivi USB montate (dicendo a automount di smontarle).

Ovviamente puoi semplicemente assicurarti che la partizione non sia usata da nessuna parte; l'automounter smonterà quindi la partizione dopo il timeout di 60 secondi ...

Il vero trucco qui è usare i collegamenti simbolici da "/ media / usb" a "/ media / autousb":

  • I symlink "/ media / usb" saranno creati da udev, offrendo all'utente una semplice panoramica delle partizioni del dispositivo di archiviazione USB
  • AutoFS eseguirà il montaggio automatico della partizione su richiesta se la si utilizza tramite / media / usb
  • Con il file "auto.usb" con script potresti supportare qualsiasi tipo di file system e inoltre puoi supportare qualsiasi tipo di schema di denominazione.
  • Questo approccio supporta le chiavette USB con più partizioni, anche se queste partizioni utilizzano diversi tipi di file system.

Posso mostrarvi come il suggerimento autofs distrugge la mia directory / home / frank? Grazie.
Frank,

1

Mi dispiace rispondere alla mia domanda e molte grazie a rozcietrzewiacz per il contributo, ma alla fine sono riuscito a fare alcuni importanti progressi usando la seguente regola dopo ore di lettura online:

SUBSYSTEMS=="scsi", KERNEL=="sd[a-h]1", SYMLINK+="removable", RUN+="/bin/mount /dev/removable /path/to/mount"

Questo monterà la prima partizione di qualsiasi dispositivo SCSI. Immagino che la prossima domanda sarà come montare più partizioni, ma questo è un altro problema per un altro giorno.


1
Non è una buona regola. Ciò corrisponderà anche alle partizioni dei dischi rigidi . c'è un removableattributo che dovresti testare, e piuttosto blockinvece di scsi.
rozcietrzewiacz,

1

Ho scoperto che la risposta migliore in realtà è diventata obsoleta, poiché non è mantenuta e non funziona su / da Jessie (vedi commento di Malat)

Per me (su Jessie), la soluzione in questo blog ha funzionato come un fascino.

Ringraziamenti a "ddumont", ma pubblicando qui una panoramica del suo blog / risposta, per far fronte a possibili marcimenti dei link in futuro.

Aggiungi la seguente riga a /etc/fstab

/dev/sr0 /media/bluray auto defaults,nofail,x-systemd.automount 0 2

Puoi farlo usando nano:

sudo nano /etc/fstab

Spiegazione:

/dev/sr0è il file del dispositivo. Puoi anche usare uno dei collegamenti simbolici impostati da udev in / dev / disk / by-id. Dovrai modificarlo in base al file del tuo dispositivo ( sudo fdisk -lper elencare i dispositivi)

/media/blurayè il punto di montaggio. Puoi scegliere un altro punto di montaggio

nofail è necessario per evitare la segnalazione di guasti durante l'avvio senza un disco nell'unità ottica

x-systemd.automount è l'opzione per configurare systemd per montare automaticamente il disco inserito

Non specificare noauto: questo impedirebbe a systemd di montare automaticamente un disco, il che vanifica lo scopo.

Test

Esegui il comando journalctl -x -fin un terminale per verificare cosa sta succedendo con systemd

Ricarica la configurazione di sistema con sudo systemctl daemon-reload.

caricare un disco nell'unità ottica

Quindi journalctl dovrebbe mostrare qualcosa come:

Sept. 27 16:07:01 frodo systemd[1]: Mounted /media/bluray.

Ulteriore

Per montare con successo le unità NTFS ho dovuto installare ntfs-3g (vecchio ntfsprogs)

sudo apt-get install ntfs-3g

Non ho dovuto installare hfsprogs per far funzionare un USB formattato OSX, ma dovresti verificarlo tu stesso.


Non si monta automaticamente sul mio jessie Debian con un USB-HDD.
buhtz,

@buhtz ma il montaggio funziona manualmente? I passaggi sopra in realtà hanno funzionato solo per me per le unità che erano nel sistema all'avvio, non "dinamicamente" inserendo e rimuovendo gli USB mentre il sistema è in esecuzione.
Paolo,
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.