![從 GRUB2 引導 EXT4 映像文件](https://rvso.com/image/1311324/%E5%BE%9E%20GRUB2%20%E5%BC%95%E5%B0%8E%20EXT4%20%E6%98%A0%E5%83%8F%E6%96%87%E4%BB%B6.png)
我的朋友需要一個快速 HDD,所以我給了她我的小 64GB SDD。這個 SSD 上安裝了我的 Linux。我使用 dd 製作分割區的映像(一個分割區上的 boot、root 和 home)。
該分割區現在位於傳統的 500GB EXT4 格式磁碟機上。
有什麼方法可以讓 GRUB 使用我擁有的這個 .img 檔案啟動嗎?我沒有拿回我的 SSD,也懶得經歷從頭開始設定 Linux 安裝的麻煩。我在 GRUB 中遇到對 ISO 映像的環回支援。這個也支援EXT4嗎?我似乎無法找到任何具體的東西,也不想丟掉任何東西。
乾杯。
答案1
即使檔案包含分割表,grub2 也可以同時啟動,其中 (hd0,1) 是檔案的位置,(loop,1) 是檔案內的分割區。然而,這只會啟動 initramfs,檔案並沒有真正掛載。
/etc/grub.d/40_custom
menuentry "My bootable disk image" {
set isofile="hdd_ext4.img"
loopback loop (hd0,1)/${isofile}
linux (loop,1)/boot/vmlinuz-3.16.0-4-amd64 root=/dev/sda1 loop=/${isofile} ro
initrd (loop,1)/boot/initrd.img-3.16.0-4-amd64
}
編寫您自己的安裝腳本,chmod a+x 並複製到 local-premount 資料夾中。使用 initramfs-tools 建立您自己的「initrd.img-3.16.0-4-amd64」並將其複製到映像檔中。無需硬編碼,只需使用腳本內 grub 條目 ${ROOT} 和 ${loop} 中的變數。
/etc/initramfs-tools/scripts/local-premount
#!/bin/sh
modprobe loop
modprobe ext4
# mount /dev/sda1 (file location)
mkdir /host
mount -n -t ext4 -o rw,data=ordered ${ROOT} /host
# kpartx add partition devmappings for hdd_ext4.img
loop_pt=$(kpartx -av /host${loop} 2>&1 | grep loop | cut -f3 -d" ")
# mount hdd_ext4.img (image file)
mount -n -t ext4 -o loop,rw,data=ordered /dev/mapper/${loop_pt} ${rootmnt}
注意:只有當 kpartx 安裝在 initramfs 中時才有效