Ubuntu Weekly Recipe

第594回 mmdebstrapで最小のルートファイルシステムを作る

この記事を読むのに必要な時間:およそ 8 分

mmdebstrapはdebootstrapライクなインターフェースを持つ,ルートファイルシステムを作るツールです。今回はこのツールを用いて,より小さなUbuntuルートファイルシステムを作ってみましょう。

debootstrapとmmdebstrap

Linux環境を構築する上で「ルートファイルシステム」は非常に重要なコンポーネントです。ルートファイルシステムの品質によって,ユーザーの使い勝手が大きく変わります。Ubuntuをはじめとする「Linuxディストリビューション」「より良いルートファイルシステムを構築する」ためのプロジェクトとも言えるのです。

世界に遍く存在する多種多様なソフトウェアをすべてひとつのルートファイルシステムに含めることは事実上不可能であり,ムダも多いため,Linuxディストリビューションは「パッケージ管理システム」を構築する方向に進化しました。つまりユーザーが必要なソフトウェアを,必要に応じて,より簡単にインストール・活用できるようにしたのです。

よって大半のLinuxディストリビューションは,パッケージ管理システムを動かすために必要なソフトウェアに加えて,そのLinuxディストリビューションがターゲットにしている大半のユーザーがおそらく使うであろうソフトウェア一式をまとめて提供しています。このため,現在ではそのルートファイルシステムは数百MBから数GBぐらいのサイズになります。

しかしながらコンテナ仮想化の普及によって,ルートファイルシステムに対して別の要求が生まれます。曰く「Linuxシステムと必要なソフトウェアをひとつのイメージにまとめて配布する」ために「ルートファイルシステムはできるだけ小さいほうが良い」という要求です。

コンテナ時代の初期から,コンテナイメージ作成ツールとして使われたのがDebianベースのディストリビューションで使われているのdebootstrapでした。

debootstrapは何もない状態から,Debianのベースシステムを構築するためのツールです。ターゲットのシステムも存在しないため,ホストのツールを使ってパッケージを取得・展開してシステムを構築します。ユーザーはdebootstrapで構築されたベースシステムにchrootし,その中でようやくaptなどのコマンドを使えるようになるのです。

もともとdebootstrapは名前の候補にdebchrootがあったことからもわかるように,Debianベースのchroot環境を構築するツールとして作られたものですが,その後すぐにDebianパッケージ構築の基盤システムとしても広く使われるようになります。今日のDebianパッケージやそれを元にしたDebianシステムの品質は,debootstrapによって「クリーンなベースシステムをかんたんに構築できる」ことも大きな要因のひとつでしょう※1⁠。

※1
ちなみに『Software Design』の読者ならすでにご存知のように,本誌に隔月で掲載されている「Debian Hot Topics」の著者でもある「やまね」さんが最近のdebootstrapに深く関わっています。Debian系のユーザは,それだけでやまねさんもお世話になっているようなものなので,今度あったときにはお礼を言ってみてはいかがでしょうか。

debootstrapは「Debianのベースシステム」を構築するツールではありますが,⁠動作には必要ではない部分をこそぎ落とした最小のシステム」を構築するツールではありません。また,あくまで起点となるベースシステムを構築するツールである以上,そのシステムを作成した時点ではセキュリティアップデートは適用されません。それらは本来debootstrapではなく,たとえばDebianのインストーラーがchrootしたあとに必要に応じて行うべき作業であるためです。

前置きが長くなりましたが,このようなdebootstrapの目的外の用途でも使えるように構築されたツールが,今回紹介するmmdebstrapです。

mmdebstrapのインストール

mmdebstrapは構築時にaptコマンドを活用することで,複数のミラーに対応し,より複雑な依存関係にも対応できるdebootstrapという位置づけになっています。

結果的にdebootstrapよりも数倍速くなったり,apt/dpkgの設定を活用することで不要なデータのインストールを抑止できます。さらに非特権でも実行できるように,Linuxの名前空間やfakerootなどにも対応しているようです。

まずはmmdebstrapをインストールしましょう。mmdebstrapは比較的新しいパッケージのため,Ubuntu 19.04以降が必要です。DebianならDebian 10以降であればmmdebstrapがパッケージ化されています。最新のリリースが0.5.1で,パッケージとの関係は次のようになっています。

  • Ubuntu 19.04,19.10,Debian 10:0.4.1
  • Ubuntu focal,Debian testing:0.5.1

今回はUbuntu 19.10とmmdebstrap 0.4.1で説明します。

Ubuntu 19.04以降の環境であれば,mmdebstrapはパッケージをインストールするだけです。

$ sudo apt install mmdebstrap

LXD上でmmdebstrapを動かすには

ただ普段使っている環境はUbuntu 18.04 LTSであることも考慮して,LXD上でUbuntu 19.10環境を構築し,そこでmmdebstrapを実行する方法もあわせて紹介しておきましょう。

LXDの初期設定については第521回「入門システムコンテナマネージャーLXD 3.0」を参照してください。今回はホストとディレクトリを共有しやすくするために,一般ユーザーとrootアカウントのIDマッピングをホストと同じにしています。共有するディレクトリはコンテナ・ホストともに~/rootfs/です。

$ mkdir $HOME/rootfs
$ lxc launch ubuntu:19.10 mmdebstrap
Creating mmdebstrap
Starting mmdebstrap
$ echo -e "both 0 0\nboth 1000 1000" | lxc config set mmdebstrap raw.idmap -
$ lxc config device add mmdebstrap share disk source=$HOME/rootfs path=/home/ubuntu/rootfs
Device share added to mmdebstrap

さらにdebootstram/mmdebstrapをコンテナ内部で実行するためには,いくつかのシステムコールを許容する必要があります。そこで今回は単に特権コンテナとして動かし,コンテナ内部で名前空間等の設定も行えるようにしておきます。これらの設定を反映させるために,コンテナを再起動してください。

$ lxc config set mmdebstrap security.privileged true
$ lxc config set mmdebstrap security.nesting true
$ lxc restart mmdebstrap

このような設定だと,コンテナとホストの管理者アカウントが隔離されません。さらに/etc/sudoers.d/90-cloud-init-usersにより,ubuntuアカウントはパスワード無しでsudoコマンドを実行できるようになっています。コンテナの扱いには十分に注意してください。

cloud-initなどを使わない場合,パスワードが無効化されたubuntuアカウントしか作られません。さらにOpenSSHサーバーはパスワードログインを無効化しているため,事実上SSHログインができない状態です。ここでは公開鍵をインポートする形で,SSHログインできるようにもしておきましょう。

LaunchpadにSSHの公開鍵を登録しているなら,次のコマンドを実行するだけです。

$ lxc exec mmdebstrap -- sudo -i -u ubuntu ssh-import-id lp:(LaunchpadのID)

GitHubに登録した公開鍵を利用したいのであれば,lp:(LaunchpadのID)の部分を「gh:(GitHubのID⁠⁠」に変更してください。これでlxc listで表示されるIPアドレスに対して,ubuntuアカウントでSSHログインできるはずです。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。