takashi kono's blog

コーヒーとキーボードと共に何かを記録していくブログ

Ubuntu Server で disk 2 個を luks でセットアップする

目的

Storage を 2個 使って、disk1 を System disk, disk2 を Data disk とする。ディスクはすべて LUKS 暗号化する。 disk2 は disk1 で os を起動途中に、LUKS 複合化され、自動マウントするように設定する。disk2 は 2,3 年で式年遷宮することを見越して手順を残す。

環境

key value
ディストリビューション Ubuntu Server 24.04 LTS
disk1 system disk
disk2 data disk
/ disk1
/data disk2

いったん、パーティション分割はこんな感じにしておく

lvm と luks の設定

a. disk1 の設定

disk1 にはすでに Ubuntu Server がインストール済みで、LUKS 暗号化済みあること。
もし未設定の場合は、インストーラーの「暗号化ディスク」を選択してインストールすること。

b. disk2 の設定

1. データディスクの確認

接続されたディスクを確認する

lsblk

例として、/dev/sdb と認識されたとする

2. データディスクを LUKS で暗号化

注意: 以下の操作はディスク上の全データを消去します。必要なデータはバックアップしてください。

sudo cryptsetup luksFormat /dev/sdb

プロンプトに従い、パスフレーズを設定します。

3. LUKS デバイスの開放

暗号化されたデータディスクを開放し、名前を付けます(例: data_disk )。

sudo cryptsetup open /dev/sdb data_disk

4. LVM の設定

LVM を使用して柔軟なディスク管理を実現します。

sudo pvcreate /dev/mapper/data_disk
sudo vgcreate data_vg /dev/mapper/data_disk
sudo lvcreate -l 100%FREE -n data_lv data_vg

5. ファイルシステムの作成

例として ext4 を使用します。

sudo mkfs.ext4 /dev/data_vg/data_lv

2. データディスクの自動解除とマウント

システム起動時にデータディスクを自動的に解除(decrypt)し、マウントするための設定を行います。

a. 鍵ファイルの作成と設定

データディスクの自動解除には鍵ファイルを使用します。

1. 鍵ファイルの作成

# コマンドでパスフレーズを作る場合
sudo dd if=/dev/urandom of=/root/.data_disk_key bs=4096 count=1
# 主導でパスフレーズを作る場合
echo 'パスフレーズ' | sudo tee /root/.data_disk_key
# 権限設定
sudo chmod 600 /root/.data_disk_key

2. 鍵ファイルを LUKS に追加

sudo cryptsetup luksAddKey /dev/sdb /root/.data_disk_key

プロンプトが表示されたら、現在のパスフレーズを入力します。

b. /etc/crypttab の編集

データディスクを自動的に解除するために、/etc/crypttab ファイルにエントリを追加します。

1. データディスクにラベルを付ける

ディスクラベルを設定すると、UUID に依存せずラベルで管理できます。

sudo e2label /dev/data_vg/data_lv data_disk_label

2. /etc/crypttab を編集

sudo vim /etc/crypttab

以下の行を追加します(UUID を実際の値に置き換えてください):

data_disk LABEL=data_disk_label /root/.data_disk_key luks

c. /etc/fstab の編集

データディスクを /data にマウントするために、/etc/fstab ファイルにエントリを追加します。

1. ファイルシステムのラベル設定(オプション)

ディスクラベルを設定すると、UUID に依存せずラベルで管理できます。
設定済みである場合はスキップ

sudo e2label /dev/data_vg/data_lv data_disk_label

2. /etc/fstab を編集

sudo vim /etc/fstab

以下の行を追加します(ラベルを使用する場合):

LABEL=data_disk_label /data ext4 defaults 0 2

d. マウントポイントの作成

sudo mkdir /data
sudo chmod 755 /data

e. 自動マウントの確認

設定が正しいか確認するために、以下のコマンドを実行します。

sudo mount -a

エラーが出なければ設定は正しいです。

f. システムの再起動と確認

システムを再起動し、自動的にデータディスクが解除・マウントされることを確認します。

sudo reboot

再起動後、以下のコマンドで確認します。

df -hT

3. データディスクの交換を容易にするための設定

データディスクを定期的に新しいディスクに交換する際、手間を最小限に抑えるための設定を行います。

a. ディスクラベルの設定

ディスクラベルを設定しておくと、ディスク交換時に UUID を変更せずに同じラベルを設定することで、crypttabfstab の設定を変更する必要がありません。

sudo e2label /dev/data_vg/data_lv data_disk_label

# /etc/crypttab
data_disk LABEL=data_disk_label /root/.data_disk_key luks

# /etc/fstab
LABEL=data_disk_label /data ext4 defaults 0 2

b. ディスク交換手順

新しいディスクにデータをコピーし、交換を行う手順を以下に示します。

1. 新しいデータディスクの準備

新しいディスク(例: /dev/sdc )を接続し、LUKS と LVM を設定します。

sudo cryptsetup luksFormat /dev/sdc
sudo cryptsetup open /dev/sdc new_data_disk

sudo pvcreate /dev/mapper/new_data_disk
sudo vgcreate new_data_vg /dev/mapper/new_data_disk
sudo lvcreate -l 100%FREE -n new_data_lv new_data_vg

sudo mkfs.ext4 /dev/new_data_vg/new_data_lv
sudo e2label /dev/new_data_vg/new_data_lv data_disk_label

2. 新しいディスクに鍵ファイルを追加

sudo cryptsetup luksAddKey /dev/sdc /root/.data_disk_key

3. 新しいディスクを一時的にマウント

sudo mkdir /mnt/new_data
sudo mount /dev/mapper/new_data_disk /mnt/new_data

4. rsync を使用してデータをコピー

sudo rsync -aAXv /data/ /mnt/new_data/

オプションの説明:

5. コピーの検証

ディレクトリ構造やファイル数、サイズを比較してコピーが正しく行われたことを確認します。

sudo diff -r /data /mnt/new_data

差異がないことを確認します。

6. 新しいディスクを /data に設定

既にラベルを設定している場合、/etc/crypttab と /etc/fstab の設定は変更不要です。

# 例: /etc/crypttab はラベル使用のため変更不要
# data_disk LABEL=data_disk_label /root/.data_disk_key luks

# /etc/fstab もラベル使用のため変更不要
# LABEL=data_disk_label /data ext4 defaults 0 2

7. システムの再起動と確認

システムを再起動し、新しいディスクが正しくマウントされていることを確認します。

sudo reboot

再起動後、以下のコマンドで確認します。

df -hT

8. 旧ディスクの取り外し

新しいディスクが正しく動作していることを確認した後、旧ディスク(例: /dev/sdb )を安全に取り外します。

shutdown して、取り外す
もし、live で取り外すなら以下

sudo cryptsetup close data_disk
sudo umount /data
# 物理的にディスクを取り外す

注意

本記事はほぼ ChatGPT o1-mini で書いており、筆者の手で加筆しております。