구성:
- MacOS arm64 M1 Apple Silicon을 호스트로 사용
- Squashfs 파일 시스템과 함께 Live USB를 사용하는 Ubuntu 20.04 amd64를 게스트로 사용
- 호스트 운영 체제의 QEMU 에뮬레이터
OS에서 squashfs를 제거하고 Mac의 에뮬레이트된 amd64 가상 머신에서 실행하고 싶습니다. Ubuntu 운영 체제를 성공적으로 추출했습니다. 나는 squashfs를 설치하고 dd를 사용하여 만든 img 파일에 내용을 복사했습니다. Mac에 이미지를 복사했지만 가상 머신을 부팅하려고 하면 "부팅 가능한 장치 없음"이라는 메시지가 나타납니다.
지원되는 Linux 가상 머신에서 사용한 명령은 다음과 같습니다.
mount -t squashfs -o loop /path/to/filesystem.squashfs /sqshfs/mount/point
빈 이미지를 만들고 ext4 fs를 만들었습니다.
dd if=/dev/zeroes of=image.img bs=1M count=15000
mkfs.ext4 image.img
설치하고 파일을 복사하세요.
mount -t auto image.img /img/mount/point
cp -r /sqshfs/mount/point/* /img/mount/point
이제 이미지에 이 폴더가 있습니다.
total 112
drwxr-xr-x 2 root root 4096 Jan 10 02:37 bin
drwxr-xr-x 3 root root 4096 Jan 10 02:37 boot
drwxr-xr-x 4 root root 4096 Jan 10 02:37 dev
drwxr-xr-x 147 root root 12288 Jan 10 02:37 etc
drwxr-xr-x 3 root root 4096 Jan 10 02:37 home
lrwxrwxrwx 1 root root 33 Jan 10 02:37 initrd.img -> boot/initrd.img-5.4.0-150-generic
lrwxrwxrwx 1 root root 33 Jan 10 02:37 initrd.img.old -> boot/initrd.img-5.4.0-148-generic
drwxr-xr-x 23 root root 4096 Jan 10 02:37 lib
drwxr-xr-x 2 root root 4096 Jan 10 02:37 lib64
drwx------ 2 root root 16384 Jan 10 02:36 lost+found
drwxr-xr-x 2 root root 4096 Jan 10 02:37 media
drwxr-xr-x 2 root root 4096 Jan 10 02:37 mnt
drwxr-xr-x 5 root root 4096 Jan 10 02:37 opt
drwxr-xr-x 2 root root 4096 Jan 10 02:37 proc
drwx------ 3 root root 4096 Jan 10 02:37 root
drwxr-xr-x 2 root root 4096 Jan 10 02:37 run
drwxr-xr-x 2 root root 12288 Jan 10 02:37 sbin
drwxr-xr-x 2 root root 4096 Jan 10 02:37 snap
drwxr-xr-x 2 root root 4096 Jan 10 02:37 srv
drwxr-xr-x 2 root root 4096 Jan 10 02:37 sys
drwxr-xr-t 2 root root 4096 Jan 10 02:37 tmp
drwxr-xr-x 11 root root 4096 Jan 10 02:38 usr
drwxr-xr-x 15 root root 4096 Jan 10 02:38 var
lrwxrwxrwx 1 root root 30 Jan 10 02:38 vmlinuz -> boot/vmlinuz-5.4.0-150-generic
lrwxrwxrwx 1 root root 30 Jan 10 02:38 vmlinuz.old -> boot/vmlinuz-5.4.0-148-generic
qcow2에서 img 변환
qemu-img convert -f raw -O qcow2 -c image.img image.qcow2
그리고 다음과 같이 QEMU를 구성합니다.
qemu-system-x86_64 \
-name TEST \
-cpu qemu64-v1 \
-smp cpus=4,sockets=1,cores=4,threads=1 \
-machine pc-q35-7.2,vmport=off,i8042=off,hpet=off \
-accel tcg,thread=multi,tb-size=1024 \
-m 4096 \
-drive file=/Users/steve/VMs/image.qcow2 \
-boot menu=on
가상 머신을 부팅하려고 하면 "부팅 가능한 장치가 없습니다"라는 메시지가 나타납니다. 저는 abt QEMU를 처음 접했고 이 구성에 뭔가 빠졌다는 것을 알고 있지만 최소한 커널 부팅을 시도해야 합니다. GUI?
답변1
QEMU에게 커널과 initramfs를 직접 찾도록 지시하지 않았고 machine pc-q35-7.2
.
소스 코드 보기, 이 시스템 유형의 기본값 중 하나 firmware=bios-256k.bin
는 시스템이 SeaBIOS를 실행하고 클래식 BIOS 기반 x86 시스템처럼 부팅을 시도하며 마스터 부트 레코드를 찾는다는 것을 의미합니다.
한 파일 시스템 이미지에서 다른 파일 시스템 이미지로 파일을 복사하므로 모든 부팅 블록(부팅 블록의 일부가 아닌 이미지에 직접 포함됨)문서) 존재하지 않는다. 또한 이미지는 단일 파일 시스템이므로 먼저 분할하지 않고 image.qcow2
실행하는 것과 같습니다 . mkfs.ext4 /dev/sda
따라서 파티션 테이블도 없고 마스터 부트 레코드도 없습니다(파티션 외부).
이미지에서 커널 및 initramfs 파일을 쉽게 복사할 수 있습니다.
mount -t auto image.img /img/mount/point
cp /img/mount/point/boot/vmlinux-5.4.0-150-generic /Users/steve/VMs/
cp /img/mount/point/boot/initrd.img-5.4.0-150-generic /Users/steve/VMs/
-kernel /Users/steve/VMs/vmlinux-5.4.0-150-generic -initrd /Users/steve/VMs/initrd.img-5.4.0-150-generic
부팅을 위해 QEMU에 직접 제공할 수 있도록 QEMU 옵션을 추가합니다 .
다음 장애물은 커널의 루트 파일 시스템 위치를 지정해야 한다는 것입니다. 파일 시스템이 더 이상 원래 파일 시스템이 아니기 때문에 initramfs 이미지에 포함된 루트 파일 시스템 UUID가 더 이상 올바르지 않기 때문입니다. 따라서 QEMU 옵션을 추가하여 -append root=/dev/sda
(파티션되지 않은 이미지, 기억하시나요?)와 같은 커널 명령줄을 지정하고 커널이 루트 파일 시스템 유형 squashfs만 지원하도록 축소되지 않기를 바랍니다.
또한 이와 같은 직접 부팅에서는 커널이 일반적으로 BIOS에서 받는 구성 정보를 얻지 못할 수 있으므로 일부 사항이 불안정할 수 있습니다.
적절하게 파티션된 디스크 이미지를 설정하고 MBR에 적절한 부트로더를 포함하는 것이 더 나을 수도 있지만 적어도 직접 커널 이미지 부팅을 시도하는 것은 쉽습니다. 누가 알아? 효과가 있을 수도 있어요!