mmdebstrapとは
debian/ubuntu系統のOSのrootfsを作るツールです。このツールをうまく使うと公式が出しているイメージより小さいイメージを作ることができます。
busyboxとは
BusyBox(ビジーボックス)は、Coreutilsなど標準UNIXコマンドで重要な多数のプログラムを単一の実行ファイルに「詰め込んで」提供する、特殊な方式のプログラムである(その詰め込み方法を指して呼ぶこともある)。
BusyBoxの実行ファイルはLinux上で最小の実行ファイルとなるよう設計されており、各コマンドの実行ファイルをインストールするのに比べディスクの使用量を大幅に削減することができる。そのため、特定用途のLinuxディストリビューションや組み込みシステムに適しており、「組み込みLinuxの十徳ナイフ」とも呼ばれている。GPLv2でリリースされているフリーソフトウェアである。
(Wikipediaから引用)
一般的な方法
variantにminbaseを指定して--dpkgoptオプションでOSの動作に必要のないファイルを削除すると小さいイメージが作成されます。サイズは90.9MBです。
mmdebstrap --variant=custom \
--dpkgopt='path-exclude=/usr/share/man/*' \
--dpkgopt='path-exclude=/usr/share/locale/*' \
--dpkgopt='path-exclude=/usr/share/doc/*' \
--dpkgopt='path-exclude=/var/lib/apt/lists/*debian*' \
--dpkgopt='path-exclude=/var/cache/apt/*.bin' \
--include=busybox,base-files \
focal ./rootfs http://jp.archive.ubuntu.com/ubuntu/
これで導入されるパッケージは以下の通りです。
aptitude search '?essential'|grep -v i386
i apt - コマンドラインパッケージマネージャ
i A base-files - Debian 基本システムの各種ファイル
i base-passwd - パスワードファイル・グループファイルを管理する Debian 基本システム
i A bash - GNU Bourne Again SHell
i A bsdutils - 4.4BSD-Lite 由来の基本ユーティリティ
i A coreutils - GNU コアユーティリティ
i dash - POSIX に準拠したシェル
i A debianutils - Debian に特化した各種ユーティリティ
i diffutils - ファイル比較ユーティリティ
i A dpkg - Debian パッケージ管理システム
i findutils - ファイル検索用ユーティリティ -- find、xargs
i grep - GNU grep, egrep, fgrep
i gzip - GNU 圧縮ユーティリティ
i hostname - ホスト名やドメイン名の設定/参照用ユーティリティ
i A init-system-helpers - 全 init システム用ヘルパーツール
i A libc-bin - GNU C ライブラリ: バイナリ
i A login - システムログインツール
i ncurses-base - 基本的なターミナルタイプ定義
i ncurses-bin - ターミナル関連プログラムとマニュアルページ
i A perl-base - 最小限の Perl システム
i A sed - テキストのフィルタリング・変換用 GNU ストリームエディタ
i A sysvinit-utils - System V ライクなユーティリティ
i A tar - GNU 版 tar アーカイブユーティリティ
i A util-linux - 各種システムユーティリティ
最小限のパッケージのみインストールされているように見えますがこのリストの中にはbusyboxで代替できるコマンドが多くあります。
もっとサイズを小さくしたいのでbusyboxでコマンドを置き換えてみようと思います。
busyboxを使ってrootfsを作る
1,スクリプトをダウンロードします
git clone https://github.com/mouseos/mmdebstrap-busybox-rootfs
2,build.shを実行します。
cd mmdebstrap-busybox-rootfs
sudo bash build.sh
3,完成したのでchrootします。bashが入っていないので最後に/bin/shを指定してbusyboxのシェルを起動します。
sudo chroot ./rootfs /bin/sh
0-1.仕組み
スクリプトの仕組みを説明します。以下がスクリプトです。
#!/bin/bash
#clean
echo Cleaning rootfs
sudo rm -r ./rootfs/*
#mmdebootstrapでbusybox ベースのrootfs作成
mmdebstrap --variant=custom \
--dpkgopt='path-exclude=/usr/share/man/*' \
--dpkgopt='path-exclude=/usr/share/locale/*' \
--dpkgopt='path-exclude=/usr/share/doc/*' \
--dpkgopt='path-exclude=/var/lib/apt/lists/*debian*' \
--dpkgopt='path-exclude=/var/cache/apt/*.bin' \
--include=busybox,base-files \
focal ./rootfs http://jp.archive.ubuntu.com/ubuntu/
#シンボリックリンク作成
sudo chroot ./rootfs /bin/busybox --install -s /bin
#ホスト名
sudo chroot ./rootfs /bin/sh -c "echo "busybox-debian" > /etc/hostname"
sudo cp etc/group rootfs/etc
sudo cp etc/passwd rootfs/etc
sudo cp etc/shadow rootfs/etc
sudo chod 640 rootfs/etc/shadow
#passwdパッケージを使う場合のみ
#sudo cp -r -v etc/pam.d/ rootfs/etc
最初の方ではrootfsフォルダ内を削除します。フォルダ内になにかあるとmmdebstrapが失敗するからです。
次に先程のmmdebstrapコマンドを書き換えます。
mmdebstrap --variant=custom \
--dpkgopt='path-exclude=/usr/share/man/*' \
--dpkgopt='path-exclude=/usr/share/locale/*' \
--dpkgopt='path-exclude=/usr/share/doc/*' \
--dpkgopt='path-exclude=/var/lib/apt/lists/*debian*' \
--dpkgopt='path-exclude=/var/cache/apt/*.bin' \
--include=busybox,base-files \
focal ./rootfs http://jp.archive.ubuntu.com/ubuntu/
variantをminbaseからcustomに変更します。このように変更することによって後述するincludeで指定したパッケージのみインストールします。
dpkgoptではシステムの動作に不要なファイルを除外します。
includeでは必要最小限のパッケージを指定します。
busyboxは様々なコマンドの代わりを果たします。
base-filesは基本的なシステムファイルが含まれています。
このままの状態だとbusyboxは使用できません。lsコマンドを使いたかったらbusybox ls cdコマンドを使いたかったらbusybox cdと入力しないといけない状態です。
そこでbusyboxにシンボリックリンクを作成します。lsという名前でシンボリックリンクを作ればlsと入力するだけでbusybox lsと同じ動作をしてくれます。
そこでスクリプト内でこのようなコマンドを実行いています。
sudo chroot ./rootfs /bin/busybox --install -s /bin
このコマンドで/binにbusyboxで使用できるコマンド名でシンボリックリンクが作成されます。
次にホスト名を設定します。
sudo chroot ./rootfs /bin/sh -c "echo "busybox-ubuntu" > /etc/hostname"
busybox-ubuntuは好きな名前にして構いません。
最後にパスワードなどユーザーに関わるファイルをコピーします。これがないとユーザー追加やパスワード変更で」エラー吐きます。
sudo cp etc/group rootfs/etc
sudo cp etc/passwd rootfs/etc
sudo cp etc/shadow rootfs/etc
サイズはどうなったか
サイズはminbase指定時は90.9MBでしたがbusyboxの使用で16.3MBまで減少しました。
公式のサイズより大幅に減量に成功しました!
実用性
なし。
方法がどこにも書かれていなかったのでいただけです。実用性はあまりありません。使うとしたらTwitterシェルbot(https://github.com/mouseos/twitter-shell-bot)など機能を制限した環境がほしいときくらいでしょう。使い方によっては良いものができるかもしれませんが...