DockerやQEMUのハードウェアエミュレーションを使用せずchrootとQEMUスタティックモジュールのみでUbuntu上に高速な RaspberryPi (Raspbian Buster lite armhf) のエミュレーション環境を起動する

# １．Introduction
たぶん、私が過去に記事にしたどの環境よりもスマートで高速なエミュレーション環境だと思います。 今回の仮想環境で起動するOSは、 **`Raspbian Buster lite armhf`** です。 なお、Ubuntu 16.04 から Ubuntu 19.04 のOSでは、 普通には **`qemu-user-static`** の最新バージョン **`4.0.0`** を使用できません。 この手順では、無理やり **`apt-get install`** でビルド済みバイナリの **`qemu-user-static 4.0.0`** をインストールします。 何故そこまでして最新の qemu-user-static にこだわるかというと、 3.x.x 以前のバージョンには I/O 周りのバグがあるためです。 今回は、面倒なQEMUのビルドもDockerの利用も、QEMUのハードウェアエミュレーションも行いません。

手順を実施すると、 **`Corei7 6core 12threads, RAM 4GB (32bitOSの制約), SSD 32GB`** のラズベリーパイの出来上がりです。

記事が長くなると読むのが煩わしいと思いましたので極めて概要的に記載しています。 ただ、特に読み込んだりしなくても、ほぼコピペで同じ環境が再現できると思います。

なお、この記事は **[Raspberry Pi のセルフビルド環境を QEMU で作る - Qiita - autchさん](https://qiita.com/autch/items/c8c9cdc7b8e5821e81a4)** を全面的に参考にさせていただきました。 誠にありがとうございます。

# ２．Past RaspberryPi virtual environment construction articles
1. **[QEMU4.0.0 のハードウェアエミュレーションモードで Debian Buster aarch64 のOSイメージをゼロから作成する方法 (Kernel 4.19.0-5-arm64, Tensorflow aarch64ビルド用)](https://qiita.com/PINTO/items/e117bb0389f2163e2ac8)**

2. **[QEMU4.0.0 + Raspbian Buster による RaspberryPi のエミュレーション環境構築(超シンプル手順バージョン)](https://qiita.com/PINTO/items/1cd90f8acca7b5b03685)**

3. **[QEMU4.0.0 のハードウェアエミュレーションモードで Debian Buster armhf のOSイメージをゼロから作成する方法 (Kernel 4.19.0-5-armmp-lpae, Tensorflow armhfビルド用)](https://qiita.com/PINTO/items/c10283a28d0699f01e01)**

# ３．Environment

- Ubuntu 16.04 x86_64 (Host PC, Core i7, 6 Core, 12 threads, RAM 16GB)
- qemu-user-static 4.0.0
- chroot

# ４．Procedure

```console:Creating_a_working_directory
$ cd ~
$ mkdir raspbian-buster-lite;cd raspbian-buster-lite
```

```console:Download_Raspbian_lite_Buster
$ curl -sc /tmp/cookie "https://drive.google.com/uc?export=download&id=104jhVcHqfWPvHu5tFVNvRqtbCFt32Tgv" > /dev/null
$ CODE="$(awk '/_warning_/ {print $NF}' /tmp/cookie)"
$ curl -Lb /tmp/cookie "https://drive.google.com/uc?export=download&confirm=${CODE}&id=104jhVcHqfWPvHu5tFVNvRqtbCFt32Tgv" -o 2019-07-10-raspbian-buster-lite.zip
$ unzip 2019-07-10-raspbian-buster-lite.zip
$ rm 2019-07-10-raspbian-buster-lite.zip
```

```console:Check_file_contents
$ file 2019-07-10-raspbian-buster-lite.img

2019-07-10-raspbian-buster-lite.img: DOS/MBR boot sector;
partition 1 : ID=0xc, start-CHS (0x0,130,3), end-CHS (0x21,37,5), startsector 8192, 524289 sectors;
partition 2 : ID=0x83, start-CHS (0x21,167,7), end-CHS (0x1b,51,40), startsector 540672, 3751936 sectors
```

```console:Attach_to_loopback_device
$ sudo losetup -frP 2019-07-10-raspbian-buster-lite.img
$ sudo fdisk -l /dev/loop*

Disk /dev/loop8: 2 GiB, 2197815296 bytes, 4292608 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: 0x17869b7d

デバイス     起動  Start 最後から セクタ  Size Id タイプ
/dev/loop8p1        8192   532480  524289  256M  c W95 FAT32 (LBA)
/dev/loop8p2      540672  4292607 3751936  1.8G 83 Linux
Disk /dev/loop8p1: 256 MiB, 268435968 bytes, 524289 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: 0x00000000
Disk /dev/loop8p2: 1.8 GiB, 1920991232 bytes, 3751936 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
```

```console:Mount_Linux_partition_to_mnt_folder
$ sudo mount -o ro /dev/loop8p2 /mnt
```

```console:Compress_to_tarball
$ sudo tar cvjf ./raspbian-buster-lite.tar.bz2 -C /mnt .
$ ls -l
合計 2494564
-rw-r--r-- 1 b920405 b920405 2197815296  7月 10 01:21 2019-07-10-raspbian-buster-lite.img
-rw-r--r-- 1 root    root     356608948  8月 15 10:48 raspbian-buster-lite.tar.bz2
```

```console:unmount_loop_devices
$ sudo umount /mnt
$ sudo losetup --detach /dev/loop8 /dev/loop8p1 /dev/loop8p2
```

```console:Extract_the_tarball
$ sudo tar xjf ./raspbian-buster-lite.tar.bz2
```
![Screenshot 2019-08-15 12:34:53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194769/d5f01b9f-5595-f858-0061-96edf6c84e94.png)


**＜qemu-user-static 4.0.0 package＞**
**Ubuntu 19.10 eoan package**
**https://packages.ubuntu.com/search?keywords=qemu-user-static&searchon=names&suite=eoan&section=all**

```console:Edit_sources.list
$ sudo nano /etc/apt/sources.list
```
Add the following **`deb http://...`** to the bottom line.

```console:Add_the_following_line
deb http://jp.archive.ubuntu.com/ubuntu/ eoan universe
```
Quit Nano editor.
<kbd>Ctrl</kbd>+<kbd>O</kbd>
<kbd>Enter</kbd>
<kbd>Ctrl</kbd>+<kbd>X</kbd>
<kbd>Enter</kbd>

```console:Install_qemu-user-static_4.0.0
$ sudo apt-get update
$ sudo apt-get install -y qemu-user-static
```

```console:Edit_sources.list
$ sudo nano /etc/apt/sources.list
```
Delete the following **`deb http://...`** to the bottom line.

```console:Add_the_following_line
deb http://jp.archive.ubuntu.com/ubuntu/ eoan universe
```
Quit Nano editor.
<kbd>Ctrl</kbd>+<kbd>O</kbd>
<kbd>Enter</kbd>
<kbd>Ctrl</kbd>+<kbd>X</kbd>
<kbd>Enter</kbd>

```console:Check_"arm"_interpreter_path
$ sudo update-binfmts --display | grep arm

qemu-arm (enabled):
 interpreter = /usr/bin/qemu-arm-static
qemu-armeb (enabled):
 interpreter = /usr/bin/qemu-armeb-static
```

```console:Copy_qemu-arm-static
$ sudo cp /usr/bin/qemu-arm-static ./usr/bin/
```

```console:Mount_the_host_directory
$ sudo mount -t sysfs sysfs ${PWD}/sys; \
sudo mount -t proc proc ${PWD}/proc; \
sudo mount -t devtmpfs udev ${PWD}/dev; \
sudo mount -t devpts devpts ${PWD}/dev/pts
```

```console:Start_chroot
$ sudo chroot . /bin/bash
# su - pi
$ uname -a
$ lsb_release -a
```
![Screenshot 2019-08-15 13:47:22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194769/e4d46707-64b6-af6b-b956-9682654eb4e7.png)

```console:Added_hostname_to_hosts_file_to_avoid_"sudo：_unable_to_resolve_host"_error
$ sudo sh -c 'echo 127.0.1.1       $(hostname) >> /etc/hosts'
```

```console:Package_upgrade
$ sudo apt-get update
$ sudo apt-get upgrade
```
![Screenshot 2019-08-17 09:24:57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194769/307ff8e7-92fa-5fa8-9f7f-d52aa0ae8d1c.png)

# ５．Reference articles
**[Raspberry Pi のセルフビルド環境を QEMU で作る - Qiita - autchさん](https://qiita.com/autch/items/c8c9cdc7b8e5821e81a4)**
**[【公式】Raspbian_liteのディスクイメージ](https://downloads.raspberrypi.org/raspbian_lite/images/)**