本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
これで、次回起動時に内蔵ストレージから起動した場合は、書き換えたイメージで起動されます。