web-dev-qa-db-ja.com

起動時にルート暗号化されていないZFSプールを自動的にインポートするにはどうすればよいですか?

ストックカーネルバージョン4.9.6およびZoLバージョン0.7.0を使用してArchLinuxの更新バージョンを実行しており、起動時に暗号化された非ルートプールをインポートしたいと考えています。プールはRAID1ミラーです。

暗号化されたコンテナは、次の方法で作成されました。

cryptsetup -y -v luksFormat /dev/nvme0n1p3

そして

cryptsetup -y -v luksFormat /dev/nvme1n1p3

それぞれに同じパスフレーズを使用しました。

手動でコンテナを開き、次の方法でプールをインポートできます。

cryptsetup open /dev/nvme0n1p3 enc0  
cryptsetup open /dev/nvme1n1p3 enc1   
zpool import -d /dev/mapper zeb

Cryptosetupコマンドは、パスワードの入力を求め、パスワードを受け入れます。

私のmkinitcpioファイルには、systemdzfs、およびsd-encryptフックが含まれています。また、モジュールdm_moddm_cryptaes_x86_64、およびraid1も含まれています。これらは、私がオンラインで見つけた断片に基づいた、暗闇の中でのショットのようなものです。

Systemd-bootを使用していますが、重要なのはmkinitcpio構成を正しく設定することにあるようです。ブートパーティションが暗号化されていません。

繰り返しますが、ここでの私の唯一の目標は、起動時に暗号化されたZFSプールを自動的に(パスフレーズのプロンプトを使用して)インポートすることです。暗号化されていないプールでこれを行うのに問題はありません。

5
airhuff

コメントする評判が50もないので、ここに質問を投稿します。あなたのrootfsは暗号化されていませんか?それで、起動すると、cryptsetupプロンプトが表示されませんか?パスワードpromtsが届かない場合は、initramfsを解凍してinitファイルを変更し、rootfsをマウントした後のどこかに次の行を追加することをお勧めします。 cryptsetup open/dev/nvme0n1p3 enc0 && cryptsetup open/dev/nvme1n1p3 enc1 && zpool import -d/dev/mapper zeb

少し前に、リモートサーバー上のZFSでLUKSで暗号化されたROOTFSのリモートsshロック解除を追加する必要がありました。 initファイルを変更してdropbearを追加して起動し、cryptsetupコマンドを変更してfifoからパスワードを受け入れる以外に方法はありません。そのためにbashスクリプトを作成したので、initramfsを更新すると、このbashスクリプトはinitramfsを解凍し、変更を加えて、元に戻します。しかし、私はgentooを使用しており、それは美しいgenkernelです。 Genkernelには、指定した場合、ZFSおよびcryptsetupのフックが含まれています。 Arch Linuxでの動作はわかりません。おそらく、genkernel/dracutを使用してカーネルを構築するオプションもあります。そうすれば、cryptsetupフックとzfsフックをinitramfsに簡単に含めることができます(まだ含まれていない場合)。とにかく、initファイルを変更することで簡単に実行できます。試して、結果をここに投稿してください。 initramfsはさまざまな方法を使用して圧縮されている可能性があるため、archlinuxで解凍する方法を見つけてください。私の側では、genkernelを変更してcpioとして生成し、cpioコマンドを使用して解凍/パックバックしました。

[〜#〜] update [〜#〜]:mkinitcpio.confを編集し、「filesystems」の前に2つのフック「encryptzfs」を追加する必要があります次にHOOKSで、/ etc/crypttab.initramfs#(google crypttab)でロック解除に必要なluksデバイスを定義する必要があります。このファイルは次世代のinitramfsに含まれるため、少なくともロックを解除しています。たぶん、ZFSは次回の再起動時に自動インポートを実行しますが、そうでない場合は、次のようにします。

ファイル/ usr/lib/initcpio/install/zfsmountを作成します

#!/bin/bash

build() {
    add_runscript
}

ファイル/ usr/lib/initcpio/hooks/zfsmountを作成します

#!/usr/bin/ash

run_hook() {
zpool import mypool
}

mkinitcpio.confで、「ファイルシステム」の前または後の最後のどこかに「zfsmount」をHOOKSに追加します。

そしてもちろん、mkinitcpioを使用してinitramfsを再生成します

参照: https://wiki.archlinux.org/index.php/Installing_Arch_Linux_on_ZFS

https://wiki.archlinux.org/index.php/mkinitcpio

1
Ural