Come configurare un dispositivo loop all'avvio?


14

Voglio configurare un dispositivo ad anello al momento dell'avvio. Mi chiedo quale sia il modo migliore per farlo.

L'ho cercato su Google. Alcuni dicono di aggiungere una regola udev, altri dicono di inserire uno script /etc/init.d, altri addirittura di modificare initramfs.

Qual è il modo migliore o giusto per farlo? Potresti fornire alcuni dettagli (su come fare)?

Grazie.


Vorrei andare con /etc/init.d/something, o /etc/rc.local, ma suggerisco di rimanere con qualsiasi metodo che funzioni.
enzotib,

6
Per che cosa? Se vuoi che un file venga montato all'avvio, aggiungilo a / etc / fstab con l'opzione loop e mount si occuperà di configurare il dispositivo loopback per te.
psusi,

@psusi: Grazie per il tuo consiglio, ma per il mio scopo, il montaggio non è sufficiente e in effetti il ​​file non può essere semplicemente montato. È un'immagine del disco piuttosto che un'immagine della partizione. E ho bisogno di conoscere il nome esatto del dispositivo loop per poterlo utilizzare per creare un disco virtuale in VirtualBox. (Faccio questo tipo di disco virtuale pensando che sia più facile condividere i file tra la macchina virtuale e la macchina host. La cartella condivisa integrata non funziona per alcune applicazioni.)
Roun

4
Puoi semplicemente puntare la macchina virtuale verso il file anziché verso il dispositivo di loopback. Devi anche fare molta attenzione per assicurarti di non eseguire mai la macchina virtuale (o di averla sospesa) e di montare il filesystem sull'host allo stesso tempo, altrimenti danneggi il file fs. Per questa ragione, è molto meglio usare la rete per avere i file di accesso guest che l'host sta condividendo tramite nfs o samba o sshfs.
psusi,

@Roun: le partizioni nel file possono ancora essere montate, sebbene sia necessario specificare l'offset settoriale della partizione dall'inizio del file (ad es. mount /disk.img /mnt -o loop,offset=2048Per la prima partizione). Gli offset possono essere trovati usando parted o fdisk una volta impostato il dispositivo loop (vedi la mia risposta qui sotto per quello).
zanfur,

Risposte:


7

Esistono almeno tre modi "appropriati" per eseguire le operazioni di avvio in Ubuntu (supponendo che non si desideri semplicemente montarlo), elencati qui in ordine di preferenza decrescente:

  1. /etc/init/*.conf (Upstart)
  2. /etc/init.d/* (Sysvinit)
  3. /etc/rc.local (runlevel change script)

C'è anche la possibilità di usare le regole udev, ma sarà contorto. Lo sconsiglio. Lo script sysvinit è eccessivo per una cosa così piccola, quindi mi concentrerò sulle altre due opzioni. Lo script di modifica del runlevel è il più semplice (anche se il meno preferito), quindi inizierò da lì.

Il /etc/rc.localfile viene semplicemente eseguito dallo /etc/init.d/rc.localscript sysvinit, che (per impostazione predefinita) viene eseguito per ultimo quando si passa a un normale runlevel "on" (ad esempio quando si avvia normalmente, ma non quando si chiude o si passa alla modalità di ripristino). Per implementare la configurazione del dispositivo di avvio, basta aggiungerlo alla fine di /etc/rc.local, supponendo che il file sia chiamato /srv/diskimagee che si desidera utilizzare /dev/loop0come dispositivo loop:

losetup /dev/loop0 /srv/diskimage

Questo è davvero tutto ciò che c'è da fare. Ovviamente, sostituisci i nomi dei file con quelli che funzionano meglio sulla tua configurazione.

Se vuoi essere un po 'più specifico a riguardo, puoi creare un processo Upstart per esso che lo configura una volta che il filesystem che lo contiene è stato montato. Un esempio sarebbe il seguente, supponendo che /srvfosse il punto di montaggio contenente il tuo diskimagefile:

description     "Setup loop devices after filesystems are mounted"

start on mounted MOUNTPOINT=/srv
task
exec losetup /dev/loop0 /srv/diskimage

Questo dovrebbe essere abbastanza semplice da seguire concettualmente: la prima riga è solo un commento per i lettori umani, ed è istruzioni per Upstart di attendere fino al /srvmontaggio del filesystem, eseguire il processo losetup e considerarti finito quando il processo termina correttamente (un " compito ", al contrario di un servizio persistente). Basta mettere quei contenuti in un file corrispondente /etc/init/*.conf. Vorrei scegliere /etc/init/losetup.confme stesso.

I vantaggi dei lavori Upstart rispetto /etc/rc.locala una cosa così semplice sono piccoli ma importanti. In primo luogo, /etc/rc.localè deprecato e il suo uso come un "sandbox disordinato per fare le cose" è visto di buon occhio da quasi tutti in questi giorni. Tra le altre ragioni per aggrottare le sopracciglia sul suo utilizzo, alcuni programmi che usano quel file sovrascriveranno semplicemente il contenuto ed è difficile riconciliare diversi script che devono andare nello stesso file. In secondo luogo, Upstart gestisce effettivamente il controllo delle dipendenze (assicurandosi che il filesystem sia montato per primo), quindi se c'è un problema con il montaggio del filesystem non lo faràprova a configurare il dispositivo loop .... ma una volta risolto e montato. Terzo, Upstart è molto più flessibile: ad esempio, è possibile che sia abbastanza intelligente da trovare un dispositivo loop inutilizzato ed "emettere" quel dispositivo loop per l'uso in altri lavori upstart, in modo simile a come abbiamo usato la variabile "MOUNTPOINT" in questo esempio sopra.


Come ha invocato il file /etc/init/losetup.conf ??? Non funziona per me ...
Imran,

1

Come sottolineato da @psusi, il modo più semplice è aggiungere la seguente riga nel tuo /etc/fstabfile

/path/to/loop/device       /path/to/mount/point       auto       loop       0 0

Ora riavvia o esegui mount -acome root. Quindi il dispositivo dovrebbe essere montato. Puoi verificarlo con lsblk.

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.