- 1回目: 開発環境の準備
- 2回目: Hello Worldプロジェクト
- 3回目: PSのGPIOでLチカ
- 4回目: PLのAXI GPIOでPSからLチカ
- 5回目: PLだけでLチカ
- 6回目: 自作IPでLチカ
- 7回目: ブートイメージを作る
- 8回目: Linux起動する
- 9回目: Linuxカーネルを少しカスタマイズする <--- 今回の内容
- 10回目: LinuxのRootFSをカスタマイズする / PythonでHello World
- 11回目: LinuxユーザアプリケーションでLチカ
- 12回目: LinuxカーネルモジュールでLチカ
- 13回目: LAN(Ethernet 0)を使う
- 14回目: Linuxユーザアプリをデバッグする / RootFSに取り込む
- 15回目: Linux起動時にアプリケーションを自動実行させる
- 16回目: Linuxから自作IPをUIOで制御する
- 17回目: Linuxで自作IPのデバイスドライバを作る
- 18回目: IoT化してスマホからLチカ
この記事の内容を3分で見る ( https://youtu.be/swrcNY7KO8Q )
環境
- 開発用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回目、Linux環境は8回目を参照。
使用するハードウェア(hdf)は8回目を参照。
Linuxカーネルを少しカスタマイズする
前回はLinuxイメージを作成して、起動させました。この時作成したLinuxイメージは、PetaLinuxツールが設定してくれたものをそのまま使用してビルドしたものです。今回は、カーネルを少しだけカスタマイズしてみようと思います。Linuxカーネルの設定は、それだけでご飯が食べていけるくらい奥が深い分野になりますが、今回は簡単な触りだけをやります。
変更する内容
今回は、試しに以下の2点をカスタマイズしてみようと思います。
- ルートファイルシステム(rootfs)をSDカードにする
- デフォルト設定だと、Linuxファイルシステムのルートは、DDR上にマウントされるようです(initramfs)。そのため、ファイルを作成しても、再起動したら消えてしまいます。SDカードを使用するようにします。
- 自動ログインにする
- 起動後、rootとして自動ログインします。(これは、趣味レベルならいいですが、実プロダクトではやるべきではありません。)
コンフィグ / ビルドする
新規PetaLinuxプロジェクトの作成からやります。ハードウェアは前回と同じく、PSのみを配置したhdfを使用します。既存のプロジェクトに対してやる場合は、petalinux-config --get-hw-description=../project_1.sdk
をpetalinux-config
に置き換えてください。)
下記コマンドを実行すると、menuconfigの画面が表示されるので、以下の設定を変更します。
cd ~/work/peta
petalinux-create --type project --template zynq --name SimplePS
cd SimplePS/
petalinux-config --get-hw-description=../project_1.sdk
- Image Packaging Configuration -> Root filesystem type -> SDカードを選択する
- Yocto Settings -> Enable Debug Tweaks を有効にする (Spaceキーを押す)
設定完了したら、SaveしてExitします。その後、ビルドし、BOOT.binを作ります。
petalinux-build
petalinux-package --boot --force --fsbl images/linux/zynq_fsbl.elf --fpga images/linux/design_1_wrapper.bit --u-boot
成果物
最終的に必要となる成果物は、以下の3つです。
- images/linux/BOOT.bin
- FSBL (First Stage Boot Loader)、ビットストリーム、U-Boot (Second Stage Boot Loader)
- images/linux/image.ub
- Linuxシステムイメージ (カーネルなど)
- images/linux/rootfs.ext4
- SDカードに書き込まれるrootfs
メモ
ここ(https://github.com/Digilent/Petalinux-Zybo-Z7-20/blob/master/README.md )には、config後に、meta-user/recipes-bsp/device-tree/files/system-user.dtsiを編集してbootargsを変更しろみたいなことが書いてあったのですが、不要でした。ug1144-petalinux-tools-reference-guide.pdfによると、自動生成される components/plnx_workspace/device-tree-generation/system-conf.dtsiで設定されているらしいです。
SDカードを作成する
ラズパイなどでおなじみですが、SDカードを2つのパーティションに分けて使用します。
- 起動用パーティション (FAT32)
- BOOT.binとimage.ubを保存
- Linuxのルートファイルシステム (ext4)
- rootfs.ext4を保存
パーティションを分ける
Windowsだとext4を扱えないので、Ubuntu上でパーティションを作成します。VirtualBoxを使用している場合は、SDカードリーダ(USB)をVirtualBoxに接続します。(VirtualBox上のメニューバー -> デバイス -> USB -> General Mass Storage Device(このデバイス名は環境によって異なる))
コマンドでやってもいいのですが、Disks (gnome-disk-utility) でGUIから設定します。僕は、8GByteのSDカードを使用しているのですが、以下のように、先頭100MByteをFAT32として、残り全部(7.6GByte)をExt4としてパーティションを分けてフォーマットしました。また、この画面で、Ext4のデバイス名を確認しておいてください。ここだと、/dev/sdb2
になっています。
メモ
ug1144-petalinux-tools-reference-guide.pdfを見ると、起動用パーティション (FAT32)の前に、「4MB の未割り当て領域が必要」とのことでしたが、特に何の設定もしないでも大丈夫でした。
イメージファイルのコピー
起動用パーティション (FAT32)にimages/linux/BOOT.binとimages/linux/image.ubをコピーします。これは、前回と同様です。
Linuxのルートファイルシステム (ext4)には、images/linux/rootfs.ext4を書き込むのですが、これはファイルのコピーではなく、バイナリレベルでイメージをそのまま書き込みます。ddで書き込むとファイルサイズもrootfs.ext4に合わせて60MByteくらいに小さくなってしまうので、最後にリサイズして戻しておきます。
sudo umount /dev/sdb2
cd ~/work/peta/SimplePS/
sudo dd if=images/linux/rootfs.ext4 of=/dev/sdb2
sync
sudo resize2fs /dev/sdb2
sync
起動確認する
前回と同様に、SDカードを挿入して、ジャンパ(JP5)をSDに設定して、電源ONします。
すると、起動完了時に自動的にrootとしてログインしていることが分かると思います。また、試しに、以下のように/home/root/にファイルを作成して再起動してみると、再起動後もファイルがあることが分かると思います。(前回だと、再起動後にファイルは消えていた)
touch newFile
ls
reboot
修正
記事を書いた後に気付いたのですが、これまでの内容は、Linuxカーネルのコンフィグではありません。プロジェクトのコンフィグになります。そのため、U-Bootの設定などはここでやりました。
Linuxカーネルそのもののコンフィグ(カーネルツリーでのmake menuconfig
相当)をやるには、以下コマンドを実行します。
petalinux-config -c kernel
メモ
自分で変更したkernel configは、project-spec/meta-user/recipes-kernel/linux/linux-xlnx/user_2018-01-14-15-33-00.cfg
といった感じに、変更した差分だけが保存されているっぽい。ベースとなるコンフィグはたぶんこれ。project-spec/meta-plnx-generated/recipes-kernel/linux/configs/plnx_kernel.cfg
。一番最初にpetalinux-configしたときに作られているっぽい。
最終的には、これらをマージしたものが使われるのかな??