廃棄予定のノート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番目のセクタ)が表示されます。