はじめに
Linux環境でストレージ層の挙動をきめ細かく制御・診断するにあたり、中核となるユーティリティが blockdev です。物理・論理ストレージのジオメトリ情報収集、誤操作を防ぐライトプロテクト化、シーケンシャルリード性能を引き上げるRead-aheadバッファの最適化など、インフラ運用で即戦力となる実用テクニックをステップバイステップで解説します。
実験用ループバックデバイスの構築と基本パラメータの把握
実稼働中のストレージを危険に晒すことなく安全に挙動を確かめるため、まずは fallocate -l 100M /tmp/test_disk.img を実行して100MBのディスクイメージ領域を切り出します。

用意したイメージファイルをカーネルが通常のブロックストレージとして扱えるよう、sudo losetup -fP /tmp/test_disk.img で空いているループバックインターフェースへアタッチします。

後続の操作や自動化スクリプトでの再利用性を高めるため、LOOP_DEV=$(losetup -j /tmp/test_disk.img | cut -d: -f1) を使って割り当てられたデバイス名を環境変数へ格納しておきます。

blockdev はブロックデバイスドライバに対する低水準なI/O制御(ioctl)の発行やパラメータ操作を担うコマンドです。sudo blockdev --report ${LOOP_DEV} を実行すると、読み取り専用フラグ(RO)、先行読み込みセクタ長(RA)、セクタサイズ(SSZ)、ブロックサイズ(BSZ)、総バイト数(Size)などの主要スペックが一目で俯瞰できます。
⚙️ [主要オプション一覧]
--report : 対象デバイスの構成パラメータ(RO、RA、SSZ、BSZ、StartSec、Size)を表形式で一覧表示します。--getro : デバイスのライトプロテクト状態を判定します(1=読み取り専用、0=読み書き可能)。--setro : 指定したデバイスを読み取り専用(Read-Only)モードに固定します。--setrw : 読み取り専用設定を解除し、書き込み可能な状態へ復帰させます。--getra : カーネルが事前読み出しを行うRead-Aheadセクタ数を照会します。--setra [セクタ数] : 先行読み込みバッファサイズを調整し、シーケンシャルI/Oの効率を高めます。--getss : システムおよびファイルシステムが認識する論理セクタサイズ(Logical Sector Size)をバイト単位で取得します。--getbsz : デバイスに設定されているブロックサイズ(Block Size)をバイト単位で出力します。--getsize64 : デバイス全体の物理ストレージ容量を正確なバイト数で返します。--flushbufs : バッファキャッシュ内のダーティページを強制的にディスクへ書き込み同期します。

容量・セクタサイズ・ブロック長の詳細確認
一連の確認作業をスムーズに進められるよう、LOOP_DEV=$(losetup -j /tmp/test_disk.img | cut -d: -f1) で対象ターゲットのデバイス名をシェル変数へ再バインドします。

sudo blockdev --getsize64 ${LOOP_DEV} を実行すると、ストレージ領域の総容量がバイト精度で返されます。
標準出力に得られる 104857600 バイトは、あらかじめ確保した100MBの容量と完全に整合していることが確認できます。

続いて sudo blockdev --getss ${LOOP_DEV} により、OSがデータ転送を行う最小論理単位(Logical Sector Size)を照会します。
出力された 512 は、伝統的なレガシー互換の512バイトセクタ構成でエミュレートされている状態を示しています。

さらに sudo blockdev --getpbsz ${LOOP_DEV} を実行して、下位ハードウェアの物理セクタサイズ(Physical Sector Size)を調べます。
結果値 512 は物理セクタ長が論理値と一致していることを意味し、いわゆるアライメントズレ(4Kセクタと512Bエミュレーションの不整合)によるI/Oペナルティが生じない構造であることがわかります。

読み取り専用(Read-Only)属性の切り替えと保護検証
モード切替のテストを行う準備として、念のため LOOP_DEV=$(losetup -j /tmp/test_disk.img | cut -d: -f1) を再実行して操作対象を確実に指定します。

誤った破壊的操作や意図しない変更からデータを厳格に守りたい場面では、sudo blockdev --setro ${LOOP_DEV} を発行してデバイスをRead-Only状態へとロックします。

設定がカーネルレイヤで反映されたかを検証すべく、sudo blockdev --getro ${LOOP_DEV} でプロテクト状況を読み取ります。
フラグとして 1 が返ってくれば、対象ディスクに対する書き込み制限が正常にアクティブ化されています。

メンテナンスや追記処理を再開する場合は、sudo blockdev --setrw ${LOOP_DEV} を投入して通常の読み書き可能(Read-Write)ステータスへと戻します。

再び sudo blockdev --getro ${LOOP_DEV} を実行して動作ステータスをチェックします。
値が 0 へ遷移していれば、書き込みロックが解除されて平常運用状態へ復帰したことを意味します。

Read-ahead設定によるI/Oチューニングと検証環境のクリーンアップ
仕上げとして、I/Oキャッシュの調整に移ります。LOOP_DEV=$(losetup -j /tmp/test_disk.img | cut -d: -f1) で対象デバイスの特定を維持します。

現状の先読みバッファ規模を把握するため、sudo blockdev --getra ${LOOP_DEV} を投入します。
戻り値 256 は、カーネルが連続アクセスを検知した際に256セクタ(512バイト換算で約128KB)分のデータを投機的にページキャッシュへ先回りロードする設定であることを示します。

巨大なログ解析やメディア配信など、大容量シーケンシャルリードのスループット向上が求められるワークロードを想定し、sudo blockdev --setra 1024 ${LOOP_DEV} で先読み量を1024セクタ(約512KB)へと引き上げます。

チューニング値が期待通り保持されているかを sudo blockdev --getra ${LOOP_DEV} で確認します。
ターミナルに 1024 が表示されれば、バッファサイズの拡張が意図通り完了しています。

すべての検証を終えたら、sudo losetup -d ${LOOP_DEV} && rm -f /tmp/test_disk.img を実行してループバック割り当ての解除とディスクイメージの破棄を行い、システムリソースを綺麗に後片付けします。

以上、blockdev コマンドを駆使した低レイヤ情報の抽出からI/Oパフォーマンスの調整手法までを解説しました。
ブロックデバイスへのパラメータ変更はシステム全体の入出力挙動にダイレクトな影響を与えるため、ステージング環境で事前にベンチマークと動作検証を重ねた上で実践に役立ててください。