Howto

Armadillo-X1,Armadillo-IoT G3/G3LでUSBストレージ内のLinuxカーネルを起動する方法

この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」を利用することが出来ませんのでご注意ください。