Howto

Armadillo-640 で USBメモリ を使用したイメージファイルの書き換え方法

本Howtoでは、USBメモリ を使用して Armadillo-640 の内蔵ストレージ(eMMC)に書き込まれているイメージファイルを書き換える方法を紹介します。
誤って内蔵ストレージのルートファイルシステムなどを壊してしまい、起動できなくなってしまった場合などの復旧方法の一つとして有用です。

Armadillo-640 を USBメモリ から起動できるようにする

1. U-Boot をビルドする

U-Boot に USBメモリ をマスストレージとして認識させるために、Configure を変更してビルドを行います。

[ATDE ~]$ cd u-boot-a600-v2018.03-at[version]
[ATDE ~/u-boot-a600-v2018.03-at[version]]$ make ARCH=arm armadillo-640_defconfig
[ATDE ~/u-boot-a600-v2018.03-at[version]]$ make ARCH=arm menuconfig

Configure 設定画面が表示されるので USB Mass Storate Support を有効にします。

  -> Device Drivers
    -> USB support
      -> [*] USB Mass Storage support  <-- 有効にします。

ビルドを行います。

[ATDE ~/u-boot-a600]$ make CROSS_COMPILE=arm-linux-gnueabihf-

ブートローダイメージを書き換える方法は製品マニュアルを参照してください。

2. USBメモリに起動用イメージを書き込む

製品マニュアルのSDブートの活用と同じ手順で行うことができます。ブートローダーについては Armadillo-640 の内蔵ストレージのものが使われるので USBメモリに書き込む必要はありません。

3. USBメモリから起動する

Armadillo-640 に USBメモリを差し込み、保守モードで電源を投入します。
USBメモリ内の起動イメージをロードします。ロードの方法は、U-Boot のバージョンによって異なります。
・U-Boot のバージョン v2018.03-at5 以上の場合

=> run usbboot
 
(省略)
 
armadillo login: 

・U-Boot のバージョン v2018.03-at5 未満の場合
USBメモリ内の起動イメージをロードするために、U-Boot の環境変数を設定して起動します。

=> setenv setup_usbargs setenv bootargs root=/dev/sda2 rootwait rw \${optargs}\;
=> setenv bootcmd run setup_usbargs\; usb start\; ext4load usb 0:2 ${loadaddr} /boot/uImage\; ext4load usb 0:2 0x83000000 /boot/a640.dtb\; usb stop\; bootm ${loadaddr} - 0x83000000\;
=> boot
 
(省略)
 
armadillo login: 

ログイン後に、df コマンドで USBメモリから起動されていることが確認できます。

[armadillo ~]# df                                                            
Filesystem     1K-blocks    Used Available Use% Mounted on                      
udev               10240       0     10240   0% /dev
tmpfs             102284    1496    100788   2% /run
/dev/sda2       15350664 1047640  13503536   8% /
(省略)

「/」にマウントしているデバイスが「/dev/sda2」となっているので USBメモリから起動されています。

USBメモリ内に格納したイメージファイルで内蔵ストレージのイメージファイルを書き換える

1. 書き換え用のイメージファイルを USBメモリ 内に格納する

USBメモリ を PC に差し込み、書き換え用のイメージファイルを格納します。

[ATDE ~]$ sudo mount /dev/sdb2 /mnt
[ATDE /mnt]$ cd /mnt
[ATDE /mnt]$ sudo mkdir images

ここで作成した images ディレクトリに書き換え用イメージをコピーします。

[ATDE ~]$ sudo cp u-boot-a600-v2018.03-at[version].imx /mnt/images/u-boot.imx
[ATDE ~]$ sudo cp uImage-a600-v4.14-at[version] /mnt/images/uImage
[ATDE ~]$ sudo cp armadillo-640-v4.14-at[version].dtb /mnt/images/a640.dtb
[ATDE ~]$ sudo cp debian-stretch-armhf-a600-[version].tar.gz /mnt/images/debian-stretch-armhf-a600.tar.gz

イメージ書き換え用スクリプト install.sh も用意します。内容は以下の通りです。

#!/bin/sh
 
echo 1 > /sys/class/leds/red/brightness
 
# 1. Bootloader
dd if=u-boot.imx of=/dev/mmcblk0 bs=1k seek=1 conv=fsync
sync
 
# 2. Kernel
mount /dev/mmcblk0p2 /mnt
cp uImage /mnt/boot/uImage
umount /mnt
 
# 3. DTB
mount /dev/mmcblk0p2 /mnt
cp a640.dtb /mnt/boot/a640.dtb
umount /mnt
 
# 4. Debian
mount /dev/mmcblk0p2 /mnt
cd /mnt
ls | grep -v -E 'boot|lost\+found' | xargs rm -rf
cd -
tar zxf debian-stretch-armhf-a600.tar.gz -C /mnt
umount /mnt
 
echo 0 > /sys/class/leds/red/brightness

同じディレクトリにコピーします。

[ATDE ~]$ sudo cp install.sh /mnt/images/
[ATDE ~]$ sudo umount /mnt

2. 書き換え用イメージファイルを内蔵ストレージに書き込む

Armadillo-640 を USBメモリ から起動します。 起動後に install.sh を実行し内蔵ストレージのイメージを書き換えます。

[armadillo ~]# cd /images
[armadillo /images]# chmod +x install.sh
[armadillo /images]# ./install.sh

これで、次回起動時に内蔵ストレージから起動した場合は、書き換えたイメージで起動されます。