Boot
GRUB 從 NTFS 分區啟動 ISO/磁碟映像
我正在嘗試從 PC 上現有的 NTFS 分區啟動包含 Linux 實時系統的 ISO。PC 有 UEFI,硬碟是用 GPT 分區的,所以 GRUB4DOS 不是一個選項。這完全可以做到嗎?
我知道之前有人問過這個問題:Grub - boot debian iso file from ntfs partition and install it,但那裡沒有批准的答案 - 這就是我再次問的原因。我也想使用我自己的核心而不是一些固定的和預編譯的核心。
從其他答案看來,我似乎需要包含某種定制的核心文件(我假設將其放置到 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 }
所以,作為一種解決方案;
背景:我正在使用 Arch Linux。它使用mkinitcpio來生成它的 initramfs(以及早期的使用者空間(!))。因為我們正在從 NTFS 引導文件系統映像,所以我們需要調整 initramfs。我們可以使用 GRUB 及其 ntfs 模組從 NTFS 分區讀取(GRUB ntfs 模組是 ro afaik.)核心和 initramfs。在此之後,我們仍然需要從 initramfs 掛載 NTFS 分區以進行完全讀/寫訪問。
解決方案的操作原理:我在initramfs中加入了ntfs-3g和fusefs包,這樣就可以掛載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 (root)
關於磁碟掛載的引導過程:
- initcpio hook 掛載 NTFS 分區
- initcpio 掛鉤將 NTFS 分區中的磁碟映像掛載為循環設備
- 現在正常的掛載鉤子執行了,它被賦予了 ext4 或在步驟 2 中掛載的磁碟映像中包含 linux rootfs 的任何分區
- 系統退出早期使用者空間;newroot 設置為 NTFS-loop-mounted 映像文件的 rootfs 分區。
- Ta-dah,我們得到了一個正在執行的 Linux 系統,它具有從 NTFS 分區內的磁碟映像/iso 映像執行的讀寫權限。