MPFS-DISCO-KIT 向け Ubuntu 22.04 の構築(Ubuntu 22.04 Root File System 編)


## はじめに

MPFS-DISCO-KIT(Microchip PolarFire SoC FPGA Discovery Kit) で動作する Ubuntu 22.04 を構築する方法をいくつかの記事に分けて説明します。

 * [イントロ編](https://qiita.com/ikwzm/items/1866dc3bb5292fd1f6e1)
 * [HSS(Hart Software Services)編](https://qiita.com/ikwzm/items/3d6d0a645dd60aba90d2)
 * [U-Boot 標準編](https://qiita.com/ikwzm/items/8b6e78e1c5599d9d375d)
 * [U-Boot bootmenu 改造編](https://qiita.com/ikwzm/items/72f75ec704dd227f9cbd)
 * [Linux Kernel linux4microchip+fpga-2024.09 編](https://qiita.com/ikwzm/items/0ca6aea057a3696bd5f0)
 * [Linux Kernel mpfs-fpga-first 編](https://qiita.com/ikwzm/items/d7405466ed7391d4dd73)
 * __Ubuntu 22.04 Root File System 編 (この記事)__
 * [SD-Card 作成編](https://qiita.com/ikwzm/items/19af3dd7a34ea5364683)
 * [SD-Card 起動編](https://qiita.com/ikwzm/items/42a1aa7b355734a813f8)

上記の記事で構築した MPFS-DISCO-KIT 向け Ubuntu 22.04 Root File System、Linux Kernel、Boot Loader は次の URL にて公開しています。なお、これらはオフシャルなものではなく、筆者の魔改造がはいっています。ご使用の際はこの点にご留意してください。

 * https://github.com/ikwzm/MPFS-FPGA-Ubuntu22.04
 * https://github.com/ikwzm/MPFS-FPGA-Linux-Kernel-6.6
 * https://github.com/ikwzm/MPFS-DISCO-KIT-U-Boot


この記事では、Ubuntu 22.04 Root File System のビルド方法について説明します。

なお、この記事で紹介する Ubuntu22.04 Root File System のビルド済みのファイルは以下の URL にあります。ビルドが面倒な方はどうぞ。

 * https://github.com/ikwzm/MPFS-FPGA-Ubuntu22.04/tree/v5.0.2


## 必要な環境

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

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

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

## 構築

### 構築環境の準備

次の URL から git clone でリポジトリをダウンロードします。

 * https://github.com/ikwzm/MPFS-FPGA-Ubuntu22.04/tree/develop-v5.0.x

```console
shell$ git clone --depth 1 --branch develop-v5.0.x https://github.com/ikwzm/MPFS-FPGA-Ubuntu22.04 MPFS-FPGA-Ubuntu22.04-develop-v5.0.x
shell$ cd MPFS-FPGA-Ubuntu22.04-develop-v5.0.x
```

### Linux Image/Header Debian Package の準備

Ubuntu22.04 Root File System をビルドする際、Linux Kernel Image/Header の Debian Package を同時に Ubuntu22.04 Root File System にインストールしておくと後々便利です(もちろん後でインストールしてもかまいません)。

上記のリポジトリには次に示す Debian Package をあらかじめ用意しています。
この Debian Package の作りかたは [『MPFS-DISCO-KIT 向け Ubuntu 22.04 の構築(Linux Kernel mpfs-fpga-first 編)』](https://qiita.com/ikwzm/items/d7405466ed7391d4dd73) を参照してください。

 * debian/
   + linux-image-6.6.51-mpfs-fpga-first_6.6.51-mpfs-fpga-1_riscv64.deb
   + linux-headers-6.6.51-mpfs-fpga-first_6.6.51-mpfs-fpga-1_riscv64.deb

### 環境変数の設定 

```console
shell$ export targetdir=ubuntu22.04-rootfs
shell$ export distro=jammy
```

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

```console
shell$ mkdir                                               $PWD/$targetdir
shell$ sudo debootstrap --arch=riscv64 --foreign $distro   $PWD/$targetdir
shell$ sudo cp /usr/bin/qemu-riscv64-static                $PWD/$targetdir/usr/bin
shell$ sudo cp /etc/resolv.conf                            $PWD/$targetdir/etc
shell$ sudo cp scripts/build-ubuntu22.04-rootfs.sh         $PWD/$targetdir
shell$ sudo cp debian/*.deb                                $PWD/$targetdir
shell$ sudo mount -vt proc proc                            $PWD/$targetdir/proc
shell$ sudo mount -vt devpts devpts -o gid=5,mode=620      $PWD/$targetdir/dev/pts
````

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

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

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

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

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

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

#### APT の設定

````console
ubuntu22.04-rootfs# distro=jammy
ubuntu22.04-rootfs# export LANG=C
ubuntu22.04-rootfs# /debootstrap/debootstrap --second-stage
````

```console
ubuntu22.04-rootfs# cat <<EOT > /etc/apt/sources.list
deb http://ports.ubuntu.com/ubuntu-ports jammy main restricted universe multiverse
deb-src http://ports.ubuntu.com/ubuntu-ports jammy main restricted universe multiverse
deb http://ports.ubuntu.com/ubuntu-ports jammy-updates main restricted universe multiverse
deb-src http://ports.ubuntu.com/ubuntu-ports jammy-updates main restricted universe multiverse
deb http://ports.ubuntu.com/ubuntu-ports jammy-security main restricted universe multiverse
deb-src http://ports.ubuntu.com/ubuntu-ports jammy-security main restricted universe multiverse
EOT
```

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

```console
ubuntu22.04-rootfs# apt -y update
ubuntu22.04-rootfs# apt -y upgrade
```

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

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

locale の設定はお好みで。
ここでは "160. en_US.UTF-8 UTF-8" と "2. C.UTF-8" を選択しました。

#### hostname の設定

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

```console
ubuntu22.04-rootfs# echo ubuntu-fpga > /etc/hostname
```

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

```console
ubuntu22.04-rootfs# passwd
```

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

```console
ubuntu22.04-rootfs# cat <<EOT >> /etc/securetty
# Seral Port for Xilinx Zynq
ttyPS0
ttyPS1
EOT
```

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

```console
ubuntu22.04-rootfs# adduser fpga
```

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

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

#### sshd config の設定

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

#### Time Zone の設定

```console
ubuntu22.04-rootfs# dpkg-reconfigure tzdata
```

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

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

#### fstab の設定

Configuration File System を /config にマウントしておきます。Configuration File System は Device Tree Overlay で使います。

```console
ubuntu22.04-rootfs# cat <<EOT > /etc/fstab
none            /config         configfs        defaults        0       0
EOT
````

#### /lib/firmware の設定

fpga-region による FPGA のコンフィギュレーションの際、bitstream ファイルは /lib/firmware に置かなければなりません。ここでそのディレクトリを作っておきます。ただし、現バージョンでは未使用ですが、とりあえずディレクトリだけ用意しておきます。

```console
ubuntu22.04-rootfs# mkdir /lib/firmware
```

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

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

```console
ubuntu22.04-rootfs# apt install -y build-essential
ubuntu22.04-rootfs# apt install -y pkg-config
ubuntu22.04-rootfs# apt install -y curl
ubuntu22.04-rootfs# apt install -y git git-lfs
ubuntu22.04-rootfs# apt install -y kmod
ubuntu22.04-rootfs# apt install -y flex bison
ubuntu22.04-rootfs# apt install -y u-boot-tools device-tree-compiler
ubuntu22.04-rootfs# apt install -y libssl-dev
ubuntu22.04-rootfs# apt install -y socat
ubuntu22.04-rootfs# apt install -y ruby rake ruby-msgpack ruby-serialport
ubuntu22.04-rootfs# apt install -y python3 python3-dev python3-setuptools python3-wheel python3-pip python3-numpy
ubuntu22.04-rootfs# pip3 install msgpack-rpc-python
```

```console
ubuntu22.04-rootfs# apt install -y samba
ubuntu22.04-rootfs# apt install -y avahi-daemon
```

```console
ubuntu22.04-rootfs# apt install -y haveged
```

#### Network Manager のインストール

```console
ubuntu22.04-rootfs# apt install -y network-manager
```

```console
ubuntu22.04-rootfs# cat <<EOT >/etc/NetworkManager/conf.d/10-globally-managed-devices.conf
[keyfile]
unmanaged-devices=none
EOT
```

#### Linux Image/Header Debian Package のインストール

```console
ubuntu22.04-rootfs# mkdir              home/fpga/debian
ubuntu22.04-rootfs# mv *.deb           home/fpga/debian
ubuntu22.04-rootfs# chown fpga.fpga -R home/fpga/debian
```

```console
ubuntu22.04-rootfs# dpkg -i home/fpga/debian/linux-image-6.6.51-mpfs-fpga-first_6.6.51-mpfs-fpga-1_riscv64.deb
ubuntu22.04-rootfs# dpkg -i home/fpga/debian/linux-headers-6.6.51-mpfs-fpga-first_6.6.51-mpfs-fpga-1_riscv64.deb
```

#### APT Cache の掃除

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

```console
ubuntu22.04-rootfs# apt-get clean
```

#### Debian Package List の生成

どんな Debian Package をインストールしたかをファイルに残しておきます。

```console
ubuntu22.04-rootfs# dpkg -l > dpkg-console-list.txt
```

### 後始末

chroot から出て、dpkg-console-list.txt を移動した後、不要になったファイルを消去してください。	

```console
ubuntu22.04-rootfs# exit
shell$ sudo rm -f  $PWD/$targetdir/usr/bin/qemu-riscv64-static
shell$ sudo rm -f  $PWD/$targetdir/build-ubuntu22.04-rootfs.sh
shell$ sudo mv     $PWD/$targetdir/dpkg-console-list.txt files/ubuntu22.04-dpkg-list.txt
shell$ sudo umount $PWD/$targetdir/proc
shell$ sudo umount $PWD/$targetdir/dev/pts
```

### ubuntu22.04-rootfs.tgz の生成

作ったディレクトリを丸ごと ubuntu22.04-rootfs.tgz にまとめます。

```console
shell$ cd $PWD/$targetdir
shell$ sudo tar cfz ../ubuntu22.04-rootfs.tgz *
shell$ cd ..
```

### ubuntu22.04-rootfs.tgz.files の生成

github で LFS(Large File Storage) を使わずにリリースする場合は、幾つかのファイルに分割しておきます。

```console
shell$ mkdir ubuntu22.04-rootfs.tgz.files
shell$ cd    ubuntu22.04-rootfs.tgz.files
shell$ split -d --bytes=40M ../ubuntu22.04-rootfs.tgz
shell$ cd ..
```

## 参考

 * https://github.com/ikwzm/MPFS-FPGA-Ubuntu22.04
 * https://github.com/ikwzm/MPFS-FPGA-Linux-Kernel-6.6