我正在尝试从 PC 上现有的 NTFS 分区启动包含 Linux live 系统的 ISO。 PC有UEFI,硬盘用GPT分区,所以GRUB4DOS不是一个选择。这完全可以做到吗?
我知道这个问题之前已经被问过:Grub - 从 ntfs 分区启动 debian iso 文件并安装它,但那里没有批准的答案 - 这就是我再次询问的原因。另外,我想使用我自己的内核,而不是一些固定和预编译的内核。
从其他答案来看,我似乎需要包含某种定制的内核文件(我假设将其放置到 EFI 分区),然后该文件能够从 NTFS 本身加载 ISO(?) 的其余部分。
这已经可以在 FAT 分区上完成,只需执行 GRUB 条目即可
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
}
答案1
所以,作为解决方案;
背景:我正在使用 Arch Linux。它用mkinitcpio生成它的 initramfs (和早期的用户空间(!))。因为我们从 NTFS 引导文件系统映像,所以需要调整 initramfs。我们可以使用GRUB及其ntfs模块从NTFS分区读取(GRUB ntfs模块是ro afaik。)内核和initramfs。此后,我们仍然需要从 initramfs 挂载 NTFS 分区以进行完全读/写访问。
解决方案的操作原理:我将ntfs-3g和fusefs包添加到initramfs中,这样就可以挂载NTFS分区了。我还创建了一个新的mkinitcpio 钩子需要在实际安装挂钩之前加载。该钩子是一个简单的 shell 脚本,用于获取参数(这些参数作为来自 GRUB 的内核参数给出),例如
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
}
- NTFS 分区内的磁盘映像位置 (image_path)
- NTFS 分区 GPT GUID (image_hd)
- 如果磁盘映像包含多个分区,则 rootfs UUID(根)
关于磁盘挂载的启动过程:
- initcpio钩挂载NTFS分区
- initcpio 挂钩将 NTFS 分区中的磁盘映像安装为循环设备
- 现在,正常的挂载钩子已运行,它会被赋予 ext4 或在步骤 2 中挂载的磁盘映像内包含 linux rootfs 的任何分区
- 系统退出早期用户空间; newroot 设置为 NTFS 循环挂载映像文件的 rootfs 分区。
- 嗯,我们得到了一个正在运行的 Linux 系统,该系统具有从 NTFS 分区内的磁盘映像/iso 映像运行的读写权限。