Virtual Box上でZybo用にLinuxをビルドする

Linux環境がないシチュエーションでPetaLinuxをビルドする必要があったので、作業ログ。

基本的な内容は資料[^1] [^2]を参考にした。


### 環境
|項目|概要|
|:-:|:--|
| OS | Windows 10 Enterprise 1909 |
| Vivado (on Windows)    | 2021.1 |
| Virtual Box | 6.1.26 |
| PetaLinux | 2021.1 |
| Board | Zybo z7-20 |

WSL(2), DockerではなくVirtual BoxなのはUSBが扱いやすいこと、PetaLinux用に環境が切れることが主な理由である。


### Bitstream作成

Vivadoでプロジェクト作成後、Zybo Z7-20を選択した。

[PROJECT MANAGER]>[Create Block Design]でZynqだけのブロック作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214706/ed17e327-79d5-de85-0454-46e4a77453bb.png)

[Block Design]ビュー内の[Sources]>[Design Sources]のdesign_1_iを右クリックし、[Create HDL wrapper]でラッパーを作り、

[Project Manager]>[PROGRAM AND DEBUG]の、[Generate Bitstream]する。

完了後、[File]>[Export]>[Export Hardware]を選択、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214706/49103ead-f5e3-b99a-236b-68bfde6ea2af.png)

下記のように選択し、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214706/125f10e8-9201-a920-2bcb-4d318831fe88.png)

これでハードウェア情報を持つファイル、design_1_wrapper.xsaができる。後で使う。

### Virtual Box上にUbuntuをインストール

6.1.28をインストールしたが、Hyper-V関係で起動できなかったため6.1.26にした。


対応するLinuxのバージョン及び保存容量、メモリ容量はPetaLinuxのリファレンスマニュアルをチェックすること
今回はPetaLinux 2021.1であるため、次のようにした。

|項目|概要|
|:-:|:--|
| OS on Virtual Box | Ubuntu 18.04.1 |
| メモリ | 8GB |
| 保存容量 | 120GB |

PetaLinux周りに入る前に以下の設定は行った。

- Windowsとの共有ディレクトリ作成[^3]
- WindowsでMicro SDカードのFAT32等のフォーマットを行うのは面倒なので、Virtual Boxで行うためマウント[^4]
- コピペの設定[^5]。


### PetaLinux環境の構築

```shell:Terminal
# su するか適宜sudoしてください
apt update 
apt upgrade

# 共有ディレクトリの設定
apt install virtualbox-guest-utils
mkdir /share


# petalinux install
## 必要ライブラリのインストール（リファレンスマニュアル参照）
apt install -y gcc git make net-tools libncurses5-dev tftpd zlib1g-dev libssl-dev flex bison libselinux1 gnupg wget diffstat chrpath socat xterm autoconf libtool tar unzip texinfo zlib1g-dev gcc-multilib build-essential 
apt install -y -dev zlib1g:i386 screen pax gzip

## インストールディレクトリの設定
mkdir -p /opt/pkg/petalinux
chown -R [usr_name] /opt/pkg
chgrp -R [usr_nane] /opt/pkg

## インストール
./petalinux-v2021.1-final-installer.run --dir /opt/pkg/petalinux/

# device tree install
git clone https://git.kernel.org/pub/scm/utils/dtc/dtc.git
cd dtc
make
```

以下を~/.bashrcに追加

```bash:.bashrc
# petalinux関連
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
source /opt/pkg/petalinux/settings.sh 

# 共有ディレクトリのマウント
mount.vboxsf share /share             

# dtcのパス通す
PATH=$PATH:[dtcをインストールしたディレクトリ]
```

共有ディレクトリ経由等でWindows上のVivadoで生成したxsaファイル(下記ではdesign_1_wrapper.xsa)をコピーしておく。

```bash:Terminal
petalinux-create -t project --template zynq -n linux_build_test
cd linux_build_test
petalinux-config --get-hw-description=[path-to-you-putted]/design_1_wrapper.xsa
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214706/415a7d03-6594-8947-4773-18b5ca40120b.png)

デフォルトのまま[Exit]

```bash:Terminal
petalinux-build
petalinux-package --boot --force --fsbl images/linux/zynq_fsbl.elf --fpga images/linux/system.bit --u-boot
```

SDカードへの書き込み。
gpartedを使う。


```bash:Terminal
apt install gparted
gparted
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214706/d3112816-c6e2-df2a-84c1-b7a62d701ba6.png)

こんな感じでパーティションを作った。
今回はrootfs等は使わないのでext4の方はいらないが、今後楽なので。

パーティションを切った後、SDカードをマウントし直す必要があるが、面倒なのでrebootすることでマウントし直している。
作ったfat32のパーティションに```image.ub```と```BOOT.bin```, ```boot.scr```をコピーする。
（```boot.scr```を忘れると正常にbootできない[^6]）


```bash:Terminal
df -h # FAT32のパーティションを探す
cd images/linux/
cp image.ub BOOT.bin boot.scr [path-to-FAT32-partition]
```

コピーが終わったら、SDカードをZyboに差し、JP5ジャンパをSDカードブートに刺し替え、USBケーブルでPCと接続する。

Tera Term等で接続する。何も弄ってなければボーレートは115200である。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214706/92d6a89d-5d44-673f-227d-5c0fdfb90b66.png)

```sh:Teraterm
Starting tcf-agent: OK
root@linux_build_test:~#
```

### 参考資料

[^1]: [ZYBO (Zynq) 初心者ガイド (8) Linux起動する](https://qiita.com/iwatake2222/items/6e6915f7318689818368)
[^2]: [Vitis 2021.1 Embedded Platform for Zybo-Z7-20](https://www.hackster.io/mohammad-hosseinabady2/vitis-2021-1-embedded-platform-for-zybo-z7-20-d39e1a)
[^3]: [VirtualBoxでWindows10とUbuntu間のファイル共有](https://sankame.github.io/blog/2020-04-30-virtualbox_share_folder/)
[^4]: [VirtualBox – 仮想マシンにUSBメモリを認識・マウント](https://pc-karuma.net/virtualbox-mount-usb-flash-drive/)
[^5]: [【VirtualBox, Ubuntu18.04】仮想マシンにコピペできない](https://qiita.com/LemonLeaf/items/ac12404e277ff9bb3a65)
[^6]: [Petalinuxで作ったLinuxがZybo-Z7-10でブートしなかった](https://qiita.com/yoshiyasu1111/items/9518bad2d90f61a0a021)