2015年4月23日木曜日

ファイルシステムの痕跡(メタデータ)をクリアする方法あれこれ(wipefsほか)

Linux で、いろいろとファイルシステムを試す際に、mkfs しようとすると、次のように残存データがあるぞと警告される場合があります。
[root@hoge ~]# cat /etc/centos-release
CentOS Linux release 7.1.1503 (Core)
[root@hoge ~]# uname -a
Linux hoge 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@hoge ~]# mkfs.btrfs /dev/sda10
/dev/sda10 appears to contain an existing filesystem (ext4).
Error: Use the -f option to force overwrite.
この例であれば、-f オプションを使えば良いのですが、残存するファイルシステムのシグネーチャを削除するのに wipefs コマンドを利用できます。
[root@hoge ~]# wipefs /dev/sda10    ※オプションを指定しなければ何が入ってるか確認できます
offset               type
----------------------------------------------------------------
0x438                ext4   [filesystem]
                     UUID:  xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

[root@hoge ~]# grep 0x438 /usr/share/file/magic 
0x438   leshort         0xEF53          Linux
[root@hoge ~]# hexdump -C -s 0x420 -n 48 /dev/sda10
00000420  00 20 00 00 00 20 00 00  00 08 00 00 00 00 00 00  |. ... ..........|
00000430  af 15 38 55 00 00 ff ff  53 ef 01 00 01 00 00 00  |..8U....S.......|
00000440  af 15 38 55 00 00 00 00  00 00 00 00 01 00 00 00  |..8U............|
00000450
[root@hoge ~]# wipefs -a /dev/sda10    ※-a オプションでクリアが実行されます
/dev/sda10: 2 bytes were erased at offset 0x00000438 (ext4): 53 ef

[root@hoge ~]# hexdump -C -s 0x420 -n 48 /dev/sda10
00000420  00 20 00 00 00 20 00 00  00 08 00 00 00 00 00 00  |. ... ..........|
00000430  af 15 38 55 00 00 ff ff  00 00 01 00 01 00 00 00  |..8U............|
00000440  af 15 38 55 00 00 00 00  00 00 00 00 01 00 00 00  |..8U............|
00000450
以下、その他の方法です。

昔から、中身をクリアするなら、次のように dd を使うのが常套ですが、サイズが大きいと時間かかります。
[root@hoge ~]# dd if=/dev/zero of=/dev/sda10 bs=1M
ファイルシステムのシグネーチャは、冒頭にあることが多いので、先頭だけクリアするという方法もあります。
[root@hoge ~]# dd if=/dev/zero of=/dev/sda10 bs=1M count=1
ランダムデータで埋める場合に、/dev/urandom を使うことがありますが、これは遅いので注意したほうがいいです。
[root@hoge ~]# dd if=/dev/urandom of=/dev/sda10 bs=1M

shred コマンドも利用できます。ゼロクリアする場合は、こうです。
[root@hoge ~]# shred -n 0 -z /dev/sda10
shred でランダムデータで埋めるには、こうです。dd で /dev/urandom 使うよりも、全然高速です。
[root@hoge ~]# shred -n 1 /dev/sda10
scrub という shred に似たものもあります。この手のツールは、いろいろありそうに思う。

もしも、TRIM 対応の SSD なら、blkdiscard を使えます。
[root@hoge ~]# blkdiscard /dev/sda10
これは大変便利です。HDD でも使えたらいいのになと思いますが、費用対効果上、HDD に TRIM が実装されるなどということは無いのでしょうね。
2015-09-10追記、少々古い Intel 520 で blkdiscard を使ってみたら消えないようでした(less -f で見たらゴミが見えた)。ところが、もう1回 blkdiscard したらオールゼロになったっぽい(less の出力冒頭しか確認してないので「ぽい」)。後日、検証してみます。520 は「Deterministic read ZEROs after TRIM」機能(hdparm -I の後半で確認できる)が搭載されていないからだろうとは思いましたが。。。

最後になりますが、くれぐれも対象デバイスを取り違えないように、注意しましょう。

0 件のコメント:

コメントを投稿

人気ブログランキングへ にほんブログ村 IT技術ブログへ