「Booster」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(序文を更新)
 
(2人の利用者による、間の10版が非表示)
8行目: 8行目:
 
{{Related|Mkinitcpio}}
 
{{Related|Mkinitcpio}}
 
{{Related|dracut}}
 
{{Related|dracut}}
  +
{{Related|Clevis}}
 
{{Related articles end}}
 
{{Related articles end}}
   
13行目: 14行目:
 
Booster は [https://michael.stapelberg.ch/posts/2020-01-21-initramfs-from-scratch-golang/ distri プロジェクト] に着想を得ており、小型で高速な init イメージを生成することを目指しています。
 
Booster は [https://michael.stapelberg.ch/posts/2020-01-21-initramfs-from-scratch-golang/ distri プロジェクト] に着想を得ており、小型で高速な init イメージを生成することを目指しています。
   
  +
Booster は、initramfs イメージの生成を担当する {{ic|/usr/bin/booster}} ユーザー空間ツールを提供します。生成されたイメージは、デフォルトでは {{ic|/boot/}} にあります。
Booster は以下の2つのコンポーネントから構成されています:
 
 
* Initramfs ジェネレータ {{ic|/usr/bin/booster}} ユーザー空間ツール。initramfs イメージの生成を行います。
 
* 生成されたイメージは通常 {{ic|/boot/}} に配置され、システムブートローダーによって Linux OS を起動するのに使われます。
 
   
 
== インストール ==
 
== インストール ==
32行目: 30行目:
 
== 設定 ==
 
== 設定 ==
   
Booster ジェネレータの設定は {{ic|/etc/booster.yaml}} にあります。設定ファイルがない場合は、デフォルトの設定ホスト固有の画像、ネットワークなしが使用されます。
+
Booster ジェネレータの設定は {{ic|/etc/booster.yaml}} にあります。設定ファイルがない場合は、デフォルトの設定(ホスト固有の画像、ネットワークなし)が使用されます。
   
 
設定ファイルを使用することで、デフォルトの動作を上書きすることができます。詳しくは {{man|1|booster|CONFIG FILE}} を参照してください。
 
設定ファイルを使用することで、デフォルトの動作を上書きすることができます。詳しくは {{man|1|booster|CONFIG FILE}} を参照してください。
   
=== スタイメージの再生成 ===
+
=== モジュルの早期ロ ===
   
  +
いくつかのカーネルモジュールは、initramfs の段階で早期にロードされる必要がある場合があります。
ブースターの設定が終わったら、{{ic|/boot}} にあるブースターイメージを更新する必要があります。イメージは {{ic|booster -output booster-foo.img}} で手動で生成するか、インストールされている全てのカーネルを繰り返し、それぞれのブースターイメージを生成する便利なスクリプト {{ic|/usr/lib/booster/regenerate_images}} を利用して生成します。
 
   
  +
例えば、{{ic|nvidia}} モジュールをロードする必要がある場合、以下の設定を使用します:
== ブートローダーの設定 ==
 
   
  +
{{hc|/etc/booster.yaml|
イメージを生成したら、次に[[Arch_ブートプロセス#ブートローダー|ブートローダー]]を設定します。
 
  +
modules_force_load: nvidia
 
=== rEFInd ===
 
 
すでに [[rEFInd# rEFInd によってカーネルが自動で検出される場合|自動検出]] に依存した設定になっている場合、追加の設定変更は必要ありません。[[rEFInd]] は [https://sourceforge.net/p/refind/code/ci/778878f7f30f68b7fa0282074e5dd8fc5894a212/ initrd files named booster*] をサポートしています。
 
 
initramfs のパスを [[rEFInd#手動でブートエントリを記述|refind.conf]] や [[rEFInd#Manual boot stanzas|manual boot stanzas]] で手動で指定する場合、正しいファイル名を使っているか確認してください。例えば {{ic|'''booster''-linux.img}} の代わりに {{ic|'''initramfs''-linux.img}} とします。
 
 
=== systemd-boot ===
 
 
新しい initramfs イメージを [[systemd-boot]] で使うには以下のようにブートローダーエントリを作成します:
 
 
{{hc|/boot/loader/entries/booster.conf|2=
 
title Arch Linux with booster
 
linux /vmlinuz-linux
 
initrd /booster-linux.img
 
options root=UUID=08f83949-bcbb-47bb-bc17-089aaa59e17e rw
 
 
}}
 
}}
   
  +
そして、[[Booster#booster イメージの再生成|booster イメージの再生成]] を実行します。
上記でルートファイルシステムは {{ic|1=UUID=08f83949-bcbb-47bb-bc17-089aaa59e17e}} と指定しています。{{ic|blkid /dev/''ROOTDEVICE''}} を実行して、あなたのデバイスの UUID を確認してください。
 
   
== 暗号化の有効化 ==
+
=== 暗号化 ===
   
Booster は LUKS ベースの完全ディスク暗号化をサポートしています。ジェネレータは特別な設定必要としません。initramfs は、ルートが存在する LUKS パーティション情報を追加する必要があります。{{ic|1=rd.luks.uuid=''LUKSUUID''}} あるいは {{ic|1=rd.luks.name=''LUKSUUID''=''LUKSNAME''}} [[カーネルパラメータ]]をブートローダーの設定ファイルで指定してください。{{ic|''LUKSUUID''}} は Booster する暗号化た LUKS パーティションの [[UUID]] をします。UUID にはクォを含ないので注意してください。{{ic|''LUKSNAME''}} は解されたパーティションの名前をします ({{ic|/dev/mapper/''NAME''}})。
+
Booster は、[[Clevis]] のような [[LUKS]] ベースのフルディスク暗号化をすぐに使用できるようにサポートしています。ジェネレーターに追加の設定必要ありません。ただし、initramfs の場合は、ルートが存在する LUKS パーティションに関する情報を追加する必要があります。これは、{{ic|1=rd.luks.uuid=''LUKSUUID''}} または {{ic|1=rd.luks.name=''LUKSUUID''=''LUKSNAME''}} [[カーネルパラメータ]] のいずれか使用して行われます。{{ic|''LUKSUUID''}} はBooster によってロックをする必要があり、暗号化された LUKS パーティションの [[UUID]] を指定します。{{man|1|booster|UUID パラメタ}} マニュアルでは、UUID に引用符を含ないことを推奨しています。{{ic|''LUKSNAME''}} は、ロックされたパーティションの名前を指定します ({{ic|/dev/mapper/''LUKSNAME''}} のように) 関連オプションについては、{{man|1|booster|BOOT TIME KERNEL PARAMETERS}} を参照してください
   
イメージの再生成は必要ありません。ブートローダーの設定ができたら、コンピュータを再起動してください。その後 {{ic|Enter passphrase for ''YOURROOT'':}} プロンプトが起動時に表示されるので、暗号化したルートパーティションのパスワードを入力してください
+
イメージの再構築は必要ありません。ブートローダーの設定が完了したら、コンピュータを再起動します。その後、起動時に暗号化されたルートパーティションのパスワードを求める {{ic|Enter passphrase for ''YOURROOT'':}} プロンプトが表示されます
   
  +
==== systemd スタイルのバインディング ====
=== Clevis 暗号化 ===
 
   
  +
Booster はパーティションもサポートします [https://0pointer.net/blog/unlocking-luks2-volumes-with-tpm2-fido2-pkcs11-security-hardware-on-systemd-248.html bound with systemd] {{ic|systemd-fido2}} や {{ic|systemd-tpm2}} など。
{{Note|Booster 固有ではない Clevis 情報用の別のページを作成する}}
 
   
  +
'systemd-fido2' を使用する場合は、{{Pkg|libfido2}} パッケージをインストールし、次の設定を使用してイメージに fido2-assert を追加してください。
暗号化された LUKS パーティションの解錠に、ユーザーによるパスワードの入力を使うというのは伝統的で広く使われる方法ですが、デメリットも存在します:
 
   
  +
{{hc|/etc/booster.yaml|
* 手動で入力する必要があるため、自動的に起動したい場合には使えません (例: 巨大なサーバーファーム)。
 
  +
extra_files: fido2-assert
* 普通の人間が覚えられるパスワードの長さには限界があり (エントロピーにして ~20-30 ビット)、近代的なブロック暗号に使う鍵としては弱すぎます (128/256 ビット)。
 
  +
}}
   
  +
[[#booster イメージの再生成|booster イメージの再生成します]] Booster は起動中にこの設定を検出し、現在の YubiKey を使用してドライブのロックを解除します。
解決策としては強固な鍵を別のどこかに保持しておくという方法があります。例えば [[TPM]] チップや [[Yubikey]]、あるいは他のネットワークサービスなどが考えられます。[https://github.com/latchset/clevis/ Clevis] はこのアイデアを実現するフレームワークです。抜き差し可能な ''pin'' を使ってデータを暗号化します (clevis の用語では ''bind'')。現在 clevis には3つの pin が存在します:
 
   
  +
{{Note|コミット 1b65577 より前に、Booster が FIDO2 キーを使用して暗号化されたパーティションのロックを解除するのに十分な早さで必要なカーネルモジュールの一部をロードできない可能性があることが報告されています。この場合、強制的にロードされる以下のモジュールを追加します。}}
* TPM2 データバインディング
 
* ネットワークサービス (別名 [https://github.com/latchset/tang Tang]) データバインディング
 
* [[Wikipedia:Shamir's Secret Sharing|シャミア秘密分散]]で他の pin を組み合わせる
 
   
  +
{{hc|/etc/booster.yaml|
Booster は上記3つの pin 全てに対応しています。
 
  +
modules_force_load: '''usbhid''','''hid_sensor_hub'''
 
  +
extra_files: fido2-assert
clevis を使うには {{pkg|clevis}} パッケージをインストールしてください。以下は TPM2 によるデータバインディングの例です (あなたのコンピュータに [[TPM]] チップが搭載されている場合にのみ動作します):
 
 
{{hc|$ clevis encrypt tpm2 '{}' <<< 'hello, world'|
 
eyJhbGciOiJkaXIiLCJjbGV2aXMiOnsicGluIjoidHBtMiIsInRwbTIiOnsiaGFzaCI6InNoYTI1NiIsImp3a19wcml2IjoiQU80QUlJQkxxT3FVenVDU1FmWkprNmdDN2wzMW43V3M2Y2FZd0VZS1BSR3Q0OHJEQUJBV2Z4M3pTUUNUTmtHZE9BM2FZd2RTZk9GcXZWdnVlQ3lPamFsWldCT2R4RlJKSzl5ZVRCM0pkNFktcF9HalhhNmlnLWxxNmtmMHZTWWkzOWMxVEpES1RYRVZTdnlXSlpEbGdxQ0JPMVNxeGJBd2tfSnIyRlRNY3hvNGtpSmNtMEVjbWd5dFdyME00QmcySlg4aVo3MEt1MTVjNzFORU5Ra3RjdGMtREhBVGFQcHJ2VzI2Z3d1YmUxckRfX19aV2tHaG9mX053M0M1OHlOcXF2RUpPZUwzNTZHNXJHNVVtYmUtWWV4Ujl2SEppZWlua3ZaNTJoMFVRYWVNSm9LYjJuNjlVTGZHb2J1NElTN20iLCJqd2tfcHViIjoiQUM0QUNBQUxBQUFFMGdBQUFCQUFJQ2poWDBVeTJKZVpSNU9pRU0ySktSeEtnUElYQ3dGNnRNR09NTDZ0ZnE5aiIsImtleSI6ImVjYyJ9fSwiZW5jIjoiQTI1NkdDTSJ9..1P2Emag_4k-GlhyY.MuQQYPa8QHrysZ74uA.0ddDxfZA3R-cCmaKu5yUZA
 
 
}}
 
}}
   
  +
=== booster イメージの再生成 ===
base64 でエンコードされた長いメッセージが内部の TPM キーで暗号化されたテキストです。このテキストは現在使っているコンピュータでしか復号化できません。他のコンピュータで復号化しようとするとエラーが返ってきます。
 
   
  +
Booster の設定が完了したら、{{ic|/boot}} にある Booster images を更新する必要があります。イメージは、{{ic|booster build booster-foo.img}} を使用して手動で生成するか、インストールされているすべてのカーネルを反復処理してカーネルごとに Booster イメージを生成する便利なスクリプト {{ic|/usr/lib/booster/regenerate_images}} もあります。
{{hc|$ clevis decrypt tpm2 '{}' <<< 'eyJhbGciOiJkaXIiLCJjbGV2aXMiOnsicGluIjoidHBtMiIsInRwbTIiOnsiaGFzaCI6InNoYTI1NiIsImp3a19wcml2IjoiQU80QUlJQkxxT3FVenVDU1FmWkprNmdDN2wzMW43V3M2Y2FZd0VZS1BSR3Q0OHJEQUJBV2Z4M3pTUUNUTmtHZE9BM2FZd2RTZk9GcXZWdnVlQ3lPamFsWldCT2R4RlJKSzl5ZVRCM0pkNFktcF9HalhhNmlnLWxxNmtmMHZTWWkzOWMxVEpES1RYRVZTdnlXSlpEbGdxQ0JPMVNxeGJBd2tfSnIyRlRNY3hvNGtpSmNtMEVjbWd5dFdyME00QmcySlg4aVo3MEt1MTVjNzFORU5Ra3RjdGMtREhBVGFQcHJ2VzI2Z3d1YmUxckRfX19aV2tHaG9mX053M0M1OHlOcXF2RUpPZUwzNTZHNXJHNVVtYmUtWWV4Ujl2SEppZWlua3ZaNTJoMFVRYWVNSm9LYjJuNjlVTGZHb2J1NElTN20iLCJqd2tfcHViIjoiQUM0QUNBQUxBQUFFMGdBQUFCQUFJQ2poWDBVeTJKZVpSNU9pRU0ySktSeEtnUElYQ3dGNnRNR09NTDZ0ZnE5aiIsImtleSI6ImVjYyJ9fSwiZW5jIjoiQTI1NkdDTSJ9..1P2Emag_4k-GlhyY.MuQQYPa8QHrysZ74uA.0ddDxfZA3R-cCmaKu5yUZA'|
 
hello, world
 
}}
 
   
  +
== ブートローダーの設定 ==
Clevis を使って LUKS パーティションをバインドすることができます、例:
 
   
  +
イメージを生成したら、次に[[Arch_ブートプロセス#ブートローダー|ブートローダー]]を設定します。
# clevis luks bind -d /dev/nvme0n1p2 tpm2 '{}'
 
   
  +
=== rEFInd ===
TPM チップで暗号化されたパスワードを使って LUKS スロットが作成されます。以下を実行することで確認できます:
 
   
  +
すでに [[rEFInd# rEFInd によってカーネルが自動で検出される場合|自動検出]] に依存した設定になっている場合、追加の設定変更は必要ありません。[[rEFInd]] は [https://sourceforge.net/p/refind/code/ci/778878f7f30f68b7fa0282074e5dd8fc5894a212/ initrd files named booster*] をサポートしています。
{{hc|# cryptsetup luksDump /dev/nvme0n1p2|
 
...
 
Tokens:
 
0: clevis
 
Keyslot: 1
 
...
 
}}
 
   
  +
initramfs のパスを [[rEFInd#手動でブートエントリを記述|refind.conf]] や [[rEFInd#Manual boot stanzas|manual boot stanzas]] で手動で指定する場合、正しいファイル名を使っているか確認してください。例えば {{ic|'''booster''-linux.img}} の代わりに {{ic|'''initramfs''-linux.img}} とします。
ひとつの ''clevis'' トークンが表示されています。LUKS はトークンを使って「どこか (例: TPM チップ) に存在する」パスワードのメタデータを保存します。詳しくは clevis のドキュメントを見てください。
 
   
  +
=== systemd-boot ===
Booster は LUKS トークンを読み込んで、clevis の情報をデコードして、パスワードを再構築してパーティションを自動的に解錠します。
 
   
  +
新しい initramfs イメージを [[systemd-boot]] で使うには以下のようにブートローダーエントリを作成します:
''tpm2'' や ''sss'' ピンにバインドされたパーティションは特に booster 側の設定を必要としません。''Tang'' (ネットワークバインド) ピンはネットワークを必要とします。詳しくは [[#設定]] セクションを見てください。
 
   
  +
{{hc|/boot/loader/entries/booster.conf|2=
==== YubiKey バインディング ====
 
  +
title Arch Linux with booster
  +
linux /vmlinuz-linux
  +
initrd /booster-linux.img
  +
options root=UUID=08f83949-bcbb-47bb-bc17-089aaa59e17e rw
  +
}}
   
  +
上記でルートファイルシステムは {{ic|1=UUID=08f83949-bcbb-47bb-bc17-089aaa59e17e}} と指定しています。{{ic|blkid /dev/''ROOTDEVICE''}} を実行して、あなたのデバイスの UUID を確認してください。
Clevis では、YubiKey の challenge-response mode を使って LUKS パーティションをバインドすることができます。LUKS パーティションのバインディングを行うには、以下を実行してください。
 
   
  +
== トラブルシューティング ==
# clevis luks bind -d /dev/sdb2 yubikey '{"slot":1}'
 
   
  +
=== デバッグ ===
{{Pkg|yubikey-personalization}} をインストールします。設定ファイルを編集し、以下のオプションを追加します。
 
 
{{hc|/etc/booster.yaml|
 
extra_files: ykchalresp
 
}}
 
 
== デバッグ ==
 
   
 
Booster が上手く動かない場合、デバッグ出力を有効にすることで何が起こっているか情報を得ることができます:
 
Booster が上手く動かない場合、デバッグ出力を有効にすることで何が起こっているか情報を得ることができます:
   
* ジェネレータのデバッグは {{ic|-debug}} コマンドラインフラグを使ってください: {{ic|booster -debug}}
+
* ジェネレータのデバッグは {{ic|-debug}} コマンドラインフラグを使ってください: {{ic|booster -debug}}
* init のデバッグは {{ic|1=booster.debug=1}} [[カーネルパラメータ]]が存在します。
+
* init のデバッグは {{ic|1=booster.debug=1}} [[カーネルパラメータ]] が存在します。
 
Booster に問題があると思われる場合は https://github.com/anatol/booster/issues でチケットを作成してください。
 
 
== 注意点 ==
 
 
=== モジュールの早期ロード ===
 
 
いくつかのカーネルモジュールは、initramfs の段階で早期にロードされる必要がある場合があります。
 
 
例えば、{{ic|nvidia}} モジュールをロードする必要がある場合、以下の設定を使用します。
 
 
{{hc|/etc/booster.yaml|
 
modules_force_load: nvidia
 
}}
 
   
  +
Booster 自体に問題があると思われる場合は、[https://github.com/anatol/booster/issues GitHub でチケットを作成してください]
そして、[[Booster#ブースターイメージの再生成|ブースターイメージの再生成]] を実行します。
 
   
 
=== Booster ジェネレータが "too many open files" エラーで失敗する ===
 
=== Booster ジェネレータが "too many open files" エラーで失敗する ===

2024年3月6日 (水) 18:31時点における最新版

関連記事

Booster は高速な initramfs ジェネレータで、mkinitcpiodracut と似ています。 Booster は distri プロジェクト に着想を得ており、小型で高速な init イメージを生成することを目指しています。

Booster は、initramfs イメージの生成を担当する /usr/bin/booster ユーザー空間ツールを提供します。生成されたイメージは、デフォルトでは /boot/ にあります。

インストール

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 にあります。設定ファイルがない場合は、デフォルトの設定(ホスト固有の画像、ネットワークなし)が使用されます。

設定ファイルを使用することで、デフォルトの動作を上書きすることができます。詳しくは booster(1) § CONFIG FILE を参照してください。

モジュールの早期ロード

いくつかのカーネルモジュールは、initramfs の段階で早期にロードされる必要がある場合があります。

例えば、nvidia モジュールをロードする必要がある場合、以下の設定を使用します:

/etc/booster.yaml
modules_force_load: nvidia

そして、booster イメージの再生成 を実行します。

暗号化

Booster は、Clevis のような LUKS ベースのフルディスク暗号化をすぐに使用できるようにサポートしています。ジェネレーターには追加の設定は必要ありません。ただし、initramfs の場合は、ルートが存在する LUKS パーティションに関する情報を追加する必要があります。これは、rd.luks.uuid=LUKSUUID または rd.luks.name=LUKSUUID=LUKSNAME カーネルパラメータ のいずれかを使用して行われます。LUKSUUID は、Booster によってロックを解除する必要があり、暗号化された LUKS パーティションの UUID を指定します。booster(1) § UUID パラメータ マニュアルでは、UUID に引用符を含めないことを推奨しています。LUKSNAME は、ロック解除されたパーティションの名前を指定します (/dev/mapper/LUKSNAME のように) 関連オプションについては、booster(1) § BOOT TIME KERNEL PARAMETERS を参照してください。

イメージの再構築は必要ありません。ブートローダーの設定が完了したら、コンピューターを再起動します。その後、起動時に暗号化されたルートパーティションのパスワードを求める Enter passphrase for YOURROOT: プロンプトが表示されます。

systemd スタイルのバインディング

Booster はパーティションもサポートします bound with systemd systemd-fido2systemd-tpm2 など。

'systemd-fido2' を使用する場合は、libfido2 パッケージをインストールし、次の設定を使用してイメージに fido2-assert を追加してください。

/etc/booster.yaml
extra_files: fido2-assert

booster イメージの再生成します Booster は起動中にこの設定を検出し、現在の YubiKey を使用してドライブのロックを解除します。

ノート: コミット 1b65577 より前に、Booster が FIDO2 キーを使用して暗号化されたパーティションのロックを解除するのに十分な早さで必要なカーネルモジュールの一部をロードできない可能性があることが報告されています。この場合、強制的にロードされる以下のモジュールを追加します。
/etc/booster.yaml
modules_force_load: usbhid,hid_sensor_hub
extra_files: fido2-assert

booster イメージの再生成

Booster の設定が完了したら、/boot にある Booster images を更新する必要があります。イメージは、booster build booster-foo.img を使用して手動で生成するか、インストールされているすべてのカーネルを反復処理してカーネルごとに Booster イメージを生成する便利なスクリプト /usr/lib/booster/regenerate_images もあります。

ブートローダーの設定

イメージを生成したら、次にブートローダーを設定します。

rEFInd

すでに 自動検出 に依存した設定になっている場合、追加の設定変更は必要ありません。rEFIndinitrd files named booster* をサポートしています。

initramfs のパスを refind.confmanual 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 が上手く動かない場合、デバッグ出力を有効にすることで何が起こっているか情報を得ることができます:

  • ジェネレータのデバッグは -debug コマンドラインフラグを使ってください: booster -debug
  • init のデバッグは booster.debug=1 カーネルパラメータ が存在します。

Booster 自体に問題があると思われる場合は、GitHub でチケットを作成してください

Booster ジェネレータが "too many open files" エラーで失敗する

もし stripuniversal を有効にしていて /usr/lib/modules/glue_helper.ko: pipe2: too many open files というエラーが出た場合は、プロセスごとのオープンファイルの上限を上げる必要があります。limits.conf#nofile を参照してください。

参照