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