Ubuntu Weekly Recipe

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

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

基本的な使い方

基本的な使い方を見ていきましょう。Ubuntu 19.10(Eoan Ermine)のルートファイルシステムは,次のように作成します。

$ mmdebstrap --components="main restricted universe multiverse" \
  eoan eoan-rootfs http://jp.archive.ubuntu.com/ubuntu
I: automatically chosen mode: unshare
I: chroot architecture amd64 is equal to the host's architecture
I: running apt-get update...
done
I: downloading packages with apt...
done
I: extracting archives...
done
I: installing packages...
done
I: downloading apt...
done
I: installing apt...
done
I: installing remaining packages inside the chroot...
done
I: cleaning package lists and apt cache...
done
done

debootstrapと異なり管理者権限でsudoコマンドを付けて)実行する必要はありません。現在のmmdebstrapは,特に指定しなければ環境に応じてunshareコマンドを用いて隔離空間を作成します。この挙動は--modeオプションを用いて変更可能です。

コマンドオプションにはコンポーネントを指定しています。Debianの場合は原則としてmainだけで良く,contrib/non-freeは必要に応じて付ける形になることが多いのですが,Ubuntuの場合はmain/restricted/universe/multiverseすべて指定することが多いためです。ちなみに0.5.1ではカンマ区切りの指定もサポートしています

残りのコマンドライン引数はそれぞれ順番に,リリース名,出力先,ミラーURIです。上記の例だとリリース名は「eoan」になります。リリース名はルートファイルシステム内部の/etc/apt/sources.listを構築する際に利用されます。

2つ目の引数である「eoan-rootfs」は出力先です。出力先は「.tar.gz」など拡張子を付けると圧縮アーカイブ形式で保存でき,サポートしている拡張子が存在しない場合はプレーンなディレクトリとなります。サポートしている拡張子はmanページのCOMPRESSIONの項目を参照してください。-を指定した場合,標準出力に出力します。パイプを経由して別のプロセスで出力結果を処理したい際に便利です。

最後の引数がミラーサーバーのURIです。0.4.1の場合,指定しないと「http://deb.debian.org/debian」が使われます。よってUbuntu用のルートファイルシステムを作る場合は,明示的にミラーサーバーを指定する必要があるのです※2⁠。ちなみに0.5.1からは,リリース名に応じてミラーサーバーを自動的に切り替える機能が実装されました。ただしリリース名とディストリビューションの対応リストは,mmdebstrapのスクリプト内部に静的に持っているため,より新しいリリース名には対応できない可能性があります。上記のようにミラーを明示しておく方法も覚えておきましょう。

※2
debootstrapの場合,リリース名に合わせて実行されるスクリプトが異なるため,そのあたりの対応は不要です。

ミラーサーバーは複数指定できます。たとえば通常のリポジトリに加えて,PPAもセットで指定したい場合は,コマンドの末尾にPPAのURIを追加してください※3⁠。

※3
後述するDebianのルートファイルシステムを作る際の注意点と同じ理由により,PPAを指定する場合は,実行ホスト上にあらかじめ該当するPPAのリポジトリ鍵をインポートしておく必要があります。

ミラーサーバーで指定できるURIは次の3種類です。

  • -⁠:標準入力の内容がそのままsources.listに追加されます
  • debもしくはdeb-src 」で始まる文字列:その行がそのままsources.listに追加されます
  • ://が含まれる文字列:deb URI リリース名 コンポーネントの形でsources.listに追加されます
  • 上記以外でファイル名の場合:ファイル名の内容がそのままsources.listに追加されます

特に-については,たとえば次のように実行すると,現在のリポジトリ設定をそのまま利用できます。

$ cat /etc/apt/sources.list /etc/apt/source.list.d/*.list | mmdebstrap eoan eoan-rootfs -

Debianのルートファイルシステムを作る際の注意点

Ubuntu上でDebianのルートファイルシステムを作ろうとするとリポジトリの鍵がないため,次のようにエラーになります。

$ mmdebstrap unstable sid
I: automatically chosen mode: unshare
I: chroot architecture amd64 is equal to the host's architecture
I: running apt-get update...
done
Get:1 http://deb.debian.org/debian unstable InRelease [139 kB]
Err:1 http://deb.debian.org/debian unstable InRelease
  The following signatures couldn't be verified because the public key
is not available: NO_PUBKEY 04EE7237B7D453EC NO_PUBKEY 648ACFD622F3D138
Reading package lists...
W: GPG error: http://deb.debian.org/debian unstable InRelease: The
following signatures couldn't be verified because the public key is
not available: NO_PUBKEY 04EE7237B7D453EC NO_PUBKEY 648ACFD622F3D138
E: The repository 'http://deb.debian.org/debian unstable InRelease' is
not signed.
E: apt-get update -oAPT::Status-Fd=<$fd> -oDpkg::Use-Pty=false failed

これはUbuntuには,Debianアーカイブのリポジトリ鍵がインストールされていないためです。

mmdebstrapは最初の段階では実行ホスト上のaptコマンドを利用します。その際,aptコマンドは実行ホスト上に登録されているリポジトリ鍵です。Ubuntuマシンなら,Ubuntuの公式リポジトリの公開鍵とユーザーがPPA登録時などに追加した公開鍵がそれに該当します。これはapt-keyコマンドで参照できます。

$ apt-key list
/etc/apt/trusted.gpg.d/ubuntu-keyring-2012-archive.gpg
------------------------------------------------------
pub   rsa4096 2012-05-11 [SC]
      790B C727 7767 219C 42C8  6F93 3B4F E6AC C0B2 1F32
uid           [ unknown] Ubuntu Archive Automatic Signing Key (2012) <ftpmaster@ubuntu.com>

/etc/apt/trusted.gpg.d/ubuntu-keyring-2012-cdimage.gpg
------------------------------------------------------
pub   rsa4096 2012-05-11 [SC]
      8439 38DF 228D 22F7 B374  2BC0 D94A A3F0 EFE2 1092
uid           [ unknown] Ubuntu CD Image Automatic Signing Key (2012) <cdimage@ubuntu.com>

/etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive.gpg
------------------------------------------------------
pub   rsa4096 2018-09-17 [SC]
      F6EC B376 2474 EDA9 D21B  7022 8719 20D1 991B C93C
uid           [ unknown] Ubuntu Archive Automatic Signing Key (2018) <ftpmaster@ubuntu.com>

しかしながらDebianのルートファイルシステムを作る際に参照するリポジトリはUbuntuではなく,Debianのリポジトリです。よってDebianのリポジトリの公開鍵が必要になるのです。

Debian系のリポジトリには,Debianアーカイブのリポジトリ鍵がパッケージ化されています。それをインストールして,mmdebstrap時に参照するようにしましょう。

$ sudo apt install debian-archive-keyring

これにより/usr/share/kerings以下に,Debianリポジトリのリリースごとの鍵ファイルがインストールされます。あとはmmdebstrapコマンド実行時に,aptコマンドのオプションとして鍵束ファイルを指定するだけです。

$ mmdebstrap unstable sid \
  --aptopt='Dir::Etc::Trusted "/usr/share/keyrings/debian-archive-keyring.gpg"'

ちなみにmmdebstrapの最新のコードにはdebootstrapコマンドと同じように,--keyringオプションが追加されています。よって,将来のリリースではもう少し直感的に鍵束ファイル・ディレクトリを指定できるようになるはずです。

著者プロフィール

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

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