Ubuntuで不良セクタを検出・診断!badblocksコマンド徹底解説

概要

ストレージ障害による深刻なデータ消失を未然に防ぐには、定期的な物理メディアの健全性チェックが欠かせません。本記事では、Linux環境で不良セクタ(バッドセクタ)を的確に洗い出す標準ツール「badblocks」の実践的な活用法を解説します。実機ストレージを危険に晒さない仮想ループバックデバイスの構築手順から、安全なリードオンリー検査、リアルタイム進捗モニタリング、ログファイル保存、そして既存データを保護したまま行える非破壊読み書きテストまで、必須オプションを体系的にマスターしていきましょう。

1. テスト環境のセットアップと基本的な読み取り検証 (-v)

badblocks ユーティリティが同梱されている e2fsprogs パッケージを最新状態へ導入するため、sudo apt-get update -qq && sudo apt-get install -y e2fsprogs を実行します。

e2fsprogsパッケージのインストール

稼働中の実ディスクを誤って操作するリスクを避けるため、テスト専用のダミーディスクとして50MBの仮想ディスクイメージを dd if=/dev/zero of=/tmp/disk_test.img bs=1M count=50 status=none コマンドで作成します。

テスト用仮想ディスクイメージの生成

用意したディスクイメージを通常のブロックストレージと同様にシステムへ認識させるため、空いているループバックデバイスへ sudo losetup -f /tmp/disk_test.img で割り当てます。

ループバックデバイスの割り当て

マッピングされたデバイスファイル名をシェル変数に格納し、正常に関連付けられたか確認するために LOOP_DEV=$(losetup -j /tmp/disk_test.img | cut -d: -f1) && echo "테스트 디바이스: $LOOP_DEV" を実行します。

割り当てデバイス名の取得と確認

badblocks は、対象ドライブの各セクタを走査して物理的な読み書きエラーが発生している破損ブロックを特定するユーティリティです。
既存のデータ構造を破壊しないデフォルトの読み取り専用モードに、詳細な検証経過を表示する -v オプションを付与してスキャンを実施します。
検査終了時にエラーとなったブロック番号が一覧に表示されなければ、対象デバイスは正常と判断できます。
⚙️ [主要オプション一覧]

-v : スキャンの経過状況や検出結果に関する詳細メッセージをコンソールに出力します。
-w : 専用のテストパターンデータを直接書き込んでから読み取る破壊的テストを実行します(既存データは全消去されます)。
-n : 格納されているデータを一時退避させつつテストパターンを書き込み、再度復元する非破壊リード/ライトテストを実施します。
-s : スキャンの進捗率(%)と処理済みブロック数をリアルタイムで画面上に更新表示します。
-b : 走査するブロックサイズをバイト単位で明示的に指定します(省略時の初期値は1024バイト)。
-o : 発見された不良ブロックの番号リストを標準出力ではなく、指定したテキストファイルへ保存します。
-p : 指定したラウンド数だけ同一スキャンを反復実行し、突発的・間欠的に現れる潜在エラーまで確実に炙り出します。

読み取り専用モードでの基本スキャン実行

2. リアルタイム進捗のモニタリング (-s, -v)

大容量ディスクの診断では処理に長時間を要するため、現在の進行度合いをパーセンテージで把握できる -s と詳細出力 -v を併用した sudo badblocks -s -v $LOOP_DEV を実行します。
-s は処理済みのブロック数と全体の完了度合(%)を動的に更新し、-v はフェーズごとの動作ログを余すところなく報告してくれます。
診断完了時に不良ブロックを示す数値が何も出力されなければ、対象ストレージの読み込み耐性に問題がないことが確認できます。

進捗率と詳細ログを表示しながらの検査

3. ファイルシステムに合わせたブロック長指定とレポート出力 (-b, -o)

最近のLinuxファイルシステムで広く採用されている標準クラスタサイズ(4096バイト)に検査単位を合わせ、見つかった問題箇所をファイルへ書き出すために LOOP_DEV=$(losetup -j /tmp/disk_test.img | cut -d: -f1) && sudo badblocks -b 4096 -v -o /tmp/badblocks_report.txt $LOOP_DEV を実行します。
-b 4096 を指定することで、ファイルシステムの論理ブロック境界に一致した効率的かつ正確なセクタスキャンが可能になります。
-o オプションを使えば不良ブロックの一覧がファイルとして保持されるため、後から fsck や e2fsck に引き渡して該当箇所を使用禁止ブロックとして登録(マーキング)する修復フローへスムーズに繋げられます。

4096バイト単位でのスキャンとログ保存

出力された診断レポートの中身を確かめるため、cat /tmp/badblocks_report.txt を実行します。
物理的な欠陥が存在しない健全なドライブの場合、記録対象となる障害ブロックが存在しないためファイルサイズはゼロバイト(空行)のまま出力されます。

レポートファイルの内容確認

4. 既存データを保護する非破壊読み書きテストと環境クリーンアップ (-n)

単なるリードテストでは発見しにくいセクタの書き込み不良を炙り出すため、既存データを温存しながら書き込み耐性も検証できる -n オプションを加え、LOOP_DEV=$(losetup -j /tmp/disk_test.img | cut -d: -f1) && sudo badblocks -n -v $LOOP_DEV を実行します。
-n モードは、ブロック内のデータをメモリ上に一時キャッシュした上でテストパターンを書き込み、整合性を検証した直後に元のビット列へ書き戻す仕組みを採用しているため、安全性を保ったまま高精度な双方向テストが行えます。
テスト完了後に不良ブロック番号が報告されなければ、ドライブの読み取り・書き込みの両面において健全性が保たれていると判断できます。

非破壊読み書きモードによる詳細検証

検証が完了したら、システムのリソースを浪費しないようループバックデバイスの割り当てを解除し、作成した仮想ディスクと一時ファイルを LOOP_DEV=$(losetup -j /tmp/disk_test.img | cut -d: -f1) && sudo losetup -d $LOOP_DEV && rm -f /tmp/disk_test.img /tmp/badblocks_report.txt でクリーンアップします。

ループデバイスのデタッチとテストファイルの削除

今回はUbuntu環境をベースに、badblocks コマンドを使ったディスク診断の代表的なフラグと安全な検証手順を整理しました。
ディスク障害はある日突然訪れるため、システム運用時の定期点検や怪しい挙動を感じた際の初期診断ツールとしてぜひ活用してみてください。