I am looking for a way to mount an img file (Batocera to be precise) in grub2 and boot from it. It's located in an ntfs formatted partition. I was able to use the loopback command to ls into the image and initiate the boot process only to be greeted with "can't open blockdev" error message. As pointed out in this thread, it's an obvious result given the fact that the image didn't get mounted.
Things I would like to know
Here are some questions which I would like to be answered, preferably with supporting resources for further reading, so that I can understand things better.
- Can kpartx, losetup and loop mounting be used to mount the image pre-boot (when in grub2), so that the mounted media can be used as a boot device?
- Is it possible to mount the image from grub shell using the built in commands? If so, how?
- From similar previous posts, I learnt that an accompanying shell/bash script can be used to mount the image. Where does the script execute? In grub shell?
- How do I execute the script? Should the script be run by adding a new grub menu entry or does it need to be added as a kernel parameter?
- In the script, how do I specify the path to the image? Should I just use the grub shell format, ie.,
(hd1, gpt3)/path/to/image.vhd?
Disk information obtained using
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
Things I've tried
I was able to successfully mount the image from ubuntu desktop using the below methods.
losetup
sudo losetup -Pf /media/Boot/Batocera.vhd
kpartx
$ 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
Mount and loop
sudo mount /media/Boot/Batocera.vhd /mnt/boot_root \
-o loop,offset=2097152
But when I tried to run the following script during the boot process, nothing seems to happen.
#!/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
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
}
Limitations
If at all possible, I would like to avoid any Kernel modifications / initramfs alterations as it ensures re-usability with future updates.
Threads referred
Booting an EXT4 image file from GRUB2
https://askubuntu.com/questions/69363/mount-single-partition-from-image-of-entire-disk-device
Thanks for the help.