第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の権限モデルとアクセス制御の理論から始めます。