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

Raspbian Stretch 2018/3/13版をQEMUでエミュレート動作させた際の手順です。
以前書いた[「Raspbian JessieをQEMUで動かす」](https://qiita.com/Nebutan/items/577dd7890f0d7a52d4a0)のStretch版です。

# 前提

* エミュレートするRaspberry Piは1/Zero相当、メモリは256MBです。[^1]
* 実行環境はUbuntu 17.10です。
* QEMUを事前にインストールしておきます。  
`$ sudo apt install qemu`
* RaspbianはLite版を使用します。
* 各ファイルはカレントディレクトリ上にあるものとします。

[^1]: Raspberry Piそのものではありません（[前版参照](https://qiita.com/Nebutan/items/577dd7890f0d7a52d4a0#%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2)）。

# 手順

## 必要ファイルをダウンロードする

### 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項については[前版](https://qiita.com/Nebutan/items/577dd7890f0d7a52d4a0#%E5%82%99%E8%80%83%E3%81%A8%E3%81%8B%E4%BB%8A%E5%BE%8C%E3%81%AE%E8%AA%B2%E9%A1%8C%E3%81%A8%E3%81%8B%E4%BD%99%E8%AB%87)を参照してください。

## 前版からの変更点

### カーネル

Raspbianのカーネルが4.4から4.9になりましたが、ARMプラットフォームまわりのKconfigががらっと変わったためにQEMU用カーネルは4.4と同じ手順ではコンパイルできなくなりました。
（自分でも4.9のコンパイルに挑戦してみたのですが、変更点を追いきれず挫折‥‥‥）
最近になって[QEMU用カーネル4.9を作成された方](https://github.com/juokelis)が現れ、QEMU上でもカーネル4.9が手軽に使えるようになりました。有り難い限りです。

### QEMUのオプション

[元リポジトリのreadme.md](https://github.com/dhruvvyas90/qemu-rpi-kernel/blob/master/README.md)の記述を元に、QEMUの起動オプションを変更しています。

* Device Treeファイル（ハードウェア構成等を記述したファイル）が別途必要になったので `-dtb` オプションを追加
* SSHのリダイレクト設定を `-redir` オプションから `-net` オプションに変更

### 設定ファイルの変更

[以前は必要だったイメージ内の設定ファイル変更](https://qiita.com/Nebutan/items/577dd7890f0d7a52d4a0#%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92%E7%B7%A8%E9%9B%86%E3%81%99%E3%82%8B)をせずとも起動できるようになり、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"
```