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 の後半で確認できる)が搭載されていないからだろうとは思いましたが。。。

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

2015年4月17日金曜日

1年ぶりに 3つのOSでZFSの性能を比較

前回から、1年経過し ZFS on Linux v0.6.4 がリリースされたので、ふたたび比較を行ってみました。

比較は、
・CentOS 7.1 + ZFS on Linux v0.6.4 (前回は 6.5 + v0.6.2)
・OpenIndiana 151a9 (最近アップデートされないので前回と同じバージョン。Hipster はオンボロらしいし)
・FreeBSD 10.1 (前回は 10.0)
の3つの OS で行いました。マシン環境は次の通り(前回とほぼ同じ)です。3つの OS をマルチブートできるようにしてあります。

・lenovo ThinkPad T510
・CPU Intel Core i7 M620 2.67GHz
・MEM 8GB
・OS ディスク R2021D
(Plextor M5M 256GB SSD 2枚によるRAID1)
・ZFS pool (HGST HTS721010A9E630 7200rpm SATA 1TB +
 HITACHI HTS725050A9A634 7200rpm SATA 500GB による mirror構成)
 ※補足:HGST 1T を 2nd HDD ベイに搭載、HITACHI 500G は eSATA 接続

前回の比較実験で tar の展開と削除を行いましたが、その時に使ったデータ(sda6.tar)が残っていましたので、同じことをやってみました。
root@hoge:~# uname -a
SunOS hoge 5.11 oi_151a9 i86pc i386 i86pc Solaris
root@hoge:~# zpool import tankS
root@hoge:~# zfs get compression tankS/backup
NAME          PROPERTY     VALUE     SOURCE
tankS/backup  compression  off       local
root@hoge:~# cd /tankS/backup
root@hoge:/tankS/backup# ls -l sda6.tar 
-rw-r--r-- 1 root root 10927441920 2013-10-20 22:44 sda6.tar
root@hoge:/tankS/backup# time tar xf sda6.tar 

real    3m12.587s
user    0m4.049s
sys     1m1.394s
root@hoge:/tankS/backup# sync
root@hoge:/tankS/backup# time rm -rf test.restore/

real    0m38.627s
user    0m0.590s
sys     0m8.514s
root@hoge:/tankS/backup# cd
root@hoge:~# zpool export tankS
root@hoge:~# 
root@hoge:~ # uname -a
FreeBSD hoge 10.1-RELEASE-p9 FreeBSD 10.1-RELEASE-p9 #0: Tue Apr  7 01:09:46 UTC 2015     root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC  amd64
root@hoge:~ # bash
[root@hoge ~]# zpool import tankS
[root@hoge ~]# zfs get compression tankS/backup
NAME          PROPERTY     VALUE     SOURCE
tankS/backup  compression  off       local
[root@hoge ~]# cd /tankS/backup/
[root@hoge /tankS/backup]# ls -l sda6.tar 
-rw-r--r--  1 root  wheel  10927441920 Oct 20  2013 sda6.tar
[root@hoge /tankS/backup]# time tar xf sda6.tar 

real    4m54.357s
user    0m5.335s
sys     0m38.711s
[root@hoge /tankS/backup]# sync
[root@hoge /tankS/backup]# time rm -rf test.restore/

real    1m13.057s
user    0m0.326s
sys     0m11.764s
[root@hoge /tankS/backup]# cd
[root@hoge ~]# zpool export tankS
[root@hoge ~]#
[root@hoge ~]# uname -a
Linux hoge 3.10.0-229.1.2.el7.x86_64 #1 SMP Fri Mar 27 03:04:26 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@hoge ~]# zpool import tankS
[root@hoge ~]# zfs get compression tankS/backup
NAME          PROPERTY     VALUE     SOURCE
tankS/backup  compression  off       local
新しいメールが /var/mail/root にあります
[root@hoge ~]# cd /tankS/backup/
[root@hoge backup]# ls -l sda6.tar 
-rw-r--r-- 1 root root 10927441920 10月 20  2013 sda6.tar
[root@hoge backup]# time tar xf sda6.tar 

real    2m53.018s
user    0m4.177s
sys     1m5.055s
[root@hoge backup]# sync
[root@hoge backup]# time rm -rf test.restore/

real    0m9.799s
user    0m0.200s
sys     0m9.601s
[root@hoge backup]# cd
[root@hoge ~]# zpool export tankS
[root@hoge ~]# 
というわけで、1ユーザのパーソナル利用環境での数値ですし、参考までですが、実験したワークロードにおいては、CentOS (Linux実装) が圧勝な数値になりました。v0.6.2 の時は、削除 (rm) に時間かかってましたが、克服された様子です。開発者の方々に感謝です!

2015年4月11日土曜日

ZFS on Linux 0.6.4 がリリースされたので早速アップデート

ZFS on Linux 0.6.4 がリリースされたので、早速 CentOS 7.1 + v0.6.3 を利用していた環境をアップデートしました。
モジュール作成は、問題なく完了して、zpool へのアクセスにも問題無いようなのですが、1点だけ、dkms の出力がおかしくなりました。
[root@hoge ~]# uname -a
Linux hoge 3.10.0-229.1.2.el7.x86_64 #1 SMP Fri Mar 27 03:04:26 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@hoge ~]# dkms status
Error! Could not locate dkms.conf file.
File:  does not exist.  ※少々焦りますが。。。
なんだろうかと調べてみますと、、、
[root@hoge ~]# ls -l /var/lib/dkms/spl/
合計 8
drwxr-xr-x 3 root root 4096  4月 11 06:44 0.6.3  ※余計なものが残っている感じ
drwxr-xr-x 3 root root 4096  4月 11 06:55 0.6.4
lrwxrwxrwx 1 root root   38  4月 11 06:55 kernel-3.10.0-229.1.2.el7.x86_64-x86_64 -> 0.6.4/3.10.0-229.1.2.el7.x86_64/x86_64
なので、ゴミと思われるものを削除しました。
[root@hoge ~]# \rm -rf /var/lib/dkms/spl/0.6.3
[root@hoge ~]# \rm -rf /var/lib/dkms/zfs/0.6.3
[root@hoge ~]# dkms status
spl, 0.6.4, 3.10.0-229.1.2.el7.x86_64, x86_64: installed
zfs, 0.6.4, 3.10.0-229.1.2.el7.x86_64, x86_64: installed
はい。これで解決です。スッキリ。
人気ブログランキングへ にほんブログ村 IT技術ブログへ