ZYBO (Zynq) 初心者ガイド (10) Linuxのrootfsをカスタマイズする / PythonでHello World

- [1回目: 開発環境の準備](https://qiita.com/take-iwiw/items/966f252f6ca954aff08b)
- [2回目: Hello Worldプロジェクト](https://qiita.com/take-iwiw/items/24a8a94741fdbb80f62a)
- [3回目: PSのGPIOでLチカ](https://qiita.com/take-iwiw/items/39d2ed00fa88a1204fce)
- [4回目: PLのAXI GPIOでPSからLチカ](https://qiita.com/take-iwiw/items/a3b935a4e4dbd41593e1)
- [5回目: PLだけでLチカ](https://qiita.com/take-iwiw/items/efcdfca1866b9941fd2a)
- [6回目: 自作IPでLチカ](https://qiita.com/take-iwiw/items/b0f2ce7b4653bc6f32b9)
- [7回目: ブートイメージを作る](https://qiita.com/take-iwiw/items/ece0cdf83e6e1908fad8)
- [8回目: Linux起動する](https://qiita.com/take-iwiw/items/6e6915f7318689818368)
- [9回目: Linuxカーネルを少しカスタマイズする](https://qiita.com/take-iwiw/items/6f2644d16cbfdb021d07)
- __[10回目: Linuxのrootfsをカスタマイズする / PythonでHello World](https://qiita.com/take-iwiw/items/94a90047978664159681) <--- 今回の内容__
- [11回目: LinuxユーザアプリケーションでLチカ](https://qiita.com/take-iwiw/items/5e4ab9a106acfda2c866)
- [12回目: LinuxカーネルモジュールでLチカ](https://qiita.com/take-iwiw/items/e7efc48d92d7b979efdc)
- [13回目: LAN(Ethernet 0)を使う](https://qiita.com/take-iwiw/items/ac489acaca1ab54d7ce8)
- [14回目: Linuxユーザアプリをデバッグする / rootfsに取り込む](https://qiita.com/take-iwiw/items/8134ca7098622219b177)
- [15回目: Linux起動時にアプリケーションを自動実行させる](https://qiita.com/take-iwiw/items/50065df6cdd1ba8bcbd6)
- [16回目: Linuxから自作IPをUIOで制御する](https://qiita.com/take-iwiw/items/da91ce4dc2a8a8df3c0a)
- [17回目: Linuxで自作IPのデバイスドライバを作る](https://qiita.com/take-iwiw/items/05eb1204cb51ce0a5c03)
- [18回目: IoT化してスマホからLチカ](https://qiita.com/take-iwiw/items/e9311292c5078d785699)

# 環境
- 開発用PC: Windows 10 64-bit 
	- Vivado 2017.4 WebPACKライセンス
	- Xilinx SDK 2017.4  <- 今回は使わない
- 開発用PC (Linux): Ubuntu 16.04 本家 (日本語版じゃない) (on VirtualBox 5.2.4)
	- PetaLinux 2017.4
- ターゲットボード: ZYBO (Z7-20) 

Windows環境は[1回目](https://qiita.com/take-iwiw/items/966f252f6ca954aff08b)、Linux環境は[8回目](https://qiita.com/take-iwiw/items/6e6915f7318689818368)を参照。
使用するハードウェア(hdf)は[8回目](https://qiita.com/take-iwiw/items/6e6915f7318689818368)を参照。

# Linuxのrootfsをカスタマイズする / PythonでHello World
前回は、Linuxカーネルをカスタマイズしました。今回は、rootfsをカスタマイズしてみます。デフォルト設定のままで作ったrootfsには最低限のバイナリやライブラリしか含まれていません。今回は試しに、Pythonを追加して、PythonからHello Worldしてみようと思います。また、gdbも追加してみます。

- Pythonoの追加
- gdbの追加

## メモ
本当は、gccも入れてネイティブビルドできるようにしようと思ったのですが、出来ないようです。
https://forums.xilinx.com/t5/Embedded-Linux/gcc-in-petalinux-kernel/td-p/788368


# プロジェクトの準備
新規PetaLinuxプロジェクトの作成からやります。とりあえず、下記操作でBOOT.binとimage.ubを作成して、ちゃんと起動できることを確認します。これは、[8回目](https://qiita.com/take-iwiw/items/6e6915f7318689818368)と同じです。

```sh
cd ~/work/peta
petalinux-create --type project --template zynq --name SimplePS
cd SimplePS/
petalinux-config --get-hw-description=../project_1.sdk
petalinux-build
petalinux-package --boot --force --fsbl images/linux/zynq_fsbl.elf --fpga images/linux/design_1_wrapper.bit --u-boot
```

参考のために、出来上がったバイナリのサイズを確認しておきます。

```sh
~/work/peta/SimplePS$ ls -la images/linux/BOOT.BIN images/linux/image.ub 
-rw-rw-r-- 1 tak tak 4554128 Jan 12 13:26 images/linux/BOOT.BIN
-rw-r--r-- 1 tak tak 9482736 Jan 12 13:25 images/linux/image.ub
```

# rootfsのコンフィグ / ビルドする
下記コマンドで、rootfsのコンフィグ画面に入れます。ここで、さまざまなツール(/usr/bin)やライブラリを、含めたり取り外したりできます。また、次回やる予定ですが、自作のユーザアプリケーションを含めるかどうかもここで設定できます。

```sh
petalinux-config -c rootfs
```

今回は、Pythonとgdbをインストールします。Filesystem Packages -> devel -> python -> python -> pythonと、Filesystem Packages-> misc -> gdbを選択して、Save,Exitします。

![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/214268/574c0c05-8708-c646-4b3e-b4d8b1f33720.jpeg)
![02.jpg](https://qiita-image-store.s3.amazonaws.com/0/214268/70c6963e-a0e2-c77a-94eb-1308de50973c.jpeg)

その後、ファイルシステムを更新します。`petalinux-build -x package`だけで良いはずですが、上手くいかなかったら、`petalinux-build -x do_populate_sysroot`と`petalinux-build -c rootfs`もやってみてください。(時間がかかるので注意)

```sh
# petalinux-build -x do_populate_sysroot
petalinux-build -x package
# petalinux-build -c rootfs
```

### メモ
rootfsのコンフィグファイルは`project-spec/configs/rootfs_config`に作られるっぽい。


# 成果物
変更したのはrootfsだけなので、`image.ub`のみ更新します。`image.ub`をSDカードに上書きコピーします。ファイルサイズが大きくなっていることを確認してください。もともと9MByteくらいだったものが、12MByteまで増加しています。

```sh
~/work/peta/SimplePS$ ls -la images/linux/BOOT.BIN images/linux/image.ub 
-rw-rw-r-- 1 tak tak  4554128 Jan 12 13:26 images/linux/BOOT.BIN
-rw-r--r-- 1 tak tak 12832728 Jan 12 13:47 images/linux/image.ub
```

## 確認する
`image.ub`を更新したSDカードで、Zyboを起動します。pythonとgdbがインストールされていることを確認します。

```sh
root@SimplePS:~# ls /usr/bin/gdb /usr/bin/python*
/usr/bin/gdb               /usr/bin/python-config     /usr/bin/python2-config    /usr/bin/python2.7-config
/usr/bin/python            /usr/bin/python2           /usr/bin/python2.7
```

# PytonでHello Worldする
通常のLinuxのようにPythonコードを実行できます。viはデフォルトでインストールされています。(今回は、rootfsはRAMに展開されているので、再起動したらファイルは消えます)

```sh
root@SimplePS:~# vi hello.py
root@SimplePS:~# cat hello.py
print("hello world")

root@SimplePS:~# python hello.py
hello world
```

# gdbでデバッグしてみる
試しに、lsコマンドをgdbでデバッグしてみます。当然lsコマンドにはデバッグ情報が含まれていないので、ブレークポイントなどは張れませんが、一応gdbからrunはできていました。ただし、gdb起動直後にエラー(LookupError: no codec search functions registered: can't find encoding)が大量に発生していました。

```sh
root@SimplePS:~# gdb ls
 ここでエラーがたくさんでる
(gdb) run
Starting program: /bin/ls
Cannot access memory at address 0x0
hello.py
```