Qemuを使用してRaspberry Pi(+ OS)をエミュレートしようとしています。 OSはfirstrun.sh
起動時にスクリプトを実行してさまざまな項目を設定したいと思います。
これが私がqemuを始める方法です:
qemu-system-aarch64 \
-M raspi3b \
-cpu cortex-a53 \
-m 1G \
-kernel kernel8.img \
-dtb bcm2710-rpi-3-b-plus.dtb \
-drive "file=2023-05-03-raspios-bullseye-arm64-lite.img,format=raw,index=0,media=disk" \
-append "rw earlyprintk loglevel=8 console=ttyAMA0,115200 dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2 rootdelay=1 systemd.run=/boot/firstrun.sh systemd.run_success_action=none debug systemd.unit=kernel-command-line.target" \
-usb \
-device usb-mouse \
-device usb-kbd \
-device usb-net,netdev=net0 \
-nographic \
-serial mon:stdio \
-netdev user,id=net0,hostfwd=tcp::7777-:22
ただし、systemdスクリプトを実行するようにQemu / kernelを設定すると、停止してsystemd.run=/boot/firstrun.sh
起動を続行できません。
印刷された最後の行は次のとおりです。
[ OK ] Finished Command from Kernel Command Line.
[ OK ] Reached target Command from Kernel Command Line
以下は最小限の最初の実行スクリプトです。
#!/bin/bash
set +e
echo "This is the firstrun script"
rm -f /boot/firstrun.sh
sed -i 's| systemd.run.*||g' /boot/cmdline.txt
exit 0
正確に再現するには、次の手順に従ってください。
# Download image
wget https://downloads.raspberrypi.org/raspios_lite_arm64/images/raspios_lite_arm64-2023-05-03/2023-05-03-raspios-bullseye-arm64-lite.img.xz
xz --extract 2023-05-03-raspios-bullseye-arm64-lite.img.xz
# Setup image - extract kernel.img and copy firstrun script
mount_dir=/mnt/raspberrypi
free_loopdev="$(sudo losetup -f)"
sudo kpartx -a -v 2023-05-03-raspios-bullseye-arm64-lite.img
loop_mapper=/dev/mapper/$(basename "${free_loopdev}")
sudo mkdir -p "${mount_dir}"
sudo mount "${loop_mapper}p2" "${mount_dir}"
sudo mount "${loop_mapper}p1" "${mount_dir}/boot"
cp "${mount_dir}/boot/kernel8.img" .
cp "${mount_dir}/boot/bcm2710-rpi-3-b-plus.dtb" .
sudo cp firstrun.sh "${mount_dir}/boot"
# Run Qemu with Image
cmdline="rw earlyprintk loglevel=8 console=ttyAMA0,115200 dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2 rootdelay=1 systemd.run=/boot/firstrun.sh systemd.run_success_action=none debug systemd.unit=kernel-command-line.target"
qemu-img resize -f raw "2023-05-03-raspios-bullseye-arm64-lite.img" 4G
qemu-system-aarch64 \
-M raspi3b \
-cpu cortex-a53 \
-m 1G \
-kernel kernel8.img \
-dtb bcm2710-rpi-3-b-plus.dtb \
-drive "file=2023-05-03-raspios-bullseye-arm64-lite.img,format=raw,index=0,media=disk" \
-append "${cmdline}" \
-usb \
-device usb-mouse \
-device usb-kbd \
-device usb-net,netdev=net0 \
-nographic \
-serial mon:stdio \
-netdev user,id=net0,hostfwd=tcp::7777-:22
スクリプトを省略すると、firstrun.sh
起動プロセスが正常に機能します。
firstrun.shを実行しても起動プロセスが続行されないのはなぜですか?
答え1
を設定するとsystemd.run
暗黙的に設定されますsystemd.unit=kernel-command-line.target
(実際にはコマンドラインで設定されます)。明らかに、しかし必ずしも必要ではありません)。設定はsystemd.unit
systemdに「これを行う」と効果的に通知します。変える一般的な起動を行います。」
これが状況が「停止した」ように見える理由です。スクリプトの最初の実行が正しく実行され、systemdに関する限り、他のことは起こる必要はありません。
最も簡単な解決策は、おそらくfirstrun.sh
次のようにスクリプトを終了することです。
systemctl start --no-block multi-user.target
最初の実行スクリプトが完了した後、通常どおり起動し続けます。
次のスクリプトが与えられた場合firstrun.sh
:
#!/bin/sh
set -x
echo "enable ssh"
systemctl enable --now ssh
echo "set root password"
echo 'root:secret' | chpasswd
echo "continue boot"
systemctl start --no-block multi-user.target
root
システムの起動が完了したら、コンソールに正常にログインできます。 SSH はホストポート 7777 でイネーブルになります。
あなたの質問には関係ありませんが、次のパラメータをkpartx
使用すると-P
これを回避できますlosetup
。
loopdev="$(sudo losetup -fP --show)"
sudo mkdir -p "${mount_dir}"
sudo mount "${loopdev}p2" "${mount_dir}"
sudo mount "${loopdev}p1" "${mount_dir}/boot"
ループデバイスの使用を防ぎ、sudo
それを使用してguestfish
画像を完全に操作できます。 (a)元のイメージのコピーオンライトレプリカを作成し、(b)これを設定するには、次の作業を行います。
#!/bin/bash
BASEIMAGE=2023-05-03-raspios-bullseye-arm64-lite.img
# Download image
if ! [ -f "$BASEIMAGE" ]; then
wget https://downloads.raspberrypi.org/raspios_lite_arm64/images/raspios_lite_arm64-2023-05-03/2023-05-03-raspios-bullseye-arm64-lite.img.xz
xz --extract 2023-05-03-raspios-bullseye-arm64-lite.img.xz
fi
echo "creating work image"
rm -f raspi-work.qcow2
qemu-img create -b "$BASEIMAGE" -F raw -f qcow2 raspi-work.qcow2 4G
echo "copying files"
guestfish -a raspi-work.qcow2 -m /dev/sda2:/ -m /dev/sda1:/boot <<EOF
copy-out /boot/kernel8.img .
copy-out /boot/bcm2710-rpi-3-b-plus.dtb .
copy-in firstrun.sh /boot/
EOF
# ...remainder of script here...