mmdebstrapによるarmhf向けrootfsの作成方法(公式最小サイズ27MB)

mmdebstrapとは

mmdebstrapとは、最小構成rootfsを作成するためのdebootstrapを代替するコマンドです。debootstrapと同様に、Debianサポートアーキテクチャ向けのrootfsを作成できます。mm(Multi-Mirror)が意味するように、複数のミラーサーバを使用する事により、debootstrapより3〜6倍ほど高速に動作します。

2019年3月現在(Debian9, stretch環境)では、mmdebstrapはtesting/unstableに存在します。stableに存在しないmmdebstrapを知ったキッカケは、debian-embeddedのメーリスです。128MB以下のrootfsを作成する方法がメーリス内で質問され、mmdebstrapの開発者(Johannes Schauer)がその方法の一つとして紹介していました。質問自体は、最終的にmmdebstrapが作成するrootfsのサイズがネックになり、他の方法(Yocto)が採用されていました。

mmdebstrapは開発中ですが、組み込み分野で使用される可能性もあります。そのため、本記事ではmmdebstrapの基本的な特徴を押さえた後、stretch環境への導入方法、rootfsの作成方法を記載します。

                    

mmdebstrapの良い点

以下の内容は、公式レポジトリのREADMEを日本語訳し、意味が通るように補足・意訳しています。比較対象は、debootstrapです。

良い点
  • 複数のミラーサーバが使用可能(debootstrapは、単一ミラーを使用)
  • ミラーサーバがDebian stableとしてセキュリティ更新される点
  • debootstrapより、3〜6倍高速
  • 必須パッケージおよびaptコマンドを含むrootfsが11秒で作成可能
  • aptコマンドを含むrootfs(.tar.gz)が27MB以下
  • namespacefakechrootprootを用いた非管理者権限での動作が可能
  • nodev(特殊デバイス)としてマウントされたFilesystem上で操作可能
  • mmdebstrapとアーキテクチャが異なる場合は、qemuを用いてrootfsを作成

開発者は、「rootfsはDebian stableのセキュリティ更新に追従しなければいけない」と考えていたようです。debootstrapは2009年時点からこの問題(#543819#762222)を解決できていませんでした。一方で、mmdebstrapはaptコマンドを用いる事によって、このセキュリティ問題を対策しました。ちなみに、debootstrapはwgetコマンドによってrootfsを作成しています。

aptコマンドを使用した恩恵として、debootstrapより3〜6倍高速になりました。下表は、 開発者がIntel Core i5-5200U(ノートPC)で検証した結果(速度比較)です。

variant mmdebstrap debootstrap

minbase
(必須・推奨・aptパッケージから構成されたrootfs)

14.18 s 51.47 s

buildddpkgopt
(minbaseにbuild-essentialを含めたrootfs)

20.55 s 59.38 s

(minbaseに重要なパッケージを含めたrootfs。
debootstrapのデフォルト構成)
18.98 s 127.18 s

                                        

mmdebstrapの書式・オプション

rootfs(TARGET)形式は、非圧縮(ディレクトリ)、tar(アーカイブ)、gzip(gz)、compress(Z)、bzip2、lzip(lz)、lzma(lzma)、lzop(lzo)、lz4、xz、zstd(zst)です。

Option 説明
help ヘルプを表示。
variant rootfsにインストール対象のパッケージを指定。パッケージ名を直接指定せず、extract, custom, essential, apt, required(デフォルト), minbase, buildd, important, debootstrap, -, standardから選択します。詳細は後述。
mode rootfs作成時の権限をauto(デフォルト), sudo, root, unshare, fakeroot, fakechrootprootから選択します。
aptopt rootfs作成時に、aptコマンドへ渡すオプションを指定します。
指定オプションはrootfs内”/etc/apt/apt.conf.d/99mmdebstrap”に記載されます。
dpkgopt rootfs作成時に、dpkgコマンドへ渡すオプションを指定します。
指定オプションはrootfs内”/etc/dpkg/dpkg.cfg.d/99mmdebstrap”に記載されます。
include rootfsに追加したいパッケージをカンマ区切りで記載します。
variantsがextract/custom以外は、依存関係を解決します。
components Debianフリーソフトウェアガイドラインに従って、rootfsに導入するパッケージを制限します。main, contrib, non-freeのいずれかをカンマ区切りで記載します。
architectures rootfsのアーキテクチャをカンマ区切りで指定します。amd64, arm64, armel, armhf, i386, mips, mips64el, mipsel, ppc64el, s390xの中から選択します。
なお、powerpcは、stretchよりサポート対象外です。
Variants 説明
extract デフォルトでは何もinstallしません(“Essential:yes”パッケージも同様)。
custom “include”オプションで指定されたパッケージのみinstallします。
essential “Essential:yes”パッケージをinstallします。
apt essentialにaptコマンドを加えて、installします。
required, minbase essentialに”Priority:required”パッケージとaptコマンドを加えて、installします。
buildd minbaseにbuild-essentialを加えて、installします。
important, debootstrap, – requiredに”Priority:important”パッケージを加えて、installします。
standard “Priority:standard”パッケージを全てinstallします。

                                    

mmdebstrapのinstall方法

今回使用した環境は、以下の通りです。

mmdebstrapは、Debian9(stretch)に提供されていません。そのため、以下の記事を参考にtesting/unstableパッケージをinstallできるようにしてください。

Debian: 任意のtesting/unstableパッケージのみをinstallする方法(システム全体はstableを維持)

上記の記事内容を実施後、以下のaptコマンドを実行してください。testingミラーサーバからinstallするパッケージはmmdebstrapのみで、他のパッケージはstretchミラーサーバから取得します。また、mmdebstrap推奨パッケージ(≒依存パッケージ)は、明示的に指定しないとinstallされません。そのため、以下の手順ではarch-test(推奨パッケージ)などを列挙して記載しています。installしなかった場合、HOST(native)環境向けrootfsしか作成できません。

                                                                 

mmdebstrapの実行例

まず、Host環境(amd64)向けrootfs作成の成功例・失敗例を示した後、Target環境について説明します。

HOST環境向けは、「管理者権限を付けてtesting/unstableを指定した場合」および「管理者権限を付けない方法(proot、fakechroot、fakeroot、unshare)」が失敗しました。つまり、Host環境向けは、管理者権限を付けてstable rootfsを作成するケースしか成功しません。失敗例は全てのログを示すと数が多いため、prootを指定した場合のみを例示します。

HOST環境向けrootfs作成の成功例(sudo権限、testingを指定)

HOST環境向けrootfs作成の失敗例(proot、stableを指定)

Target環境(armhf)の成功例では、不要なファイル(man, locale, doc)を削除し、rootfsサイズを小さくしたケース(35MB)を示します。Target環境はHOST環境向けと逆で、管理者権限を付けると失敗するため、失敗例はその例を示します。

Target環境向けrootfs作成の成功例(proot、unstableを指定)

Target環境向けのrootfs作成の失敗例(sudo権限、stable指定)

                   

                                 

Raspberry Pi3環境でのrootfs動作確認

上記の手順で作成したTarget環境向けrootfsをRaspberry Pi3にコピーし、動作確認します。

                                    

おまけ: 最小rootfs作成に挑戦……敗北

私が作成したTarget環境(armhf)向けのrootfsは、35MBです。このサイズは、組み込み環境としては大きいです。rootfsサイズは、起動速度にも関わるため、より小さいサイズのrootfsを試みました。結果は駄目でしたが、考え方と実行結果ログを残しておきます。

最小rootfs作成の挑戦結果(まとめ)
  • variantオプションがcustomの場合、最小rootfsが作成できそう(予想)
  • custom選択時は、includeオプションで指定パッケージは依存解決されない(仕様)
  • busyboxベースのrootfs環境は、エラーを読む限り作成が許されていない(予想)
  • rootfsに不要なファイルは、man、doc、locale、aptコマンドのゴミ(事実)

前提として、以下の通り、busyboxベース(busybox + ログインシステム)はエラーが発生して作成できません。

上記のエラーを考慮した場合、bash(dash、fishも可能)、coreutils、diffutils、libc-binが最低限必要な事が分かります。さらに、基本的なログインシステムを提供するには、login, passwd, uidmap, base-filesも導入しなければいけません。極めつけとして、variantオプションがcustomの場合は、依存関係を自動的に解決しないため、依存解決用パッケージをincludeオプションに渡さなければなりません。依存関係を手動で列挙する事は苦痛なため、これ以上の挑戦を止めました。

最後に、パッケージをinstallした後に、除外するファイルについてです。「mmdebstrapの実行例」と同じく、man、locale、docが削除できます。さらに、aptコマンド実行後のゴミも削除できます。これらの削除対象ファイルに関しては、2015年のELBE(Embedded Linux Build Enviroment)で言及されています。

                                             

おすすめ