![Загрузка файла образа EXT4 из GRUB2](https://rvso.com/image/1311324/%D0%97%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B0%20%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%B0%20EXT4%20%D0%B8%D0%B7%20GRUB2.png)
Моей подруге нужен был быстрый HDD, поэтому я отдал ей свой маленький SDD на 64 ГБ. На этом SSD был установлен мой Linux. Я использовал dd, чтобы сделать образ раздела (boot, root и home на одном разделе).
Этот раздел теперь находится на традиционном диске емкостью 500 ГБ, отформатированном в EXT4.
Есть ли способ заставить GRUB просто загрузиться с помощью этого файла .img, который у меня есть? Я не получу свой SSD обратно, и я не хочу тратить время на установку Linux с нуля. Я наткнулся на поддержку loopback в 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}
Примечание: это будет работать только если kpartx установлен в initramfs.