我的朋友需要一块快速的 HDD,所以我给了她我的 64GB 小型 SDD。这块 SSD 上安装了我的 Linux。我使用 dd 制作了分区的映像(启动、根目录和主目录位于一个分区上)。
该分区现在位于传统的 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}
注意:仅当 initramfs 中安装了 kpartx 时,此功能才有效