Armadilloフォーラム

Armadillo-640インストールイメージの作成手順について

kima

2023年11月15日 11時34分

お世話になります。

動作中のArmadillo-640の動作イメージをコピーする方法として、
dumprootfsでルートファイルシステムのアーカイブを作成し、
make-install-disk-image.shでSDカード用のインストールイメージを
作成する方法を試しています。

現在、以下の手順で、インストールディスクを作成しています。

動作中のA-640の以下のファイルは標準から変更してあります。
・uBoot → ブートローダー(UART3コンソール)v13 (Armadilloサイトからダウンロード)
・/boot/uImage → 変更(開発環境ATDEでビルド)
・/boot/a640.dtb → 変更(開発環境ATDEでビルド)

●手順
クローン元のArmadillo-640にUSBメモリを挿し、
/boot/uImageをAtmark社からダウンロードしたもの(Linuxカーネルv62)に差し替え、
# dumprootfs
を実行すると、リブート後、ダンプが始まります。

※ ダンプの様子は、COM3で確認しています。
→ USBメモリ内に、dump_rootfs_YYYYMMDD.tar.gz が生成されます。

開発環境ATDEに、make_install_disk_image.zip を展開し、
# make-install-disk-image.sh (引数。。。)
を実行すると、
インストールイメージ(*.img)が生成されます。
これを、microSDカードに書き込み、
クローン先のArmadillo-640にインストールします。

●質問1)
この手順で、
ddなどでルートファイルシステムのイメージをコピーする方法で問題になる、
複製されては困るデータ(SSHの秘密鍵、UUIDなど)の
問題は解決しているのでしょうか?

●質問2)
dumprootfsを実行する際、
/boot/uImageが、開発環境ATDEでビルドしたuImageのままだと、
dumprootfsでリブート後、ダンプが開始できません。
uImageをAtmark社からダウンロードしたものに差し替えると、ダンプができます。
自分でビルドしたuImageでも、dumprootfsが動作するようにはできませんか?
カーネルをビルドする際、必要なオプションがあるのでしょうか?

●質問3)
dumprootfsで生成されたdump_rootfs_YYYYMMDD.tar.gzには、
クローン元の/home/atmark/内に保存しておいた、
uImageおよびa640.dtb ファイルが削除されていました。
/exclude.listには、これらを削除するような記載はしてありません。
削除しないようにすることは可能でしょうか?
(なぜ削除されるのでしょうか?)

●質問4)
インストールイメージを作成(make-install-disk-image.sh)する際、
引数に指定するuImageとa640.dtbに、
開発環境ATDEでビルドした自作のカーネルとデバイスツリーを指定すると、
インストーラー実行時に、これらが/boot/にコピーされていないようです。
代わりに、Armadilloサイトからダウンロードしたファイルを指定すると、
正常に/boot/にコピーされます。

手順や、ビルドの方法に問題があるのでしょうか?

よろしくお願いいたします。

コメント

at_kojiro.yamada

2023年11月15日 13時57分

> ●質問1)
> この手順で、
> ddなどでルートファイルシステムのイメージをコピーする方法で問題になる、
> 複製されては困るデータ(SSHの秘密鍵、UUIDなど)の
> 問題は解決しているのでしょうか?

解決されていません。

まずは、コピーしたくないファイルのパスを /etc/dumprootfs/excludes.list に追加して
そのファイルを dumprootfs の対象から外す必要があります。

コピーされないようにした後の対応はモノによって違うので、
分からなければまた聞いていただければと思います。
その際は、別のトピックにしていただけると助かります。

>
> ●質問2)
> dumprootfsを実行する際、
> /boot/uImageが、開発環境ATDEでビルドしたuImageのままだと、
> dumprootfsでリブート後、ダンプが開始できません。
> uImageをAtmark社からダウンロードしたものに差し替えると、ダンプができます。
> 自分でビルドしたuImageでも、dumprootfsが動作するようにはできませんか?
> カーネルをビルドする際、必要なオプションがあるのでしょうか?

おそらく、カーネルイメージに結合されている initramfs が古いのだと思います。

https://download.atmark-techno.com/armadillo-640/source/
から最新の initramfs_a600-[VERSION].cpio.gz をダウンロードし、
Armadillo-640 製品マニュアルの 「initramfs アーカイブへのシンボリックリンク作成」の手順を再度実行した後に (ln -sf でシンボリックリンクを上書きできます)
カーネルをビルドしてみてください。

>
> ●質問3)
> dumprootfsで生成されたdump_rootfs_YYYYMMDD.tar.gzには、
> クローン元の/home/atmark/内に保存しておいた、
> uImageおよびa640.dtb ファイルが削除されていました。
> /exclude.listには、これらを削除するような記載はしてありません。
> 削除しないようにすることは可能でしょうか?
> (なぜ削除されるのでしょうか?)

dump_rootfs*tar.gz の中に残っているはずですね。
こちらで動作確認してみますので少々お待ちください。

>
> ●質問4)
> インストールイメージを作成(make-install-disk-image.sh)する際、
> 引数に指定するuImageとa640.dtbに、
> 開発環境ATDEでビルドした自作のカーネルとデバイスツリーを指定すると、
> インストーラー実行時に、これらが/boot/にコピーされていないようです。
> 代わりに、Armadilloサイトからダウンロードしたファイルを指定すると、
> 正常に/boot/にコピーされます。
>
> 手順や、ビルドの方法に問題があるのでしょうか?

認識を合わせたいので少し質問させてください。

- 「~インストーラー実行時に、これらが/boot/にコピーされていないようです。」とは、
A. インストールディスク(つまりSDカード)上
B. インストール後のArmadilloのeMMC上
のどちらでしょうか

- 「自身でビルドした uImage が存在せず、かわりに他の uImage が配置されている」
という状態であってるでしょうか

at_kojiro.yamada

2023年11月16日 13時11分

> > ●質問3)
> > dumprootfsで生成されたdump_rootfs_YYYYMMDD.tar.gzには、
> > クローン元の/home/atmark/内に保存しておいた、
> > uImageおよびa640.dtb ファイルが削除されていました。
> > /exclude.listには、これらを削除するような記載はしてありません。
> > 削除しないようにすることは可能でしょうか?
> > (なぜ削除されるのでしょうか?)
>
> dump_rootfs*tar.gz の中に残っているはずですね。
> こちらで動作確認してみますので少々お待ちください。

こちらでは再現できませんでした。
/boot/uImage を /home/atmark/uImage にコピーして、dumprootfs を実行してみましたが、
ちゃんと dump_rootfs*.tar.gz の中に /home/atmark/uImage が存在していました。

どこに問題があるのか切り分けていくのが良いと思います。

[armadilloまたはATDE]# tar tf dump_rootfs_YYYYMMDD.tar.gz | grep /home/atmark

上記コマンドで /home/atmark/uImage と /home/atmark/a640.dtb が表示されれば、 dump_rootfs_YYYYMMDD.tar.gz の中にそれらのファイルが含まれています。

含まれていた場合は、上記と同様のコマンドでインストールディスク内の /images/dump_rootfs_YYYYMMDD.tar.gz にファイルが含まれているかどうか確認してみてください。

含まれていなかった場合は、dumprootfs コマンドを実行したArmadillo の /etc/dumprootfs/exclude.list の中に /home/atmark に関する行がないか確認してみてください。

> > > ●質問3)
> > > dumprootfsで生成されたdump_rootfs_YYYYMMDD.tar.gzには、
> > > クローン元の/home/atmark/内に保存しておいた、
> > > uImageおよびa640.dtb ファイルが削除されていました。
> > > /exclude.listには、これらを削除するような記載はしてありません。
> > > 削除しないようにすることは可能でしょうか?
> > > (なぜ削除されるのでしょうか?)
>

> [armadilloまたはATDE]# tar tf dump_rootfs_YYYYMMDD.tar.gz | grep /home/atmark
> 

> 上記コマンドで /home/atmark/uImage と /home/atmark/a640.dtb が表示されれば、
> dump_rootfs_YYYYMMDD.tar.gz の中にそれらのファイルが含まれています。

【結果】
ご確認いただき、ありがとうございます。

以前、dumprootfsしたときのデータを、上記tar tfコマンドで確認しましたが、
やはりuImage, a640.dtbはありませんでした。
質問させていただいたときには書いていませんでしたが、これらは、
(追加・変更したファイルをまとめておくため。。)

/home/atmark/xxxxxx_armadillo_custom_files/boot/uImage
/home/atmark/xxxxxx_armadillo_custom_files/boot/a640.dtb

というカタチで保存してあります。
dumprootfsは、下記、excludes.listに従い、
"/boot/uImage"と、"/boot/a640.dtb"は、削除してるようなので、
"~/boot/uImage"も削除されてしまっているのでしょうか?

excludes.listは、以下のとおりです。

/excludes.list
/boot/*
/root/.bashhistory
/home/*/.bashhistory
/var/log/*

at_kojiro.yamada

2023年11月17日 14時45分

> > > > ●質問3)
> > > > dumprootfsで生成されたdump_rootfs_YYYYMMDD.tar.gzには、
> > > > クローン元の/home/atmark/内に保存しておいた、
> > > > uImageおよびa640.dtb ファイルが削除されていました。
> > > > /exclude.listには、これらを削除するような記載はしてありません。
> > > > 削除しないようにすることは可能でしょうか?
> > > > (なぜ削除されるのでしょうか?)
> (略)
> dumprootfsは、下記、excludes.listに従い、
> "/boot/uImage"と、"/boot/a640.dtb"は、削除してるようなので、
> "~/boot/uImage"も削除されてしまっているのでしょうか?
>
> excludes.listは、以下のとおりです。
>

> /excludes.list
> /boot/*
> /root/.bashhistory
> /home/*/.bashhistory
> /var/log/*
> 

こちらの現象、initramfs側の dumprootfs のバグでした。
ご迷惑おかけしてしまい申し訳ございません。

excludes.list を実際に使う前に、処理の都合で各行の先頭の / を削除していたのが原因でした。
先頭の / を削除すると boot/* となり、パスを問わずあらゆる boot/ 以下のファイルを除外する、という意味になっています。
今月余力がなく来月になってしまうかもしれませんが、修正します。

今できる対策として、excludes.list の各行の先頭の / を /./ にすることでこの問題を回避することができます。
上記 excludes.list を修正すると以下のようになります。

/./excludes.list
/./boot/*
/./root/.bashhistory
/./home/*/.bashhistory
/./var/log/*

at_kojiro.yamada

2023年12月27日 14時30分

> こちらの現象、initramfs側の dumprootfs のバグでした。
> ご迷惑おかけしてしまい申し訳ございません。
>
> excludes.list を実際に使う前に、処理の都合で各行の先頭の / を削除していたのが原因でした。
> 先頭の / を削除すると boot/* となり、パスを問わずあらゆる boot/ 以下のファイルを除外する、という意味になっています。
> 今月余力がなく来月になってしまうかもしれませんが、修正します。

12月になってしまいましたが、
こちらのバグを initramfs v2.1.2 ( dump_rootfs v1.1.2 ) で修正しました。
ニュース[1] で「/etc/dumprootfs/excludes.list 内の絶対パスを相対パスとして扱ってしまうバグを修正」としている項目が本件の修正です。

[1] https://armadillo.atmark-techno.com/news/20231226/software-update-a600

> > ●質問2)
> > dumprootfsを実行する際、
> > /boot/uImageが、開発環境ATDEでビルドしたuImageのままだと、
> > dumprootfsでリブート後、ダンプが開始できません。
> > uImageをAtmark社からダウンロードしたものに差し替えると、ダンプができます。
> > 自分でビルドしたuImageでも、dumprootfsが動作するようにはできませんか?
> > カーネルをビルドする際、必要なオプションがあるのでしょうか?
>
> おそらく、カーネルイメージに結合されている initramfs が古いのだと思います。
>
> https://download.atmark-techno.com/armadillo-640/source/
> から最新の initramfs_a600-[VERSION].cpio.gz をダウンロードし、
> Armadillo-640 製品マニュアルの 「initramfs アーカイブへのシンボリックリンク作成」の手順を再度実行した後に (ln -sf でシンボリックリンクを上書きできます)
> カーネルをビルドしてみてください。

【結果】
ご指摘の通り、カーネルビルド時に結合するinitramfsを、
initramfs_a600-2.1.0.cpio.gz

initramfs_a600-2.1.1.cpio.gz
に変更することで、
dumprootfsが動作するようになりました。
ありがとうございました。

※他の質問に頂いたコメントについても、確認のうえ対応いたしますので、お待ち下さい。

> > ●質問1)
> > この手順で、
> > ddなどでルートファイルシステムのイメージをコピーする方法で問題になる、
> > 複製されては困るデータ(SSHの秘密鍵、UUIDなど)の
> > 問題は解決しているのでしょうか?
>
> 解決されていません。
>
> まずは、コピーしたくないファイルのパスを /etc/dumprootfs/excludes.list に追加して
> そのファイルを dumprootfs の対象から外す必要があります。
>
> コピーされないようにした後の対応はモノによって違うので、
> 分からなければまた聞いていただければと思います。
> その際は、別のトピックにしていただけると助かります。
>
【回答】
●SSHの秘密鍵については、

Armadilloを使った製品量産時に各Armadilloにopenssh-serverを効率的にインストールする方法
https://armadillo.atmark-techno.com/blog/10899/10011
https://armadillo.atmark-techno.com/blog/10899/10043

を参考にトライしてみます。

●UUIDについては、
なにか、参考になる情報はございますでしょうか?

よろしくお願いします。

> > ●質問4)
> > インストールイメージを作成(make-install-disk-image.sh)する際、
> > 引数に指定するuImageとa640.dtbに、
> > 開発環境ATDEでビルドした自作のカーネルとデバイスツリーを指定すると、
> > インストーラー実行時に、これらが/boot/にコピーされていないようです。
> > 代わりに、Armadilloサイトからダウンロードしたファイルを指定すると、
> > 正常に/boot/にコピーされます。
> >
> > 手順や、ビルドの方法に問題があるのでしょうか?
>
> 認識を合わせたいので少し質問させてください。
>
> - 「~インストーラー実行時に、これらが/boot/にコピーされていないようです。」とは、
> A. インストールディスク(つまりSDカード)上
> B. インストール後のArmadilloのeMMC上
> のどちらでしょうか
>
> - 「自身でビルドした uImage が存在せず、かわりに他の uImage が配置されている」
> という状態であってるでしょうか
>
【結果】
質問4については、
私が、質問2の内容と勘違いしているところがあり、
質問内容が適切ではありませんでした。
ご面倒おかけしました。

結果として、以下の方法で、
インストールイメージを生成することで、
SDカードからインストーラーが動作し、
「想定通りに」インストールすることができました。

sudo ./build.sh \
a640 u-boot-a600-console-uart3-v2018.03-at13.imx
<自作uImage> \
<自作dtb> \
<自作rootfs> \
core/uImage \
armadillo-640-v4.14-at61.dtb

従来は、5・6個目の引数を指定せずに実行しておりました。
自作のuImage, a640.dtb を使用時には、5・6個目の引数に、
SDカードから起動する用のuImageとdtbが必要。
ということでよろしいでしょうか?

上記の引数設定が、最適なのかわかりませんので、
ご指摘があればお願い致します。