Red Hat Certified System Administrator (RHCSA) #6: ローカル storage 2 — LVM 拡張と LUKS 暗号化
#5 ローカル storage 1 でパーティションと swap、そして LVM の基本構造 (PV・VG・LV) を作ってみました。この記事はその上で、すでに作った LVM を大きくしたり小さくしたりする作業、そして ブロックデバイスを LUKS で暗号化して永続マウントする作業 を扱います。どちらの作業も RHCSA 実技でよく出題され、特に LV 拡張はほぼ毎回の試験に登場する定番です。
LVM の価値は、運用中でも無停止で容量を調整できる点にあります。ディスクが足りなくなったら、新しいディスクを PV として追加して VG にまとめたうえで LV を大きくします。このとき LV だけ大きくして終わりではなく、その上に載ったファイルシステムまで一緒に広げて はじめて実際に空間が見える、という点が核心です。
LVM 階層を思い出す #
拡張作業を理解するには、LVM の 3 つの階層がどう積み上がるのかを頭に置いておく必要があります。下から上へ行くほど抽象化が一段ずつ上がります。
| 階層 | 略称 | 正体 |
|---|---|---|
| Physical Volume | PV | LVM が使う物理ブロックデバイス (ディスク・パーティション) |
| Volume Group | VG | 複数の PV を束ねて作った容量プール |
| Logical Volume | LV | VG から切り出した仮想パーティション。ここにファイルシステムを載せる |
容量を増やす流れは常にこの階層に沿います。PV を増やして VG のプールを大きくし、そのプールから LV をさらに切り出し、最後に LV 上のファイルシステムを広げます。 どの段階で止まっているかを確認するには、次のコマンドで各階層の現在の状態を見ます。
pvs # PV 要約: ディスクごとの容量と所属 VG
vgs # VG 要約: 全体容量と残りの空き (VFree)
lvs # LV 要約: 論理ボリュームごとの容量と所属 VGより詳しい情報は display 系で見ます。
pvdisplay /dev/vdb1 # PV 詳細: PE サイズ、総・割当・空き PE
vgdisplay vg_data # VG 詳細: 総 PE、Free PE / Size
lvdisplay /dev/vg_data/lv_app # LV 詳細: LV パス、サイズ、セグメントvgs の VFree 列、vgdisplay の Free PE / Size 行が、今 LV をどれだけ大きくできるか を教えてくれる核心指標です。この値が 0 なら、まず VG から大きくする必要があります。
VG 拡張: 新しいディスクをプールにまとめる #
VG に空きがないときは、新しいブロックデバイスを PV にして VG に追加します。試験では普通、新しいディスク (/dev/vdc など) または新しく作ったパーティションが与えられます。
まず追加するデバイスを PV として初期化します。
# ディスク全体を PV として使う場合
pvcreate /dev/vdc
# またはパーティション 1 つを PV として使う場合 (タイプコードは LVM に)
pvcreate /dev/vdc1パーティションを PV として使うときは、
fdiskまたはpartedでパーティションを作ったうえでタイプを LVM (8eまたはlvm) に指定し、partprobeでカーネルにパーティションテーブルの変更を知らせます。パーティション作成手順は #5 で扱いました。
次に、作った PV を既存の VG にまとめます。
vgextend vg_data /dev/vdc拡張が反映されたかを vgs で確認します。VSize が大きくなり、VFree に新しいディスク容量分の空きができていれば成功です。
vgs vg_data
# VG #PV #LV #SN Attr VSize VFree
# vg_data 2 1 0 wz--n- <19.99g 10.00gLV 拡張: 論理ボリュームとファイルシステムを一緒に広げる #
VG に空きができたら LV を大きくします。ここで RHCSA の最もよくある失点が出ます。LV だけ広げてファイルシステムを広げないと、lvs には容量が増えて見えても、df で見た実際の使用可能空間はそのままです。
方法 1: -r オプションで一度に (推奨) #
lvextend に -r (--resizefs) オプションを付けると、LV 拡張とファイルシステム拡張を 1 つのコマンドで処理します。XFS・ext4 のどちらも自動的に適切なツールを呼ぶので、試験で最も安全です。
# LV を 5GB 追加で広げ、ファイルシステムも一緒に拡張
lvextend -r -L +5G /dev/vg_data/lv_app
# VG の残り空間をすべてこの LV に寄せ、ファイルシステムも拡張
lvextend -r -l +100%FREE /dev/vg_data/lv_app方法 2: LV 拡張後にファイルシステムを別途拡張 #
-r を使わない、または段階を分けて理解したい場合は、LV を先に広げてからファイルシステムを別途広げます。このとき ファイルシステムの種類によってツールが異なります。
# 1) LV を先に拡張
lvextend -L +5G /dev/vg_data/lv_app
# 2-a) XFS ファイルシステムなら xfs_growfs (マウントポイントを引数に)
xfs_growfs /mnt/app
# 2-b) ext4 ファイルシステムなら resize2fs (LV パスを引数に)
resize2fs /dev/vg_data/lv_appXFS は マウントされた状態 でのみ xfs_growfs で広げられ、引数にマウントポイントを取ります。ext4 の resize2fs は LV デバイスパスを引数に取り、マウントの有無に関わらず動作します。どのファイルシステムか迷ったら、df -T /mnt/app または lsblk -f でタイプを先に確認します。
-L と -l の違い #
lvextend のサイズ指定方式は 2 通りあり、両者を混同すると意図と違うサイズになります。
| オプション | 単位 | 意味 |
|---|---|---|
-L 8G | 絶対サイズ (バイト単位) | LV を正確に 8GB にする |
-L +5G | 絶対サイズの増分 | 現在のサイズに 5GB を足す |
-l 200 | PE の個数 | LV を 200 個の PE にする |
-l +50 | PE 個数の増分 | 現在から PE 50 個を足す |
-l +100%FREE | VG 空きの比率 | VG に残った空間すべてを足す |
大文字 -L は人が読む容量 (G・M) を、小文字 -l は PE 個数や比率 (%FREE・%VG) を取ります。「残った空間をすべて」 という要求が出たら -l +100%FREE が正解であり、この場合 -L では正確に合わせにくいです。
LV 縮小: ext4 のみ可能、XFS は不可 #
拡張の逆の作業である縮小は、ファイルシステムの種類が可否を分けます。 この違いが RHCSA 定番の落とし穴です。
- ext4: 縮小可能。ただし、必ずファイルシステムを先に小さくし、その次に LV を小さくしなければなりません (順序が拡張と逆)。
- XFS: 縮小不可。XFS は設計上小さくできません。小さくしたい場合は、バックアップ後に作り直す方法しかありません。
ext4 縮小は順序が核心です。データ破損を防ぐには、ファイルシステムを先に小さくし、LV をそのサイズに合わせて小さくします。
# ext4 縮小手順 (XFS には適用不可)
umount /mnt/app # 先にマウント解除
e2fsck -f /dev/vg_data/lv_app # ファイルシステムを強制点検
resize2fs /dev/vg_data/lv_app 6G # ファイルシステムを 6GB に縮小
lvreduce -L 6G /dev/vg_data/lv_app # LV を 6GB に縮小
mount /mnt/app # 再マウント
lvreduceにも-rオプションがあり、ファイルシステム縮小と LV 縮小を一度に処理できます。ただし-rでまとめても、対象が XFS なら縮小は依然として失敗します。 XFS はツールが自動で選ばれようと手動だろうと縮まない、という点を覚えておきます。
LUKS 暗号化ボリューム #
LUKS (Linux Unified Key Setup) は、ブロックデバイス自体を暗号化する標準方式です。暗号化されたデバイスは、正しいパスフレーズ (または鍵) で解除 (open) してはじめて /dev/mapper/ に平文マッピングができ、そのマッピングにファイルシステムを作ってマウントします。RHCSA では、与えられたディスクや LV を LUKS で暗号化し、起動時にパスフレーズを入力してマウントされるよう永続設定するシナリオが出ます。
使用するツールは cryptsetup コマンドで、cryptsetup パッケージとして提供されます。
1) LUKS フォーマット #
対象デバイスを LUKS として初期化します。この作業は デバイスの既存データをすべて消すので、対象を必ず確認します。確認手順として大文字 YES を直接入力する必要があります。
cryptsetup luksFormat /dev/vdb1
# WARNING! ... will overwrite data ... irrevocably.
# Are you sure? (Type 'yes' in capital letters): YES
# Enter passphrase: ...
# Verify passphrase: ...2) LUKS 解除 (open) #
暗号化デバイスを開いて平文マッピングを作ります。最後の引数がマッピング名であり、/dev/mapper/<名前> として公開されます。
cryptsetup luksOpen /dev/vdb1 cryptdata
# Enter passphrase for /dev/vdb1: ...
ls -l /dev/mapper/cryptdata # 平文マッピングを確認3) ファイルシステム作成とマウント #
ここからはマッピングデバイスを一般のブロックデバイスのように扱います。ファイルシステムを作ってマウントします。
mkfs.xfs /dev/mapper/cryptdata
mkdir /secure
mount /dev/mapper/cryptdata /secure作業が終わったら閉じることもできます。閉じると /dev/mapper/ のマッピングが消え、再び開くにはパスフレーズが必要です。
umount /secure
cryptsetup luksClose cryptdataLUKS デバイス情報の確認 #
暗号化デバイスの状態とヘッダー情報は次で確認します。
cryptsetup luksDump /dev/vdb1 # LUKS ヘッダー: バージョン、キースロット
cryptsetup status cryptdata # 開いたマッピングの状態
blkid /dev/vdb1 # TYPE="crypto_LUKS" と UUID を確認
lsblk -f # デバイス階層とマッピング関係blkid で出る LUKS デバイスの UUID は、次の段階の crypttab 永続設定にそのまま使います。
LUKS 永続マウント: crypttab + fstab #
手動で luksOpen して mount した設定は、再起動すると消えます。起動時に自動で解除・マウントされるよう、2 つのファイルを合わせて設定する必要があります。この永続設定が RHCSA 採点の核心です。
/etc/crypttab: どのデバイスをどの名前で開くか #
/etc/crypttab は、起動時に解除する LUKS デバイスを定義します。形式は 名前 バッキングデバイス キーファイル オプション の順です。
# /etc/crypttab
# マッピング名 バッキングデバイス キーファイル オプション
cryptdata UUID=11112222-3333-4444-5555-666677778888 none3 番目のフィールドの none はキーファイルがないという意味であり、この場合は 起動中にパスフレーズを直接入力 することになります。バッキングデバイスは /dev/vdb1 のようなパスより UUID=... で書くほうが、ディスクの順序が変わっても安全です。UUID は前段階の blkid /dev/vdb1 の結果を使います。
/etc/fstab: マッピングデバイスをどこにマウントするか #
fstab には、暗号化された元のデバイスではなく、crypttab が作ってくれるマッピングデバイス (/dev/mapper/cryptdata) を書きます。
# /etc/fstab
/dev/mapper/cryptdata /secure xfs defaults 0 0順序が重要です。crypttab が先に /dev/mapper/cryptdata を作り、その次に fstab がそのマッピングをマウントします。fstab に元の /dev/vdb1 を書くと、暗号化された生データをマウントしようとして失敗します。
キーファイルでパスフレーズ入力を省く #
起動のたびにパスフレーズを入力しないようにするには、キーファイルを登録します。キーファイルを作って LUKS にキースロットとして追加し、crypttab にパスを書きます。
# キーファイル生成 (root のみ読めるよう権限を制限)
dd if=/dev/urandom of=/root/luks-key bs=512 count=4
chmod 600 /root/luks-key
# キーファイルをこの LUKS デバイスのキースロットに追加 (既存のパスフレーズで認証)
cryptsetup luksAddKey /dev/vdb1 /root/luks-keyその次に crypttab のキーファイルフィールドを none からキーファイルパスに変えます。
# /etc/crypttab (キーファイル使用)
cryptdata UUID=11112222-3333-4444-5555-666677778888 /root/luks-key設定の検証 #
永続設定を終えたら、再起動せずに検証します。マッピングを閉じたうえで systemd に crypttab を処理させ、fstab を確認します。
umount /secure
cryptsetup luksClose cryptdata
# crypttab を再適用 (キーファイルがなければここでパスフレーズ入力)
systemctl daemon-reload
cryptdisks_start cryptdata 2>/dev/null || cryptsetup luksOpen /dev/vdb1 cryptdata
mount -a # fstab 構文・マウントの検証。エラーなく終わるべき
df -h /secure # マウントを確認最も確実な検証は実際の再起動です。試験では、時間が許せば再起動後に /secure が自動でマウントされるかを直接確認します。
試験ポイント #
この領域でよく間違える点を整理します。
- XFS は縮小できません。 拡張 (
xfs_growfs) のみ可能です。「小さくせよ」が出たらその LV は ext4 のはずであり、XFS ならバックアップ後の再作成が唯一の道です。 - LV 拡張後にファイルシステム拡張を抜かすと 0 点 です。
lvextend -rでまとめるか、別々にやるなら XFS はxfs_growfs <マウントポイント>、ext4 はresize2fs <LV パス>を忘れません。 - ext4 縮小は順序が逆 です。ファイルシステムを先に (
resize2fs) 小さくし、LV をその次に (lvreduce) 小さくします。順序を変えるとデータが切られます。 -Lと-lを区別 します。「残った空間すべて」は-l +100%FREEです。- LUKS は fstab にマッピングデバイスを書きます。
/dev/mapper/cryptdataであって/dev/vdb1ではありません。crypttab と fstab を両方設定してはじめて永続マウントになります。 - すべての作業は 再起動後も維持 されてはじめて点数になります。
mount -aで fstab を検証する習慣をつけます。
まとめ #
この記事で押さえたこと:
- VG 拡張:
pvcreateで新しい PV を作り、vgextendで VG にまとめて空きを確保します。 - LV 拡張:
lvextend -rで LV とファイルシステムを一度に広げるか、lvextendの後に XFS はxfs_growfs、ext4 はresize2fsで別々に広げます。 - LV 縮小: ext4 のみ可能であり、ファイルシステムを先に小さくします。XFS は縮小不可 です。
- LVM 情報:
pvs・vgs・lvsで要約を、pvdisplay・vgdisplay・lvdisplayで詳細を見ます。 - LUKS 暗号化:
cryptsetup luksFormat・luksOpenで暗号化・解除し、/etc/crypttabと/etc/fstabを一緒に設定して起動時に自動解除・マウントされるようにします。
次へ — ファイルシステム #
ストレージのブロック階層を、拡張と暗号化まで扱いました。ここからはその上に載るファイルシステム自体へ視線を移します。
#7 ファイルシステム: XFS、ext4、mount/fstab、NFS、AutoFS では、XFS と ext4 の違い、fstab でローカルファイルシステムを永続マウントする方法、そして NFS 共有をマウントして AutoFS で必要なときだけ自動マウントする設定まで、直接打ちながら整理します。