恥は/dev/nullへ by 初心者

~ PC初心者による右往左往の記録 ~

廃棄する前にHDDのデータを上書きする

廃棄予定のノートPCが2台あるので、これらのPCに残っているデータを消去することにしました。いずれも(SSDではなく)HDD搭載マシンですから、ゼロでデータを上書きすれば問題ありません。

データをゼロで上書きするだけなら、それに特化したソフトもあります。しかし、作業後に適切にゼロ埋めされているのか確認したいので、SystemRescueというLinux環境を使うことにしました。

念のため再度書きますが、この記事はHDDのデータを消去することに関するものです(SSDのデータを消去する場合は別の方法が必要になります)。

この記事の内容

SystemRescueというLinux環境をUSBメモリから起動して、ノートPCのHDDに保存されているデータを(ゼロで上書きすることによって)消去する。

1. SystemRescueのダウンロード

公式サイト(https://www.system-rescue.org/Download/)から以下のファイルをダウンロードします。

・systemrescue-XX.XX-amd64.iso (本体)
・systemrescue-XX.XX-amd64.iso.sha256 (チェックサム確認用)
・systemrescue-XX.XX-amd64.iso.asc (GnuPG署名確認用)


ついでに、GnuPG用の公開鍵もダウンロードしておきます。
https://www.system-rescue.org/security/signing-keys/gnupg-pubkey-fdupoux-20210704-v001.pem

ダウンロードしたファイル(計4つ)は同一のフォルダにまとめておきます。

次に、SHA256チェックサムを確認します。
PowerShellを起動し、4ファイルがあるフォルダで以下を実行します。

Get-FileHash systemrescue-XX.XX-amd64.iso -Algorithm SHA256

画面に出力されたハッシュ値と .sha256ファイルに記述されているハッシュ値が一致していればOKです。

次は、GnuPG署名の確認です。
PowerShellを起動し、4ファイルがあるフォルダで以下を実行します。

(1)公開鍵をインポート

gpg --import gnupg-pubkey-fdupoux-20210704-v001.pem


(2)インポート確認

gpg --list-keys

一覧に「Francois Dupoux 20210704」が表示されていることを確認します。

(3)署名確認

gpg --verify systemrescue-XX.XX-amd64.iso.asc systemrescue-XX.XX-amd64.iso

出力されたメッセージに「正しい署名」とあればOKです。
ちなみに、「警告: この鍵は信用できる署名で証明されていません」は無視してよいです。

2. USBメモリへSystemRescueを書き込む(Rufusを使用)

https://rufus.ie/ からRufusの最新版をダウンロードします。

SystemRescueを書き込むUSBメモリをPCに挿して、Rufusを起動します。
Rufusの設定内容は以下のとおりです。

・デバイス           :対象のUSBメモリを選択
・ブートの種類        :「選択」ボタンからSystemRescueのisoファイルを指定
・パーティション構成  :MBR ←isoを選択すると自動設定されます
・ターゲットシステム  :BIOS または UEFI ←自動設定されます
・ボリュームラベル    :RESCUE1300 ←自動設定されます
・ファイルシステム    :FAT32
・クイックフォーマット:チェックあり
・不良ブロックを検出  :チェックなし

(1)「スタート」をクリックします。
(2)書き込みモードの選択画面で「ISOイメージモードで書き込む」を選択
(3)Syslinuxファイルのダウンロード確認画面で「はい」を選択(→ インターネットから2つのファイルが自動ダウンロードされます)

3. 消去対象PCのBIOS設定

データを消去するPCのBIOS画面を起動して、「USBレガシー機能」を有効にします。この機能が有効になっていないとUSBメモリからブートできない機種があるようです。

次に、起動順序を設定する画面で、内臓HDDよりもUSB Memoryが優先的に起動されるようにしておきます。

最後に、変更した内容を保存してBIOS画面を終了します。

4. SystemRescueの起動

HDDのデータを消去するPCにSystemRescueが入ったUSBメモリを挿し、電源を入れます。起動メニューが表示されたら「Boot SystemRescue using default options」を選んでEnter押下。

無事に起動すると、[root@sysrescue ~]# というプロンプトが表示されます。

5. 消去対象PCのデバイスを確認する

最初に次のコマンドを実行します。

lsblk

たとえば、以下のように表示されます(あくまでも例です)。

NAME   MAJ:MIN RM    SIZE RO TYPE MOUNTPOINTS
sda      8:0    0  931.5G  0 disk   ← 消去対象のHDD
sdb      8:16   1   28.5G  0 disk   ← SystemRescue入りUSBメモリ

SIZE列に表示された容量から、sdaがHDDで、sdbがUSBメモリだと分かります。

6. HDDのデータをゼロで上書きする

消去するHDDが/dev/sdaなら、次のコマンドを実行します。

dd if=/dev/zero of=/dev/sda bs=4M status=progress conv=fsync


オプションの内容は次のとおりです。

if=/dev/zero   :入力元。0を無限に返す仮想デバイス
of=/dev/sda    :出力先。消去対象のHDD
bs=4M          :ブロックサイズ。1度に4MB分の0データを書き込む
status=progress:進捗をリアルタイム表示
conv=fsync     :最後にバッファの残りを確実にHDDに書き出してから終了する


書き込みが完了した時の出力例

dd: error writing '/dev/sda': No space left on device
1000204886016 bytes (1.0 TB, 932 GiB) copied, 11281.4 s, 88.7 MB/s

1行目の末尾にある「No space left on device」はエラーではなく、HDDの末尾まで書き込んだことを示すメッセージです。

今回は約1TBのHDDで、3時間くらいかかりました。

7. 論理セクタのサイズと総セクタ数を確認する

fdisk -l /dev/sda | grep -E "sectors|Sector"

を実行して、たとえば、以下のように表示されたとします。

Disk /dev/sda: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes


総セクタ数と論理セクタのサイズを見ておきます。

総セクタ数        :上記の例では 1953525168
論理セクタのサイズ:Units行の「= の後の値」または Sector size行の「logicalの値」
                    上記の例では 512 バイト


ddコマンドは「論理セクタ」単位で動作するので、物理セクタの数ではなく、論理セクタの数をチェックします。

8. ゼロ埋めの確認(5か所をサンプル調査)

今回はHDDの5か所を調べて、ゼロ埋めできているかチェックしました。
以下は「調査対象のHDDが/dev/sda」「論理セクタ1つのサイズ = 512バイト、総セクタ数 = 1953525168」の場合です。

先頭部分
   dd if=/dev/sda bs=512 count=1 | xxd

25%付近(総セクタ数 × 0.25)
   dd if=/dev/sda bs=512 skip=488381292 count=1 | xxd

50%付近(総セクタ数 × 0.5)
   dd if=/dev/sda bs=512 skip=976762584 count=1 | xxd

75%付近(総セクタ数 × 0.75)
   dd if=/dev/sda bs=512 skip=1465143876 count=1 | xxd

末尾(総セクタ数 - 1)
   dd if=/dev/sda bs=512 skip=1953525167 count=1 | xxd


ゼロ埋めできている部分は次のように表示されます。

00000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
(次行以降も全て0000と . が続く)


ゼロ埋めできておらずデータが残っている場合は 0000以外の文字や、. 以外の文字が表示されます。

00000000: 4d5a 9000 0300 0000 0400 0000 ffff 0000  MZ..............
(0000以外の値や、右端に . 以外の文字が表示される)


9. 作業完了・電源オフ

ゼロ埋めできていることが確認できたら、次のコマンドを実行してSystemRescueを終了します。

poweroff


10. データの上書き回数と中身の確認

古いHDD(90年代のHDDなど)では、1回の上書き(今回の例でいえば、ゼロで埋めること)でデータを確実に消去できなかったため、3回上書きする等の手段が取られていました。しかし、新しいHDD(今回消去したのは2011年に製造されたPCのHDD)の場合、1回の上書きで十分という記事を読みました。とはいえ、「それで本当に大丈夫?」という気持ちもありました。

そこで、上書き作業をした後にHDDの中身をチェックしました。今回は、HDDの「先頭、25%付近、50%付近、75%付近、末尾」のデータがゼロだけになっているかを(ddコマンドとxxdコマンドで)見ました。上書き回数が1回でも、HDDの中身がゼロ埋めされていることを確認できれば安心できます。

基礎知識

(1)セクタ番号は 0 で始まります。

仮にセクタ数が全部で10個の場合、0セクタから9セクタまでが存在します(つまり、開始セクタは0セクタで最終セクタは第9セクタ)。

(2)skipの計算に使うのは(物理セクタではなく)論理セクタのサイズ
(3)skipに指定するのは、スキップする「セクタの個数」

仮に、fdiskで調べた論理セクタのサイズが512バイトで、/dev/sdaのセクタ数が全部で10個の場合、次のようにすれば最後のセクタの内容を表示できます(もちろん、セクタ数が10ということは通常ありえません。あくまでも例です)。

dd if=/dev/sda bs=512 skip=9 count=1 | xxd


ここでは「bs * skip = 512 * 9」で、9セクタ分のバイト数をスキップして、最終セクタを読み込んでいます。

言い換えると、「0セクタから8セクタまでの、9個のセクタ」に相当するバイト数がスキップされるので、最後のセクタ(10番目のセクタ)が表示されます。