2022/08/19

ルートにマウントする暗号化LVM領域の拡張

目的


Debian 10や11をインストールするとき、「ディスク全体を使い、暗号化LVMをセットアップする」ことができます。 もし、このディスクがいっぱいになってしまうと、容量を増やしたくなります。

ここでは、ディスクを追加し、暗号化したうえで、ルートにマウントしたディスクの容量を増やしてみます。

失敗するとOSの起動ができなくなるので、元に戻せるようバックアップをとってから実行しましょう。実施する場合は自己責任で!

方法


構成


Physical volumeをPV1、Volume groupをVG1、Logical volumeが2つでLV-rootとLV-swapとし、構成が
[PV1]─→[VG1]┬→[LV-root]
              └→[LV-swap]
であるとき、これを
[PV1]┬→[VG1]┬→[LV-root]
[PV2]┘       └→[LV-swap]
のように変更し、増えた容量をLV-rootに割り当てます。 PV2が新しく追加したディスクをLVMのPhysical volumeにしたものになります。

ディスクの暗号化と起動時の暗号化解除のための手順


以下、root権限で実行します。

最初に追加したディスクを暗号化します。追加したディスクは/dev/sdcであるとします。

$ cryptsetup --cipher aes-cbc-essiv:sha256 --key-size 256 luksFormat /dev/sdc
実行するとパスフレーズの入力を要求されるので、設定したいパスフレーズを入力します。

なお、暗号化アルゴリズムとキーサイズの設定は参考文献のままですので、必要に応じて変更します。

さきほど設定したパスフレーズが正しく入力できたか確認するために、次のコマンドを実行します。

$ cryptsetup luksOpen /dev/sdc sdc_crypt
成功したら次のステップに進みます。
(省略してもよいかもしれませんが、もし暗号化を解除できない状態でこれ以降の作業を進めていくと今動かしているOSが起動しなくなります)

次に、暗号化ディスクのUUIDを確認します。

cryptsetup luksDump /dev/sdc
を実行すると、暗号化ディスクの情報が表示されます。
UUID:          	xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
のxxx部分がUUIDですので、この値を$(UUID)と書くことにします。

UUIDがわかったので、/etc/crypttabに次の一行を追加します。

sdc_crypt UUID=$(UUID) none luks,discard,initramfs
行の最後にinitramfsと書いておくのがポイントです。

編集を終えたら、

$ update-initramfs -u
を実行して、OSの起動時の処理内容を更新します。 これにより、追加したディスクのパスフレーズによる暗号化の解除処理をOSの起動時に実施できるようになります。

リブートして、起動時に暗号化を解除できるか確認します。

リブートすると、これまで通り、Debianインストール時に暗号化したディスクに対するパスフレーズの入力を求められ、 続いて、今回追加したディスクのパスフレーズの入力を求められます。

もし、パスフレーズの入力回数が増えていない(=今回追加したディスクのパスフレーズの入力が求められない)状態の場合、 なにか失敗しているので、これ以降のLVMの変更手順は実行してはいけません。OSが起動しなくなります。

今回追加したディスクのパスフレーズの入力を求められ、暗号化を解除したうえでOSが起動すると、 /dev/mapperにsdc_cryptが加わっているはずです。

LVMの構成変更


追加したディスクを暗号化し、それを解除できるようになったので、次はルートにマウントしているディスクの容量を増やします。

まず、Physical volumeにsdc_cryptを追加します。

pvcreate /dev/mapper/sdc_crypt
追加したPhysical volumeを既存のVolume group (ここではxxx-vg)に追加します。
$ vgextend xxx-vg /dev/mapper/sdc_crypt
追加できたか確認します。
$ vgdisplay -v
の最後のほうに、Volume groupを構成するPhysical volumeが表示されますので、それで確認ができます。

さらに、Total PE / Free PEの行を見ると、Free PEの値がわかるので、この値を覚えておきます。 ここではこの値を$(Free)とします。

Logical volumeのうち、rootのvolumeの容量を増やします。

$ lvextend -l +$(Free) /dev/xxx-vg/root
もし、$(Free)が1000なら
$ lvextend -l +1000 /dev/xxx-vg/root
とします。

最後に、ファイルシステムの容量を増やします。ext2またはext3、ext4であれば、

$ resize2fs /dev/xxx-vg/root
を実行することで、ルートのディスク容量が追加したディスクの容量分だけ増えます。 他のファイルシステムを使っている場合は、適切なコマンドを実行して容量を増やします。

これで容量が増えているはずなので、dfなどでディスク容量が増えていることを確認します。

容量が予定通り増えていれば、最後にリブートして、OSが問題なく起動するか確認します。

正常に起動すれば、作業は完了です。

参考文献


https://qiita.com/ynakayama/items/74096212b8177234be8a
https://blog.id774.net/entry/2014/05/13/481/