
Ich versuche, ein ISO mit einem Linux-Livesystem von einer vorhandenen NTFS-Partition auf einem PC zu booten. Der PC hat UEFI und die Festplatte ist mit GPT partitioniert, daher ist GRUB4DOS keine Option. Ist das überhaupt möglich?
Ich weiß, dass die Frage schon einmal gestellt wurde:Grub - Debian-ISO-Datei von der NTFS-Partition booten und installieren, aber dort gibt es keine genehmigten Antworten - deshalb frage ich noch einmal. Außerdem möchte ich meinen eigenen Kernel anstelle eines festen und vorkompilierten verwenden.
Aus den anderen Antworten geht hervor, dass ich eine Art angepasste Kerneldatei einbinden muss (ich nehme an, ich platziere sie in einer EFI-Partition), die dann in der Lage ist, den Rest des ISO(?) vom NTFS selbst zu laden.
Dies kann bereits auf der FAT-Partition erfolgen, indem Sie einfach einen GRUB-Eintrag vornehmen
menuentry "Boot LINUX FROM ISO FILE" {
set iso_path=/path_to/image_on_FAT_filesystem.iso
loopback loop (hdX,msdosY)$iso_path
linux (loop)/path_to/vmlinuz nomagic base_only norootcopy from=$iso_path
}
Antwort1
Also, als Lösung;
Hintergrund: Ich verwende Arch Linux. Es verwendetmkinitcpioum sein Initramfs (und den frühen Userspace(!)) zu generieren. Da wir ein Dateisystem-Image vom NTFS booten, müssen wir das Initramfs optimieren. Wir können GRUB und sein NTFS-Modul verwenden, um den Kernel und das Initramfs von der NTFS-Partition zu lesen (das GRUB-NTFS-Modul ist meines Wissens nach ro). Danach müssen wir noch die NTFS-Partition vom Initramfs mounten, um vollen Lese-/Schreibzugriff zu haben.
Funktionsweise der Lösung: Ich habe die Pakete ntfs-3g und fusefs zum initramfs hinzugefügt, damit die NTFS-Partition gemountet werden kann. Außerdem habe ich ein neuesmkinitcpio-Hakendas vor dem eigentlichen Mounting-Hook geladen werden muss. Der Hook ist ein einfaches Shell-Skript, das die Parameter abruft (diese werden als Kernel-Argumente von GRUB angegeben) wie
menuentry "Boot LINUX FROM ISO FILE" {
insmod ntfs
set root='(hdX,Y)'
linux /in_ntfs/vmlinuz-linux root=UUID=*GPT_UUID_OF_ROOTFS_ON_DISK_IMAGE* image_path=*path_to_disk_image_on_NTFS* image_hd=*GPT_UUID_OF_NTFS_DISK*
initrd /in_ntfs/initrd.img
}
- Speicherort des Disk-Images innerhalb der NTFS-Partition (Image-Pfad)
- GPT-GUID der NTFS-Partition (image_hd)
- Wenn das Disk-Image mehrere Partitionen enthält, die rootfs UUID (root)
Der Bootvorgang bezüglich der Festplatteneinbindungen:
- Der initcpio-Hook mountet die NTFS-Partition
- Der initcpio-Hook mountet das Disk-Image von der NTFS-Partition als Loop-Device
- Nun wird der normale Mount-Hook ausgeführt. Er erhält die ext4-Partition oder eine andere Partition, die Linux-Rootfs enthält, innerhalb des Disk-Images, das in Schritt 2 gemountet wurde.
- Das System verlässt den frühen Benutzerbereich; Newroot wird auf die RootFS-Partition der NTFS-Loop-gemounteten Image-Datei eingestellt.
- Tada, wir haben ein laufendes Linux-System mit Lese- und Schreibberechtigungen, das von einem Disk-Image/ISO-Image innerhalb einer NTFS-Partition ausgeführt wird.