第2章: ストレージ階層と暗号化理論 - ディスク管理の計算機科学的基盤

2.1 ストレージ抽象化の理論

2.1.1 ブロックデバイスの概念

デバイス抽象化の歴史

1960年代、UNIXの設計者Ken ThompsonとDennis Ritchieは「Everything is a file」という革命的な抽象化を導入しました。この原則により、ハードウェアデバイスを含むすべてのリソースがファイルとして扱えるようになりました。

Unixのデバイス抽象化:

/dev/sda     ← ディスク全体
/dev/sda1    ← 第1パーティション
/dev/sda2    ← 第2パーティション
/dev/tty0    ← 端末デバイス
/dev/null    ← ヌルデバイス
/dev/random  ← 乱数生成デバイス

統一インターフェース:
open(), read(), write(), close(), ioctl()

キャラクタデバイス vs ブロックデバイス

キャラクタデバイス(Character Device):
- 1バイト単位のシーケンシャルアクセス
- バッファリングなし
- 例:キーボード、シリアルポート、/dev/random

ブロックデバイス(Block Device):
- 固定サイズブロック(通常512B〜4KB)単位のアクセス
- バッファリングあり
- ランダムアクセス可能
- 例:HDD、SSD、USBメモリ

/dev内のデバイス識別:
$ ls -l /dev/sda /dev/tty0
brw-rw---- 1 root disk 8, 0 Nov 29 10:00 /dev/sda
crw--w---- 1 root tty  4, 0 Nov 29 10:00 /dev/tty0
 ↑                          ↑
 b=block, c=character       major, minor 番号

ブロックデバイスのI/Oスタック

ユーザー空間のread()/write()呼び出し
           ↓
   VFS(Virtual File System)
           ↓
   ファイルシステム(ext4, xfs, etc.)
           ↓
   ブロック層(Block Layer)
           ↓
   I/Oスケジューラ
           ↓
   デバイスドライバ
           ↓
   ハードウェア(HDD/SSD)

2.1.2 ディスクパーティショニングの理論

パーティションの必要性

1970年代のディスクは高価で大容量だったため、複数の論理ディスクに分割する必要がありました:

分割の目的:
1. マルチブート: 複数のOSを共存
2. データ分離: システムとユーザーデータを分離
3. 障害分離: 1つの領域の問題が他に波及しない
4. 管理性: バックアップ、暗号化の単位
5. 性能: 領域ごとに最適なファイルシステム

MBR(Master Boot Record)方式

1983年のIBM PCで導入された古いパーティション方式:

MBRの構造(ディスクの先頭512バイト):

┌────────────────────────────────────┐ 0x000
│    ブートストラップコード          │
│    (446バイト)                   │
├────────────────────────────────────┤ 0x1BE
│  パーティションエントリ 1(16B)    │
├────────────────────────────────────┤ 0x1CE
│  パーティションエントリ 2(16B)    │
├────────────────────────────────────┤ 0x1DE
│  パーティションエントリ 3(16B)    │
├────────────────────────────────────┤ 0x1EE
│  パーティションエントリ 4(16B)    │
├────────────────────────────────────┤ 0x1FE
│  シグネチャ 0x55AA(2B)           │
└────────────────────────────────────┘ 0x200

各パーティションエントリ(16バイト):
┌─────┬─────┬─────┬─────────────────┐
│Boot │Start│Type │Size            │
│Flag │ CHS │ID   │                │
└─────┴─────┴─────┴─────────────────┘

制限:
- 最大4つのプライマリパーティション
- 最大2TB(2^32 × 512バイト)
- CHS(シリンダ/ヘッド/セクタ)アドレッシング

GPT(GUID Partition Table)方式

UEFIとともに導入された現代的な方式:

GPTの構造:

セクタ0: 保護MBR(互換性のため)
セクタ1: GPTヘッダ
セクタ2-33: パーティションエントリ配列
  ...
セクタN-33〜N-2: バックアップパーティションエントリ
セクタN-1: バックアップGPTヘッダ

利点:
- 最大128パーティション(拡張可能)
- 最大8 ZiB(ゼビバイト)
- CRC32チェックサムによる整合性検証
- 冗長性(ヘッダとエントリのバックアップ)
- GUID(128ビット)によるパーティション識別

パーティション識別のスキーム

Linuxでのパーティション命名:

SATA/SCSI/SSD:
  /dev/sda   ← 1番目のディスク
  /dev/sda1  ← 1番目のパーティション
  /dev/sda2  ← 2番目のパーティション
  /dev/sdb   ← 2番目のディスク

NVMe:
  /dev/nvme0n1    ← 1番目のNVMeディスク
  /dev/nvme0n1p1  ← 1番目のパーティション

仮想環境(VirtIO):
  /dev/vda   ← 1番目の仮想ディスク
  /dev/vda1  ← 1番目のパーティション

2.1.3 ファイルシステム階層標準(FHS)

FHS(Filesystem Hierarchy Standard)の歴史

1994年、LinuxコミュニティはFHSを策定し、ディレクトリ構造を標準化しました。

/                  ← ルートディレクトリ
├── bin/           ← 基本コマンド(mv, cp, ls)
├── boot/          ← ブートローダ、カーネル
├── dev/           ← デバイスファイル
├── etc/           ← 設定ファイル
├── home/          ← ユーザーホームディレクトリ
├── lib/           ← 共有ライブラリ
├── media/         ← リムーバブルメディア
├── mnt/           ← 一時マウントポイント
├── opt/           ← サードパーティソフトウェア
├── proc/          ← プロセス情報(仮想FS)
├── root/          ← rootのホームディレクトリ
├── run/           ← 実行時データ
├── sbin/          ← システム管理コマンド
├── srv/           ← サービスデータ
├── sys/           ← カーネル/デバイス情報(仮想FS)
├── tmp/           ← 一時ファイル
├── usr/           ← ユーザープログラム
│   ├── bin/       ← ユーザーコマンド
│   ├── lib/       ← ライブラリ
│   └── share/     ← アーキテクチャ非依存データ
└── var/           ← 可変データ(ログ、メール、キャッシュ)
    ├── log/       ← ログファイル
    ├── mail/      ← メールスプール
    └── cache/     ← アプリケーションキャッシュ

パーティション分離の設計理由

推奨されるパーティション分離:

1. /boot(非暗号化)
   - ブートローダ、カーネル
   - 暗号化するとブート不能

2. /(ルート)
   - OSの中核
   - 比較的小さく(10-20GB)
   - 安定性が重要

3. /home
   - ユーザーデータ
   - OSとは独立
   - OS再インストール時も保護可能

4. /var
   - ログ、キャッシュ
   - 急成長の可能性
   - 溢れてもシステムに影響しない

5. /tmp
   - 一時ファイル
   - 別パーティションで制限
   - セキュリティ(noexec, nosuid)

6. swap
   - 仮想メモリ
   - RAM枯渇時のバックアップ

2.2 ブートプロセスの理論

2.2.1 システム起動のフェーズ

コンピュータの電源投入からユーザーログインまでの過程を理解します。

ブートプロセスの全体像:

1. ファームウェア初期化(BIOS/UEFI)
           ↓
2. ブートローダ(GRUB)
           ↓
3. カーネル起動(vmlinuz)
           ↓
4. initramfs/initrd
           ↓
5. 実ルートファイルシステムマウント
           ↓
6. init/systemd起動
           ↓
7. サービス起動
           ↓
8. ログイン画面/プロンプト

2.2.2 BIOS vs UEFI

BIOS(Basic Input/Output System)

1981年のIBM PCから続く従来のファームウェア:

BIOSの特徴:
- 16ビットリアルモードで動作
- 1MB以下のメモリアドレス空間
- MBRからブートローダをロード
- 設定はCMOS RAMに保存

BIOSブートシーケンス:
1. POST(Power-On Self-Test)
2. 起動デバイス検索
3. MBRの先頭512バイトをメモリ0x7C00にロード
4. 制御をブートストラップコードに移転

UEFI(Unified Extensible Firmware Interface)

Intelが1990年代後半に開発したモダンファームウェア:

UEFIの特徴:
- 64ビット(または32ビット)保護モードで動作
- 大容量ディスクサポート(GPT)
- セキュアブート(署名検証)
- ネットワークブート
- グラフィカルインターフェース

UEFIブートシーケンス:
1. SEC(Security Phase): 初期化とコード検証
2. PEI(Pre-EFI Initialization): メモリ初期化
3. DXE(Driver Execution Environment): ドライバロード
4. BDS(Boot Device Selection): 起動デバイス選択
5. TSL(Transient System Load): ブートローダ実行
6. RT(Runtime): OS動作中のUEFIサービス

2.2.3 GRUB(Grand Unified Bootloader)

GRUBの役割と構造

GRUBのステージ:

Stage 1(512バイト):
- MBRに格納
- Stage 1.5またはStage 2をロード

Stage 1.5(オプション):
- ファイルシステムドライバ
- /bootパーティションへのアクセスを可能に

Stage 2:
- 完全なブートローダ
- メニュー表示
- カーネルとinitramfsのロード

GRUB設定ファイル:
/boot/grub/grub.cfg      ← 自動生成(編集しない)
/etc/default/grub        ← ユーザー設定
/etc/grub.d/             ← スクリプト

GRUB設定例

# /etc/default/grub
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""

# 暗号化ルートの場合
GRUB_ENABLE_CRYPTODISK=y

# 設定の反映
$ sudo update-grub  # Debian系
$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg  # RHEL系

2.2.4 カーネルとinitramfs

Linuxカーネルのロード

カーネルイメージ:
/boot/vmlinuz-$(uname -r)

「vmlinuz」の由来:
- vm: Virtual Memory(仮想メモリサポート)
- linux: Linuxカーネル
- z: 圧縮(gzip/xz/lz4)

カーネルパラメータの例:
root=/dev/mapper/vg-root  ← ルートデバイス
ro                        ← 読み取り専用でマウント
quiet                     ← ブートメッセージ抑制
splash                    ← スプラッシュ画面表示
cryptdevice=...           ← 暗号化デバイス

initramfs(Initial RAM Filesystem)

initramfsの役割:
- カーネル起動直後の一時的なルートファイルシステム
- 実ルートマウントに必要なドライバとツール
- 暗号化ディスクのパスフレーズ入力

initramfsの内容:
/bin/           ← 基本コマンド
/sbin/          ← システムコマンド
/lib/           ← カーネルモジュール
/etc/           ← 設定ファイル
/scripts/       ← 初期化スクリプト
/init           ← 最初に実行されるスクリプト

暗号化ディスクでの流れ:
1. initramfsがロードされる
2. cryptsetupがパスフレーズを要求
3. 暗号化ボリュームがアンロック
4. LVMが有効化
5. 実ルートがマウントされる
6. switch_root/pivot_root

2.3 論理ボリューム管理(LVM)の理論

2.3.1 LVMの設計思想

抽象化層の導入

LVM(Logical Volume Manager)は、物理ストレージとファイルシステムの間に抽象化層を導入します。これにより、動的なボリューム管理が可能になります。

従来のパーティショニング:
┌──────────────────────────────────┐
│  ファイルシステム(ext4)        │
├──────────────────────────────────┤
│  パーティション(/dev/sda1)     │ ← 固定サイズ
├──────────────────────────────────┤
│  物理ディスク(/dev/sda)        │
└──────────────────────────────────┘

LVMによる抽象化:
┌──────────────────────────────────┐
│  ファイルシステム(ext4)        │
├──────────────────────────────────┤
│  論理ボリューム(LV)            │ ← 動的サイズ変更可能
├──────────────────────────────────┤
│  ボリュームグループ(VG)        │ ← ストレージプール
├──────────────────────────────────┤
│  物理ボリューム(PV)            │
├──────────────────────────────────┤
│  物理デバイス(/dev/sda)        │
└──────────────────────────────────┘

2.3.2 LVMの三層構造

1. Physical Volume(PV): 物理ボリューム

PVはLVMの最下層:
- 物理パーティションまたはディスク全体
- PE(Physical Extent)単位で管理
- デフォルトPEサイズ: 4MB

PV作成:
$ sudo pvcreate /dev/sda5

PVの構造:
┌─────────────────────────────────────────┐
│  PV Header(メタデータ)                 │
├─────────────────────────────────────────┤
│  PE 0  │  PE 1  │  PE 2  │ ... │ PE n  │
│  4MB   │  4MB   │  4MB   │     │  4MB  │
└─────────────────────────────────────────┘

2. Volume Group(VG): ボリュームグループ

VGは1つ以上のPVをまとめたストレージプール:
- 複数のPVを結合
- LVに割り当て可能な総容量を提供

VG作成:
$ sudo vgcreate hostname42-vg /dev/sda5

VGの構造:
┌─────────────────────────────────────────┐
│  hostname42-vg (Volume Group)           │
├─────────────────────────────────────────┤
│  PV: /dev/sda5                          │
│  ┌────┬────┬────┬────┬────┬────┐        │
│  │PE 0│PE 1│PE 2│PE 3│PE 4│... │        │
│  └────┴────┴────┴────┴────┴────┘        │
│                                         │
│  Total PEs: 7500                        │
│  Free PEs: 0                            │
└─────────────────────────────────────────┘

3. Logical Volume(LV): 論理ボリューム

LVはVG内に作成される仮想パーティション:
- VGのPEを割り当てて構成
- サイズの動的変更が可能
- スナップショットの作成が可能

LV作成:
$ sudo lvcreate -L 10G -n root hostname42-vg
$ sudo lvcreate -L 5G -n home hostname42-vg

LVとPEのマッピング:
┌─────────────────────────────────────────┐
│  LV: root (10GB = 2560 PEs)             │
│  LE 0 → PE 0                            │
│  LE 1 → PE 1                            │
│  ...                                    │
│  LE 2559 → PE 2559                      │
├─────────────────────────────────────────┤
│  LV: home (5GB = 1280 PEs)              │
│  LE 0 → PE 2560                         │
│  LE 1 → PE 2561                         │
│  ...                                    │
└─────────────────────────────────────────┘

デバイスパス:
/dev/hostname42-vg/root
/dev/hostname42-vg/home
または
/dev/mapper/hostname42--vg-root
/dev/mapper/hostname42--vg-home

2.3.3 Device Mapperフレームワーク

dm-linuxの役割

LVMは内部でLinuxのDevice Mapperフレームワークを使用します。

Device Mapperの役割:
- 仮想ブロックデバイスの作成
- 論理デバイスと物理デバイスのマッピング
- 複数の機能を積層可能

Device Mapperの主な用途:
1. dm-linear: 連続マッピング(LVM)
2. dm-crypt: 暗号化(LUKS)
3. dm-mirror: ミラーリング(RAID1)
4. dm-stripe: ストライピング(RAID0)
5. dm-snapshot: スナップショット
6. dm-thin: シンプロビジョニング

スタック例(暗号化LVM):
┌──────────────────────────────────┐
│  ファイルシステム(ext4)        │
├──────────────────────────────────┤
│  dm-linear(LV: root)           │
├──────────────────────────────────┤
│  dm-crypt(LUKS暗号化)          │
├──────────────────────────────────┤
│  パーティション(/dev/sda5)     │
└──────────────────────────────────┘

2.3.4 LVMの操作コマンド

# 物理ボリューム操作
pvcreate /dev/sda5      # PV作成
pvdisplay               # PV詳細表示
pvs                     # PV一覧(簡潔)
pvscan                  # PVスキャン

# ボリュームグループ操作
vgcreate vg_name /dev/sda5   # VG作成
vgdisplay                    # VG詳細表示
vgs                          # VG一覧(簡潔)
vgextend vg_name /dev/sdb1   # VG拡張

# 論理ボリューム操作
lvcreate -L 10G -n lv_name vg_name  # LV作成
lvdisplay                            # LV詳細表示
lvs                                  # LV一覧(簡潔)
lvextend -L +5G /dev/vg_name/lv_name # LV拡張
lvreduce -L -2G /dev/vg_name/lv_name # LV縮小(危険)

2.4 ディスク暗号化の理論

2.4.1 暗号化の基礎理論

対称鍵暗号

ディスク暗号化は対称鍵暗号を使用します。同じ鍵で暗号化と復号を行います。

対称鍵暗号の動作:

平文(Plaintext)
    ↓
    ├─→ 暗号化鍵(Key) ─→ 暗号化アルゴリズム ─→ 暗号文(Ciphertext)

暗号文(Ciphertext)
    ↓
    ├─→ 復号鍵(同じKey)─→ 復号アルゴリズム ─→ 平文(Plaintext)

AES(Advanced Encryption Standard)

2001年にNISTが標準化した現代の標準暗号:

AESの特徴:
- ブロック暗号(128ビットブロック)
- 鍵長: 128, 192, または256ビット
- SPN(Substitution-Permutation Network)構造
- ラウンド数: 10(AES-128), 12(AES-192), 14(AES-256)

AESの各ラウンド:
1. SubBytes: S-Boxによる非線形変換
2. ShiftRows: 行のシフト
3. MixColumns: 列の混合
4. AddRoundKey: ラウンド鍵とのXOR

セキュリティ:
- 既知の実用的な攻撃なし
- ブルートフォースには2^128以上の計算が必要
- 政府機関でも使用される高いセキュリティ

2.4.2 ブロック暗号のモード

ディスク暗号化では、データを512バイト〜4KBのセクタ単位で暗号化します。ブロック暗号を大きなデータに適用するには暗号化モードが必要です。

XTS-AES(XEX-based Tweaked-codebook mode with ciphertext Stealing)

XTS-AESの特徴(ディスク暗号化の標準):
- IEEE P1619標準
- 各セクタが独立して暗号化
- セクタ番号をTweakとして使用
- 並列処理が可能

XTS-AESの動作:

    平文ブロック P
         ↓
    ┌─────────────────────────────────┐
    │  XOR with T ← Tweak(セクタ番号)│
    │       ↓                         │
    │  AES暗号化(Key 1)              │
    │       ↓                         │
    │  XOR with T                     │
    └─────────────────────────────────┘
         ↓
    暗号文ブロック C

Tweak計算:
T = E(Key2, セクタ番号) × α^i
(α: GF(2^128)の原始元)

2.4.3 LUKS(Linux Unified Key Setup)

LUKSの設計目標

LUKSはLinuxの標準的なディスク暗号化形式で、2004年にClemens Fruhwirthによって設計されました。

LUKSの目標:
1. 相互運用性: 異なるLinuxディストリビューション間で互換性
2. 安全な鍵管理: 複数のパスフレーズ、鍵スロット
3. パスフレーズ変更: データを再暗号化せずに変更可能
4. メタデータ: ヘッダに必要な情報を格納

LUKSヘッダの構造

LUKSv1ヘッダ(簡略化):

オフセット  内容
0x000       マジック番号("LUKS\xba\xbe")
0x006       バージョン(1または2)
0x008       暗号アルゴリズム(例: "aes")
0x028       暗号化モード(例: "xts-plain64")
0x048       ハッシュアルゴリズム(例: "sha256")
0x068       ペイロードオフセット
0x06c       鍵長(ビット)
0x070       マスター鍵ダイジェスト(塩付きハッシュ)
0x094       マスター鍵ダイジェスト塩
0x0b4       PBKDF2イテレーション回数
...
0x168       鍵スロット 0
0x1b0       鍵スロット 1
...         鍵スロット 2-7

鍵導出関数(PBKDF2 / Argon2)

パスフレーズから暗号鍵を導出する際、ブルートフォース攻撃を防ぐため鍵導出関数を使用します。

PBKDF2(Password-Based Key Derivation Function 2):

パスフレーズ + 塩(Salt)
    ↓
┌─────────────────────────────────────┐
│  HMAC-SHA256                        │
│       ↓                             │
│  イテレーション(数万〜数十万回)    │
│       ↓                             │
│  HMAC-SHA256                        │
│       ↓                             │
│  ... (繰り返し)                   │
└─────────────────────────────────────┘
    ↓
導出鍵(Derived Key)

イテレーション回数の意味:
- 1回の鍵導出に約1秒かかるように設定
- 攻撃者のブルートフォースを1秒/試行に制限
- 正規ユーザーは1秒待つだけ

Argon2(LUKSv2のデフォルト)

2015年のPassword Hashing Competitionの勝者:

Argon2の特徴:
- メモリハード: GPU/ASICでの並列攻撃に強い
- 時間とメモリを調整可能

Argon2のパラメータ:
- 時間コスト(t): イテレーション回数
- メモリコスト(m): 使用メモリ(KB)
- 並列度(p): スレッド数

例:
t=4, m=1048576(1GB), p=4
→ 4スレッドで1GBメモリを使用、4回イテレーション
→ 攻撃者も同等のメモリが必要

2.4.4 dm-cryptアーキテクチャ

dm-cryptとLUKSの関係

関係:
- dm-crypt: Linuxカーネルの暗号化ブロックデバイス層
- LUKS: dm-crypt上の標準的な鍵管理形式
- cryptsetup: dm-cryptとLUKSを操作するユーザー空間ツール

スタック:
┌──────────────────────────────────┐
│  cryptsetup(ユーザー空間ツール) │
├──────────────────────────────────┤
│  LUKS形式(メタデータ、鍵管理)  │
├──────────────────────────────────┤
│  dm-crypt(カーネル暗号化層)    │
├──────────────────────────────────┤
│  暗号化パーティション            │
└──────────────────────────────────┘

cryptsetupコマンド

# LUKSボリュームの作成
cryptsetup luksFormat /dev/sda5

# ボリュームのアンロック
cryptsetup luksOpen /dev/sda5 sda5_crypt

# ステータス確認
cryptsetup status sda5_crypt

# 鍵スロットの追加
cryptsetup luksAddKey /dev/sda5

# 鍵スロットの削除
cryptsetup luksRemoveKey /dev/sda5

# ヘッダ情報の表示
cryptsetup luksDump /dev/sda5

2.5 Born2berootへの理論の適用

2.5.1 パーティション構成の設計

Born2berootの要件を満たすパーティション設計:

推奨構成(30GB仮想ディスク):

┌─────────────────────────────────────────┐
│  /dev/sda1: /boot(500MB, ext4)       │ ← 非暗号化
├─────────────────────────────────────────┤
│  /dev/sda5: LUKS暗号化パーティション    │
│  ┌─────────────────────────────────────┐│
│  │  hostname42-vg(ボリュームグループ)││
│  │  ┌────────────────────────────────┐││
│  │  │  root-lv: /(10GB, ext4)     │││
│  │  ├────────────────────────────────┤││
│  │  │  home-lv: /home(5GB, ext4)  │││
│  │  ├────────────────────────────────┤││
│  │  │  var-lv: /var(5GB, ext4)    │││
│  │  ├────────────────────────────────┤││
│  │  │  tmp-lv: /tmp(3GB, ext4)    │││
│  │  ├────────────────────────────────┤││
│  │  │  swap-lv: swap(2GB)         │││
│  │  └────────────────────────────────┘││
│  └─────────────────────────────────────┘│
└─────────────────────────────────────────┘

デバイスパス:
/dev/sda1                         → /boot
/dev/mapper/hostname42--vg-root   → /
/dev/mapper/hostname42--vg-home   → /home
/dev/mapper/hostname42--vg-var    → /var
/dev/mapper/hostname42--vg-tmp    → /tmp
/dev/mapper/hostname42--vg-swap   → swap

2.5.2 Debianインストール手順

1. インストーラ起動

VirtualBox → 起動 → Install(テキストモード)を選択

2. 言語・地域・キーボード

Language: English
Country: Japan(または your location)
Keyboard: American English(42クラスタの場合)

3. ネットワーク設定

Hostname: [あなたの42ログイン]42
  例: tyamada42

Domain: (空欄)

4. ユーザー設定

Root password: [強力なパスワード]
  - 10文字以上
  - 大小文字、数字を含む
  - 連続文字3回以下

User full name: Your Name
Username: [あなたの42ログイン]
  例: tyamada

User password: [rootとは異なる強力なパスワード]

5. パーティション設定(最重要)

選択: "Guided - use entire disk and set up encrypted LVM"

ディスク: SCSI1 (sda)

スキーム: "Separate /home, /var, and /tmp partitions"

暗号化パスフレーズ: [記憶可能な強力なフレーズ]
  - 8文字以上推奨
  - ブート時に毎回入力

"Finish partitioning and write changes to disk" → Yes

6. パッケージ設定

Archive mirror: Japan → deb.debian.org
HTTP proxy: (空欄)
Popularity contest: No

Software selection:
  [ ] Debian desktop environment
  [*] SSH server
  [*] standard system utilities

7. GRUB

Install GRUB: Yes
Device: /dev/sda

2.5.3 インストール後の確認

# ブート後、暗号化パスフレーズを入力してログイン

# LVMの確認
$ sudo pvs
  PV         VG            Fmt  Attr PSize   PFree
  /dev/sda5  hostname42-vg lvm2 a--  <29.52g    0

$ sudo vgs
  VG            #PV #LV #SN Attr   VSize   VFree
  hostname42-vg   1   5   0 wz--n- <29.52g    0

$ sudo lvs
  LV     VG            Attr       LSize
  home   hostname42-vg -wi-ao----  5.00g
  root   hostname42-vg -wi-ao---- 10.00g
  swap_1 hostname42-vg -wi-ao----  2.00g
  tmp    hostname42-vg -wi-ao----  3.00g
  var    hostname42-vg -wi-ao----  5.00g

# パーティションとマウントの確認
$ lsblk
NAME                        MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINT
sda                           8:0    0   30G  0 disk
├─sda1                        8:1    0  500M  0 part  /boot
└─sda5                        8:5    0 29.5G  0 part
  └─sda5_crypt              254:0    0 29.5G  0 crypt
    ├─hostname42--vg-root   254:1    0   10G  0 lvm   /
    ├─hostname42--vg-home   254:2    0    5G  0 lvm   /home
    ├─hostname42--vg-var    254:3    0    5G  0 lvm   /var
    ├─hostname42--vg-tmp    254:4    0    3G  0 lvm   /tmp
    └─hostname42--vg-swap_1 254:5    0    2G  0 lvm   [SWAP]

# 暗号化の確認
$ sudo cryptsetup status sda5_crypt
/dev/mapper/sda5_crypt is active and is in use.
  type:    LUKS2
  cipher:  aes-xts-plain64
  keysize: 512 bits
  device:  /dev/sda5

2.5.4 スナップショットの作成

# クリーンインストール完了後、VMをシャットダウン
$ sudo shutdown -h now

# ホストマシンでスナップショット作成
$ VBoxManage snapshot "Born2beroot" take "Fresh Install" \
    --description "Debian with encrypted LVM installed"

2.6 チェックポイント

2.6.1 理論的理解の確認

以下の概念を説明できることを確認してください:

ストレージ理論

  • [ ] ブロックデバイスとキャラクタデバイスの違い
  • [ ] MBRとGPTの違い
  • [ ] FHSの主要ディレクトリ

ブートプロセス

  • [ ] BIOS/UEFIの役割
  • [ ] GRUBの機能
  • [ ] initramfsの目的

LVM

  • [ ] PV、VG、LVの関係
  • [ ] Device Mapperの役割
  • [ ] LVMの利点

暗号化

  • [ ] 対称鍵暗号の原理
  • [ ] LUKSの鍵管理
  • [ ] 鍵導出関数(PBKDF2/Argon2)の目的

2.6.2 実践的な確認

インストール完了

  • [ ] Debianが正常にインストールされた
  • [ ] 暗号化パスフレーズでブートできる
  • [ ] LVMパーティションが正しく構成されている
  • [ ] ホスト名が[ログイン名]42形式

まとめ

本章では、Born2berootのディスク構成の基盤となる理論を学びました:

ストレージ抽象化

  • UNIXの「Everything is a file」原則
  • ブロックデバイスとI/Oスタック
  • パーティショニング(MBR/GPT)

ブートプロセス

  • BIOS/UEFIファームウェア
  • GRUB ブートローダ
  • カーネルとinitramfs

LVM

  • 物理ボリューム→ボリュームグループ→論理ボリュームの三層構造
  • Device Mapperフレームワーク
  • 動的なボリューム管理

暗号化

  • AES-XTSによるディスク暗号化
  • LUKSの鍵管理とメタデータ
  • PBKDF2/Argon2による鍵導出

次章では、ユーザー・グループ管理とsudo設定について学びます。UNIXの権限モデルとアクセス制御の理論から始めます。