从 GRUB2 启动 EXT4 映像文件

从 GRUB2 启动 EXT4 映像文件

我的朋友需要一块快速的 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 时,此功能才有效

相关内容