ブログ

遠隔地で運用中にArmadillo-640のルートファイルシステムを書き換える(micro SDを使用する場合)

at_takuma.fukuda
2020年7月1日 17時48分

*この記事の手順の実行にはATDEとArmadillo-640実機の操作の両方が必要となります。
*この記事ではSDブート用のマイクロSDカードを使用することを想定した手順を記載します。
ブートディスクの作成方法については下記をご参照ください。
Armadillo-640 製品マニュアル14.1. ブートディスクの作成

Armadillo-640を客先で使用している・機器の内部に設置しているなど直接操作を行えない場合には、
SSHなどをインストールして遠隔で操作できるようにされていることが多いかと思います。

このような環境でシステムのアップデートを行う場合、
カーネル・DTB・ブートローダなどはSSHの操作で書き換えることが出来ますが、
ルートファイルシステムは書き換えることが出来ません。
Armadillo-640ではeMMCにあるルートファイルシステムがそのまま動いているためです。

そのためルートファイルシステムを書き換えるためには別のルートファイルシステムを用意する必要があります。
マニュアルでご案内している標準的な手順はSDブートを実行してeMMCをマウントして書き換えるというものです。
Armadillo-640 製品マニュアル 11.2.4. ルートファイルシステムの書き換え

しかしeMMCブートで動作しているArmadillo-640をSDブートに切り替えるには、
保守モードで起動しブートローダの環境変数を書き換える、ジャンパピンをショートする等、ハードウェアを直接操作する必要があります。

遠隔運用中のArmadillo-640ではハードウェアの操作を行う事は難しいです。
そこで、この記事ではソフトウェア操作のみでルートファイルシステムの切り替えを行い、
遠隔でのルートファイルシステム書き換えを可能とするための手順をご紹介します。

1.ブートスクリプトの有効化

ルートファイルシステムに必要なハードウェア操作のうち、
ブートローダの環境変数変更については自動化することが可能です。
Armadillo-640のブートローダの操作を自動化するためにはブートスクリプトを使用します。
ブートスクリプトとは?またブートスクリプトの生成方法などについては以下を参照ください。
Armadillo Howto Armadillo-X1, Armadillo-IoT G3/G3L: U-Bootブートスクリプト(boot.scr)の使い方

しかしArmadillo-640のブートローダは初期設定ではブートスクリプトは有効になっていません。
ブートスクリプトを有効にするには、ブートローダのコンフィギュレーションを変更する必要があります。
下記の手順1~2を参考にATDE上にU-Bootのソースコードアーカイブを展開し、
Armadillo-640用のデフォルトコンフィギュレーションを適用します。
Armadillo-640 製品マニュアル 10.1. ブートローダーをビルドする
デフォルトコンフィギュレーション適用後、以下のコマンドでコンフィギュレーションメニューを表示します。

[atde7]$ make ARCH=arm menuconfig

コンフィギュレーションメニューが表示されたら以下を有効化してください。

Command line interface
--> [*] Use hush shell
--> Shell scripting commands
--> [*] source

コンフィギュレーションを変更したら、再度以下の手順に戻ってビルドを行ってください。
Armadillo-640 製品マニュアル 10.1. ブートローダーをビルドする

ビルドしたブートローダイメージをArmadillo-640へ書き込む方法は下記を参考にしてください。
Armadillo-640 製品マニュアル
これでブートローダがブートスクリプトを読み込めるようになります。

2.ブートスクリプトによるルートファイルシステム変更

ブートローダからLinuxカーネルを起動する際には以下が実行されます。
・ルートファイルシステムの指定
・カーネルイメージの読み込み
・DTBの読み込み

Armadillo-640のブートローダでは、Linuxカーネル起動時にsetup_mmcargsという関数を実行してルートファイルシステムの指定を行っています。
この関数のパラメータを書き換えてしまえば起動時のルートファイルシステムを変更できます。
マイクロSDカードのパーティション2をルートファイルシステムとして指定するブートスクリプトは以下の通りです。

setenv setup_mmcargs setenv bootargs root=/dev/mmcblk1p2 rootwait ${optargs};
*デフォルト設定では「root=/dev/mmcblk0p2」となっています。
*この記事ではSDブート用のマイクロSDカードを使用しているため
 マイクロSDカードのパーティション2にルートファイルシステムが配置されているので、
 そこを指定しています。

ATDEを使用して上記内容のテキストファイルを作成し、スクリプトファイルを生成してください。
詳細な手順は下記をご参照ください。
Armadillo Howto Armadillo-X1, Armadillo-IoT G3/G3L: U-Bootブートスクリプト(boot.scr)の使い方
また、eMMCのパーティション2をルートファイルシステムに戻すためのブートスクリプトも作っておく必要があります。

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

ブートスクリプトを生成したら、Armadillo上の任意のディレクトリに格納します。
*この記事ではboot.scrというファイル名のスクリプトを「/boot/」に格納しています。

3.ブートローダの環境変数変更

ブートローダの環境変数を変更して、
ブートローダからカーネルを起動する際にこのスクリプトを読み込むよう、u-bootの環境変数「bootcmd」を変更します。

setenv bootcmd "ext4load mmc 0:2 ${loadaddr} /boot/boot.scr; source; run setup_mmcargs; ext4load mmc 0:2 ${loadaddr} /boot/uImage; ext4load mmc 0:2 0x83000000 /boot/a640.dtb; bootm ${loadaddr} - 0x83000000;"
*bootcmd実行時にまずeMMCのパーティション2の/bootディレクトリ下にあるboot.scrを読みだし実行するよう指定しています。

bootコマンドを実行するとまずスクリプトを読み込み、それからルートファイルシステム、uImage、dtbを読み込ませて起動するという処理になっています。

4.ルートファイルシステムの書き換え

SDカード上のルートファイルシステムからeMMCをマウントしてルートファイルシステムを書き換えることが出来ます。
以下のマニュアル通りの手順を実行すれば書き換えが完了します。
Armadillo-640 製品マニュアル 11.2.4. ルートファイルシステムの書き換え
この時気を付けなければならないのは、ルートファイルシステムの書き換えが完了したらブートスクリプトも変更しておく必要があるという事です。
ブートスクリプトを変更して起動時にeMMCのパーティション2をルートファイルシステムに指定するようにしておかないと、起動するたびにSDカードをルートファイルシステムしてシステムが立ち上がってしまいます。

ここで行うべき処理をシェルスクリプトとして自動化すると以下のようにになります。

#!/bin/sh
#eMMCの第2パーティションを/mnt/ディレクトリにマウントします。
mount -t ext4 /dev/mmcblk0p2 /mnt
cd /mnt
#eMMCの第2パーティションのboot、lost+foundディレクトリ以外のファイル・ディレクトリを削除します。
ls | grep -v -E 'boot|lost\+found' | xargs rm -rf
cd -
#ルートファイルシステムアーカイブを/mnt/ディレクトリに展開します。
#ファイル名の指定にお気を付け下さい
tar zxf /root/debian-stretch-armhf-a600-[version].tar.gz -C /mnt 
sync
#eMMCをルートファイルシステムとして起動するようブートスクリプトファイルを書き換えます。
cp /root/boot.scr /mnt/boot/boot.scr
#/mnt/ディレクトリにマウントしたeMMCの第2パーティションをアンマウントします。
umount /mnt
#Armadillo-640を再起動します。
reboot

このスクリプトの実行を/etc/rc.localに記載していておけば、
起動後ルートファイルシステムを書き換え、元のルートファイルシステムに戻るところまで自動で動作してくれます。
ここまでの手順を元に以下のようなフローを組めば、遠隔でのルートファイルシステムアップデートが実現できます。

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