先日パソコンを買ったわけだがこれは SSD 120GB + HDD 2TB というストレージ構成。普通に考えて SSD に OS をインストールするわけだが Debian を最小の手作業かつ汎用的な手段でセットアップするという記事でも書いた通り個人的に自分のデータを置くあらゆるストレージは必ず暗号化するというポリシーがある。そこで SSD には GNU/Linux に備わっている暗号化 LVM を有効にしてインストールする。さてここで問題になるのが HDD であり、これも暗号化した上で LVM に追加しなければならない。この記事では既存の暗号化済み LVM に新しくストレージを暗号化して追加させる方法について記述する。なお新しいストレージは /dev/sdb として認識されている前提で書く。
暗号化パーティションの作成
これは基本的にこちらの記事の通りである。
まずはボリュームを乱数で埋める。これは他にもやり方があるし、だいたい元のストレージが以前から暗号化されているなら読み取り不可なのでそのまま使えるということも有り得る。
1 | shred -n 1 -v /dev/sdb |
次に鍵を生成する。 256 ビット長なので 32 バイトを指定。生成した鍵は root だけ読み取れるようにしておく。
1 2 | dd if=/dev/random of=/etc/lvm/lvm.seckey bs=1 count=32 chmod 400 /etc/lvm/lvm.seckey |
次に LUKS パーティションの作成をする。
1 2 3 4 5 | cryptsetup --cipher aes-cbc-essiv:sha256 --key-size 256 luksFormat /dev/sdb # 大文字で YES を回答する # パスフレーズを 2 回入力する cryptsetup luksAddKey /dev/sdb /etc/lvm/lvm.seckey # パスフレーズを 1 回入力する |
これで暗号化されたパーティションが作成された。次のように確認する。 UUID を確認しておく。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # cryptsetup luksDump /dev/sdb LUKS header information for /dev/sdb Version: 1 Cipher name: aes Cipher mode: cbc-essiv:sha256 Hash spec: sha1 Payload offset: 4096 MK bits: 256 〜 省略 〜 MK iterations: 77500 UUID: 8553a6e4-4f0f-4230-8ddb-ec2f4b68e4eb 〜 省略 〜 Key Slot 0: ENABLED 〜 省略 〜 Key Slot 2: DISABLED Key Slot 3: DISABLED Key Slot 4: DISABLED Key Slot 5: DISABLED Key Slot 6: DISABLED Key Slot 7: DISABLED |
dm-crypt デバイスの作成をする。 sdb_crypt の部分は好きな名前で良い。既存の LVM と揃えてわかりやすくすると良いだろう。
1 | cryptsetup --key-file /etc/lvm/lvm.seckey luksOpen /dev/sdb sdb_crypt |
LVM への追加とファイルシステムの作成
これも基本的にはこちらの記事の通り。
dm-crypt デバイスに PV を作成する。
1 | pvcreate /dev/mapper/sdb_crypt |
作成した PV を既存の VG に参加させる。
1 | vgextend raytrek-vg /dev/mapper/sdb_crypt |
成功したら vgscan や pvscan で状況を確認する。
1 2 3 4 5 6 7 | # vgscan Reading all physical volumes. This may take a while... Found volume group "raytrek-vg" using metadata type lvm2 # pvscan PV /dev/mapper/sda5_crypt VG raytrek-vg lvm2 [119.00 GiB / 0 free] PV /dev/mapper/sdb_crypt VG raytrek-vg lvm2 [1.82 TiB / 0 free] Total: 2 [1.94 TiB] / in use: 2 [1.94 TiB] / in no VG: 0 [0 ] |
また pvdisplay で拡張可能なエクステント数を確認しておく。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # pvdisplay --- Physical volume --- PV Name /dev/mapper/sda5_crypt VG Name raytrek-vg PV Size 119.00 GiB / not usable 0 Allocatable yes (but full) PE Size 4.00 MiB Total PE 30464 Free PE 0 Allocated PE 30464 PV UUID Sho5wy-eiSd-TZEU-y7Xs-7vTY-JaX6-i3dwe1 --- Physical volume --- PV Name /dev/mapper/sdb_crypt VG Name raytrek-vg PV Size 1.82 TiB / not usable 3.09 MiB Allocatable yes PE Size 4.00 MiB Total PE 476931 Free PE 476931 Allocated PE 0 PV UUID YqLai4-8IS3-IH6J-AVhC-aT8J-K6Bx-NhsPYV |
上の例では 476931 が拡張可能であるとわかる。これをもとに VG に追加された PV 上に LV を作成する。領域の無駄のないようにエクステント数を引数に指定するのが推奨である。
1 | lvcreate -l 476931 --name data raytrek-vg |
これで LV ができたので、 LV 上にファイルシステムを作成する。
1 | mkfs -t ext4 /dev/raytrek-vg/data |
mount コマンドを発行してマウントができることを確認する。
1 2 3 | mkdir /data mount /dev/raytrek-vg/data /data df -T -h |
成功したなら一旦 umount しておく。
自動マウントの設定
最後に起動時に自動マウントされるよう各種ファイルを編集する。デバイス名はなるべく UUID で指定するのが推奨である。
まず /etc/fstab を編集する。
1 2 | /dev/mapper/raytrek--vg-root / ext4 relatime,errors=remount-ro 0 1 /dev/mapper/raytrek--vg-data /data ext4 relatime,errors=remount-ro 0 1 |
また /etc/crypttab に次の一行を追加する。
1 | sdb_crypt UUID=8553a6e4-4f0f-4230-8ddb-ec2f4b68e4eb /etc/lvm/lvm.seckey luks |
mount -a すれば自動的にマウントされることが確認できるはずである。
1 2 3 4 5 6 7 8 9 10 11 12 | # mount -a # df -T -h Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/raytrek--vg-root ext4 86G 49G 36G 58% / none tmpfs 4.0K 0 4.0K 0% /sys/fs/cgroup udev devtmpfs 16G 4.0K 16G 1% /dev tmpfs tmpfs 3.2G 1.2M 3.2G 1% /run none tmpfs 5.0M 0 5.0M 0% /run/lock none tmpfs 16G 156K 16G 1% /run/shm none tmpfs 100M 28K 100M 1% /run/user /dev/sda1 ext4 232M 46M 180M 21% /boot /dev/mapper/raytrek--vg-data ext4 1.8T 68M 1.7T 1% /data |
これで /data をデータ領域として自由に利用できるようになった。