LoginSignup
22
13

More than 5 years have passed since last update.

Raspbian Stretch 2018/3/13版をQEMUで動かす

Last updated at Posted at 2018-04-12

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 を新規作成します。

90-qemu.rules
KERNEL=="sda", SYMLINK+="mmcblk0"
KERNEL=="sda?", SYMLINK+="mmcblk0p%n"

  1. Raspberry Piそのものではありません(前版参照)。 

22
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
13