ブログ

遠隔地で運用中にArmadillo-640のルートファイルシステムを書き換える(外部ディスクを使用しない場合)

at_takuma.fukuda
2020年7月7日 8時59分

*この記事の手順の実行にはATDEとArmadillo-640実機の操作の両方が必要となります。
遠隔地で運用中にArmadillo-640のルートファイルシステムを書き換える(micro SDを使用する場合)
上記記事では、Armadillo-640のルートファイルシステムを遠隔地からアップデートする方法についてマイクロSDカードを使用する方法をご説明しました。

この記事ではマイクロSDカードやUSBメモリを使用せず、eMMC上の別のパーティションにルートファイルシステムを構築することで同様の事を行います。

*この記事の手順を実行する前に、上記記事の手順1に従ってブートスクリプトを使用可能なブートローダイメージを作成しておいてください。

1.ブートスクリプトの作成

この記事では、eMMCのパーティション4にシステム書き換え用のルートファイルシステムを配置します。
そのため以下の内容のブートスクリプトを作成します。

setenv setup_mmcargs setenv bootargs root=/dev/mmcblk0p4 rootwait ${optargs};

ATDEを使用して上記内容のテキストファイルを作成し、スクリプトファイルを生成してください。
詳細な手順は下記をご参照ください。
Armadillo Howto Armadillo-X1, Armadillo-IoT G3/G3L: U-Bootブートスクリプト(boot.scr)の使い方

boot.scrを生成し、Armadillo上の任意のディレクトリに格納します。
*この例では「/boot/」に格納しています。

2.パーティション再構成

eMMCのパーティションを区切りなおして別のパーティションにルートファイルシステムを構築します。
Armadillo-640のパーティションを区切りなおす方法については下記ブログ記事を参考にします。
ブログ Armadillo-640/610:eMMCのパーティションを切りなおす方法
上記記事と同様にSDブートを行って、ブートディスク上からeMMCのパーティション分けとイメージファイルの適用を行います。
ブート用SDディスク上には、ブートローダ・カーネル・デバイスツリー・ユーザランドのイメージファイルを用意しておくほか、
手順1で作成したブートスクリプトファイルも用意しておいてください。

上記記事と同様にパーティションを4つに区切りますが、
4つ目のパーティションへはルートファイルシステムを展開し、かつルートファイルシステムのイメージを配置する必要があるため、
一定のサイズが必要となります。
記事執筆時点で配布しているArmadillo-640のルートファイルシステムアーカイブv20200319のファイル容量が214.75MBなので、
512MBもあれば十分ではないかと思われますが、念のためこの記事では1GB確保しておくことにします。
*このパーティションの容量を増やせば、その分システムを動作させるパーティションの容量が小さくなることになるので、
どの程度の容量を確保するかはお客様自身で十分な検証をお願いいたします。

以下、ブートディスク上で実行するスクリプトの例です。

#!/bin/sh
#事前に用意したイメージファイル一式を格納したディレクトリのパスを指定します。
IMAGES_FOLDER=/root/images
 
#用意したイメージファイルのファイル名を変数に格納します。
#実行時にはそれぞれ実際のファイル名に変更してください
UBOOT_IMAGE=u-boot.imx
KERNEL_IMAGE=uImage
DTB_IMAGE=a640.dtb
DEBIAN_IMAGE=debian-stretch-armhf-a600.tar.gz
BOOT_SCRIPT=boot.scr
 
DTB_IMAGE_RENAME=a640.dtb
 
DEV_EMMC=/dev/mmcblk0
RESERVED1_EMMC_PATH=${DEV_EMMC}p1
USERLAND_EMMC_PATH=${DEV_EMMC}p2
RESERVED2_EMMC_PATH=${DEV_EMMC}p3
 
EXT4_EMMC_PATH=${DEV_EMMC}p4
 
#eMMCをフォーマットします
emmc_format() {
    fdisk ${DEV_EMMC} <<EOF
o
n
p
1
 
+32M
n
p
3
 
+128M
#パーティション4についての設定です。サイズを1GBと指定します。
n
p
4
 
+1G
n
p
 
 
 
t
1
b
t
2
83
t
3
b
t
4
83
w
EOF
 
    mkfs.vfat ${RESERVED1_EMMC_PATH}
    mke2fs -F -t ext4 ${USERLAND_EMMC_PATH}
    mkfs.vfat ${RESERVED2_EMMC_PATH}
#パーティション4はパーティション2と同じファイルフォーマットにしておきます。
    mke2fs -F -t ext4 ${EXT4_EMMC_PATH}
}
 
emmc_format
echo "######## Finish making partition ########"
 
dd if=${IMAGES_FOLDER}/${UBOOT_IMAGE} of=/dev/mmcblk0 bs=1k seek=1 conv=fsync
echo "######## Finish writing u-boot ########"
 
mount -t ext4 ${USERLAND_EMMC_PATH} /mnt
rm -rf /mnt/*
 
tar zxf ${IMAGES_FOLDER}/${DEBIAN_IMAGE} -C /mnt
echo "######## Finish writing userland ########"
 
cp ${IMAGES_FOLDER}/${KERNEL_IMAGE} /mnt/boot/uImage
echo "######## Finish writing kernel ########"
 
cp ${IMAGES_FOLDER}/${DTB_IMAGE} /mnt/boot/${DTB_IMAGE_RENAME}
echo "######## Finish writing device tree blob ########"
 
#ここでブートスクリプトをルートファイルシステムの/bootディレクトリに格納する
cp ${IMAGES_FOLDER}/${BOOT_SCRIPT} /mnt/boot/boot.scr
echo "######## Finish writing bootscript ########"
 
umount /mnt
 
#ここからシステム書き換え用ルートファイルシステムの準備
#パーティション4をマウントする
mount -t ext4 ${EXT4_EMMC_PATH} /mntx
#パーティション4へルートファイルシステムアーカイブを展開する
tar zxf ${IMAGES_FOLDER}/${DEBIAN_IMAGE} -C /mnt
echo "######## Finish writing userland2 ########"
umount /mnt

4.まとめ

上記完了したら、下記記事の手順3を実行するとブートスクリプトを読み込んでeMMCのパーティション4をルートファイルシステムとしてArmadillo-640が起動するようになります。
ルートファイルシステム書き換え操作についても下記記事の手順4をご参考ください。
遠隔地で運用中にArmadillo-640のルートファイルシステムを書き換える(micro SDを使用する場合)

ここまでの手順を元に以下のようなフローを組めば、遠隔でのルートファイルシステムアップデートが実現できます。

1.書き換え用のルートファイルシステムアーカイブをダウンロードする
2.ブートスクリプトを置き換える
3.再起動
4.ブートスクリプトを読み込んでeMMCパーティション4をルートファイルシステムとして起動する
5.SDカード上のスクリプトファイルによってeMMCパーティション2のルートファイルシステムを書き換える
6.ブートスクリプトファイルを書き換える
7.再起動