2011-08-23 8 views
6

Sto utilizzando udev per rilevare la connessione e la disconnessione dell'unità USB sul server Ubuntu 10.04 LTS x64. Tutto funziona correttamente quando i dispositivi USB sono collegati mentre la macchina è in esecuzione, ma se uno è già presente all'avvio, il mio script non viene completato, apparentemente perché lo mkdir /tmp/blah non funziona.udev: dispositivo connesso all'avvio

Se successivamente digitare sudo udevadm trigger al terminale, tutto è a posto.

Suppongo che al punto che udev prima valuti i dispositivi connessi rispetto alle sue regole, il filesystem di root non è stato montato.

Le mie domande sono quindi:

  1. ho io identificato correttamente il problema?
  2. Esiste un modo standard per risolverlo? Esiste quindi un'alternativa allo /tmp/ che è possibile utilizzare sia prima che dopo / sia stato montato?
+0

Ottima domanda per http://unix.stackexchange.com/ –

+0

Potrebbe avere ragione ... che o serverfault. Comunque sto scrivendo uno script bash: la mia testa è in modalità di programmazione quindi sono venuto qui, forse senza pensarci completamente! –

risposta

5

Il filesystem di root è montato, ma è di sola lettura al momento. /dev/shm (un filesystem in memoria) dovrebbe essere disponibile; le nuove distribuzioni linux possono anche avere un ramdisk /run. Puoi anche scegliere una directory permanente da qualche parte, montare un tmpfs su di esso nel tuo script e fare il tuo lavoro lì.

+0

Spostare l'elaborazione da '/ tmp /' a '/ dev/shm /' risolve il problema - grazie mille per il vostro aiuto. Presumibilmente questo file system è persistente mentre la macchina è in funzione? –

+0

Sì, ma è un filesystem in memoria, quindi non usare troppo spazio lì. – bdonlan

1

1- Non so, anche in initramfs, prima che il filesystem di root sia montato, esiste una directory/tmp scrivibile.

Vero, quando viene montata la radice reale questo/tmp verrà scartato e il finale/tmp sarà vuoto. Sei sicuro che il comando mkdir /tmp/blah stia fallendo? O lo presumi perché non è lì quando lo cerchi?

2- In Ubuntu (non so di altre distro) si dispone di una directory nascosta in /dev/.initramfs per questo tipo di esigenze. Dal momento che /dev è un mountpoint tmpfs (o devtmpfs) conservato nel filesystem di root finale, lo avrete ancora lì.

+0

le regole di udev nel filesystem di root verranno eseguite con il file system di root '/ tmp'; questo potrebbe essere prima di rimontare il file system di root in lettura-scrittura. – bdonlan

+0

Hai ragione - non ho visto il comando 'mkdir' fallire (il suo output non è loggato, al momento), ma il comando successivo (un' mount') fallisce, riportando che la directory 'mkdir' dovrebbe creare è non presente –

+0

@bdonlan che potrebbe essere esso, di sola lettura. In questo caso, configurare il/tmp come un tmpfs dovrebbe fare il trucco. Anche il trucco /dev/.initramfs dovrebbe essere valido. – rodrigo

2

Una soluzione a questo problema è scrivere uno script richiamato dalle regole udev che si scollega immediatamente e attende che si verifichi qualche evento per garantire che il sistema sia "sufficientemente avviato" per creare punti di montaggio, ecc. dispositivi. La persona che ha risposto al post seguente (http://superuser.com/questions/53978/ubuntu-automatically-mount-external-drives-to-media-label-on-boot-without-au) ha scritto uno script che controlla se "httpd" è in esecuzione prima di continuare. Sono sicuro che probabilmente ci sono anche altri modi "migliori" per farlo.

Problemi correlati