Beaglebone Black ネットワーク・ブート環境の構築
Beaglebone Black networking boot via Network over USB.
前回記事、「BeagleBone Black 起動SDカードの作成」では、Linuxを起動できるSDカードを作成してBeaglebone BlackをLinux動作させる方法について紹介しました。
しかし、この方法ではカーネル周りを開発する場合に毎回開発PCでSDカードを作成し、Beaglebone BlackにSDカードを戻して起動、という手順を毎回ふまなければなりません。
また、SDカードを頻繁に抜き差しするため、SDカードスロットへの負荷も大きくなり、SDカードスロットが故障する原因ともなり得ます。
このため、実際の開発現場においてはターゲットボードをネットワーク経由でブートする環境を構築することが現実的です。
今回の記事は、実際にBeaglebone Blackをネットワーク経由でブートするための環境を構築する方法について紹介します。
なお、この記事の内容はUbuntuのバージョンなど「BeagleBone Black 起動SDカードの作成」で紹介した環境をベースにしています。
ネットワーク・ブートとは?
ネットワーク経由でのブートとは、ターゲットであるBeagleBone Blackと開発ホスト(サーバー)をTCP/IPで接続します。実現のために、このネットワーク上では、2つの技術を利用します。
1つ目は、ネットワーク経由でカーネルイメージをダウンロードしてメインメモリに展開するための「TFTP」。
もう1つは、システムが起動するためのルートファイルシステムをネットワークから与えるための「NFS」です。
AM3359は、電源投入後ROMプログラムが動作し、U-Bootをメインメモリにロードします。ここまではSDカード起動と同様です。このU-BootはBeaglebone Black上のMMCでも、SDカードでも問題ありません。
このU-Bootの機能を使ってTFTPサーバーから、カーネルイメージをダウンロードします。TFTPとは、Trivial File Transfer Protocol(トリビアル ファイル トランスファー プロトコル、TFTP)の略で、UDPを使ってファイルを転送するためのプロトコルです。ポート番号は通常69を使います。このTFTPは認証を行わないため、今回のように開発環境などでOSのカーネルイメージを転送するなど、信頼できる近距離でのファイル転送に利用されます。
次に、メインメモリにロードされたカーネルイメージを使ってLinuxを起動しますが、Linux動作に必要となるルートファイルシステムは、ネットワーク上のファイル共有システムであるNFSをマウントし、そこからLinux起動を行います。
このルートファイルシステムの実態はNFSサーバー上にあり、このイメージをネットワーク経由でマウントして利用します。NFSで使われるポート番号は通常は2049です。
このような環境を構築することで、カーネルイメージやユーザーランド/プログラムの実態は開発ホストに存在することとなり、ターゲットボードのローカルなイメージを書き換える必要は無くなり、より迅速な開発が可能となります。
Beaglebone BlackのUSBは、仮想イーサネットの機能を持っています。開発ホストとBeaglebone Blackを接続するネットワーク(TCP/IP)は、このUSB上の仮想イーサネットを使います。
このため、LANポートは必要としません。
$ sudo apt install tftpd-hpa
TFTP動作を有効化します。
$ sudo systemctl enable tftpd-hpa
$ sudo systemctl restart tftpd-hpa
TFTPサーバーとして参照されるデフォルトのディレクトリは、/var/lib/tftpboot/です。
/var/lib/tftpboot/以下にTFTPで転送させたいファイルを置きます。
このディレクトリにカーネルをビルドして作成される、zImageとam335x-boneblack.dtbをコピーします。
次に、開発ホストをNFSサーバーとして動作させるため、nfs-kernel-serverをインストールします。
$ sudo apt install nfs-kernel-server
ルートファイルシステムを展開したディレクトリまたはそのリンクをNFSに公開します。
下記の例では、前回記事で使用した debian-10.0-minimal-armhf-2019-08-05.tar.xz を展開した
/home/UserName/bbb/image/ディレクトリのリンクを/var/lib/nfs/rootfs として作成し、そのリンクを/etc/exportsに記述しています。
# cd /var/lib/nfs
# ln -s /home/UserName/bbb/image/debian-10.0-minimal-armhf-2019-08-05 rootfs
# vi /etc/exports <--- viでなくてもよい、以下の行を記述する。
/var/lib/nfs/rootfs 192.168.11.0/24(rw,sync,no_subtree_check,no_root_squash)
NFSサーバーを起動します。
$ sudo systemctl enable nfs-kernel-server.service
$ sudo systemctl start nfs-kernel-server.service
設定するカーネル・コンフィグは、下記の通りです。
CONFIG_USB_GADGET=y
CONFIG_USB_MUSB_HDRC=y
CONFIG_USB_MUSB_GADGET=y
CONFIG_USB_MUSB_DSPS=y
CONFIG_NOP_USB_XCEIV=y
CONFIG_AM335X_PHY_USB=y
CONFIG_USB_ETH=y
設定は、menuconfig で行います。
menuconfigを実行してください。
そして、Device Drivers --> USB Support 以下で設定を行います。
まず、"Inventra Highspeed Dual Role Controller (TI, ADI, AW, ...)"で下記の設定を行います。
CONFIG_USB_MUSB_HDRC=y
CONFIG_USB_MUSB_GADGET=y
CONFIG_USB_MUSB_DSPS=y
このうちの"CONFIG_USB_MUSB_GADGET=y"については、"MUSB Mode Selection (Gadget only mode) --->"から設定を行います。
CONFIG_NOP_USB_XCEIV=y
CONFIG_AM335X_PHY_USB=y
この状態を設定するには、"USB Physical Layer drivers"から、"CONFIG_NOP_USB_XCEIV=y"を設定することで実現できます。
CONFIG_USB_GADGET=y
これらのコンフィギュレーションを行った後、カーネルとモジュールのビルド・インストールを行います。
できあがったカーネルイメージ =zImageと、dtbファイル=am335x-boneblack.dtbを/var/lib/tftpboot/ 以下にコピーします。
また、モジュールの再インストールも行ってください。
モジュールのインストール先はNFSのルートファイルシステムです。
IPアドレス
開発ネットワークアドレス:192.168.111.0/24
BeagleBoneBlack:192.168.111.222
開発ホスト(サーバー):192.168.111.1
MACアドレス
1つ目は、ネットワーク経由でカーネルイメージをダウンロードしてメインメモリに展開するための「TFTP」。
もう1つは、システムが起動するためのルートファイルシステムをネットワークから与えるための「NFS」です。
AM3359は、電源投入後ROMプログラムが動作し、U-Bootをメインメモリにロードします。ここまではSDカード起動と同様です。このU-BootはBeaglebone Black上のMMCでも、SDカードでも問題ありません。
このU-Bootの機能を使ってTFTPサーバーから、カーネルイメージをダウンロードします。TFTPとは、Trivial File Transfer Protocol(トリビアル ファイル トランスファー プロトコル、TFTP)の略で、UDPを使ってファイルを転送するためのプロトコルです。ポート番号は通常69を使います。このTFTPは認証を行わないため、今回のように開発環境などでOSのカーネルイメージを転送するなど、信頼できる近距離でのファイル転送に利用されます。
次に、メインメモリにロードされたカーネルイメージを使ってLinuxを起動しますが、Linux動作に必要となるルートファイルシステムは、ネットワーク上のファイル共有システムであるNFSをマウントし、そこからLinux起動を行います。
このルートファイルシステムの実態はNFSサーバー上にあり、このイメージをネットワーク経由でマウントして利用します。NFSで使われるポート番号は通常は2049です。
このような環境を構築することで、カーネルイメージやユーザーランド/プログラムの実態は開発ホストに存在することとなり、ターゲットボードのローカルなイメージを書き換える必要は無くなり、より迅速な開発が可能となります。
用意するもの:
一般的にネットワークブートはTCP/IP=LANから行いますが、BeagleBoneBlackでは、新たに必要とするハードウェアはありません。Beaglebone BlackのUSBは、仮想イーサネットの機能を持っています。開発ホストとBeaglebone Blackを接続するネットワーク(TCP/IP)は、このUSB上の仮想イーサネットを使います。
このため、LANポートは必要としません。
開発ホストの準備:
開発ホストをTFTPサーバとして動作させるため、tftpd-hpaをインストールします。$ sudo apt install tftpd-hpa
TFTP動作を有効化します。
$ sudo systemctl enable tftpd-hpa
$ sudo systemctl restart tftpd-hpa
TFTPサーバーとして参照されるデフォルトのディレクトリは、/var/lib/tftpboot/です。
/var/lib/tftpboot/以下にTFTPで転送させたいファイルを置きます。
このディレクトリにカーネルをビルドして作成される、zImageとam335x-boneblack.dtbをコピーします。
次に、開発ホストをNFSサーバーとして動作させるため、nfs-kernel-serverをインストールします。
$ sudo apt install nfs-kernel-server
ルートファイルシステムを展開したディレクトリまたはそのリンクをNFSに公開します。
下記の例では、前回記事で使用した debian-10.0-minimal-armhf-2019-08-05.tar.xz を展開した
/home/UserName/bbb/image/ディレクトリのリンクを/var/lib/nfs/rootfs として作成し、そのリンクを/etc/exportsに記述しています。
# cd /var/lib/nfs
# ln -s /home/UserName/bbb/image/debian-10.0-minimal-armhf-2019-08-05 rootfs
# vi /etc/exports <--- viでなくてもよい、以下の行を記述する。
/var/lib/nfs/rootfs 192.168.11.0/24(rw,sync,no_subtree_check,no_root_squash)
NFSサーバーを起動します。
$ sudo systemctl enable nfs-kernel-server.service
$ sudo systemctl start nfs-kernel-server.service
起動カーネルの準備:
起動するカーネルをNFS起動できる状態に設定する必要があります。
カーネル自身はTFTPによってメインメモリにロードされます。
このカーネルは起動後、BeagleBone BlackのUSB上の仮想TCP/IPネットワークを有効化し、さらにNFSでホストに接続してネットワーク共有ファイルをマウントします。
そのため、いくつかのモジュールをカーネルに組み込んだ形での設定=カーネル・コンフィギュレーションが必要になります。
CONFIG_USB_GADGET=y
CONFIG_USB_MUSB_HDRC=y
CONFIG_USB_MUSB_GADGET=y
CONFIG_USB_MUSB_DSPS=y
CONFIG_NOP_USB_XCEIV=y
CONFIG_AM335X_PHY_USB=y
CONFIG_USB_ETH=y
設定は、menuconfig で行います。
menuconfigを実行してください。
そして、Device Drivers --> USB Support 以下で設定を行います。
まず、"Inventra Highspeed Dual Role Controller (TI, ADI, AW, ...)"で下記の設定を行います。
CONFIG_USB_MUSB_HDRC=y
CONFIG_USB_MUSB_GADGET=y
CONFIG_USB_MUSB_DSPS=y
このうちの"CONFIG_USB_MUSB_GADGET=y"については、"MUSB Mode Selection (Gadget only mode) --->"から設定を行います。
CONFIG_NOP_USB_XCEIV=y
CONFIG_AM335X_PHY_USB=y
この状態を設定するには、"USB Physical Layer drivers"から、"CONFIG_NOP_USB_XCEIV=y"を設定することで実現できます。
CONFIG_USB_GADGET=y
を、設定し、
CONFIG_USB_ETH=y
するためには、"USB Gadget precomposed configurations"のチェックを入れる必要があります。
これらのコンフィギュレーションを行った後、カーネルとモジュールのビルド・インストールを行います。
できあがったカーネルイメージ =zImageと、dtbファイル=am335x-boneblack.dtbを/var/lib/tftpboot/ 以下にコピーします。
また、モジュールの再インストールも行ってください。
モジュールのインストール先はNFSのルートファイルシステムです。
ネットワークの準備:
この記事のアドレス設定:IPアドレス
開発ネットワークアドレス:192.168.111.0/24
BeagleBoneBlack:192.168.111.222
開発ホスト(サーバー):192.168.111.1
MACアドレス
BeagleBoneBlack:f8:dc:7a:00:00:02
開発ホスト(サーバー):f8:dc:7a:00:00:0
U-BootでBeaglebone Black側のネットワークを設定します。
U-Boot起動後、以下のメッセージが出ているときにスペースを入力します。
Press SPACE to abort autoboot in 2 seconds
以下のプロンプトが表示されるので、ネットワーク関連の環境変数を設定します。
=>
Beaglebone Black側のIPアドレス
setenv ipaddr 192.168.111.222
ネットマスク
setenv netmask 255.255.255.0
サーバーのIPアドレス
setenv serverip 192.168.111.1
USB Etherアダプタの有効化
setenv ethact usb_ether
USB EtherアダプタのBeaglebone Black側MACアドレス
setenv usbnet_devaddr f8:dc:7a:00:00:02
USB Etherアダプタのホスト側MACアドレス
setenv usbnet_hostaddr f8:dc:7a:00:00:01
この状態で、ホスト側のネットワークアダプタを設定します。
コマンドでネットワークアダプタを追加します。
# nmcli con add type ethernet ifname enxf8dc7a000001 ip4 192.168.111.1/24
Beaglebone BlackのU-Bootプロンプトからpingコマンドを打って、接続を確認してください。
下記のような表示となればOKです。
host 192.168.111.1 is alive
=>
U-Bootのプロンプトから下記のコマンドを入力して、カーネルイメージとdtbファイルをBeagleBoneBlackのメインメモリに展開します。
=> tftp 0x81000000 zImage
TFTPが正しく動作すると、下記のようにローディングが実行されます。
using musb-hdrc, OUT ep1out IN ep1in STATUS ep2in
MAC f8:dc:7a:00:00:02
HOST MAC f8:dc:7a:00:00:01
RNDIS ready
high speed config #2: 2 mA, Ethernet Gadget, using RNDIS
USB RNDIS network up!
Using usb_ether device
TFTP from server 192.168.111.1; our IP address is 192.168.111.222
Filename 'zImage'.
Load address: 0x81000000
Loading: #################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
###
521.5 KiB/s
done
Bytes transferred = 10535424 (a0c200 hex)
同様に、dtbファイルもTFTPでロードしてください。
=> tftp 0x82000000 am335x-boneblack.dtb
起動パラメーターを設定します。NFSブート、ネットワーク、コンソールなど。。。
=> setenv bootargs root=/dev/nfs rw ip=192.168.111.222:::::usb0 console=ttyO0,115200n8 g_ether.dev_addr=f8:dc:7a:00:00:02 g_ether.host_addr=f8:dc:7a:00:00:01 nfsroot=192.168.111.1:/var/lib/nfs/rootfs,nfsvers=3
いよいよ起動です!
=> bootz 0x81000000 - 0x82000000
制御がメインメモリ上のカーネルに移り、NFSをルートファイルシステムとしてマウントできればログインまで到達できるはずです。
また、無事起動でき、今後ともネットワークブート環境で利用を続ける場合には、saveenvコマンドで基本ネットワークブートを設定してください。
今回の記事では、開発環境としてのネットワークブートでした。
しかし、このネットワークブートは開発環境だけのものではありません。
実際の運用環境においても利用は可能です。つまり、多数のストレージを持たないネットワーク対応のターゲットをネットワークブートすることも可能です。
起動OSのイメージやルートファイルシステムはクラウドとした、IoTエッジも可能なんですね。
開発ホスト(サーバー):f8:dc:7a:00:00:0
U-BootでBeaglebone Black側のネットワークを設定します。
U-Boot起動後、以下のメッセージが出ているときにスペースを入力します。
Press SPACE to abort autoboot in 2 seconds
以下のプロンプトが表示されるので、ネットワーク関連の環境変数を設定します。
=>
Beaglebone Black側のIPアドレス
setenv ipaddr 192.168.111.222
ネットマスク
setenv netmask 255.255.255.0
サーバーのIPアドレス
setenv serverip 192.168.111.1
USB Etherアダプタの有効化
setenv ethact usb_ether
USB EtherアダプタのBeaglebone Black側MACアドレス
setenv usbnet_devaddr f8:dc:7a:00:00:02
USB Etherアダプタのホスト側MACアドレス
setenv usbnet_hostaddr f8:dc:7a:00:00:01
この状態で、ホスト側のネットワークアダプタを設定します。
コマンドでネットワークアダプタを追加します。
# nmcli con add type ethernet ifname enxf8dc7a000001 ip4 192.168.111.1/24
Beaglebone BlackのU-Bootプロンプトからpingコマンドを打って、接続を確認してください。
下記のような表示となればOKです。
host 192.168.111.1 is alive
=>
ネットワークからの起動:
それでは、いよいよネットワークから起動してみましょう。U-Bootのプロンプトから下記のコマンドを入力して、カーネルイメージとdtbファイルをBeagleBoneBlackのメインメモリに展開します。
=> tftp 0x81000000 zImage
TFTPが正しく動作すると、下記のようにローディングが実行されます。
using musb-hdrc, OUT ep1out IN ep1in STATUS ep2in
MAC f8:dc:7a:00:00:02
HOST MAC f8:dc:7a:00:00:01
RNDIS ready
high speed config #2: 2 mA, Ethernet Gadget, using RNDIS
USB RNDIS network up!
Using usb_ether device
TFTP from server 192.168.111.1; our IP address is 192.168.111.222
Filename 'zImage'.
Load address: 0x81000000
Loading: #################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
###
521.5 KiB/s
done
Bytes transferred = 10535424 (a0c200 hex)
同様に、dtbファイルもTFTPでロードしてください。
=> tftp 0x82000000 am335x-boneblack.dtb
起動パラメーターを設定します。NFSブート、ネットワーク、コンソールなど。。。
=> setenv bootargs root=/dev/nfs rw ip=192.168.111.222:::::usb0 console=ttyO0,115200n8 g_ether.dev_addr=f8:dc:7a:00:00:02 g_ether.host_addr=f8:dc:7a:00:00:01 nfsroot=192.168.111.1:/var/lib/nfs/rootfs,nfsvers=3
いよいよ起動です!
=> bootz 0x81000000 - 0x82000000
制御がメインメモリ上のカーネルに移り、NFSをルートファイルシステムとしてマウントできればログインまで到達できるはずです。
また、無事起動でき、今後ともネットワークブート環境で利用を続ける場合には、saveenvコマンドで基本ネットワークブートを設定してください。
今回の記事では、開発環境としてのネットワークブートでした。
しかし、このネットワークブートは開発環境だけのものではありません。
実際の運用環境においても利用は可能です。つまり、多数のストレージを持たないネットワーク対応のターゲットをネットワークブートすることも可能です。
起動OSのイメージやルートファイルシステムはクラウドとした、IoTエッジも可能なんですね。
Have a Happy Hucking!!
Lightning Brains
おまけ:
Ubuntuを経由して、Beagleboneがインターネットにアクセスするためには、Ubuntuをルーターとして動作させてやる必要があります。
そのためには、iptablesを使って出口(インターネット側)をens33として、入口(BeagleBone Black)をenxf8dc7a000001として定義します。
sudo iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE
sudo iptables -A FORWARD -i enxf8dc7a000001 -j ACCEPT
また、BegleBone Blackの/etc/resolv.confの内容を"nameserver 8.8.8.8"とします。
下記のコマンドでルート設定を行います。
# route add default gw 192.168.111.1
コメント
コメントを投稿