Linuxにおけるストレージ構造のおさらい
背景
長らくLinuxをしっかり触っていなかったので、思い出しも兼ねてナレッジ記事にする。
Linuxのストレージ構造について
Linuxのストレージは、大きく次のような階層になっている。
物理ディスク/仮想ディスク
↓
パーティション
↓
RAID・LVM・暗号化などのブロックデバイス管理
↓
ファイルシステム
↓
マウント
↓
ディレクトリツリー
以下、階層ごとの概要。
1. 物理ディスクまたは仮想ディスクがある
データを保存する物理ディスクまたは仮想ディスクが全ての土台。
- 物理ディスク:HDD、SSD、NVMe SSDなど実際の記憶装置
- 仮想ディスク:仮想マシンやクラウドサービス上で割り当てられる論理的なディスク
Linuxでは、これらはブロック単位(データの塊、最小512B)でデータを読み書きするブロックデバイスとして認識される。
/dev/sda
/dev/sdb
/dev/nvme0n1
2. ディスクをパーティションに分割する
1台のディスクは、内部をいくつかの領域に区切って利用できる。この区切られた領域をパーティションと呼ぶ。ディスク全体をそのままLVMやファイルシステムに割り当てる構成では、パーティションを作らないケースもある。
/dev/sda
├── /dev/sda1
├── /dev/sda2
└── /dev/sda3
パーティションにより以下のような用途ごとに領域を分けて管理できるようになる。
- OS領域
- データ領域
- スワップ領域
3. RAIDやLVMでブロックデバイスを管理する
パーティションやディスクに対して、必要に応じてRAIDやLVMを構成する。
RAID
複数のディスクを組み合わせて冗長性・性能・容量を向上させる仕組みを指す。代表的な構成は次のとおり:
- RAID 0:データを分散して性能を上げるが、冗長性はない
- RAID 1:同じデータを複数のディスクに書き込む
- RAID 5・6:パリティを使って障害に備える
- RAID 10:RAID 1とRAID 0を組み合わせる
LinuxでソフトウェアRAIDを組む場合は、mdadmで管理を行うことがほとんど。
LVM(Logical Volume Manager)
ディスク領域を論理的かつ柔軟に扱うための仕組みで、複数のディスクやパーティションをまとめ、その中から用途ごとに論理ボリュームを切り出す。
PV(Physical Volume)
↓
VG(Volume Group)
↓
LV(Logical Volume)
- PV:LVMで扱う物理ディスクまたはパーティション
- VG:複数のPVをまとめたストレージ領域
- LV:VGから切り出した論理的なボリューム
LVMにはボリュームの拡張・縮小やスナップショットといった機能もあるが、LVM自体はデータの冗長化を行うものではないため、冗長性はRAID側で実現する。
代表的な構成は次のとおり:
複数のディスク
↓
RAID
↓
LVM
↓
論理ボリューム
4. ファイルシステムを作成する
パーティショニング、論理vol化した後にファイルシステムを作成する。ストレージ上でファイルやディレクトリをどう保存・管理するかを定める仕組みで代表的なものは次のとおり:
- ext4:Linuxで広く使われている汎用的なファイルシステム
- XFS:大容量ファイルや並列アクセスに強いファイルシステム
- Btrfs:スナップショットやチェックサムなどを備えたファイルシステム
論理ボリュームにXFSを作成する場合は、次のように実行:
mkfs.xfs /dev/vg01/lv_data
この時点ではファイルシステムが作成されただけで、まだ通常のディレクトリからアクセスできる状態にはなってないので、次のマウントを実行する必要がある。
5. ファイルシステムをマウントする
作成したファイルシステムをLinuxのディレクトリツリーに接続する操作をマウントと呼び、接続先のディレクトリをマウントポイントと呼ぶ。
mount /dev/vg01/lv_data /data
この例では、/dev/vg01/lv_data上のファイルシステムを/dataディレクトリに接続している。
論理ボリューム
/dev/vg01/lv_data
↓ マウント
マウントポイント
/data
マウント後は、/data配下に保存したファイルが、対応する論理ボリュームに記録されるようになる。再起動後も自動的にマウントさせたい場合は、/etc/fstabに設定を記述しておくのが一般的である。
学んだこと
ここまでの流れをまとめると、Linuxのストレージ構造は次のとおり:
- 物理ディスクまたは仮想ディスクを、OSがブロックデバイスとして認識する
- 必要に応じてディスクをパーティションに分割する
- RAIDで冗長性や性能を確保する
- LVMでストレージ領域を柔軟に分割・管理する
- 使用する領域にファイルシステムを作成する
- ファイルシステムをマウントポイントに接続する
- Linuxのディレクトリツリーからファイルを読み書きする
代表的な構成例は次のとおり:
物理ディスク
├── /dev/sda
└── /dev/sdb
↓
mdadmによるRAID 1
/dev/md0
↓
LVMのPV
↓
VG
vg01
↓
LV
/dev/vg01/lv_data
↓
XFSファイルシステム
↓
/dataへマウント
パーティション・RAID・LVMは、いずれも「ファイルシステムを作る前段階で、ブロックデバイスの領域をどう構成・管理するか」に関わる仕組みという整理になる。
次の課題
- TODO: RAIDとLVMを組み合わせた実機/検証環境での構築手順を確認する
- TODO: 暗号化(LUKSなど)を挟んだ場合の階層を整理する
