mmdebstrapとbusyboxを利用して最小のubuntuを作る

watch_later 2021年12月29日水曜日

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




仕組み

スクリプトの仕組みを説明します。以下がスクリプトです。
#!/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)など機能を制限した環境がほしいときくらいでしょう。使い方によっては良いものができるかもしれませんが...

この記事を書いた人



sentiment_satisfied 絵文字