Petalinux 応用編
ネットワーク経由で Petalinux を起動する
公開日:2023年7月31日
これまでに紹介してきた Petalinux の起動手順は、microSDカードにイメージを配置していました。
今回はそれらのイメージをmicroSDカードに配置せず、ホストPC上にあるイメージをネットワーク経由で利用する方法を紹介します。
目次
TFTP サーバ設定
まずはホストPCに TFTP サーバをインストールし、設定を確認します。
$ sudo apt-get install tftpd-hpa
$ cat /etc/default/tftpd-hpa
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"
この環境ではサーバのディレクトリは/srv/tftpとなっています。
また、このディレクトリは読み込み専用になっているので、以下のように TFTP_OPTIONS に "--create" を追加して書き込み出来るようにしておきます。
$ sudo vi /etc/default/tftpd-hpa
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure --create"
TFTP_USERNAME="tftp"から、tftp権限で実行されます。
サーバのディレクトリは root 権限になっているので、tftp に変更します。また、後述の Petalinux ビルド結果のイメージを配置するために書き込み権限も追加しておきます。
$ ls -l /srv
total 4
drwxr-xr-x 2 root nogroup 4096 Dec 8 13:11 tftp
$ sudo chown -R tftp /srv/tftp
$ sudo chmod 777 /srv/tftp
$ ls -l /srv
total 4
drwxrwxrwx 2 tftp nogroup 4096 Dec 8 13:11 tftp
サーバを再起動することで上記設定変更が反映されます。
$ sudo service tftpd-hpa restart
$ service tftpd-hpa status
* tftpd-hpa.service - LSB: HPA's tftp server
Loaded: loaded (/etc/init.d/tftpd-hpa; generated)
Active: active (running) since Mon 2022-12-12 14:47:53 JST; 40s ago
Docs: man:systemd-sysv-generator(8)
Process: 18422 ExecStart=/etc/init.d/tftpd-hpa start (code=exited, status=0/SUCCESS)
Tasks: 1 (limit: 76817)
Memory: 252.0K
CGroup: /system.slice/tftpd-hpa.service
`-18432 /usr/sbin/in.tftpd --listen --user tftp --address :69 --secure --create /srv/tftp
Dec 12 14:47:53 machinename systemd[1]: Starting LSB: HPA's tftp server...
Dec 12 14:47:53 machinename tftpd-hpa[18422]: * Starting HPA's tftpd in.tftpd
Dec 12 14:47:53 machinename tftpd-hpa[18422]: ...done.
Dec 12 14:47:53 machinename systemd[1]: Started LSB: HPA's tftp server.
Petalinux コンフィグレーション (TFTP用)
次に Petalinux 側で TFTP を利用するための設定を行います。
これまでに紹介した記事同様、Petalinux プロジェクトを作成し、システムコンフィグレーションを行っておいてください。
これまでに作成した Petalinux プロジェクトを使っても構いません。
petalinux-config を実行して、[Image Packaging Configuration] を選択し、(/tftpboot) tftpboot directory を TFTP サーバディレクトリ /srv/tftp に変更します。
Root filesystem type についてはひとまず INITRD と EXT4 のどちらでも構いません。
保存して終了し、続いて u-boot の設定のために petalinux-config -c u-boot を実行します。
[Command line interface] -> [Network commands] と遷移し、[serverip variable takes precedent over DHCP server IP.] を有効にします。
保存して終了すれば、設定完了です。
ビルドすると TFTP サーバディレクトリにビルド結果が配置されます。
$ petalinux-build
...
INFO: Successfully copied built images to tftp dir: /srv/tftp
[INFO] Successfully built project
$ ls /srv/tftp/
boot.scr rootfs.cpio.gz rootfs.tar.gz u-boot.bin zynq_fsbl.elf
config rootfs.cpio.gz.u-boot system.bit u-boot.elf
image.ub rootfs.ext4 system.dtb uImage
pxelinux.cfg rootfs.jffs2 u-boot-dtb.bin vmlinux
rootfs.cpio rootfs.manifest u-boot-dtb.elf zImage
TFTP を利用して Petalinux を起動する
以下の手順で Zybo Z7-20 と PC を接続します。これまでとほぼ同じ手順ですが少し異なります。
- microSD カードを FAT32 でフォーマットする
これまでのパーティション構成(FAT32+EXT4)のままでも構いません。中身だけ削除しておいてください。 - microSD カードを Zybo Z7-20 に取り付ける
- Zybo Z7-20 と PC(Ubuntu) を micro USB - USB ケーブルで接続する
- Zybo Z7-20 の イーサネットポートをローカルネットワークに接続する
- Zybo Z7-20 の電源を入れる
- dmesg | tail -f を実行して接続する Port を確認する
- Ubuntu 上でシリアルターミナルソフトを起動する
この状態ではブートローダーがなく、まだシリアルコンソール側に何も出力されません。
JTAG経由で起動するために、ホストPCの Petalinux プロジェクトディレクトリで以下を実行します。
$ petalinux-boot --jtag --u-boot
[INFO] Sourcing buildtools
INFO: Use bitstream: "/home/username/workspace/petalinux1/peta_project/images/linux/system.bit.
INFO: Please use --fpga --bitstream <BITSTREAM> to specify a bitstream if you want to use other bitstream.
INFO: Launching XSDB for file download and boot.
INFO: This may take a few minutes, depending on the size of your image.
rlwrap: warning: your $TERM is 'xterm-256color' but rlwrap couldn't find it in the terminfo database. Expect some problems.: Inappropriate ioctl for device
INFO: Configuring the FPGA...
INFO: Downloading bitstream: /home/username/workspace/petalinux1/peta_project/images/linux/system.bit to the target.
INFO: Downloading ELF file: /home/username/workspace/petalinux1/peta_project/images/linux/zynq_fsbl.elf to the target.
INFO: Loading image: /home/username/workspace/petalinux1/peta_project/images/linux/system.dtb at 0x00100000
INFO: Downloading ELF file: /home/username/workspace/petalinux1/peta_project/images/linux/u-boot.elf to the target.
INFO: SOC Silicon version is 1.0.
これでシリアルコンソール上で起動ログが出力されます。
...
DHCP client bound to address 192.168.0.9 (504 ms)
*** ERROR: `serverip' not set
Cannot autoload with TFTPGET
Zynq>
このシリアルコンソール上で TFTP ブートのための u-boot 設定を行います。
- サーバ(ホストPC)のIPを設定する
- 起動時に以下が行われるようにする
- ボードのIP取得(dhcp)
- pxeブート設定をサーバから取得(pxe get)
- サーバからイメージを取得し実行(pxe boot) - 設定を保存する
microSDカードに保存される
Zynq> setenv serverip 192.168.0.11
Zynq> setenv bootcmd "dhcp;pxe get;pxe boot;"
Zynq> saveenv
Saving Environment to FAT... OK
設定が完了しました。ボードの電源を入れ直し、再度 petalinux-boot --jtag --u-boot を実行すると Linux が起動し、これまで同様ログイン出来るようになります。
PetaLinux 2022.1_release_S04190222 peta_project /dev/ttyPS0
peta_project login: petalinux
You are required to change your password immediately (administrator enforced).
New password:
Retype new password:
peta_project:~$
これで TFTP を利用して、ネットワーク経由で Petalinux を起動出来るようになりました。
カスタマイズして petalinux-build するたびに microSD カードにイメージを配置する必要がなくなります。
※ Zybo Z7-20 の電源入れ直しは必要です
ただし、この方法だと起動のたびに rootfs.cpio.gz.u-boot が展開されて利用されることになり、Linux 起動後に編集した内容が保存されません。
※ microSD カードの ROOT パーティションに rootfs を配置する設定の場合は編集結果は microSD カードに保存されていました
→ NFS を使えばその問題を解決できます(次節で紹介)。
TIPS
ボードの電源入れ直しのたびに Petalinux プロジェクトディレクトリで petalinux-boot --jtag --u-boot を実行するのが面倒な場合、以下の手順で自動的に起動されるようにしておくことが出来ます。
- Petalinux プロジェクトディレクトリで以下を実行して BOOT.BIN を生成する
$ petalinux-package --boot --force --fsbl images/linux/zynq_fsbl.elf --fpga images/linux/system.bit --u-boot - 生成された BOOT.BIN を microSD カードに配置する (利用するカードは上述までと同じもの)
$ cp images/linux/BOOT.BIN /media/username/BOOT/ - microSDカードを Zybo Z7-20 に取り付ける
- ジャンパーピン設定(JP5) を SD 側にする
BOOT.BIN だけは microSD に配置することになりますが、これでボードの電源ONで自動的に起動してログイン入力まで進みます。ただし、ブロックデザインの変更など、BOOT.BIN 自体の更新が必要な変更を行った場合は、再度 BOOT.BIN を生成&再配置が必要です。
NFS サーバ設定
ホストPCに NFS サーバをインストールし、サーバディレクトリを作成します。
ディレクトリはどこでも構いません。ここでは /srv/nfs とします。
$ sudo apt install nfs-kernel-server
$ sudo mkdir /srv/nfs
$ ls -l /srv/
total 8
drwxr-xr-x 16 root root 4096 Dec 19 14:32 nfs
drwxrwxrwx 3 tftp nogroup 4096 Dec 14 14:46 tftp
続いて NFS クライアントからの接続許可設定を行います。/etc/exports の末尾に以下を追加します。
$ sudo vi /etc/exports
...
/srv/nfs 192.168.0.9(rw,sync,no_root_squash,no_subtree_check)
- /srv/nfs: NFS サーバディレクトリパス
- 192.168.0.9: クライアント(Zybo Z7-20)のIPアドレス
- 括弧内: オプション
サーバを再起動することで上記設定変更が反映されます。
$ sudo service nfs-server restart
$ service nfs-server status
* nfs-server.service - NFS server and services
Loaded: loaded (/lib/systemd/system/nfs-server.service; enabled; vendor preset: enabled)
Drop-In: /run/systemd/generator/nfs-server.service.d
`-order-with-mounts.conf
Active: active (exited) since Mon 2022-12-19 16:46:36 JST; 3min 47s ago
Process: 232628 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
Process: 232629 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
Main PID: 232629 (code=exited, status=0/SUCCESS)
Dec 19 16:46:35 machinename systemd[1]: Starting NFS server and services...
Dec 19 16:46:36 machinename systemd[1]: Finished NFS server and services.
Petalinux コンフィグレーション (NFS用)
Petalinux 側で NFS を利用するための設定を行います。TFTP も利用するので、TFTP 用の設定も行っておいてください。
以下で NFS サーバ(ホストPC)がサポートしているバージョンを確認しておきます。
$ sudo cat /proc/fs/nfsd/versions
-2 +3 +4 +4.1 +4.2
petalinux-config を実行して、[Image Packaging Configuration] を選択し、[Root filesystem type] を NFS に変更します。
さらに [Location of NFS root directory] を NFS サーバディレクトリ /srv/nfs に変更します。
保存して終了し、続いて petalinux-config -c kernel を実行します。
[File systems] -> [Network File Systems] と遷移し、以下を有効にします。
- NFS client support for NFS version 3
デフォルトで有効 - NFS client support for NFS version 4
- NFS client support for NFSv4.1
最初は表示されていない。version 4 を有効にすると表示される - NFS client support for NFSv4.2
最初は表示されていない。4.1 を有効にすると表示される - Root file system on NFS
デフォルトで有効
バージョンについてはホストPCがサポートしているバージョンのみ有効にしてください。
利用したいバージョンのみで構いませんが、サポートしている最新バージョンの利用をお勧めします。
また、[Networking support] -> [Networking options] と遷移し、以下を有効にしてください。全てデフォルトでは有効になっています。
- IP: kernel level autoconfiguration
- IP:DHCP support
- IP:BOOTP support
- IP:RARP support
保存して終了します。
Root filesystem を NFS に変更したので、bootargs が変更されます。
デバイスツリーをビルドして、変更内容を確認します。
$ petalinux-build -c device-tree
...
INFO: Successfully copied built images to tftp dir: /srv/tftp
[INFO] Successfully built device-tree
$ cat components/plnx_workspace/device-tree/device-tree/system-conf.dtsi
...
/ {
chosen {
bootargs = "console=ttyPS0,115200 earlycon root=/dev/nfs nfsroot=192.168.0.11:/srv/nfs,tcp ip=dhcp rw";
stdout-path = "serial0:115200n8";
};
};
...
NFS 関連の情報が含まれています。
しかしこれだけでは不十分で、利用する NFS バージョンを指定する必要があります。
system-user.dtsi に chosen をコピーし、利用する NFS バージョンを追記します。
以下のように tcp の後ろに ,nfsvers=4.2 と追記します。
※空白は含めないでください
$ vi project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
/include/ "system-conf.dtsi"
/ {
chosen {
bootargs = "console=ttyPS0,115200 earlycon root=/dev/nfs nfsroot=192.168.0.11:/srv/nfs,tcp,nfsvers=4.2 ip=dhcp rw";
stdout-path = "serial0:115200n8";
};
};
また、UIO 利用などで既に bootargs を編集している場合は、その変更も維持する必要があります。
これで設定完了です。petalinux-build します。
TFTP + NFS を利用して Petalinux を起動する
rootfs を NFS サーバディレクトリに展開します。
$ sudo tar xf images/linux/rootfs.tar.gz -C /srv/nfs/
TFTP 利用時と同じ手順でシリアルコンソール上で TFTP&NFS のための u-boot 設定を行います。
今回も serverip と bootcmd を環境変数として設定&保存します。
※ serverip は変更なし
以前の環境変数設定が保存されている場合、TFTP ブートが進んでしまいます。シリアルコンソール上で以下のカウントダウンが終わる前に任意のキーを入力して自動起動を停止してください。
Hit any key to stop autoboot: 0
Zynq>
設定内容は以下の通りです。
- サーバ(ホストPC)のIPを設定する
- 起動時に以下が行われるようにする
- ボードのIP取得(dhcp)
- Fit image(image.ub) を TFTP サーバから取得し 0x10000000 に配置 (tftpboot 0x10000000 image.ub)
- image(アドレス) を指定して Linux を起動 (bootm 0x10000000) - 設定を保存する
microSDカードに保存される
Zynq> setenv serverip 192.168.0.11
Zynq> setenv bootcmd "dhcp;tftpboot 0x10000000 image.ub;bootm 0x10000000;"
Zynq> saveenv
Saving Environment to FAT... OK
設定が完了しました。ボードの電源を入れ直し、petalinux-boot --jtag --u-boot を実行すると Linux が起動し、これまで同様ログイン出来るようになります。
※ BOOT.BIN を microSD に配置して自動起動でもよい
PetaLinux 2022.1_release_S04190222 peta_project /dev/ttyPS0
peta_project login: petalinux
You are required to change your password immediately (administrator enforced).
New password:
Retype new password:
peta_project:~$
mount でホストPCの NFS サーバディレクトリがマウントされていることが確認でき、ファイルの追加など何らかの編集が即時反映されることが確認出来ます。
peta_project:~$ mount
192.168.0.11:/srv/nfs on / type nfs4 (rw,relatime,vers=4.2,rsize=4096,wsize=4096,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.0.9,local_lock=none,addr=192.168.0.11)
...
peta_project:~$ ls
peta_project:~$ touch test.txt
peta_project:~$ ls
test.txt
$ ls /srv/nfs/home/petalinux/
test.txt
これで TFTP + NFS を利用して Petalinux を起動出来るようになりました。
rootfs はホストPCにあるので、ボード再起動のたびに編集結果が失われることもありません。
なお、ホストPC側から編集する場合は、アクセス権限を揃えるために、以下のように chroot を利用してログインしてから行うことをお勧めします。
$ sudo chroot /srv/nfs/ su petalinux
sh-5.1$ cd ~
sh-5.1$ pwd
/home/petalinux
sh-5.1$ touch test2.txt
※文中に記載されている各種名称、会社名、商品名などは各社の商標もしくは登録商標です。