Ich versuche, ein bootfähiges UEFI-CD-ISO mit einem komprimierten Dateisystem aus einer virtuellen Maschine zu erstellen, die ich mit den benötigten Inhalten bereitgestellt habe.
Erklären:
- Ich verwende Packer und eine Kickstart-Datei, um CentOS 7 zu installieren
- Ich verwende ein Packer-Provisioning-Skript, um einige Binärdateien zu kompilieren, die ich auf dem Image benötige
- Ich folgte den Anweisungen vonHierum ein komprimiertes Dateisystem-Image zu erstellen, nachdem alles, was ich brauche, im Betriebssystem ist:
mkdir -p /mnt/squashfs /squashfs
mount -o bind / /mnt/squashfs
mksquashfs /mnt/squashfs /squashfs/filesystem.squashfs -comp gzip -no-exports -xattrs -noappend -no-recovery -e /mnt/squashfs/squashfs/filesystem.squashfs
find /boot -name 'vmlinuz-*' -type f -exec cp {} /squashfs/vmlinuz \;
find /boot -name 'init*' -type f -exec cp {} /squashfs/initrd.img \;
- Danach habe ich einige Skripte vonHierSo erstellen Sie ein ISO:
yum -y install xorriso dosfstools grub2-efi-modules mtools
mkdir -p /iso /iso_src/ /iso_src/live
find /boot -name 'vmlinuz-*' -type f -exec cp {} /iso_src/vmlinuz \;
find /boot -name 'init*' -type f -exec cp {} /iso_src/initrd.img \;
cp /squashfs/filesystem.squashfs /iso_src/live/
touch /iso_src/LINUX_CUSTOM
cat <<'EOF' >grub.cfg
search --set=root --file /LINUX_CUSTOM
insmod all_video
set default="0"
set timeout=30
menuentry "Custom Linux" {
linux /vmlinuz boot=live toram=filesystem.squashfs quiet nomodeset
initrd /initrd.img
}
EOF
grub2-mkstandalone \
--format=x86_64-efi \
--output=bootx64.efi \
--locales="" \
--fonts="" \
"boot/grub/grub.cfg=grub.cfg"
(dd if=/dev/zero of=efiboot.img bs=1M count=10 && \
mkfs.vfat efiboot.img && \
mmd -i efiboot.img efi efi/boot && \
mcopy -i efiboot.img ./bootx64.efi ::efi/boot/
)
xorriso \
-as mkisofs \
-iso-level 3 \
-full-iso9660-filenames \
-volid "LINUX_CUSTOM" \
-eltorito-alt-boot \
-e EFI/efiboot.img \
-no-emul-boot \
-append_partition 2 0xef efiboot.img \
-output "/iso/image.iso" \
-graft-points \
"/iso_src" \
/EFI/efiboot.img=efiboot.img
Jetzt versuche ich, diese ISO in VirtualBox mit aktiviertem UEFI zu booten, aber es schlägt fehl mit
Failed to switch root: Specified switch root path '/sysroot' does not seem to be an OS tree
Soweit ich das verstehe, wurde mein Squashfs also nicht gemountet? Ich bin ziemlich neu auf diesem Gebiet, verstehe also alle Schritte nur teilweise und habe das Gefühl, dass ich etwas übersehe, denn das Einzige, was Grub mitteilt, dass mein Dateisystem jetzt aus einer Squashfs-Datei stammen muss, statt aus der Maschine, von der ich das Image erstellt habe (auf der sich ein tatsächliches Blockgerät befand), ist das toram
Ding.
Kann jemand Hinweise/Beispiele geben, wie man dieses Problem lösen und das System booten kann? Ich habe viel darüber gelesen, dracut
konnte aber nicht verstehen, wie man es in diesem Szenario verwendet? Oder ist das einfach ein Problem mit der Grub-Konfigurationsdatei?
Aktualisieren
Nach einigem Googeln bin ich zu Dracut gewechselt und verwende jetzt in meinem Bereitstellungsskript Dracut, um Initrd wie folgt zu generieren:
dracut -a dmsquash-live -N -m "kernel-modules base" --filesystems "squashfs" /dracut/initrd.dracut.img
und verwenden Sie den folgenden Grub-Boot-Eintrag (das initrd.img hier ist das zuvor erstellte initrd.dracut.img):
menuentry "Custom Linux" {
linux /vmlinuz root=live:/dev/sr0 rd.live.debug=1
initrd /initrd.img
}
das scheint weiter zu gehen, scheitert aber mitWarning: /dev/mapper/live-rw does not exist
Aktualisierung 2
Es scheint, dass CentOS 7 mit einem älteren Dracut geliefert wird, der nur den Live-CD-Modus unterstützt (siehe The filesystem structure is traditionally expected to be:
unten Booting live images
, dem meine Struktur nicht entsprach). Also habe ich mit CentOS 8 neu angefangen, einem neueren Dracut, der mit meiner Struktur umgehen kann, und jetzt ist mein einziges Problem beim Booten, dass ich die /etc/fstab
von der Originalmaschine habe, und ich hoffe, Google hilft mir dabei, das zu lösen:D
Aktualisierung 3
Das einfache Ignorieren /etc/fstab
von „along“ /dev
und „/proc“ beim Erstellen des Squashfs hat den Trick getan – das endgültige ISO bootet erfolgreich im UEFI-Modus.