Armadilloフォーラム

SDカード上のユーザーランドを使う

te_kawasaki

2014年7月6日 15時52分

SDカード上に、ユーザーランドの圧縮イメージを置き、オンボードのフラッシュからのブートの様にRAMディスク上に展開して起動する方法は無いでしょうか?
FAQかもしれませんが?ドキュメントに見当たりませんでしたので質問させて頂きます。
よろしくお願いいたします。

コメント

at_daisuke.sasaki

2014年7月22日 17時04分

佐々木大輔です。

ユーザーランドの圧縮イメージをRAMに展開し、起動することは現状できません。

差し支えなければ、なぜ、そのようにしたいのか教えて頂けますか?

返答遅くなりました。
弊社では、電源管理も不要な単機能の装置を作ることが多く、ルートファイルシステムはRAMDISK上に展開して動かす様にしています。
この場合、ファームウェアアップデートを行うには、netflash等を使いオンボードフラッシュ上のイメージを書き換える必要がありますが、SDから展開起動できれば、ユーザーに納めた後でもSDカードの入れ替えだけでアップデートが行えるのでコンソール操作などを行わずに済むからです。
SDに起動スクリプトを仕込んでそこからフラッシュ書き込みと言う手もありますが、840だとユーザーランドのイメージ書き込みに長時間掛かるので出来れば、SDから直接展開したいです。
以上です、よろしくお願いいたします。

at_daisuke.sasaki

2014年7月31日 20時32分

佐々木大輔です。

回答いただきありがとうございます。

SDブート + ReadOnlyマウント で、やりたい事はできないでしょうか?

「SD交換だけで、ユーザーに納めた後でもSDカードの入れ替えだけでアップデートがしたい」
というのはSDブートで解決できると思います。

懸念されているのは、電源断などで、SDカードのデータが壊れてしまう事だと思いますが、
これについてはユーザーランドをReadOnlyでマウントしておくことで回避します。
※一時的にデータを書き込みたい領域については「tmpfs」などをマウントしておくことで確保します。

上記で解決できるといいのですが、いかがでしょうか?

佐々木さま、ご提案ありがとうございます。
確かに、SDブートでも可能でしょうが、/var /devなどの適正な処理方法を開拓する必要がありますね。
また、展開されたユーザランドのSDをコピーするのもgzファイル一つをコピーと比べて手間かなと思い質問させていただきました。
出来ないのであれば諦めます。

こんにちは。
竹之下です。

アイデアレベルで試していませんが、SDカード上にrootfsのアーカイブを置いておき、
それをramfsに展開した後pivot_rootすることで実現できないでしょうか?

下記のような手順になるかと思います。
- 一度、フラッシュメモリから展開したRAMDISK上のユーザーランドで起動(initの代わりにshが起動するようにしておく)
- SDカードをマウント(mount /dev/mmcblk0p1 /mnt)
- ramfsをマウント (mkdir /new-root; mount -t ramfs none /new-root)
- SDカード上のアーカイブをramfsに展開(tar xzf /mnt/rootfs.tgz -C /new-root)
- ramfsにpivot_rootする(cd /new-root; pivot_root . old-root)
- 新しいrootfsにchrootする(exec chroot . sh dev/console 2>&1)
- 元のrootfsをアンマウントする(umount /old-root)
- 新しいrootfsのinitを実行

pivot_rootに関しては、manページも参照してください。
http://man7.org/linux/man-pages/man8/pivot_root.8.html
http://man7.org/linux/man-pages/man2/pivot_root.2.html

※pivot_rootコマンドは、busyboxのutil-linuxにも含まれています。