仕事で使っていたHDDの中のデータを復元できない形で消去する必要が生じたので方法を考えてみた。
削除対象は400TB程度のストレージ装置でNFSでLinux (CentOS)にマウントされている。
既存のソフトウエア、方法など
ググるとshredを使う方法、ddを使ってゼロフィルやurandomのデータを書き込む方法などがある。上書き回数については複数回上書きする方がいいという噂もあったが、Wikipediaによると、最近のHDDは1回上書きするだけで事足りるらしい。
それならばddでゼロフィルするだけでも事足りるのだろうが、やはり一律ゼロでは残留磁気が残ってしまうような気がして心もとない。かといってshredやurandomはランダム生成に時間がかかりすぎて消去期限に間に合わないことが分かった。
作成したスクリプトの動作
- はじめにurandomで1GB分のランダムデータを生成する。
- 生成した1GB分のデータをcatで繰り返しつなげて巨大な数個のファイルでディスク領域全体を上書きする。
- ディスク全体にデータを書き終わると空き容量がない旨のエラーが大量に発生して動作が終了する。
- 必要に応じてランダムデータのファイルを削除する。
1GB分もランダムデータをcatでつないでしまえば、次の1バイトにどんなデータが来るか予測するのは非常に困難なので残留磁気を読み取るのは事実上不可能と考えた。
スクリプト
10T分ランダムデータで埋める場合
randomfill.bash
# !/bin/bash
OUTDIR=OUT # 巨大ファイルの出力先ディレクトリ
mkdir -p $OUTDIR
function main(){
make1G orig_1G # urandomデータを1GB分カレントディレクトリに保存
copy1T orig_1G data_1T 10 # 上で作成したデータをcatで1TB分つなげたファイルを10個作成
}
function make1G(){# urandomデータを1GB分カレントディレクトリに保存
file=$1
echo "Making a 1GB file: $file"
time head -c 1000m /dev/urandom > $file
echo "Done"
}
function make1T(){# 上で作成したデータをcatで1TB分つなげたファイルを作成
infile=$1
outfile=$2
echo "Making a 1TB file from $infile to $outfile"
touch $outfile
for ((i=0; i<1024; i++))
do
cat $infile >> $outfile
done
echo "Done"
}
function copy1T(){# 1TBのファイルを指定した数だけ作成
file=$1
outbase=$2
num=$3
for ((j=0; j<$num; j++))
do
outname=$OUTDIR/$outbase.$j
if [ ! -r $outname ]
then
make1T $file $outname # TB級ストレージの場合
# cat $file > $outname # 数百GB級ストレージの場合
# dd if=$file of=$outname bs=64M # ddは遅かった
fi
done
}
main
このスクリプトの利点
- 空き領域のみランダムデータで上書きするので残しておきたいデータがある場合にも使える。
- bash on windows で試したところ、フルフォーマットと同程度の速度でデータ消去が完了した。
- 同じプログラムを同時に走らせると別々のファイル名で書き込みを行うので、RAIDなどで複数スレッド同時書込みできる環境では増速も可能。