ブロックデバイス
from デバイスファイル
$ ls -lの最初文字がb
単なるファイルの読み書き以外に、ランダムアクセスができる
ストレージの所定の位置の所定のデータにアクセスできる
例えば
HDD
SSD
Claude Code.icon
データを固定サイズのブロック単位(通常512バイトまたは4096バイト)で読み書きするデバイス。カーネルのバッファキャッシュ/ページキャッシュを経由し、ランダムアクセスが可能。
基本的な特徴
ブロック単位のI/O: 1バイトだけ読みたくても、最低1ブロック分をカーネルが読む
ページキャッシュ経由: 読み書きはカーネルのメモリキャッシュを通る
ランダムアクセス: 任意の位置を lseek で指定して読み書きできる
I/Oスケジューリング: カーネルがリクエストを並べ替え・結合して効率化する
代表的なブロックデバイス
/dev/sda, /dev/sdb
SATA/SCSIディスク全体
/dev/sda1, /dev/sda2
パーティション
/dev/nvme0n1
NVMe SSD
/dev/nvme0n1p1
NVMe SSDのパーティション
/dev/vda
仮想マシンのvirtioディスク
/dev/loop0
ループバックデバイス(ファイルをブロックデバイスとして扱う)
/dev/md0
ソフトウェアRAID
/dev/dm-0
Device Mapper(LVM, 暗号化等)
カーネル内部のデータパス
code:_
ユーザー空間: read(fd, buf, 4096)
↓ システムコール
VFS (Virtual File System)
↓
ファイルシステム (ext4, XFS等): 論理アドレス → ブロック番号に変換
↓
ページキャッシュ: キャッシュにあればここで返す (キャッシュヒット)
↓ キャッシュミス
ブロックレイヤー (Block Layer): bioリクエスト生成
↓
I/Oスケジューラ: リクエストの並べ替え・マージ
↓
デバイスドライバ: ハードウェア固有の処理
↓
ハードウェア (ディスク/SSD)
キャラクタデバイスとの決定的な違いは、ページキャッシュとI/Oスケジューラを経由する点。
ページキャッシュの役割
カーネルは読み込んだブロックをメモリに保持する:
読み込み: 同じブロックの再読み込みを回避(キャッシュヒット)
書き込み: すぐにディスクに書かず、メモリ上で「dirty」としてマークし、後でまとめて書き出す(ライトバック)
sync や fsync で明示的にディスクに書き出させることも可能
code:bash
# キャッシュの状態を確認
free -h # buffersとcacheの欄
cat /proc/meminfo | grep -i dirty # 書き出し待ちのデータ量
I/Oスケジューラ
複数のI/Oリクエストを効率よくディスクに発行するための仕組み:
table:_
スケジューラ 特徴
none そのまま発行。NVMe SSDなど内部キューを持つデバイス向き
mq-deadline レイテンシ保証。リクエストごとにデッドラインを設定
bfq (Budget Fair Queueing) 対話的な体感を重視。デスクトップ向き
kyber 軽量で高速SSD向き
code:bash
# 現在のスケジューラを確認
cat /sys/block/sda/queue/scheduler
# mq-deadline kyber bfq none
HDDではシーク最適化のためスケジューラが重要だが、SSD/NVMeではランダムアクセスのペナルティがほぼないため none や kyber が適する。
ブロックサイズの階層
ブロックサイズは文脈によって異なる:
table:_
レイヤー 典型的なサイズ 意味
物理セクタサイズ 512B or 4096B (4Kn) ハードウェアが扱う最小単位
論理セクタサイズ 512B カーネルがデバイスに発行する最小単位
ファイルシステムブロック 4096B ext4等がアロケートする単位
ページサイズ 4096B カーネルのメモリ管理単位
ループバックデバイス — ファイルをブロックデバイスにする
通常のファイルをブロックデバイスとして扱える仕組み:
code:bash
# ISOイメージをマウント
losetup /dev/loop0 disk.iso
mount /dev/loop0 /mnt
# または一発で
mount -o loop disk.iso /mnt
ディスクイメージのテストやコンテナ技術の内部で多用される。
Device Mapper — ブロックデバイスの合成
LinuxのDevice Mapperは、ブロックデバイスを変換・合成するフレームワーク:
code:_
物理デバイス → Device Mapper → 仮想ブロックデバイス (/dev/dm-*)
LVM: 複数ディスクを論理ボリュームとして統合
dm-crypt (LUKS): ブロックレベル暗号化
dm-thin: シンプロビジョニング
dm-cache: SSDをHDDのキャッシュとして使う
これらは全て「ブロックデバイスを受け取り、変換して、別のブロックデバイスとして公開する」という共通パターン。
まとめ
ブロックデバイスの本質は「カーネルのページキャッシュとI/Oスケジューラを経由してブロック単位でアクセスする」という点。この中間層があることで、キャッシュによる高速化、I/Oの最適化、ファイルシステムの構築、Device Mapperによる合成といった豊かなエコシステムが成立している。
/mrsekut-book-477419607X/228