从 grub2 挂载并从磁盘映像(img/vhd)启动

从 grub2 挂载并从磁盘映像(img/vhd)启动

我正在寻找一种方法来在 grub2 中安装 img 文件(准确地说是 Batocera)并从中启动。它位于 ntfs 格式的分区中。我能够使用命令loopback进入ls映像并启动启动过程,但只收到“无法打开 blockdev”错误消息。正如指出的那样线程,由于图像没有被安装,这是一个显而易见的结果。

我想知道的事情

以下是一些我希望得到解答的问题,最好能提供支持性资源以供进一步阅读,以便我更好地理解。

  1. 是否可以使用 kpartx、losetup 和循环挂载来预启动时挂载映像(在 grub2 中),以便挂载的介质可以用作启动设备?
  2. 是否可以使用内置命令从 grub shell 挂载映像?如果可以,怎么做?
  3. 从之前类似的帖子中,我了解到可以使用附带的 shell/bash 脚本来挂载映像。脚本在哪里执行?在 grub shell 中?
  4. 我如何执行脚本?是否应通过添加新的 grub 菜单项来运行脚本,还是需要将其添加为内核参数?
  5. 在脚本中,我该如何指定图像的路径?我应该只使用 grub shell 格式吗(hd1, gpt3)/path/to/image.vhd

使用获取的磁盘信息 sudo parted /media/Boot/Batocera.vhd UNIT b print

Number  Start     End       Size     File system  Name                Flags  

1      2048s     3145727s  3143680s  fat32        Basic data partition  msftdata  
2      3145728s  5281791s  2136064s  ext4         Basic data partition  msftdata

我尝试过的事情

我能够使用以下方法从 ubuntu 桌面成功安装映像。

失败

sudo losetup -Pf /media/Boot/Batocera.vhd

陣容

$ sudo kpartx -av /media/Boot/Batocera.vhd    
add map loop18p1 (252:2): 0 3082240 linear /dev/loop0 2048    
add map loop18p2 (252:3): 0 17887232 linear /dev/loop0 3084288

安装和循环

sudo mount /media/Boot/Batocera.vhd /mnt/boot_root \
-o loop,offset=2097152

但是当我尝试在启动过程中运行以下脚本时,似乎什么都没有发生。

#!/bin/sh

modprobe loop
modprobe vfat
modprobe ext4

mkdir /boot_root
mkdir /SHARE
mount -o loop,offset=1048576B -t vfat /media/Boot/Batocera.vhd /boot_root
mount -o loop,offset=1610612736B -t ext4 /media/Boot/Batocera.vhd /SHARE

GRUB2 菜单项

menuentry "Batocera" {
    insmod ntfs
    insmod linux
    insmod part_gpt
    insmod part_msdos
    loopback loop (hd1,gpt4)/Boot/Distros/Batocera.vhd
    linux (loop,1)/boot/linux run_script=(hd1,gpt4)/Boot/Scripts/Mount_Partitions_2.sh root=/boot_root label=RECALBOX console=tty3
    initrd (loop,1)/boot/initrd.gz
}

限制

如果可能的话,我希望避免任何内核修改/ initramfs 更改,因为它可以确保将来更新时的可重复使用性。

主题引用

从 GRUB2 启动 EXT4 映像文件

https://askubuntu.com/questions/69363/mount-single-partition-from-image-of-entire-disk-device

谢谢您的帮助。

相关内容