fragen stichworte

Benutzerdefiniertes initrd-Init-Skript: Erstellen von / dev / initctl

Ich habe eine virtuelle Maschine (VMM ist Xen 3.3), die mit zwei IDE-Festplatten (/dev/hda und/dev/hdb) ausgestattet ist. Das Root-Dateisystem befindet sich in/dev/hda1, auf dem Scientific Linux 5.4 installiert ist./dev/hdb enthält ein leeres ext2-Dateisystem.

Ich möchte das Root-Dateisystem vor Schreibvorgängen durch die VM schützen, indem Sie aufs (AnotherUnionFS) ein beschreibbares Dateisystem auf das Root-Dateisystem schichten. Die Änderungen an/werden in das Dateisystem unter/dev/hdb geschrieben. (Außerhalb der VM wird die Datei, auf der/dev/hda gespeichert ist, auch auf schreibgeschützte Berechtigungen festgelegt, sodass der VMM auch verhindern sollte, dass die VM auf dieser Ebene geändert wird.) (Zweck dieses Setups: Beschädigen Sie eine virtuelle Maschine mit einer Software-implementierten Fehlerinjektion, behalten Sie jedoch das Dateisystem-Image bei, um die VM schnell in einen fehlerfreien Zustand zu starten.)

Wie bekomme ich ein initrd-init-Skript, um die erforderlichen Mounts durchzuführen, um das Union-Dateisystem zu erstellen?

Ich habe zwei Ansätze ausprobiert:

  1. Ich habe versucht, das von mkinitrd erstellte nash-Skript zu ändern. Ich weiß jedoch nicht, was setuproot und switchroot tun, und wie sie mein aufs als neue Root verwenden. Offensichtlich weiß auch niemand hier. (EDIT: Ich nehme das zurück.)

  2. Ich habe versucht, eine LiveCD (mit linux-live-6.3.0) zu erstellen und dann das Bash/linuxrc-Skript von der generierten initrd aus zu ändern, und ich habe die Mounts richtig, aber die final/sbin/init beschwert sich über/dev/initctl.

Insbesondere hängt mein/linuxrc an der "/union". Die letzten Zeilen von/linuxrc führen Folgendes aus:

cd/union
mkdir -p mnt/live
pivot_root . mnt/live
exec sbin/chroot . sbin/init </dev/console >/dev/console 2>&1

Beim Start von init wird etwas wie init:/dev/initctl: No such file or directory ausgegeben. Was soll dieses FIFO schaffen? Ich habe keinen solchen Dateinamen in den ursprünglichen linuxrc- und liblinuxlive-Skripts gefunden.

Ich habe versucht, es über "mkfifo/dev/initctl" zu erstellen, aber dann beschwerte sich init über eine Zeitüberschreitung beim Öffnen oder Schreiben in den FIFO.

Ich würde mich über jede Hilfe oder Hinweise freuen. Vielen Dank.

antworten

Wie bereits gesagt, erstellt init /dev/initctl.

Das Problem, das ich hatte, war, dass mein /linuxrc -Skript nicht mit PID 1 ausgeführt wurde. Wenn es init ausgeführt wurde, wurde es auch nicht mit PID 1 ausgeführt telinit.

Damit /linuxrc mit PID 1 ausgeführt werden kann, brauchte ich Folgendes für die Kernel-Boot-Zeile: root=/dev/ram0 rw init=/linuxrc, wie in dieses Forum beschrieben.

Jetzt funktioniert alles. Wenn die VM gebootet ist, ist die Ausgabe von mount

aufs on/type aufs (rw)
proc on/proc type proc (rw)
sysfs on/sys type sysfs (rw)
devpts on/dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on/dev/shm type tmpfs (rw)
none on/proc/sys/fs/binfmt_misc type binfmt_misc (rw)

Ja! Ist es koscher, meine eigene Antwort als "Antwort" zu kennzeichnen?

Wenn Sie bereits eine Virtualisierungslösung verwenden, warum gehen Sie dann all diese Schwierigkeiten durch? Die einfachste Lösung wäre, auf Ihrem Host so etwas wie LVM zu verwenden, das bereits Snapshot-Unterstützung bietet, und Ihrer VM einen Snapshot zu präsentieren. Das heißt:

  • Erstellen Sie ein logisches Volume (LV), das Ihr Root-Dateisystem enthält.
  • Erstellen Sie eine Momentaufnahme dieser LV
  • Konfigurieren Sie Ihre VM so, dass sie vom Snapshot aus startet.

Wenn Sie das saubere Dateisystem wiederherstellen möchten, löschen Sie den Snapshot und erstellen Sie ihn neu. Einfach und ohne Umschweife mit initrd oder aufs - es sind keine Änderungen am Gastbetriebssystem erforderlich.

Die richtige Lösung ist die Verwendung von ZFS für virtuelle Maschinen. Bevor Sie experimentieren, erstellen Sie einen Snapshot. Nimmt nur weniger als eine Sekunde und einen kurzen Zeilenbefehl: zfs snapshot (Ihr Datenträger) snapshotname. Dann können Sie alles machen, sogar die Lautstärke formatieren. Jetzt möchten Sie wiederherstellen. Ein kurzer Zeilenbefehl: zfs rollback thesnapshotname. Wenn Sie das Volume wirklich formatiert haben, dauert es einige Zeit, bis das Rollback abgeschlossen ist. Andernfalls dauert es einige Sekunden, bis der Rollback-Vorgang abgeschlossen ist. Alle Änderungen, nachdem der Schnappschuss verschwindet.

Init selbst erstellt im Allgemeinen initctl. Sie benötigen jedoch Folgendes:

/etc/inittab muss einen Eintrag für initdefault enthalten. Zweitens, senden Sie SIGUSR1 an init, nachdem /dev auf der richtigen Wurzel erneut angehängt wurde. Dadurch wird init gezwungen, die Konfiguration erneut zu lesen.