GRUB 从 NTFS 分区启动 ISO/磁盘映像

GRUB 从 NTFS 分区启动 ISO/磁盘映像

我正在尝试从 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
}
  1. NTFS 分区内的磁盘映像位置 (image_path)
  2. NTFS 分区 GPT GUID (image_hd)
  3. 如果磁盘映像包含多个分区,则 rootfs UUID(根)

关于磁盘挂载的启动过程:

  1. initcpio钩挂载NTFS分区
  2. initcpio 挂钩将 NTFS 分区中的磁盘映像安装为循环设备
  3. 现在,正常的挂载钩子已运行,它会被赋予 ext4 或在步骤 2 中挂载的磁盘映像内包含 linux rootfs 的任何分区
  4. 系统退出早期用户空间; newroot 设置为 NTFS 循环挂载映像文件的 rootfs 分区。
  5. 嗯,我们得到了一个正在运行的 Linux 系统,该系统具有从 NTFS 分区内的磁盘映像/iso 映像运行的读写权限。

相关内容