Chienomi

Encrypted Swap (LUKS) を含むディスクを拡張する

Live With Linux::tips

前提として、Manjaro Linuxの話である。

インストール時に暗号化し、かつswapを作成すると、ルートファイルシステムとswapのふたつのパーティションがLUKSパーティションとして作られるようになっている。 そして、このディスクを拡張しようとしたとき、swapパーティションのほうが後方にあるため、ルートファイルシステムの拡張ができない。

さりとて、移動させることもできないため、拡張を断念する人もいるだろう。

実質、swapを作り直す必要があるのだが、少し複雑な手順になっているため、難しい部分がある。 そこで、今回このようなディスクの拡張を解説する。

手順

ライブディスクでの作業

ここでは2つ内蔵ディスクの間でより大きなものへ複製し、拡張するものとする。

まずは、2つの内蔵ディスクを両方取り付けた上でライブディスクで起動する。 Manjaroのライブイメージが良いだろう。

仮に複製元ディスクが/dev/sda、複製先ディスクが/dev/sdbであるとする。

まずはディスクそのものを複製する。

# cat /dev/sda > dev/sdb

次にディスクレイアウトを修正し、パーティションを作成する。 すべきことは

  1. ディスクレイアウトを修正
  2. 後方のswapパーティションを削除
  3. ルートファイルシステム用パーティションを後方にswap分の領域を残して拡張
  4. ルートファイルシステム用パーティションの後方にswap用パーティションを作成
# gparted /dev/sdb

swapパーティションを再作成したことでswapパーティションのUUIDが変わることに注意だ。

swapパーティションを準備する。 ここで使用するパスフレーズは、ルートファイルシステムと同じ「いつものパスフレーズ」である。

# cryptsetup luksFormat /dev/sdb3
# cryptsetup luksOpen /dev/sdb3 newSwap
# mkswap /dev/mapper/newSwap

続いて/etc/crypttab/etc/fstabを修正する。 そのためにルートファイルシステムをマウントする。

# cryptsetup luksOpen /dev/sdb2 newManjaro
# mount /dev/mapper/newManjaro /mnt
# xed /mnt/etc/crypttab /mnt/etc/fstab

もともとのスワップパーティションのUUIDを確認する必要がある。 blkidを用いて、複製元の/dev/sda3を確認しよう。

# blkid

そのパーティションのUUIDに一致する次のようなエントリがcrypttabにある。

luks-aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa UUID=aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa     /crypto_keyfile.bin luks

これを新しいswapパーティションのUUIDに変える。 crypttabfstabの該当するすべてのUUIDを変更してもいいが、crypttabUUID=だけを変えても動作する。

ここまでやったら再起動する。起動できないとかなり面倒なので間違いがないかよく確認すること。 また、再起動といっても、一度シャットダウンし、複製元ディスクは除去する。

再起動してからの処理

再起動すると一応起動はできるのだが、swapパーティションの取り扱いに失敗し、パスフレーズをもう一度聞かれる。

この状態で起動しログインする。

まずは、ルートファイルシステムを拡張しよう。 Manjaroのインストーラは標準でEXT4にするため、resize2fsを使う。

$ sudo resize2fs /dev/mapper/luks-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

crypttabでnameを変更した場合は、/etc/default/grubGRUB_CMDLINE_LINUX_DEFAULTのUUIDも修正する。

さらに、Manjaroの場合、起動時にLUKSパスフレーズを尋ねるが、これによって/crypto_keyfile.binを生成し、これを鍵ファイルとしてLUKSをオープンするようになっている。そして、この鍵ファイルはパスフレーズと同じものではない。

そのため、鍵ファイルで開けるようにしないとswapパーティションのオープンに失敗する。

再起動したシステムのswapパーティションが/dev/sda3であるならば、

$ sudo cryptsetup luksAddKey /dev/sda3 /crypto_keyfile.bin

として鍵ファイルを追加しておく。

さらに、/etc/openswap.confswap_deviceのUUIDを修正し、nameを変更した場合はcrypt_swap_nameも修正する。

名前は維持し、crypttabでマッピングを変更した場合は以上で大丈夫だが、名前も合わせて変更した場合はさらに手順が必要となる。

まず、/etc/default/grubGRUB_CMDLINE_LINUX_DEFAULTで指定されているresumeデバイスを変更する。 その上で

$ sudo grub-mkconfig -o /boot/grub/grub.cfg

として新しい設定を生成する。

必要のない作業のはずだが、一応カーネルの生成もしておく。

$ sudo mkinitcpio -P

続いてGrubの生成。 (Manjaroでない場合はGrub生成手順は異なる)

$ sudo udpate-grub