我正在寻找一种方法来在 grub2 中安装 img 文件(准确地说是 Batocera)并从中启动。它位于 ntfs 格式的分区中。我能够使用命令loopback
进入ls
映像并启动启动过程,但只收到“无法打开 blockdev”错误消息。正如指出的那样这线程,由于图像没有被安装,这是一个显而易见的结果。
我想知道的事情
以下是一些我希望得到解答的问题,最好能提供支持性资源以供进一步阅读,以便我更好地理解。
- 是否可以使用 kpartx、losetup 和循环挂载来预启动时挂载映像(在 grub2 中),以便挂载的介质可以用作启动设备?
- 是否可以使用内置命令从 grub shell 挂载映像?如果可以,怎么做?
- 从之前类似的帖子中,我了解到可以使用附带的 shell/bash 脚本来挂载映像。脚本在哪里执行?在 grub shell 中?
- 我如何执行脚本?是否应通过添加新的 grub 菜单项来运行脚本,还是需要将其添加为内核参数?
- 在脚本中,我该如何指定图像的路径?我应该只使用 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 更改,因为它可以确保将来更新时的可重复使用性。
主题引用
https://askubuntu.com/questions/69363/mount-single-partition-from-image-of-entire-disk-device
谢谢您的帮助。