はじめに
フラッシュストレージ(SSD/NVMe)の不要セクタをコントローラへ一括通知し、素早く初期状態へと戻す強力なLinux標準コマンドがblkdiscardです。本ガイドでは、実ドライブへの誤操作リスクを完全に排除するため、ループバックデバイスを用いた安全な検証環境を構築しながら、主要オプションの挙動や内部メカニズムを順を追って解説します。ストレージの再セットアップやスループット回復に役立つ実践ノウハウを身につけましょう。
1. ドライブ側のTRIM対応状況とブロック情報の事前確認
SSDに対して消去コマンドを発行する前に、まず該当デバイスがTRIM(discard機能)を受け付ける設計になっているか、パラメータ構成を精査します。以下の通りlsblk --discard -o NAME,DISC-ALN,DISC-GRAN,DISC-MAX,DISC-ZERO,MOUNTPOINTSを実行してください。
結果テーブル内のDISC-GRAN(破棄粒度)およびDISC-MAX(最大破棄サイズ)に非ゼロの値(例: 512Bや2Tなど)が返ってくれば、対象ストレージ(nvme0n1など)がTRIMリクエストを正常に処理できる状態であることを示しています。

2. 実機破壊を防ぐ仮想ループバックブロックデバイスの立ち上げ
本番環境のディスクを保護しつつ実験を進めるため、64MBのコンテナファイルを生成し、あらかじめランダムなバイト列を流し込みます。ターミナルでdd if=/dev/urandom of=/tmp/test_disk.img bs=1M count=64 status=noneを実行しましょう。

作成した単一イメージファイルをOSのブロックデバイス層に認識させるため、空いているループバックノードへ割り当てます。これにはsudo losetup -fP /tmp/test_disk.imgを使用します。

後続のオペレーションをスムーズに行えるよう、紐づけられたデバイスパスを変数へ自動抽出すべく、LOOP_DEV=$(losetup -j /tmp/test_disk.img | cut -d: -f1)を実行します。

変数$LOOP_DEVにセットされたパスを標準出力で確認するために、echo "생성된 디바이스: $LOOP_DEV"を実行します。
画面上に/dev/loop0等のノード名が表示されていれば、準備は問題ありません。

消去処理前のダンプとして、先頭128バイトに乱数データが確かに書き込まれているかをsudo hexdump -C -n 128 $LOOP_DEVで検証します。
00で埋まっておらず、不規則な16進数値が並んでいることが確認できます。

3. blkdiscardによる全セクタ一括破棄の実践
テスト対象のループバックデバイス情報を確実に参照するため、改めてLOOP_DEV=$(losetup -j /tmp/test_disk.img | cut -d: -f1)を実行してパスを保持します。

対象デバイスの全領域に向けてブロック解放リクエストを送信し、進行ログを追跡するためsudo blkdiscard -v $LOOP_DEVを実行します。
オフセット0からデバイス末尾に至る67,108,864バイト(64MB)の空間全体が破棄対象として処理された旨が表示されます。

ブロック破棄完了後、データが初期化されたか調べるためsudo hexdump -C -n 128 $LOOP_DEVを再度実行します。
先ほどまで存在したランダムデータが消え去り、空データ(ゼロクリア)または出力なしの状態へリセットされたことが確認できます。

4. オフセットと長さを指定した局所的ディスカード(-o, -l)
範囲指定消去のテストに移るため、作業用変数へデバイスパスを再度代入するLOOP_DEV=$(losetup -j /tmp/test_disk.img | cut -d: -f1)を実行します。

部分的な破棄動作を観測できるように、先頭エリアへ目印となる文字列を書き込んでおきます。echo "TESTDATA_RELOAD" | sudo dd of=$LOOP_DEV bs=1M count=10 status=noneを実行してください。

開始位置と範囲を絞り込み、先頭(オフセット0)から10MBのレンジのみを解放するためにsudo blkdiscard -v -o 0 -l 10M $LOOP_DEVを実行します。
コンソール出力から、指定した10,485,760バイト(10MB)分だけがピンポイントでディスカードされたことが把握できます。

狙った先頭領域がクリアされたか確かめるべく、先頭64バイトをsudo hexdump -C -n 64 $LOOP_DEVで読み出します。
直前に書き込んだシグネチャが綺麗に破棄されていることが分かります。

5. テスト用リソースの解放と運用上の留意点
すべての検証を終えたら、環境の後片付けを行います。まず紐づいているループノード名を取得するためLOOP_DEV=$(losetup -j /tmp/test_disk.img | cut -d: -f1)を実行します。

カーネルのブロック層から仮想ループバックデバイスを切り離すため、sudo losetup -d $LOOP_DEVを実行します。

不要となったディスクイメージファイルをホストから破棄し、ストレージ容量を元に戻すためにrm -f /tmp/test_disk.imgを実行します。

残留している仮想デバイスが存在しないことを確かめるため、losetup -aを実行して登録一覧をチェックします。
コマンドが何も返さなければ、作業環境のリソースは正常に完全破棄されています。

今回はUbuntu環境において、blkdiscardを活用してSSDの不要ブロックを迅速かつ根本から消去・初期化するテクニックを紹介しました。
本コマンドで discard されたセクタは一般的な手段ではデータ復旧が極めて困難になりますので、実機に適用する際は対象デバイスノードに誤りがないか細心の注意を払って運用してください。