![GRUB2에서 EXT4 이미지 파일 부팅](https://rvso.com/image/1311324/GRUB2%EC%97%90%EC%84%9C%20EXT4%20%EC%9D%B4%EB%AF%B8%EC%A7%80%20%ED%8C%8C%EC%9D%BC%20%EB%B6%80%ED%8C%85.png)
내 친구는 빠른 HDD가 필요해서 작은 64GB SDD를 선물했습니다. 이 SSD에는 Linux가 설치되어 있었습니다. 저는 dd를 사용하여 파티션(한 파티션에 부팅, 루트, 홈) 이미지를 만들었습니다.
이 파티션은 이제 기존의 500GB EXT4 형식 드라이브에 있습니다.
내가 가지고 있는 이 .img 파일을 사용하여 GRUB을 부팅할 수 있는 방법이 있나요? SSD를 다시 돌려받을 수 없고 처음부터 Linux 설치를 설정하는 번거로움을 겪을 필요가 없습니다. ISO 이미지에 대한 GRUB의 루프백 지원을 발견했습니다. 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에 설치된 경우에만 작동합니다.