Wie richte ich ein Loop-Gerät beim Booten ein?

14

Ich möchte beim Booten ein Loop-Gerät einrichten. Ich frage mich, wie das am besten geht.

Ich habe auf Google danach gesucht. Einige sagen das Hinzufügen einer udev-Regel, andere das Einfügen von Skripten /etc/init.d, andere modifizieren sogar die initramfs.

Was ist der beste oder richtige Weg, um dies zu tun? Könnten Sie bitte einige Details angeben (wie es geht)?

Vielen Dank.

Roun
quelle
Ich würde mit /etc/init.d/somethingoder gehen /etc/rc.local, aber ich schlage vor, mit welcher Methode auch immer zu bleiben, die funktioniert.
Enzotib
6
Wozu? Wenn Sie möchten, dass eine Datei beim Booten eingehängt wird, fügen Sie sie einfach mit der Option loop zu / etc / fstab hinzu, und mount übernimmt die Konfiguration des Loopback-Geräts für Sie.
Psusi
@psusi: Vielen Dank für Ihren Rat, aber für meinen Zweck reicht das Mounten nicht aus, und tatsächlich kann die Datei nicht einfach gemountet werden. Es ist eher ein Festplatten-Image als ein Partitions-Image. Und ich muss den genauen Namen des Loop-Geräts kennen, um damit eine virtuelle Festplatte in VirtualBox erstellen zu können. (Ich halte diese Art der virtuellen Festplatte für einfacher, Dateien zwischen der virtuellen Maschine und der Host-Maschine freizugeben. Der integrierte freigegebene Ordner funktioniert für einige Anwendungen nicht.)
Roun
4
Sie können die virtuelle Maschine nur auf die Datei und nicht auf das Loopback-Gerät verweisen. Sie müssen auch sehr vorsichtig sein, um sicherzustellen, dass Sie die virtuelle Maschine niemals gleichzeitig ausführen (oder anhalten lassen) und das Dateisystem auf dem Host bereitstellen, da sonst die fs beschädigt werden. Aus diesem Grund ist es eine viel bessere Idee, das Netzwerk zu verwenden, um die Gastzugriffsdateien, die der Host über nfs oder samba oder sshfs freigibt, zu haben.
Psusi
@Roun: Partitionen in der Datei können weiterhin gemountet werden, obwohl Sie den Sektoroffset der Partition vom Dateianfang an angeben müssen (z. B. mount /disk.img /mnt -o loop,offset=2048für die erste Partition). Offsets können mit parted oder fdisk gefunden werden, sobald das Loop-Gerät eingerichtet ist (siehe meine Antwort unten).
Zanfur

Antworten:

7

In Ubuntu gibt es mindestens drei "geeignete" Möglichkeiten, um Startup-Dinge zu erledigen (vorausgesetzt, Sie möchten sie nicht nur mounten), die hier in absteigender Reihenfolge aufgeführt sind:

  1. /etc/init/*.conf (Emporkömmling)
  2. /etc/init.d/* (sysvinit)
  3. /etc/rc.local (Runlevel Change Script)

Es gibt auch die Möglichkeit, udev-Regeln zu verwenden, diese sind jedoch kompliziert. Ich empfehle dagegen. Das Sysvinit-Skript ist für so eine kleine Sache zu viel des Guten, also werde ich mich auf die beiden anderen Optionen konzentrieren. Das Skript zum Ändern des Runlevels ist am einfachsten (wenn auch am wenigsten bevorzugt), also fange ich dort an.

Die /etc/rc.localDatei wird einfach vom /etc/init.d/rc.localsysvinit-Skript ausgeführt, das (standardmäßig) zuletzt ausgeführt wird, wenn Sie zu einem normalen Runlevel "on" wechseln (z. B. wenn Sie normal booten, aber nicht, wenn Sie herunterfahren oder in den Wiederherstellungsmodus wechseln). Um das Einrichten des Startgeräts zu implementieren, fügen Sie dies einfach am Ende von hinzu /etc/rc.local, vorausgesetzt, Ihre Datei wird aufgerufen /srv/diskimageund Sie möchten sie /dev/loop0als Loop-Gerät verwenden:

losetup /dev/loop0 /srv/diskimage

Das ist wirklich alles was dazu gehört. Ersetzen Sie die Dateinamen natürlich durch die Namen, die für Ihr Setup am besten geeignet sind.

Wenn Sie etwas genauer darauf eingehen möchten, können Sie einen Upstart-Job dafür erstellen, der ihn einrichtet, sobald das Dateisystem, das ihn enthält, eingehängt wurde. Ein Beispiel wäre das Folgende, vorausgesetzt, dass /srves sich um den Einhängepunkt handelt, der Ihre diskimageDatei enthält:

description     "Setup loop devices after filesystems are mounted"

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

Dies sollte einfach genug sein, um es konzeptionell zu befolgen: Die erste Zeile ist nur ein Kommentar für den menschlichen Leser, und es enthält Anweisungen für Upstart, um zu warten, bis das /srvDateisystem bereitgestellt ist, den Prozess losetup auszuführen und sich als beendet zu betrachten, wenn der Prozess erfolgreich beendet wird (a " Task ", im Gegensatz zu einem Dienst, der persistent ist). Fügen Sie diese Inhalte einfach in eine Datei ein, die übereinstimmt /etc/init/*.conf. Ich würde selbst wählen /etc/init/losetup.conf.

Die Vorteile von Upstart-Jobs /etc/rc.localfür so eine einfache Sache sind klein, aber wichtig. Erstens /etc/rc.localist es veraltet und seine Verwendung als "unordentlicher Sandkasten, um Dinge zu erledigen" wird heutzutage von so ziemlich jedem missbilligt. Einige Programme, die diese Datei verwenden, können unter anderem den Inhalt überschreiben, und es ist schwierig, verschiedene Skripts zu synchronisieren, die in dieselbe Datei aufgenommen werden müssen. Zweitens erledigt Upstart die Abhängigkeitsprüfung für Sie (stellen Sie sicher, dass das Dateisystem zuerst gemountet ist). Wenn also Probleme beim Mounten des Dateisystems auftreten, wird dies nicht der Fall seinVersuchen Sie, das Loop-Gerät einzurichten, aber sobald Sie es aufgelöst und gemountet haben. Drittens ist Upstart wesentlich flexibler: Sie können beispielsweise festlegen, dass ein unbenutztes Loop-Gerät gefunden werden soll, und dieses Loop-Gerät zur Verwendung in anderen Upstart-Jobs "ausgeben", ähnlich wie wir es mit der Variablen "MOUNTPOINT" getan haben in diesem Beispiel oben.

zanfur
quelle
Wie wird die /etc/init/losetup.conf aufgerufen ??? Es funktioniert nicht für mich ...
Imran
1

Wie @psusi hervorhob, ist es am einfachsten, die folgende Zeile in Ihre /etc/fstabDatei einzufügen

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

Jetzt neu starten oder mount -aals root ausführen . Dann sollte das Gerät montiert werden. Sie können das mit überprüfen lsblk.

Navigaid
quelle