このHowtoでは、Armadillo-IoT G3/G3L/X1 にてUSBフラッシュメモリ内に保存したLinuxカーネルを起動する方法について紹介します。
概要
2017/12/01現在、Armadillo-IoT G3/G3Lの製品マニュアル内「SDブートの活用」で紹介されているSDブート実行方法に「JP1をショートに設定する」という操作が記載されています。
またArmadillo-X1にはSDスロットが搭載されておらず、「ブートディスクを接続したSDスロット拡張ボードを、CON7アドオンインターフェースに接続する」作業が必要となります。
どちらも利用者が行う作業であり、手間が発生してしまっています。
これを回避するため、Armadillo-X1,Armadillo-IoT G3/G3L(以下Armadilloと記載)に標準搭載されているUSBフラッシュメモリからLinuxカーネルを起動させることで、SDブートと似た動作をさせます。
今回は例として、Armadilloで採用しているブートローダー「U-Boot」の機能である「起動時のスクリプトファイル(boot.scr)読み込み」を利用します。
このスクリプトファイルに「ArmadilloのBoot時、USBフラッシュメモリの第一パーティション内に【usbboot_enable】というファイルが存在した場合、USBフラッシュメモリに保存されているLinuxカーネルを起動する」という処理を記載します。
また今回の方法ではマニュアルのSDブートとは違い、SPIフラッシュのブートローダーからUSBフラッシュメモリ内に保存されたLinuxカーネルを起動します。
U-bootで用いるスクリプトファイル(boot.scr)について
U-Bootスクリプト(boot.scr)については別Howto記事「Howto : Armadillo-X1, Armadillo-IoT G3/G3L: U-Bootブートスクリプト(boot.scr)の使い方」にて紹介されています。
詳しい情報はそちらを参照してください。
U-Bootコマンドのテキストファイル(boot.txt)作成
ATDE上でテキストファイル"boot.txt"を作成します。
atde:~$ vi boot.txt
"boot.txt"は以下のように記載します。
setenv get_usbstart usb start setenv usbstop usb stop setenv usbboot_usbdev 0 setenv usbboot_part 1 setenv get_usbboot_enable fatload usb ${usbboot_usbdev}:${usbboot_part} ${loadaddr} usbboot_enable setenv boot_start bootm ${loadaddr} - ${fdt_addr} if run get_usbstart; then if run get_usbboot_enable; then echo try USB boot... setenv usbdev 0 setenv usbpart 1 setenv usbroot /dev/sda2 rootwait rw setenv usbargs setenv bootargs console=${console},${baudrate} root=${usbroot} ${optargs} setenv loadfdt fatload usb ${usbdev}:${usbpart} ${fdt_addr} ${fdt_file} setenv loadimage fatload usb ${usbdev}:${usbpart} ${loadaddr} ${image} fi fi if run usbargs; then if run loadfdt; then if run loadimage; then if run usbstop; then run boot_start fi fi fi else if run mmcargs; then if run loadfdt; then if run loadimage; then run boot_start fi fi fi fi
"boot.txt"内で「fatload」コマンドの対象インターフェースを「usb」としています。
Armadilloでは通常、対象インターフェースは「mmc」となっているため上記のように書き換える必要があります。
またUSBを使用する場合、「usb start」と「usb stop」のコマンドは必ず必要になります。
上記ファイルを用いずに実装を行う際は忘れずに追加してください。
boot.scrの生成
ATDE上でboot.scrを生成します。
今回は「ATDE6」を使用しているため、「u-boot-tools」の「mkimage」コマンドを使用します。
atde:~$ mkimage -A arm -O linux -T script -C none -a 0 -e 0 -d boot.txt boot.scr
生成した"boot.scr"をArmadilloに転送して下さい。
boot.scrの配置
ATDEからArmadilloに転送した"boot.scr"を、eMMCの第1パーティション(/dev/mmcblk2p1)にコピーします。
armadillo:~# mount /dev/mmcblk2p1 /mnt/
armadillo:~# cp boot.scr /mnt/
armadillo:~# sync
armadillo:~# umount /mnt/
Armadilloのブートローダー設定変更
※2018年3月現在、u-bootバージョン[at14]以降は標準でUSBフラッシュメモリを認識できるようになっているため、この項目の作業は必要ありません。それ以前のバージョンを使用する場合、参考にしてください。
上記にて作成したboot.scrはU-Boot上で動作するため、U-Boot上でUSBストレージが認識できることが前提となります。
しかし、2017/12/01現在公開しているブートローダーの設定ではUSBを認識しない設定となっているため、これを修正する必要があります。
各Armadilloの製品ページよりブートローダー(U-Boot)ソースファイルをダウンロードし、これを展開します。
atde:~$ tar xf uboot_2016.07-at11.tar.gz
このブートローダーソースファイルに、今回用意したブートローダー用のパッチ「u-boot-x1-sd-at11_usb-enable.patch」を当てます。
パッチは以下のURLからダウンロードできます。
u-boot-x1-sd-at11_usb-enable.patch
このパッチはブートローダーのバージョン「v11」にのみ対応しています。
先ほど展開したディレクトリにパッチをコピーし、ディレクトリ内に入ります。
atde:~$ cp u-boot-x1-sd-at11_usb-enable.patch uboot_2016.07-at11/
atde:~$ cd uboot_2016.07-at11
atde:~/uboot_2016.07-at11$
移動したパッチを当てます。
atde:~/uboot_2016.07-at11$ sudo patch -p1 < u-boot-x1-sd-at11_usb-enable.patch
パッチを当てた後は、マニュアル内の項目「ブートローダーをビルドする」を参考にイメージファイルを作成します。
イメージファイル作成後、マニュアル内の項目「特定のイメージファイルだけを書き換える」の「ブートローダーイメージの書き換え」を参考に作成したイメージファイルを適用します。
USBデバイスの準備
マニュアル内の項目「SD ブートの活用」を参考に、ATDEでUSBのブートディスクを作成します。
マニュアル内では対象が「SDカード」ですが、同様の方法でUSBもブートディスクとして作成することができます。
ATDEでのブートディスク作成後、USBストレージの第一パーティションに「usbboot_enable」という空ファイルを作成します。
USBデバイス名は適宜変化するため、確認の上指定してください。(以下例ではsdb)
atde:~$ sudo mount /dev/sdb1 /mnt
atde:~$ touch /mnt/usbboot_enable
atde:~$ sync
atde:~$ sudo umount /mnt
作成後、ブートディスクをArmadilloのUSBハブに接続します。
Armadilloの再起動と確認
Armadilloを再起動して、USBストレージのLinuxカーネルが起動することを確認します。
armadillo:~# reboot
dfコマンドを用いてファイルシステム情報を呼び出し、「Mounted on」列の「/」をマウントしているデバイスが「/dev/sda2」となっていればUSBストレージのLinuxカーネル起動成功です。
armadillo:~# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 844844 661328 123384 85% /
udev 10240 0 10240 0% /dev
tmpfs 100272 4800 95472 5% /run
tmpfs 250672 0 250672 0% /dev/shm
tmpfs 5120 0 5120 0% /run/lock
tmpfs 250672 0 250672 0% /sys/fs/cgroup
tmpfs 50136 0 50136 0% /run/user/0
eMMCのLinuxカーネル起動に戻したい場合は一度Armadilloの電源を落とし、ブートディスクを取り出してから電源を入れなおすことで戻ります。 以下のように「/dev/mmcblk2p2」であればeMMCのカーネル起動に戻っています。
armadillo:~# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mmcblk2p2 3457408 665616 2596448 21% /
udev 10240 0 10240 0% /dev
tmpfs 100272 4772 95500 5% /run
tmpfs 250676 0 250676 0% /dev/shm
tmpfs 5120 0 5120 0% /run/lock
tmpfs 250676 0 250676 0% /sys/fs/cgroup
tmpfs 50136 0 50136 0% /run/user/0
注意点
IoTゲートウェイ管理クラウド「node-eye」に必要なnode-eyeパッケージをArmadilloにインストールすると、node-eye専用のboot.scrに上書されますのでご注意ください。
また、独自作成した"boot.scr"を使用したい場合、IoTゲートウェイ管理クラウド「node-eye」を利用することが出来ませんのでご注意ください。