Armadilloフォーラム

Armadillo-640用のルートファイルシステムアーカイブ作成について

junp

2019年5月22日 14時44分

いつもお世話になっております。藤本です。

Armadillo-640用のインストールディスクを作成するために
https://manual.atmark-techno.com/armadillo-guide-std/armadillo-guide-st…
を参考に
at-debian-builderでルートファイルシステムアーカイブを作成し、
make-install-disk-imageでインストールディスクを作成し、インストールが行えました。
ただ、at-debian-builderではapt-getで多くのパッケージを取得、インストールするため時間がかかるので、
弊社のアプリケーションだけを変更する際は、at-debian-builderで作成した
ルートファイルシステムアーカイブを一旦展開し、中身のアプリケーションを変更後、再度アーカイブを作成して、
その後、make-install-disk-imageでインストールディスクを作成しようと思い、その手順を行ってみました。

その手順で一応はArmadilloへのインストールは行えたのですが、
Armadilloで動かしているFTPサーバがエラーで起動できていないことが分かりました。
その原因としてはFTPサーバの設定ファイル(/etc/vsftpd.conf)の所有者がatmarkになっているために失敗しているようでした。
確認してみると、他にもいろいろなファイル、ディレクトリの所有者がatmarkになっていました。
ルートファイルシステムアーカイブをそのまま使った場合は/etcディレクトリ等の所有者はrootになっていました。
(at-debian-builderで作成したルートファイルシステムアーカイブをそのまま使った場合と展開してから使った場合のlsの結果を添付します。)

ルートファイルシステムアーカイブを一旦展開したとしても何も変わらないと思ったのですが、こういったやり方はだめなのでしょうか?
よろしくお願いします。

ファイル ファイルの説明
ls_atmark_asis.txt アーカイブを展開してから作ったイメージでのls -l /*の結果
ls_atmark_edited.txt アーカイブからそのまま作ったイメージでのls -l /*の結果
コメント

藤本です。

すみません。自己解決しました。
tarコマンドにsudoを付けていなかったのが原因でした。
sudoを付けると/etcディレクトリ等の所有者はrootになり、想定した動作になりました。

あと、気になった点が1点あるのですが、
fixupスクリプト内でatmarkユーザを作成していますが、
/home/atmarkディレクトリの所有者がrootになってしまいます。
そのため、atmarkユーザが/home/atmarkにアクセスできなくなっていました。
どうしてホームディレクトリの所有者がrootになってしまうのでしょうか?
とりあえず、その対策として、fixupスクリプトの

mkhomedir_helper atmark

の次の行に

chown atmark.atmark /home/atmark

を入れたのですが、この対応で問題ないでしょうか?

佐藤です。

> /home/atmarkディレクトリの所有者がrootになってしまいます。
こちらでも試してみましたが、/home/atmarkディレクトリの所有者はatmarkとなっていました。

> 佐藤です。
>
> > /home/atmarkディレクトリの所有者がrootになってしまいます。
> こちらでも試してみましたが、/home/atmarkディレクトリの所有者はatmarkとなっていました。

佐藤様

ご確認ありがとうございました。
こちらでも再度確認したところ、/home/atmarkに何らかのファイルを入れるようにしているために
mkhomedir_helperが実行される前に/home/atmarkディレクトリが所有者がrootで作成されてしまうようです。
at-debian-builder-v1.2.0/a600_resources/home/atmarkを消して実行すると/home/atmarkディレクトリの所有者はatmarkになりました。
こういった場合はどう対処すべきでしょうか?

中村です。

> こちらでも再度確認したところ、/home/atmarkに何らかのファイルを入れるようにしているために
> mkhomedir_helperが実行される前に/home/atmarkディレクトリが所有者がrootで作成されてしまうようです。
> at-debian-builder-v1.2.0/a600_resources/home/atmarkを消して実行すると/home/atmarkディレクトリの所有者はatmarkになりました。
> こういった場合はどう対処すべきでしょうか?

at-debian-builder-v1.1.0のときですが、
このようなことや、その他にもいろいろと不具合があったので、
build.shを修正して使いました。
(「その他のいろいろな不具合」については、
簡単に一言で説明するのは難しいので、
ここでは省略させていただきます)

v1.1.0とv1.2.0の差分をとってみたところ、
私の場合に不具合の原因となっていた部分は変更されていないので、
v1.2.0でも同じ考えでいいのではないかと思います。

at-debian-builderの使い方の説明では、
| a600_resources以下にファイルやディレクトリを追加すると、
| そのファイルやディレクトリはそのままルートファイルシステムに
| 配置されます。
となっていて、a600_resources以下に入れたものは、
fixupを実行する前に"cp -r $RES/* $ABSP"でコピーされるのですが、
これが問題になりました。

どのように修正したかというと、独自に追加するものを
a600_resources直下に入れるのではなくて、
a600_resourcesの下にディレクトリを作ってその下に入れます。
そして、build.shを修正して、独自に追加するものは、
fixup実行の後にコピーするようにしました。

そのディレクトリを"hoge"とし、
build.shを次のように修正しました。
(この差分はv1.1.0のときのものです)

--- build.sh-orig
+++ build.sh
@@ -115,7 +115,7 @@
 cp /usr/bin/qemu-arm-static $ABSP/usr/bin
 
 #Copy resources and fixup
-cp -r $RES/* $ABSP
+cp -r $RES/resources $ABSP
 
 chroot $ABSP sh -c "/debootstrap/debootstrap --second-stage"
 
@@ -150,6 +150,9 @@
 chown ${SUDO_USER}  ./installed_pkgs_$BD.list
 rm -rf $ABSP/resources
 
+# copy hoge resources
+cp -a $RES/hoge/* $ABSP
+
 #Archive userland
 (cd $ABSP; tar zcf ../$(basename $ABSP)_$BD.tar.gz * ; chown ${SUDO_USER} ../$(basename $ABSP)_$BD.tar.gz)

"$RES/hoge/*"を"$ABSP"にコピーしするときの
cpのオプションは"-r"ではなくて"-a"にしている
ことにも注意してください。

--
なかむら

佐藤です。

a600_resources/resouces 以下に atmark ディレクトリを作り、
fixupスクリプトを以下のように修正することでも対応可能と思います。

mkhomedir_helper atmark
sudo -u atmark cp -r /resources/atmark /home  <- 追加

中村様、佐藤様

ご回答ありがとうございます。
所有者がrootになると困るディレクトリに関してはa600_resources直下に置かずに
別の方法でfixupの処理が終わってからコピーすることで対処できるようですね。
私の使用方法だと/home/atmarkディレクトリの所有者が問題になっているだけなので、
佐藤様からのアドバイスのfixupスクリプトの修正でも対応できそうです。
ただ、中村様の仰る「その他のいろいろな不具合」がどのようなものか気になります。(私が気付いていない他の不具合がある??)

中村です。

> ただ、中村様の仰る「その他のいろいろな不具合」がどのようなものか気になります。(私が気付い
> ていない他の不具合がある??)

私の場合、build.shの修正例でのディレクトリ"hoge"の下には、
/home/atmarkに入れるものだけではなく、
Armadillo-640のルート以下に配置するものをすべて置いています。
各ファイルやディレクトリのowner/groupやパーミッションも
Armadillo-640にコピーした後のものを事前に設定しています。

「いろいろな不具合」と書きましたがそんなにたくさんあるわけではなく、
(大げさに書いてしまい申し訳ありません)
作業メモや記憶では、次の2つです。
[1] fixupでコピーや生成されるファイルとの競合
[2] 追加パッケージの設定ファイル変更の問題

まず、
[1] fixupでコピーや生成されるファイルとの競合
について。

fixupの最後で/etc/hosts,/etc/rc.local,/etc/network/interfacesを
コピーをしています。
また、fixupが/etc/hostnameを生成しています。

a600_resources/resourcesの下にあるものを修正したり
fixupスクリプトを修正して独自のものにしてもいいのですが、
独自に追加や変更するものは"hoge"の下で一元管理したいので、
(fixupを修正したりfixupに処理を追加したりして対応するしか
ないものもあるのですが、できるだけ"hoge"の下に集めたいので)
fixupスクリプトやa600_resources/resourcesの下のファイルには
手を付けずに、fixupと重複するものも"hoge"の下に置いておいて、
fixupのあとに独自のものを上書きコピーするようにしました。

次に、
[2] 追加パッケージの設定ファイル変更の問題
について。

これは、
[x1-debian-builder: apt-getでインストールされる設定ファイルの変更方法について]
https://users.atmark-techno.com/blog/1913/2575
で説明されているような、設定ファイルの修正方法と警告に対するものです。

警告に都度[N]で応答するのは面倒ですし、操作を間違える可能性もあります。
また、自前で用意(あるいは修正した)パッケージの設定ファイルが
ある状態でパッケージをインストールするのは気持が悪いので、
build.shを修正して、パッケージインストール後にパッケージの
設定ファイルを独自のもので上書きコピーするようにしました。

--
なかむら

中村様

藤本です。

詳しいご説明ありがとうございました。
なるほど、よくわかりました。

[1]については
a600_resources/resources内のinterfaces等のファイルも私の用途に合うように編集しています。
[2]については
a600_resources/resources内にパッケージの設定ファイルを置き、
fixupスクリプトを編集して、apt-get後にそれらをコピーするようにしています。

中村様のやり方とは違いますが、これでも問題は無いかなと考えています。

中村です。

> 中村様のやり方とは違いますが、これでも問題は無いかなと考えています。

はい。
私はa600_resources/resourcesの下はできるだけいじらないように
したかったので、先ほどの説明のようにしましたが、
藤本さんの方法でも大丈夫だと思います。

[2]については、藤本さんも順番を入れ替えることでfixupの問題を
回避されているということですので、アットマークテクノさんに
at-debian-builderの改善をしていただけることを期待しています。

--
なかむら

中村です。

at-debian-builderネタをもう1つ書いておきます。

[8.2.2. ルートファイルシステムのカスタマイズ]
https://manual.atmark-techno.com/armadillo-guide-std/armadillo-guide-st…

の終わりのあたり
[8.2.2.2. Debianパッケージを追加する]
の最後のところに次の注意が書いてあります。

openssh-serverのような「パッケージのインストールの際に、
自動的に秘密鍵を生成する」パッケージは、基本的にpackages
には追加せず、Armadilloを起動した後に"apt-get install"を
使って個別にインストールしてください。

1台や2台ならいいですけど、たくさんあるときは困りますよね。
たくさんあるときは初回起動時のみの処理として自動化できるとしても、
インターネットにつながないとapt-getできないというのも不便です。

この対策として、私は次のようにしています。

(1) openssh-serverパッケージもat-debian-builderでインストール
a600_resources/resources/packagesにopenssh-serverを追記します。

(2) fixupでホスト鍵を削除
fixupスクリプトの最後に次の処理を追加します。

# sshdのホスト鍵を削除
rm -f /etc/ssh/ssh_host_*

(3) 起動時にホスト鍵を生成
サービスとして登録した方がいいのかもしれませんが、
簡易的に/etc/rc.localで次のようにしても大丈夫みたいです。

# sshのホスト鍵がなければ再生成
# overlayfsを使っているときには生成した鍵をlowerにもコピー
if [ ! -f /etc/ssh/ssh_host_rsa_key ]; then
  dpkg-reconfigure openssh-server
  if [ -d /overlay ]; then
    mount -o rw,remount /overlay/system
    cp -p /etc/ssh/ssh_host_* /overlay/system/etc/ssh/.
    sync
    mount -o ro,remount /overlay/system
  fi
fi

Armadillo-640の標準状態ではrwでremountする必要がありますが、
G3やG3Lなどや、/overlay/systemをrwでmountする改造<*1>をしている
Armadillo-640ではremountは必要ありません。

<*1> https://users.atmark-techno.com/forum/armadillo/3790#comment-6750

--
なかむら

中村様

詳しいご説明ありがとうございます。
現在はSSHサーバは使用していないので大丈夫でしたが、
確かにこういった場合はマニュアル通りに個別でapt-getするのは大変そうだと思っていました。
at-debian-builderでインストールしてから秘密鍵を消し、秘密鍵が無ければ再生成するというスクリプトを置いておくので問題なさそうですね。
SSH等の秘密鍵を使うことになったら参考にさせていただきます。