構成:
- 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
。
ソースコードを見るこのシステムタイプのデフォルト値の1つ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に適切なブートローダを含める方が良いかもしれませんが、少なくとも直接カーネルイメージを起動しようとするのは簡単です。誰が知っていますか?効果があるかもしれません!