Ultra96 向け Debian GNU/Linux の構築(Debian9 Root File System編)

## はじめに

Ultra96 に Debian GNU/Linux (v2018.2版) を構築する方法について、具体的な方法をいくつかに分けて説明します。

 * [Introduction](https://qiita.com/ikwzm/items/5ae07792143d8018bfea)
 * [Boot Loader](https://qiita.com/ikwzm/items/9c78e83298906447fe5d)
   - [Sample FPGA Design](https://qiita.com/ikwzm/items/0489b02962c6f0455783)
   - [FSBL   (First Stage Boot Loader)](https://qiita.com/ikwzm/items/fe9d6abda60660fc2f87)
   - [PMUFW  (Platform Manager Unit Firmware)](https://qiita.com/ikwzm/items/00024adf956696dd51c6)
   - [BL31   (ARM Trusted Firmware Boot Loader state 3-1)](https://qiita.com/ikwzm/items/3c0d735cd3a605d269f3)
   - [U-Boot](https://qiita.com/ikwzm/items/11853d8cfdaf373beaef)
   - [BOOT.BIN](https://qiita.com/ikwzm/items/af4420edd262e14feef9)
 * [Linux Kernel](https://qiita.com/ikwzm/items/02af5ac78a558c910e84)
 * __Debian9 Root File System(この記事)__

この記事では、Debian9 Root File System の構築について説明をします。

## 必要な環境

私は Ubuntu 上で Debian9 Root File System を構築しました。Debian 系のプラットフォームを用意してください。

まずはプラットフォームに構築に必要なツールをインストールします。

```console
shell$ apt-get install qemu-user-static debootstrap binfmt-support
```
## 構築

### 構築環境の準備

次の URL から git clone でリポジトリをダウンロードして v2018.2.1 をチェックアウトします。

 * [https://github.com/ikwzm/ZynqMP-FPGA-Linux](https://github.com/ikwzm/ZynqMP-FPGA-Linux)

```console
shell$ git clone git://github.com/ikwzm/ZynqMP-FPGA-Linux
shell$ cd ZynqMP-FPGA-Linux
shell$ git checkout v2018.2.1
```

### 環境変数の設定 

```console
shell$ export targetdir=debian9-rootfs
shell$ export distro=stretch
```

### 構築(ステージ１)

```console
shell$ mkdir $targetdir
shell$ sudo debootstrap --arch=arm64 --foreign $distro    $targetdir
shell$ sudo cp /usr/bin/qemu-aarch64-static               $targetdir/usr/bin
shell$ sudo cp /etc/resolv.conf                           $targetdir/etc
shell$ sudo cp scripts/build-debian9-rootfs-with-qemu.sh  $targetdir
shell$ sudo cp linux-image-4.14.0-xlnx-v2018.2-zynqmp-fpga_4.14.0-xlnx-v2018.2-zynqmp-fpga-1_arm64.deb $targetdir
````

### QEMU による構築(ステージ２)

これ以降は QEMU(arm64版) と chroot を使ってRoot File System を構築します。

```console
shell$ sudo chroot $targetdir
```

ここから、次の２種類の方法があります。

 1. build-debian9-rootfs-with-qemu.sh を使って楽々構築
 2. 一歩一歩コマンドを打ち込みつつ構築

どちらもやってることは同じなので、ここでは一歩一歩コマンドを打ち込む方法を説明します。

#### APT の設定

```console
debian9-rootfs# distro=stretch
debian9-rootfs# export LANG=C
debian9-rootfs# /debootstrap/debootstrap --second-stage
```

```console
debian9-rootfs# cat <<EOT > /etc/apt/sources.list
deb     http://ftp.jp.debian.org/debian            stretch         main contrib non-free
deb-src http://ftp.jp.debian.org/debian            stretch         main contrib non-free
deb     http://ftp.jp.debian.org/debian            stretch-updates main contrib non-free
deb-src http://ftp.jp.debian.org/debian            stretch-updates main contrib non-free
deb     http://security.debian.org/debian-security stretch/updates main contrib non-free
deb-src http://security.debian.org/debian-security stretch/updates main contrib non-free
EOT
```

```console
debian9-rootfs# cat <<EOT > /etc/apt/apt.conf.d/71-no-recommends
APT::Install-Recommends "0";
APT::Install-Suggests   "0";
EOT
```

```console
debian9-rootfs# apt-get update
```

#### 基本的なアプリケーションのインストール

```console
debian9-rootfs# apt-get install -y locales dialog
debian9-rootfs# dpkg-reconfigure locales
debian9-rootfs# apt-get install -y net-tools openssh-server ntpdate resolvconf sudo less hwinfo ntp tcsh zsh
```

#### hostname の設定

ここでは debian-fpga という名前をつけています。ここらへんはお好みに合わせてください。

```console
debian9-rootfs# echo debian-fpga > /etc/hostname
```

#### root のパスワードの設定

```console
debian9-rootfs# passwd
```

ここで rootのパスワードを何にするか聞かれるので適当に admin とか入力してください。

```console
debian9-rootfs# cat <<EOT >> /etc/securetty
# Seral Port for Xilinx Zynq
ttyPS0
EOT
```

#### FPGA ユーザーの追加

```console
debian9-rootfs# adduser fpga
```

ここで fpga ユーザーのパスワードを何にするか聞かれるので適当に fpga とか入力してください。

```console
debian9-rootfs# echo "fpga ALL=(ALL:ALL) ALL" > /etc/sudoers.d/fpga
```

#### sshd config の設定

```console
debian9-rootfs# sed -i -e 's/#PasswordAuthentication/PasswordAuthentication/g' /etc/ssh/sshd_config
```

#### Time Zone の設定

```console
debian9-rootfs# dpkg-reconfigure tzdata
```

または Time Zone を noninteractive に指定したい時は次のようにしてください。

```console
debian9-rootfs# echo "Asia/Tokyo" > /etc/timezone
debian9-rootfs# dpkg-reconfigure -f noninteractive tzdata
```

#### fstab の設定

```console
debian9-rootfs# cat <<EOT > /etc/fstab
none		/config	configfs	defaults	0	0
EOT
````
Configuration File System を /config にマウントしておきます。Configuration File System は Device Tree Overlay で使います。

#### Network Interface の設定

```console
debian9-rootfs# cat <<EOT > /etc/network/interfaces.d/eth0
allow-hotplug eth0
iface eth0 inet dhcp
EOT
````

ここでは有線LAN (eth0) に DHCP を設定しています。これはお使いの環境にあわせてください。

#### /lib/firmware の設定

```console
debian9-rootfs# mkdir /lib/firmware
```

fpga-region による FPGA のコンフィギュレーションの際、bitstream ファイルは /lib/firmware に置かなければなりません。ここでそのディレクトリを作っておきます。

#### 各種アプリケーションのインストール

```console
debian9-rootfs# apt-get install -y wireless-tools
debian9-rootfs# apt-get install -y wpasupplicant
debian9-rootfs# apt-get install -y firmware-realtek
debian9-rootfs# apt-get install -y firmware-ralink
debian9-rootfs# apt-get install -y build-essential
debian9-rootfs# apt-get install -y git
debian9-rootfs# apt-get install -y u-boot-tools
debian9-rootfs# apt-get install -y socat
debian9-rootfs# apt-get install -y ruby ruby-msgpack ruby-serialport
debian9-rootfs# gem install rake
debian9-rootfs# apt-get install -y python  python-dev  python-setuptools  python-wheel  python-pip  python-numpy
debian9-rootfs# apt-get install -y python3 python3-dev python3-setuptools python3-wheel python3-pip python3-numpy
debian9-rootfs# pip3 install msgpack-rpc-python
debian9-rootfs# apt-get install -y samba
debian9-rootfs# apt-get install -y avahi-daemon
```

必要なアプリケーションはここでインストールします。何をインストールするかはお好みで。

#### Device Tree Compiler (supported symbol version) のインストール

```console
debian9-rootfs# apt-get install -y flex bison
debian9-rootfs# cd root
debian9-rootfs# mkdir src
debian9-rootfs# cd src
debian9-rootfs# git clone https://git.kernel.org/pub/scm/utils/dtc/dtc.git dtc
debian9-rootfs# cd dtc
debian9-rootfs# make
debian9-rootfs# make HOME=/usr/local install-bin
debian9-rootfs# cd /
```

apt-get で install される Device Tree Compiler はバージョンが古くてシンボルがサポートされていないことがあります。ここではソースコードからビルドしています。これに関しては[「デバイスツリーにシンボル情報を埋め込む」](https://qiita.com/ikwzm/items/03d518b7c46d1ee49943)を参照してください。

#### Wireless tools and firmware のインストール

Ultra96 は WiFi と Bluetooth を持っています。通常は WiFi でネットワークに接続します。すぐに WiFi と Bluetooth が使えるようにこの段階で必要なパッケージと firmware をインストールしておきます。

```console
debian9-rootfs# apt-get install wireless-tools
debian9-rootfs# apt-get install wpasupplicant
debian9-rootfs# apt-get install firmware-realtek
debian9-rootfs# apt-get install firmware-ralink
debian9-rootfs# mkdir /lib/firmware/ti-connectivity
```

WiFi Chip の firmware を TI のリポジトリからダウンロードして /lib/firmware/ti-connectivity にコピーします。

```console
debian9-rootfs# git clone git://git.ti.com/wilink8-wlan/wl18xx_fw.git
debian9-rootfs# cp wl18xx_fw/wl18xx-fw-4.bin /lib/firmware/ti-connectivity
debian9-rootfs# rm -rf wl18xx_fw/
```

Bluetooth Chip の firmware を TI のリポジトリからダウンロードして /lib/firmware/ti-connectivity にコピーします。

```console
debian9-rootfs# git clone git://git.ti.com/wilink8-bt/ti-bt-firmware
debian9-rootfs# cp ti-bt-firmware/TIInit_11.8.32.bts /lib/firmware/ti-connectivity
debian9-rootfs# rm -rf ti-bt-firmware
```

#### Linux Modules のインストール

```console
debian9-rootfs# dpkg -i linux-image-4.14.0-xlnx-v2018.2-zynqmp-fpga_4.14.0-xlnx-v2018.2-zynqmp-fpga-1_arm64.deb
```

#### APT Cache の掃除

```console
debian9-rootfs# apt-get clean
```

APT Cache に大量にダウンロードしたパッケージがキャッシュされていますが、そのままだと Root File System が大きくなるので、掃除して身軽にしておきます。

### 後始末

```console
debian9-rootfs# exit
shell$ sudo rm -f $targetdir/usr/bin/qemu-aarch64-static
shell$ sudo rm -f $targetdir/build-debian9-rootfs-with-qemu.sh
shell$ sudo rm -f $targetdir/linux-image-4.14.0-xlnx-v2018.2-zynqmp-fpga_4.14.0-xlnx-v2018.2-zynqmp-fpga-1_arm64.deb
shell$ sudo mv    $targetdir/dpkg-list.txt files/dpkg-list.txt
```

ご苦労さまでした。chroot から出て不要になったファイルを消去してください。	

### debian9-rootfs-vanilla.tgz の生成

```console
shell$ cd $targetdir
shell$ sudo tar cfz ../debian9-rootfs-vanilla.tgz *
```

最後に作ったディレクトリを丸ごと debian9-rootfs-vanilla.tgz にまとめて完了です。