Raspbian Stretch 2018/3/13版をQEMUでエミュレート動作させた際の手順です。
以前書いた「Raspbian JessieをQEMUで動かす」のStretch版です。
前提
- エミュレートするRaspberry Piは1/Zero相当、メモリは256MBです。1
- 実行環境はUbuntu 17.10です。
- QEMUを事前にインストールしておきます。
$ sudo apt install qemu
- RaspbianはLite版を使用します。
- 各ファイルはカレントディレクトリ上にあるものとします。
手順
必要ファイルをダウンロードする
Raspbianイメージファイル
まずはRaspbianのイメージファイルをダウンロードします。
https://www.raspberrypi.org/downloads/raspbian/
日本では北陸先端大にあるミラーサーバ http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian_lite/images/ からの方が早くダウンロードできると思います。
下記wgetコマンドの例では北陸先端大のミラーサーバをダウンロード元に指定しています。
$ wget http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian_lite/images/raspbian_lite-2018-03-14/2018-03-13-raspbian-stretch-lite.zip
ダウンロードしたら展開をお忘れなく。
$ unzip 2018-03-13-raspbian-stretch-lite.zip
QEMU用カーネルとDevice Treeファイル
https://github.com/dhruvvyas90/qemu-rpi-kernel よりQEMU用カーネルとDevice Treeファイルをダウンロードします。
$ wget https://github.com/dhruvvyas90/qemu-rpi-kernel/raw/master/kernel-qemu-4.9.59-stretch
$ wget https://github.com/dhruvvyas90/qemu-rpi-kernel/raw/master/versatile-pb.dtb
起動する
以下のコマンドを入力し、QEMU上でRaspbianが起動することを確認します。
もちろん初期ID・パスワードはRaspberry Pi実機にインストールする場合と同様です。
下記コマンドでは -net
オプションでホストの10022番ポートからRaspbianのSSHに接続できるようにしています。
また、エミュレータのシリアルポートがQEMUを実行したシェルの標準入出力に接続されます。不要の場合は -serial stdio
オプションを削除してください。
$ qemu-system-arm \
-kernel kernel-qemu-4.9.59-stretch \
-cpu arm1176 \
-M versatilepb \
-dtb versatile-pb.dtb \
-m 256 \
-no-reboot \
-serial stdio \
-append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" \
-hda 2018-03-13-raspbian-stretch-lite.img \
-net nic -net user,hostfwd=tcp::10022-:22
Raspbianイメージのパーティションサイズを拡張する
必須ではありませんが、このままではパーティションの空き容量が約500MBしかありません。
以下はRaspbianイメージのパーティション拡張手順です。
イメージのサイズを拡張する
以下のコマンドでイメージのサイズ変更を行います。
ここでは4GB分拡張して元と合わせ5.6GBにしていますが、拡張するサイズを変更するは +4G
の箇所を適宜変更してください。
またRaspbianが動作中の場合は終了させてください。
$ qemu-img resize 2018-03-13-raspbian-stretch-lite.img +4G
イメージサイズ拡張を反映させる
前述のコマンドでRaspbianを起動します。
ここからはRaspbian上での操作になります。
fdiskの操作
fdisk
を実行します。
$ sudo fdisk /dev/sda
p
コマンドでパーティションの一覧を表示します。
Command (m for help): p
Disk /dev/sda: 5.7 GiB, 6153043968 bytes, 12017664 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xa8fe70f4
Device Boot Start End Sectors Size Id Type
/dev/sda1 8192 93802 85611 41.8M c W95 FAT32 (LBA)
/dev/sda2 98304 3629055 3530752 1.7G 83 Linux
Command (m for help):
デバイス一覧の /dev/sda2 の先頭セクタを記録しておきます。
(この例では 93804
)
d
コマンドでパーティション 2 を削除します。
Command (m for help): d
Partition number (1,2, default 2): 2
Partition 2 has been deleted.
Command (m for help):
n
コマンドでパーティションを作成します。
Command (m for help): n
パーティションタイプは p
、パーティション番号は 2
を入力します。
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
先頭セクタ番号は先ほど記録した値を入力します。
(この例では 98304
)
First sector (2048-12017663, default 2048): 98304
最終セクタ番号はそのまま改行を入力します。
Last sector, +sectors or +size{K,M,G,T,P} (98304-12017663, default 12017663):
Created a new partition 2 of type 'Linux' and of size 5.7 GiB.
「パーティションに残っているext4のシグネチャを消去するか」と聞かれますが、消去すると拡張途中のパーティションが壊れてしまいますので、n
を入力します。
Partition #2 contains a ext4 signature.
Do you want to remove the signature? [Y]es/[N]o: n
w
コマンドでパーティション情報を書き込みます。
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: Device or resource busy
The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).
fdisk
が終了するので、Raspbianを再起動して新しいパーティション情報を反映させます。
$ sudo shutdown -r now
ファイルシステムのサイズ変更
再起動後、以下のコマンドでファイルシステムのサイズ変更を行います。
$ sudo resize2fs /dev/sda2
df -h
コマンドでパーティションサイズが拡張できていることを確認できれば完了です。
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 5.6G 1.1G 4.3G 20% /
(以下省略)
備考とか余談とか
エミュレートするハードウェア / 仮想マシンのメモリサイズ / パーティションの拡張 /参考にした記事
上記4項については前版を参照してください。
前版からの変更点
カーネル
Raspbianのカーネルが4.4から4.9になりましたが、ARMプラットフォームまわりのKconfigががらっと変わったためにQEMU用カーネルは4.4と同じ手順ではコンパイルできなくなりました。
(自分でも4.9のコンパイルに挑戦してみたのですが、変更点を追いきれず挫折‥‥‥)
最近になってQEMU用カーネル4.9を作成された方が現れ、QEMU上でもカーネル4.9が手軽に使えるようになりました。有り難い限りです。
QEMUのオプション
元リポジトリのreadme.mdの記述を元に、QEMUの起動オプションを変更しています。
- Device Treeファイル(ハードウェア構成等を記述したファイル)が別途必要になったので
-dtb
オプションを追加 - SSHのリダイレクト設定を
-redir
オプションから-net
オプションに変更
設定ファイルの変更
以前は必要だったイメージ内の設定ファイル変更をせずとも起動できるようになり、kpartx も手順上で不要になりました。
そのため関連する手順を削除しました。
ただし設定変更をしない場合は、SDカードを指すデバイスファイル /dev/mmcblk0 が存在しません。
/dev/mmcblk0 が必要な場合は、Raspbian上で下記の通り /etc/udev/rules.d/90-qemu.rules を新規作成します。
KERNEL=="sda", SYMLINK+="mmcblk0"
KERNEL=="sda?", SYMLINK+="mmcblk0p%n"