フリーツールでハードディスクを完全消去
個人情報の漏洩がさまざまな事件につながる今、パソコンの廃棄にも気を配らないといけないようになりました。
古いPCを回収してもらおうとすると、家電量販店や処分業者はハードディスクの消去をするように要求してきます。熱心な担当者なら有料のディスク消去プランなども紹介してきたりします。
ハードディスクから住所録やパスワードのメモ書き、クレジットカード番号、個人情報を抜き取られる可能性を考え、ディスクは消去しておくのがいいと思います。
最近のマルウェア対策ツールなどにはディスク消去ツールがついていたりするのですが、廃棄のためにわざわざソフトを買うという気にもなかなかなれないと思います。
そこで、ここではCDやDVD、USBメモリにフリーのOS(Linux)をインストールし、そこから起動したOSでディスクの完全消去をします。そうすることでPCのカバーを開けることなくディスクの完全消去ができます。またハードディスクは壊れていないけれどWindowsが正常に起動しないという場合でも対応可能です。
SSDディスクやUSBメモリの完全消去を検討している方はATA の Secure Erase機能の記事で紹介している方法をとった方がいいと思いますので、合わせて参考にしていただけると幸いです。
Linuxの作成
通常Linuxを利用する際はハードディスクにインストールして利用することが多いと思います。そのため検索して最初に出てくる項目は、インストール用のデータ(ディスクイメージ)だと思います。
それとは別にLive CDと言われたりする、CDやDVDから直接起動できるディスクイメージもあります。調べればもっと多くのツールがあると思いますが、ここでは次のものを紹介します。
- Debian Liveを利用する
直接OSのイメージをコピーするのがLive版です。DVDの書き込み環境があり、なおかつ削除対象のハードディスクがついたPCがDVDからの起動ができれば、この方法が利用できます。
また同じ内容をUSBメモリに書き込むこともできます。
Debian:「Live インストールイメージ」から自分の環境にあったイメージをダウンロードします。
この時Liveイメージが英語キーボード配列になっていることがあります。その際のキー配列は次のようになっています。
英数以外のキー
一段目「ほへ」→-=
二段目「@{」→[]
三段目「れけむ」→;'¥(バックスラッシュ)
四段目「ねるめ」→,./
Shift同時押し
一段目「ぬ~へ」→!@#$%^&*()_+
二段目「@{」→縦波の()
三段目「れけむ」→:"|
四段目「ねるめ」→<>?
- PuppyLinuxを利用する
削除対象のハードディスクがついたPCがCDにしか対応していない場合、Debian Liveはサイズ的に1枚のCDに収まりません。代用として、PuppyLinuxのUbuntu互換などがあると思います。UbuntuはDebianと同系列のOSです。
- Debianのmini.isoを利用する
Debianのmini.isoはインストーラーです。先に非常に小さなインストーラーをUSBメモリの先頭に書き込んでおき、その後に消去したいハードディスクのあるPCで起動させ、インストーラーを書き込んだ後ろに本体を書き込みます。つまり、小さなDebianOSをUSBメモリ上にインストールできます。Debian「USB メモリでの起動用ファイルの準備」に詳細がありますが、小さなサイズのUSBメモリでもインストールが可能です。8Gのメモリで試してみましたが、インストール後のディスク使用量は2G程度でした。
こちらはインストール作業が必要なので、若干時間がかかります。
mini.isoの配布場所が少しわかりづらいので書いておきます。ミラーはどこでもいいとは思いますが、サイトにより配布していないこともあるのかもしれません。下線の場所はアーキテクチャ別に分かれている箇所です。ここではamd64を指定しています。
http://http.us.debian.org/debian/dists/bullseye/main/installer-amd64/current/images/netboot/mini.isomini.isoから「日本語」を選択してインストールしてもプロンプトでは◆◆◆◆となって表示できないと思います。その際は「LANG=C」とコマンド入力して文字を英語にします。ならば最初から英語にすればと思うかもしれませんが、英語で進めてしまうと今度はキーボード配列が違ったものになってしまいます。
ダウンロードが終わったらイメージを書き込みます。CDやDVDに書き込みをする場合、Windows10ならば、.imgファイルの右クリックからの「ディスクイメージの書き込み」から行えます。
USBへの書き込みはbalena Etcher等を使うと簡単です。
Etcherでの書き込み方法は次の通りです。
- 「Flash from file」をクリック
- ダウンロードした.isoファイルを選択してOKをクリック。
- 「Select Target」をクリックして書き込むUSBディスクを指定して「Select」をクリック。
- 「Flash!」をクリック
書き込みが終わったら、CDやDVD、USBメモリを削除したいハードディスクがあるPCにセットして起動します。PCによってはUSBからの起動ができなかったり、起動ができてもハードディスクからの起動が優先になっている場合もあります。その際は、BIOSやUEFIの設定より変更してください。
筆者の環境だと次のようなBIOSの設定が必要でした。
- 電源ONの際F2キーを何度か押す
- BIOSメニューの中からBootを選択(→キーで移動)
- Bootデバイスの中からUSBを選択(↓キーで移動)
- PgUpキーで優先度を上に
- ESCキーで終了
- 保存するか聞かれるのでyキーを押す
Debian Liveの場合は初期メニューからDebian Liveを選択してコンソール画面に移動します。PuppyLinuxの場合はGUIが立ち上がりますので、デスクトップにある「console」アイコンからコンソールを起動します。
mini.isoの場合はインストール画面が立ち上がります。インストール中の画面遷移はDebianをインストールした際の記事で紹介しています。ウィザードに従い途中、「ディスクのパーティショニング」の際は「ガイド-最大の連続空き領域を使う」にして「ガイドによるパーティショニング」を行います。
LANケーブル等を接続せずにネットワークまわりの設定をすべてキャンセルすれば余計なダウンロードがない分早く処理が終わります。ただし後で紹介するgddrescueを使いたいならIPの設定をしてください。
インストールするソフトウェアは「標準システムユーティリティ」だけを選択して進めます。(上下とスペースで選択、エンターで決定です)
Debian Liveの場合は管理者権限の必要なコマンドはsudoを先頭につけて実行します。PuppyLinuxのターミナルは起動時に管理者権限となっているのでそのままコマンドを入力します。mini.isoからインストールした場合は、suコマンドを入力したのち、インストール時に入力した管理者パスワードを入力して管理者プロンプト(#)から処理を実行します。
ディスク消去の方法
なにをもってディスクを完全消去したといえるのかというのは正解がない問題なのかもしれません。一番簡単なものはディスク全体をすべて「00(16進数)」で書き込んでしまうものです。ただすべて00で書き込んでも復元できてしまうともいわれています。なので、近年推奨されている方法は、数回ランダムな値を書き込んでから、最後に「00」を書き込むという方法です。かつての情報処理技術者試験では互い違いのビット配列を2度書き込むという方法が答えだったこともありました。(今はランダムな値を数回書き込むにかわっているようです。)
どの方法をとるにしてもLinuxの「dd」というコマンドを使います。ddは、ブロック単位でデータを入出力するコマンドです。別記事ではこのddを使ってHDDのクローンを作成しました。ddコマンド自体はユーザー権限で利用できますが、ここでは管理者権限で操作します。
指定したディスクの中をすべて消去する(「000000.....」を書き込む)には、特殊ファイルである/dev/zeroを使って、次のようにします。xxxの部分は対象となるディスクを示すデバイス名(sdbなどの文字列)となります(sda,hdbなど)。
; Debian Liveの場合 $ sudo dd if=/dev/zero of=/dev/xxx ; Puppy Linuxの場合 # dd if=/dev/zero of=/dev/xxx ; mini.isoの場合 $ su - ...(パスワード入力) # dd if=/dev/zero of=/dev/xxx
書き込む値を0でなくランダムな文字列にする場合は/dev/zeroの部分を/dev/urandomとします。
デバイス名のxxxの部分はsdから始まる接頭に、アルファベット1文字、最後に数値となっていると思います。もともとのハードディスクの他、起動にUSBメモリを使っていたらそれも出力されます。cdやdvdの場合は接頭はsdにはなりません。
fdiskコマンドを使うとそれらのデバイス名を確認できます。CDやDVDから起動した場合はそれは認識されませんが正常です。
出力されるモデル名やサイズから対象のディスクを把握してください。ここでは/dev/sdaということになりました。
# fdisk -l Disk /dev/sda: 38.29 GiB, 40060403712 bytes, 78242976 sectors Disk model: Maxtor xxxxx ....
このディスクを表す文字列(xxx)の詳細はC.4. Linuxにおけるデバイス名にそのルールが紹介されています。
削除する前に中身を見てみたいという場合は、Windows用のディスクでも暗号化されてなければだいたい読みだすことができます。読みだすためにはマウントが必要になります。ここでは/mnt/testmountを作成した後にsdaの第1パーティションであるsda1をマウントします。コマンドは次のようなります。
マウントできたらlsコマンドを使って中身を列挙してみます。
# mkdir /mnt/testmount # mount /dev/sda1 /mnt/testmount # ls /mnt/testmount
中身を確認した際には、削除する前にマウントを解除します。
# umount /mnt/testmount # dd if=/dev/urandom of=/dev/sda ... 40060403712 bytes (40GB, 37GiB) copied, 4162.25 s, 9.6 MB/s
削除作業はディスクの容量やPCのスペックによっては長い作業になると思いますが、「 ... bytes (...) copied, ....」というメッセージが表示されれば処理は終了です。求める消去レベルにより、この作業を繰り返します。
exceptoin Emask 0x0 SAct 0x0 Serr 0x0 action 0x0 BMDMA stat 0x25 failed command: READ DMA cmd c8/00:08:a0:07:80/00:00:00:00:00/e2 tag 0 dma 4096 in res 51/40:06:a2:07:80/00:00:00:00:00/e2 Emask 0x9 (media error) status: { DRDY ERR } error: { UNC } print_req_error: I/O error, dev sda, sector 41944994 21475835904 byts (21GB, 20GiB) copied, 2248.35 s, 9.6 MB/s
不良セクタがあったりすると、上のようなエラーがでます。ここでは41944994セクタでI/Oエラー、つまり書き込めない現象が起きたため、処理が止まりました。結果21G(21475835904byts)までは書き込みしました。
ddの処理においてはデフォルトでは512バイト単位で読み書きを行います。これが最小記録サイズを下回ることはないので、エラーが出て止まったらエラーとなるセクタ(512バイト)飛ばして次のセクタから、再スタートします。
ddを続きから処理するには、seekで書き込み箇所を指定します。seekで読み飛ばすサイズはobs(書き込みサイズ)何個分かで指定します。デフォルトは512なので、書き込みの終わったバイト数÷512+1から指定します。
なぜ512バイトなのかというと、ハードディスクのセクタサイズ(=最小記録サイズ)が512バイトだからです。近年のディスクは4096バイトですが、それらはたいてい物理的な4096バイトのセクタを論理的に512バイトにしています。そうでない場合も4096は512の倍数なので問題ありません。
2か所目の不良セクタがあると計算方法が面倒になってきます。「再開した際のseekの位置+(今回書き込みできたバイト数÷512)+1」となります。
そのようにして最後まで処理が終わったら旧ハードディスクの消去は完了です。
消去中の状況確認
ddコマンドの処理は長いので、動いているのか止まっているのか心配になることがあるかもしれません。その際はpkillコマンドを使ってシグナル(USR1)を送ると、現在の状況を返事してくれます。
まず、直接コンピュータを操作しているのなら「ALTキー+F2(3,4,...)」を押すと、ターミナルを切り替えられるので切り替えてログインします。そうでない場合は新たに接続します。
これは、ddコマンドにUSR1シグナルを送信しています。このコマンドを実行した後、「ALTキー+F1」を押し元のターミナルに戻ってみると、現在の進捗状況が表示されていると思います。
書き込みエラーへの対応
ddのオプションに「conv=noerror」を指定すると読み込み時のエラーは読み飛ばすことができますが、今回のような場合では/dev/zeroや/dev/urandomを指定しているので、ほとんどのIOエラーが書き込みだと思います。先に復旧方法と共に紹介したように、これだとddは途中で止まってしまいます。
しかし、Stack Exchangeにあるように、gddrescueをインストールすると簡単にdd処理中のエラーをスキップすることができます。ただしインストールが必要なので書き込みのできないメディアからOSを起動している場合は利用できません。
zeroやurandomなどの特殊ファイルからのコピーをする際は--forceオプションを付けます。また本家のddと違いコピー元とコピー先はパスをそのまま渡します。順序はif、ofの順です。
# apt install gddrescue ... # ddrescue /dev/zero /dev/sdb --force
ステータスは常に表示されます。
root@debian:~# ddrescue /dev/zero /dev/sdb --force GNU ddrescue 1.23 Press Ctrl-C to interrupt ipos: 41110 MB, non-trimmed: 0 B, current rate: 24510 kB/s opos: 41110 MB, non-scraped: 0 B, average rate: 51323 kB/s non-tried: 9223 PB, bad-sector: 0 B, error rate: 0 B/s rescued: 41110 MB, bad areas: 0, run time: 13m 20s pct rescued: 0.00%, read errors: 0, remaining time: n/a time since last successful read: n/a Copying non-tried blocks... Pass 1 (forwards) ddrescue: Write error: No space left on device
最後まで到達すると「Write error: No space left on device」がでますが、問題ありません。
消去結果の確認
ランダムで書き込んだ場合は目視では判断がつきませんが、/dev/zeroを書き込んだ場合なら、odコマンドを使うことで書き込み結果の確認ができます。
-jオプションで開始位置、-Nオプションで出力サイズを指定できるので、ディスクの範囲を抜き打ちでチェックします。
左端に位置が表示されるアドレス部以外は、残りがすべて0となっていれば/dev/zeroをきちんと書き込んでいると判断できます。
# od -j 0 -N 256 /dev/sdb 0000000 000000 000000 000000 000000 000000 000000 000000 000000 * ...
もし完全にチェックしたい場合は、odの出力結果は前の行と同じだと*で省略されるようなので、オプションで範囲を指定しないで実行してディスクの最後に到達すればすべて0だということになります。
S.M.A.R.T.
ちなみに不良セクタがあっても問題なくOSが稼働するのは、ハードディスクがその部分を使わないようにして代替セクタを割り当てているからです。この情報はS.M.A.R.T.から確認することができます。 archlinux.:「S.M.A.R.T.」を参考に、S.M.A.R.T.情報を取得するアプリをインストールしてチェックしてみます。
$su - ... # apt update ... # apt install smartmontools ...
まず「smartctl --info /dev/xxx」として、ディスクがS.M.A.R.T.に対応しているか、有効になっているか確認します。有効にするには、「smartctl --smart=on /dev/xxx」とします。
一般的なチェックをするには「smartctl -t short /dev/xxx」とします。待ち時間の目安が表示されてチェック実行されます。中断するには「smartctl -X」とします。終了後結果を表示するには「smartctl -a /dev/xxx」とします。
情報の判断のしかたは「S.M.A.R.T.(スマート情報)で障害状況を分析する」に詳しく載っています。
基本的にTHRESH(threshold:閾値)より、VALUEが下回っていると危険な状況です。VALUEは回復する類のものもありその際にはWORSTに一番悪かった値が入っています。
不良セクタの状況を確認するには、「Reallocated_Sector_Ct」の項目をみます。これはハードディスクが不良セクタに対応している状況をしめしています。ハードディスクは不良セクタが発生した際、予備のセクタと置き換えを行います。置き換え可能な予備セクタがどれぐらい残っているかを「Reallocated_Sector_Ct」の項目は示しています。表示は%で、100となっていれば十分に余裕があります。次の例では、閾値(THRESH)となっている5を下回ったら、ハードディスクの交換が必要だということになります。
USBメモリの復旧(Windows)
OSをインストールしたUSBメモリを元に戻すには、OS起動用ディスクとして書き込まれてしまったブートローダーを消去する必要があります。
Windows機でUSBメモリを復旧させるには管理者権限のあるコマンドプロンプトからdiskpartを実行します。この方法はSOFTELメモを参考にさせていただきました。
;diskpart >diskpart DISKPART> list disk ディスク 状態 サイズ ------------ ------------- ------- ディスク 0 オンライン 465 GB ディスク 1 オンライン 7728 MB ; サイズで判断してディスクを選択します ; 選択間違えると致命的な事になるので注意が必要です DISKPART> select disk 1 ; 選択したディスクに*がつきます ; 必ず確認しましょう DISKPART> list disk ディスク 状態 サイズ ------------ ------------- ------- ディスク 0 オンライン 465 GB * ディスク 1 オンライン 7728 MB ; 選択中のディスクのパーテーションを初期化 DISKPART> clean DiskPart はディスクを正常にクリーンな状態にしました。 ; パーテーションを再作成 DISKPART> create partition primary DiskPart は指定したパーティションの作成に成功しました。 ; 終了 DISKPART> exit
このあとUSBメモリをフォーマットすると元通りに使えます。
USBメモリの復旧(Linux)
Linuxでは、USBの復旧にもddコマンドを利用します。USBメモリをLinuxに差し込みデバイス名を取得します。ここではsdbとしています。
USBの第1パーテーションまでのデータをすべて0にします。通常ddは512バイトずつ書き込みますので「count=4」で2048バイト書き込みます。
この状態でWindow機にUSBメモリを差し込めばフォーマットするか確認してくるので、フォーマットすれば元通りになります。
Linuxから続けてメモリを初期化するなら、次のように進めます。
;fdisk起動 # fdisk /dev/sdb ; 新規パーテーション作成 ; この後の問はすべてデフォルトでエンター Command (m for help): n ; ファイルのパーテーションをexFATに ; (一般的なUSBメモリのフォーマット) Command (m for help): t ; 07(exFAT)を指定 ...: 07 ; 書き込み Command (m for help): w ; フォーマットするためのツールをインストール # apt install exfat-utils ; パーテーションをexFATでフォーマット # mkfs.mkfs.exfat /dev/sdb1
参考にさせていただきましたサイトの皆様、ありがとうございました。