Booster
Booster は高速な initramfs ジェネレータで、mkinitcpio や dracut と似ています。 Booster は distri プロジェクト に着想を得ており、小型で高速な init イメージを生成することを目指しています。
Booster は以下の2つのコンポーネントから構成されています:
- Initramfs ジェネレータ
/usr/bin/booster
ユーザー空間ツール。initramfs イメージの生成を行います。 - 生成されたイメージは通常
/boot/
に配置され、システムブートローダーによって Linux OS を起動するのに使われます。
インストール
booster-gitAUR パッケージをインストールしてください。パッケージのインストールフックによって initramfs イメージが生成されます (インストールされているカーネル (例: linux, linux-lts) ごとにひとつずつ)。イメージは /boot
ディレクトリに配置されます:
$ ls -lh /boot/booster*
-rwxr-xr-x 1 root root 4.0M Dec 16 16:20 /boot/booster-linux.img
また、イメージは手動で生成することもできます:
$ booster -output mybooster.img
設定
Booster ジェネレータの設定は /etc/booster.yaml
に存在します。設定ファイルが存在しない場合、デフォルトの設定 (ホスト個別イメージ、ネットワークなし) が使われます。
設定ファイルを使うことでデフォルトの挙動を変更できます。設定例:
/etc/booster.yaml
network: dhcp: on # 'dhcp' cannot be used together with 'ip' ip: 10.0.2.15/24 gateway: 10.0.2.255 universal: false modules: nvidia,kernel/sound/usb/
network
はネットワークの設定です。この設定がない場合、起動時にネットワークは初期化されません。ネットワークは固定 ip (ip
と gateway
ノード) あるいは dhcp4 (dhcp
ノード) で設定できます。
universal
オプションはユニバーサルイメージを有効にします。ユニバーサルイメージには様々なカーネルドライバ・ツールが含まれます。デフォルトでは、ホスト個別イメージが生成され、現在のホストで使われているモジュールのみが含まれます。
modules
は生成されるイメージにモジュールを追加します。モジュールの名前、ファイルのパス、モジュールが含まれるディレクトリのパスで指定することができます (ディレクトリの名前は常に最後に /
記号を付けてください)。Booster ジェネレータはモジュールの依存関係を解決して、イメージに追加します。
ブートローダーの設定
イメージを生成したら、次にブートローダーを設定します。
rEFInd
すでに 自動検出 に依存した設定になっている場合、追加の設定変更は必要ありません。rEFInd は initrd files named booster* をサポートしています。
initramfs のパスを refind.conf や manual boot stanzas で手動で指定する場合、正しいファイル名を使っているか確認してください。例えば booster-linux.img
の代わりに initramfs-linux.img
とします。
systemd-boot
新しい initramfs イメージを systemd-boot で使うには以下のようにブートローダーエントリを作成します:
/boot/loader/entries/booster.conf
title Arch Linux with booster linux /vmlinuz-linux initrd /booster-linux.img options root=UUID=08f83949-bcbb-47bb-bc17-089aaa59e17e rw
上記でルートファイルシステムは UUID=08f83949-bcbb-47bb-bc17-089aaa59e17e
と指定しています。blkid /dev/ROOTDEVICE
を実行して、あなたのデバイスの UUID を確認してください。
暗号化の有効化
Booster は LUKS ベースの完全ディスク暗号化をサポートしています。ジェネレータは特別な設定を必要としません。initramfs には、ルートが存在する LUKS パーティションの情報を追加する必要があります。rd.luks.uuid=LUKSUUID
あるいは rd.luks.name=LUKSUUID=LUKSNAME
カーネルパラメータをブートローダーの設定ファイルで指定してください。LUKSUUID
は Booster で解錠する暗号化した LUKS パーティションの UUID を示します。UUID にはクォートを含まないので注意してください。LUKSNAME
は解錠されたパーティションの名前を示します (/dev/mapper/NAME
)。
イメージの再生成は必要ありません。ブートローダーの設定ができたら、コンピュータを再起動してください。その後 Enter passphrase for YOURROOT:
プロンプトが起動時に表示されるので、暗号化したルートパーティションのパスワードを入力してください。
Clevis 暗号化
暗号化された LUKS パーティションの解錠に、ユーザーによるパスワードの入力を使うというのは伝統的で広く使われる方法ですが、デメリットも存在します:
- 手動で入力する必要があるため、自動的に起動したい場合には使えません (例: 巨大なサーバーファーム)。
- 普通の人間が覚えられるパスワードの長さには限界があり (エントロピーにして ~20-30 ビット)、近代的なブロック暗号に使う鍵としては弱すぎます (128/256 ビット)。
解決策としては強固な鍵を別のどこかに保持しておくという方法があります。例えば TPM チップや Yubikey、あるいは他のネットワークサービスなどが考えられます。Clevis はこのアイデアを実現するフレームワークです。抜き差し可能な pin を使ってデータを暗号化します (clevis の用語では bind)。現在 clevis には3つの pin が存在します:
Booster は上記3つの pin 全てに対応しています。
clevis を使うには clevis パッケージをインストールしてください。以下は TPM2 によるデータバインディングの例です (あなたのコンピュータに TPM チップが搭載されている場合にのみ動作します):
$ clevis encrypt tpm2 '{}' <<< 'hello, world'
eyJhbGciOiJkaXIiLCJjbGV2aXMiOnsicGluIjoidHBtMiIsInRwbTIiOnsiaGFzaCI6InNoYTI1NiIsImp3a19wcml2IjoiQU80QUlJQkxxT3FVenVDU1FmWkprNmdDN2wzMW43V3M2Y2FZd0VZS1BSR3Q0OHJEQUJBV2Z4M3pTUUNUTmtHZE9BM2FZd2RTZk9GcXZWdnVlQ3lPamFsWldCT2R4RlJKSzl5ZVRCM0pkNFktcF9HalhhNmlnLWxxNmtmMHZTWWkzOWMxVEpES1RYRVZTdnlXSlpEbGdxQ0JPMVNxeGJBd2tfSnIyRlRNY3hvNGtpSmNtMEVjbWd5dFdyME00QmcySlg4aVo3MEt1MTVjNzFORU5Ra3RjdGMtREhBVGFQcHJ2VzI2Z3d1YmUxckRfX19aV2tHaG9mX053M0M1OHlOcXF2RUpPZUwzNTZHNXJHNVVtYmUtWWV4Ujl2SEppZWlua3ZaNTJoMFVRYWVNSm9LYjJuNjlVTGZHb2J1NElTN20iLCJqd2tfcHViIjoiQUM0QUNBQUxBQUFFMGdBQUFCQUFJQ2poWDBVeTJKZVpSNU9pRU0ySktSeEtnUElYQ3dGNnRNR09NTDZ0ZnE5aiIsImtleSI6ImVjYyJ9fSwiZW5jIjoiQTI1NkdDTSJ9..1P2Emag_4k-GlhyY.MuQQYPa8QHrysZ74uA.0ddDxfZA3R-cCmaKu5yUZA
base64 でエンコードされた長いメッセージが内部の TPM キーで暗号化されたテキストです。このテキストは現在使っているコンピュータでしか復号化できません。他のコンピュータで復号化しようとするとエラーが返ってきます。
$ clevis decrypt tpm2 '{}' <<< 'eyJhbGciOiJkaXIiLCJjbGV2aXMiOnsicGluIjoidHBtMiIsInRwbTIiOnsiaGFzaCI6InNoYTI1NiIsImp3a19wcml2IjoiQU80QUlJQkxxT3FVenVDU1FmWkprNmdDN2wzMW43V3M2Y2FZd0VZS1BSR3Q0OHJEQUJBV2Z4M3pTUUNUTmtHZE9BM2FZd2RTZk9GcXZWdnVlQ3lPamFsWldCT2R4RlJKSzl5ZVRCM0pkNFktcF9HalhhNmlnLWxxNmtmMHZTWWkzOWMxVEpES1RYRVZTdnlXSlpEbGdxQ0JPMVNxeGJBd2tfSnIyRlRNY3hvNGtpSmNtMEVjbWd5dFdyME00QmcySlg4aVo3MEt1MTVjNzFORU5Ra3RjdGMtREhBVGFQcHJ2VzI2Z3d1YmUxckRfX19aV2tHaG9mX053M0M1OHlOcXF2RUpPZUwzNTZHNXJHNVVtYmUtWWV4Ujl2SEppZWlua3ZaNTJoMFVRYWVNSm9LYjJuNjlVTGZHb2J1NElTN20iLCJqd2tfcHViIjoiQUM0QUNBQUxBQUFFMGdBQUFCQUFJQ2poWDBVeTJKZVpSNU9pRU0ySktSeEtnUElYQ3dGNnRNR09NTDZ0ZnE5aiIsImtleSI6ImVjYyJ9fSwiZW5jIjoiQTI1NkdDTSJ9..1P2Emag_4k-GlhyY.MuQQYPa8QHrysZ74uA.0ddDxfZA3R-cCmaKu5yUZA'
hello, world
Clevis を使って LUKS パーティションをバインドすることができます、例:
# clevis luks bind -d /dev/nvme0n1p2 tpm2 '{}'
TPM チップで暗号化されたパスワードを使って LUKS スロットが作成されます。以下を実行することで確認できます:
# cryptsetup luksDump /dev/nvme0n1p2
... Tokens: 0: clevis Keyslot: 1 ...
ひとつの clevis トークンが表示されています。LUKS はトークンを使って「どこか (例: TPM チップ) に存在する」パスワードのメタデータを保存します。詳しくは clevis のドキュメントを見てください。
Booster は LUKS トークンを読み込んで、clevis の情報をデコードして、パスワードを再構築してパーティションを自動的に解錠します。
tpm2 や sss ピンにバインドされたパーティションは特に booster 側の設定を必要としません。Tang (ネットワークバインド) ピンはネットワークを必要とします。詳しくは #設定 セクションを見てください。
デバッグ
Booster が上手く動かない場合、デバッグ出力を有効にすることで何が起こっているか情報を得ることができます:
- ジェネレータのデバッグは
-debug
コマンドラインフラグを使ってください:booster -debug
。 - init のデバッグは
booster.debug=1
カーネルパラメータが存在します。
Booster に問題があると思われる場合は https://github.com/anatol/booster/issues でチケットを作成してください。