ブログ

Armadilloを使った製品量産時に各Armadilloにopenssh-serverを効率的にインストールする方法(その1)

at_takuma.fukuda
2021年8月29日 18時13分

Armadilloを使った製品を運用するにあたり、
openssh-serverなどをインストールしてEthernet経由でのログインを検討されることと思います。

各Armadilloシリーズの製品マニュアルでもご案内している通り、
openssh-server のような「パッケージのインストールの際に、自動的に秘密鍵を生成する」パッケージは、
ルートファイルシステムアーカイブのイメージにおいてインストールを行うと、
イメージを書き込んだArmadilloすべてが同一の秘密鍵を利用することとなってしまうため、
Armadillo を起動した後に "apt install" を使って個別にインストールすることが望ましいです。

しかし、製品量産時に個別にインストールを行う事は非常に非効率です。

そこで、効率的にArmadilloへopenssh-serverをインストールしつつ、
各Armadilloが異なる秘密鍵を利用するような手順を2つご紹介します。

この記事では、事前にパッケージファイルをダウンロードし、Armadilloの初回起動時にインストールを行うという手段をご紹介します。
もう一つの記事ではインストールしたopenssh-serverの秘密鍵を事後に書き換える手段をご紹介しておりますので、併せてご覧ください。
Armadilloを使った製品量産時に各Armadilloにopenssh-serverを効率的にインストールする方法(その2)

概要

  • debパッケージをダウンロードしてルートファイルシステムアーカイブに格納する
  • インストール後の初回起動時にパッケージのインストールを行う

実施環境

この記事はArmadillo-IoT A6を前提とした記載をしておりますが、
その他のArmadilloシリーズでも同様の手段がご利用可能です。
Armadillo-IoT A6ではルートファイルシステムアーカイブのビルドツールがat-debian-builderであるため、
この記事でもat-debian-builderを使用しています。
他のArmadilloシリーズに適用される場合は、それぞれに適したビルドツールをご利用ください。

パッケージのダウンロード

at-debian-builder/x1-debian-builderでは、
ルートファイルシステムアーカイブをビルドするためにARM用のDebian環境の展開を行うので、
ビルド処理の中でファイルのダウンロードを行うことが出来ます
以下のように、「apt-get install」 コマンドに「-d」というオプションを付けると、
インストールを行わず、ファイルのダウンロードのみを行います。

apt-get install -y -d openssh-server

ダウンロードしたファイルは「/var/cache/apt/archives」に格納されます。
上記コマンド実行後に、このディレクトリに格納された「*.deb」というファイルを全てコピーし、
以下のようにコマンド実行すると、インストールする事が出来ます。

dpkg -i  ./*.deb

ただし、「/var/cache/apt/archives」には「apt-get install -d」でダウンロードしたファイルだけでなく、
「apt-get install」でインストールしたパッケージのキャッシュファイルが全て格納されています。
そのため、「apt-get install -d」を実行する前に、「apt-get clean」を実行してキャッシュをクリアしておく必要があります。

at-debian-builder/aiota6_resources/ersources/fixup
に以下のように追記します。

at-debian-builder/aiota6_resources/ersources/fixup

(前略)
apt-get -y install $PKGS

#ここから
apt-get clean
#キャッシュクリア
apt-get install -y -d openssh-server
#ダウンロード
cd /var/cache/apt/archives
#ダウンロードしたファイルの格納先へ移動
tar zcf  packages.tar.gz *.deb
#ダウンロードしたファイルをファイル名を指定して圧縮(ここではpackages.tar.gzというファイルに圧縮)
mv packages.tar.gz /root/
#任意のディレクトリに移動させておく(ここではルートユーザのディレクトリ)
cd
#ここまで

#Setup locals
(後略)

パッケージのインストール

インストール直後の初回起動時に、ダウンロードしたdebパッケージをインストールします。
インストール実行のために、以下のような処理内容のスクリプトファイルを作成します。

  • aptパッケージファイルを解凍
  • インストールを実行
  • インストール完了後debパッケージファイルを削除
  • スクリプトファイル自身を削除

実際のスクリプトファイル内容は以下のようになります。

/root/setup.sh

cd /root
#debパッケージを圧縮したファイルが格納されたディレクトリへ移動
mkdir pkg
#ファイル展開先のディレクトリを作成
tar zxf packages.tar.gz -C pkg
#上記で作成したディレクトリを指定してファイル展開
cd /root/pkg
#ファイル展開したディレクトリへ移動
dpkg -i  ./*.deb
#インストールの実行
cd ..
#ディレクトリ再移動
rm -r pkg
#展開したファイルをディレクトリごと削除
rm packages.tar.gz
#圧縮ファイルを削除
rm setup.sh
#スクリプトファイル自身を削除

スクリプトファイルを実行させるための準備

作成したスクリプトファイルをArmadillo起動直後に実行させるための準備をします。

ファイル準備

作成したスクリプトファイル「setup.sh」をat-debian-builder/aiota6_resources\resoucesに格納します。

ファイルコピー

at-debian-builder/aiota6_resources\resouces/fixupに以下のように追記し、
ビルド時にファイルのコピーと実行権限の付与を行います。

(前略)
cp /resources/interfaces /etc/network/interfaces

#ここから
cp /resources/setup.sh /root/setup.sh
#ファイルコピー
chmod +x /root/setup.sh
#実行権限付与
#ここまで

#user change the password at login
(後略)
自動実行設定

起動時に上記スクリプトを自動実行させるために、
rc.localファイルへ、スクリプトファイルを呼び出すように記載します。

at-debian-builder/aiota6_resources/resources/rc.local

!/bin/sh

if { -f /sys/calss/leds/red/brightness }; then
	echo 0 > /sys/class/leds/red/brightness
fi

#ここから
/root/setup.sh
#ここまで

実行

以上でビルドしたルートファイルシステムをインストールディスク等で書き込んだ後にArmadilloを起動すると、
ダウンロードしておいたパッケージファイルを初回起動時にインストールさせられます。
ルートファイルシステムのビルド、書き込みの手順については各製品のマニュアルをご参照ください。