先日、Arch Linux ARM のディスクイメージ作った。
今回はこのディスクイメージと QEMU を使って Ubuntu で Arch Linux ARM のエミュレーションをやってみたのでそのメモ。
前回作ったディスクイメージをコピー。名前が長いと面倒なので qemu-alarm.img とした。
cp ArchLinuxARM_20160202.img qemu-alarm.img
カーネルは GitHub で頒布してくれていた人のを借りてきた。
そのままだと /dev/mmcblk0p1 というか /dev/sda1 がマウント出来ず、起動する度にエラーになるのでこれを一度無効にする。
qemu-system-arm -kernel kernel-qemu-4.1.bin -M versatilepb -cpu arm1176 -m 256 "root=/dev/sda2 rw panic=1 init=/bin/bash" -hda qemu-alarm.img
vi で /etc/fstab の /dev/mmcblk0p1 行をコメントアウトする。
vi /etc/fstab
exit してもう一度 QEMU を起動する。この時に init=/bin/bash はつけない。
qemu-system-arm -kernel kernel-qemu-4.1.bin -M versatilepb -cpu arm1176 -m 256 -serial stdio -append "root=/dev/sda2 rw panic=1 console=ttyAMA0,115200" -hda qemu-alarm.img -net nic -net user,net=192.168.1.0/24,hostfwd=tcp::12345-:22
いつもはこういうことには関心するけどこれはなんか気持ち悪い…w

さて、ディスクイメージは 1 GB で作ったのでちょっと拡張する。ディスクイメージの拡張は truncate や qemu-image resize でできる。どちらも + を付けたりすることで「追加」になるようだ。
truncate -s +3GB alarm.img
qemu-image resize alarm.img +`numfmt --from si 3G`
再び QEMU を起動してディスクサイズを確認する。ファイルシステムはまだ拡張していない状態。

パーティションテーブルを編集して /dev/sda2 を作り直す。
fdisk /dev/sda

再起動後、ファイルシステムを拡張する。
resize2fs /dev/sda2
QEMU の制限でメモリが 256 MB しかないのでスワップファイルを作成する。
dd if=/dev/zero of=/swapfile bs=1M count=256 mkswap /swapfile chmod 0600 /swapfile swapon /swapfile echo /swapfile none swap swap 0 0 >>/etc/fstab
/dev/sda1(/dev/mmcblk0)を読み込むための方法として udev に新しいルールを作るものがあるらしい。
vi /etc/udev/rules.d/90-qemu.rules
KERNEL=="sda" SYMLINK+="mmcblk0" KERNEL=="sda?" SYMLINK+="mmcblk0p%n" KERNEL=="sda2" SYMLINK+="mmcblk0p2"
そうすると起動するときに /dev/mmcblk => /dev/sda みたいなリンクができる。
と、してみたがやっぱり /boot にマウントしてくれないんだよな…。/etc/fstab に /dev/sda1 って書いてもダメだし。
起動後にマウントはできるから起動順とかの問題かね。
microSD に入っている Arch Linux ARM を扱う方法もあるみたいだし、Raspberry Pi 本体での作業にはそれほど拘らなくてもいいのかも。
microSD に入っている Arch Linux ARM を QEMU で起動する
Arch Linux ARM を焼いてある microSD が転がっていたのでカードリーダーに突っ込んで QEMU で起動できるのか試してみた。デバイスは /dev/sdc。
そのままだと /dev/sdc に書き込み権限が無いので適当にパーミッションを変更。VirtualBox の rawdisk イメージと同じようなものか。
chmod 0666 /dev/sdc
-drive file=/dev/sdc,if=scsi で /dev/sdc を読みに行くようにして起動。
qemu-system-arm -kernel kernel-qemu-4.1.7.bin -M versatilepb -cpu arm1176 -m 256 -append "root=/dev/sda2 rw" -drive file=/dev/sdc,if=scsi
あっさり出来てしまうから困る。

うーん、ということは Raspberry Pi の勉強会は実機がなくてもなんとかなるところはなんとかなるかもなぁ…。ネットワークがちょっと難だけど。
それより udev をもうちょっと勉強しなきゃだめかな。