複製されたUSBスティックからQEMUを起動する方法

複製されたUSBスティックからQEMUを起動する方法

構成:

  • 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に適切なブートローダを含める方が良いかもしれませんが、少なくとも直接カーネルイメージを起動しようとするのは簡単です。誰が知っていますか?効果があるかもしれません!

関連情報