更新:2016年11月10日(ストレージプールのサイズについて)
※警告※
(1)ZFSを使用するPCはECC対応メモリーを実装したものを使うべきらしい。
さもなければ、保存データを壊してしまう危険があるらしい。(†1)
(2)スクリプトを組んでchownやchmodで頻繁にファイルの所有者や権限を変更する必要がある場合、
以下の手順で導入するZFS-FUSEは使用するべきではない。
頻繁ではないもののZFS-FUSEが落ちてしまうことがある。すると当然、ファイルシステムにアクセスできなくなる。(†2)
毎日、数分おきに合計200回程度で、所有者と権限の変更を行っていたところ、
半年に1度の頻度で、ZFS-FUSEが落ちてしまった。
そうではない環境では、ZFS-FUSEは安定に動作しつづけた。
(この回復のためには、service zfs-fuse stop して、ある程度じっくり待ってから、service start zfs-fuseする。)
□注意□
ネイティブZFSとは異なり、ZFS-FUSEでは、ACLを使うことができないようだ。実際に、setfaclコマンドで試してみたが、”サポートされていない操作です”とエラーになった。(参考)
・#130 — Lack of (Posix) ACL support cripples zfs-fuse < http://zfs-fuse.net/issues/130 > 2012年6月7日
・Compressed fs with acl (posix) support? < http://www.linuxquestions.org/questions/linux-server-73/compressed-fs-with-acl-posix-support-938090/ > 2012年6月7日
以下、ZFS-FUSEの導入の手順メモ
使用したCentOS 6.2 64bit版は、インストーラーから「Desktop用途」を選択してインストールしたものである。
■パッケージ zfs-fuse のインストール
ZFSの導入は、専用のパッケージをYUMでインストールするだけだった。
1、epelリポジトリを使用できるようにした
必要なパッケージがepelリポジトリに存在しているため、epelを利用できるようにする。
[root@FileServer-01 ~]# rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-6.noarch.rpm
http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-6.noarch.rpm を取得中
警告: /var/tmp/rpm-tmp.nitPMD: ヘッダ V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
準備中... ########################################### [100%]
1:epel-release ########################################### [100%]
[root@FileServer-01 ~]#
2、 zfs-fuseのインストールをyumを使って行った
インフォメーションを表示させる
[root@FileServer-01 ~]# yum info zfs-fuse
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
epel/metalink | 4.1 kB 00:00
* base: ftp.jaist.ac.jp
* epel: ftp.jaist.ac.jp
* extras: ftp.jaist.ac.jp
* updates: ftp.jaist.ac.jp
epel | 4.0 kB 00:00
epel/primary_db | 4.4 MB 00:00
Available Packages
Name : zfs-fuse
Arch : x86_64
Version : 0.6.9
Release : 6.20100709git.el6
Size : 1.4 M
Repo : epel
Summary : ZFS ported to Linux FUSE
URL : http://zfs-fuse.net/
License : CDDL
Description : ZFS is an advanced modern general-purpose filesystem from Sun
: Microsystems, originally designed for Solaris/OpenSolaris.
:
: This project is a port of ZFS to the FUSE framework for the Linux
: operating system.
:
: Project home page is at http://zfs-fuse.net/
インストールを行う
[root@FileServer-01 ~]# yum install zfs-fuse
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
* base: ftp.jaist.ac.jp
* epel: ftp.jaist.ac.jp
* extras: ftp.jaist.ac.jp
* updates: ftp.jaist.ac.jp
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package zfs-fuse.x86_64 0:0.6.9-6.20100709git.el6 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================================
Package Arch Version Repository Size
================================================================================================
Installing:
zfs-fuse x86_64 0.6.9-6.20100709git.el6 epel 1.4 M
Transaction Summary
================================================================================================
Install 1 Package(s)
Total download size: 1.4 M
Installed size: 4.1 M
Installed:
zfs-fuse.x86_64 0:0.6.9-6.20100709git.el6
Complete!
再起動時にもzfs設定関係のコマンドが実行できるようにしておく
[root@FileServer-01 ~]# chkconfig zfs-fuse on
下記、ZFS-FUSEの設定に備えて、サービスを起動しておく
[root@FileServer-01 ~]# service zfs-fuse start
■ストレージプールと、ZFSファイルシステムを作成し、マウントポイントを指定した
ZFSに対応したファイルシステムを使うには、最初にストレージプールを作成する。
今回は空HDDを丸ごと使ってストレージプールを作成した。
(領域確保したパーティションを指定することもできる。)
ストレージプール上にZFSファイルシステムを作成する。
作成したZFSファイルシステムは任意のディレクトリにマウントできた。
1、ストレージプールを作成した
[root@FileServer-01 ~]# zpool create zfsstrpool /dev/sdx
zfsstrpool ・・・ 定義を行うストレージプール名 (任意に名づけられる)
/dev/sdx ・・・ このストレージプールに参加させる空HDDのデバイス名
ルートディレクトリに作成したストレージプールなどが現れることを確認
[root@FileServer-01 ~]# ls -all -h / | grep zfs
drwxr-xr-x. 2 root root 0 1月 1 09:00 1970 zfs-kstat
drwxr-xr-x. 2 root root 2 5月 14 12:57 2012 zfsstrpool
○ところで、parted で調べたパーティションの容量よりもストレージプールは小さくなっていた。
(ストレージプールとして確保された容量は、zpool list コマンドで調べられる。)
ストレージプールに当てるパーティションのサイズを変化させて調べたら、以下のようになった。
約 188GB のパーティションの場合、ストレージプールでは約 13GB 少なくなった。175GBになった。
約 183GB のパーティションの場合、ストレージプールでは約 13GB 少なくなった。170GBになった。
約 238GB のパーティションの場合、ストレージプールでは約 18GB 少なくなって、220GBとなった。
ストレージプールに割り当てたパーティションのサイズが増えると減少量は増加するのではないか。
ZFSは、ブロックごとにハッシュデータを持っていて、エラーを検出できるようになっているようだ。(†1)
このハッシュデータの保存場所確保のためにストレージプールで使用できるサイズが減少するのではないか。
2、作成したストレージプールに、ZFSファイルシステムを生成した
[root@FileServer-01 ~]# zfs create zfsstrpool/fs01-zfs
zfsstrpool ・・・ 対象のストレージプール名
fs01-zfs ・・・ 生成するファイルシステムの名(任意に名づけられる)
生成したZFSファイルシステムは、次の位置に自動的にマウントされた
[root@FileServer-01 ~]# zfs mount
zfsstrpool /zfsstrpool
zfsstrpool/fs01-zfs /zfsstrpool/fs01-zfs
ZFSファイルシステムのマウント位置は、ファイルシステム名と同じ名前のディレクトリになっていた
[root@FileServer-01 ~]# ls -all -h / | grep zfs
drwxr-xr-x. 2 root root 0 1月 1 09:00 1970 zfs-kstat
drwxr-xr-x. 3 root root 3 5月 14 13:09 2012 zfsstrpool
[root@FileServer-01 ~]# cd /zfsstrpool/
[root@FileServer-01 zfsstrpool]# ls
fs01-zfs
3、マウントポイント位置を変更した
マウントポイントにするディレクトリを作成した
[root@FileServer-01 ~]# mkdir /home/files
ZFSファイルシステムのマウントポイントをセットしなおした
[root@FileServer-01 ~]# zfs set mountpoint=/home/files zfsstrpool/fs01-zfs
ZFSファイルシステムのマウント状態を確認した
[root@FileServer-01 ~]# zfs mount
zfsstrpool /zfsstrpool
zfsstrpool/fs01-zfs /home/files
■生成したZFSファイルシステムで、圧縮機能や、重複排除機能を有効化した
ZFSファイルシステムの機能である「圧縮」や「重複排除」を利用するには、次のようにパラメーターをセットし、各機能を有効化する必要がある。
圧縮機能を有効化した
[root@FileServer-01 ~]# zfs set compression=gzip-9 zfsstrpool/fs01-zfs
gzip-9・・・gzip-1からgzip-9まで選べる(gzip-9で圧縮率が最高になる)
重複排除機能を有効化した
[root@FileServer-01 ~]# zfs set dedup=verify zfsstrpool/fs01-zfs
■設定を確認した
以上の設定の後で、ストレージプールとZFSファイルシステムの設定を表示させた。
[root@FileServer-01 ~]# zfs get all
NAME PROPERTY VALUE SOURCE
zfsstrpool type filesystem -
zfsstrpool creation 月 5月 14 12:57 2012 -
zfsstrpool used 111K -
zfsstrpool available 488G -
zfsstrpool referenced 21K -
zfsstrpool compressratio 1.00x -
zfsstrpool mounted yes -
zfsstrpool quota none default
zfsstrpool reservation none default
zfsstrpool recordsize 128K default
zfsstrpool mountpoint /zfsstrpool default
zfsstrpool sharenfs off default
zfsstrpool checksum on default
zfsstrpool compression off default
zfsstrpool atime on default
zfsstrpool devices on default
zfsstrpool exec on default
zfsstrpool setuid on default
zfsstrpool readonly off default
zfsstrpool zoned off default
zfsstrpool snapdir hidden default
zfsstrpool aclmode groupmask default
zfsstrpool aclinherit restricted default
zfsstrpool canmount on default
zfsstrpool xattr on default
zfsstrpool copies 1 default
zfsstrpool version 4 -
zfsstrpool utf8only off -
zfsstrpool normalization none -
zfsstrpool casesensitivity sensitive -
zfsstrpool vscan off default
zfsstrpool nbmand off default
zfsstrpool sharesmb off default
zfsstrpool refquota none default
zfsstrpool refreservation none default
zfsstrpool primarycache all default
zfsstrpool secondarycache all default
zfsstrpool usedbysnapshots 0 -
zfsstrpool usedbydataset 21K -
zfsstrpool usedbychildren 90K -
zfsstrpool usedbyrefreservation 0 -
zfsstrpool logbias latency default
zfsstrpool dedup off default
zfsstrpool mlslabel off -
zfsstrpool/fs01-zfs type filesystem -
zfsstrpool/fs01-zfs creation 月 5月 14 13:09 2012 -
zfsstrpool/fs01-zfs used 21K -
zfsstrpool/fs01-zfs available 488G -
zfsstrpool/fs01-zfs referenced 21K -
zfsstrpool/fs01-zfs compressratio 1.00x -
zfsstrpool/fs01-zfs mounted yes -
zfsstrpool/fs01-zfs quota none default
zfsstrpool/fs01-zfs reservation none default
zfsstrpool/fs01-zfs recordsize 128K default
zfsstrpool/fs01-zfs mountpoint /home/files local
zfsstrpool/fs01-zfs sharenfs off default
zfsstrpool/fs01-zfs checksum on default
zfsstrpool/fs01-zfs compression gzip-9 local
zfsstrpool/fs01-zfs atime on default
zfsstrpool/fs01-zfs devices on default
zfsstrpool/fs01-zfs exec on default
zfsstrpool/fs01-zfs setuid on default
zfsstrpool/fs01-zfs readonly off default
zfsstrpool/fs01-zfs zoned off default
zfsstrpool/fs01-zfs snapdir hidden default
zfsstrpool/fs01-zfs aclmode groupmask default
zfsstrpool/fs01-zfs aclinherit restricted default
zfsstrpool/fs01-zfs canmount on default
zfsstrpool/fs01-zfs xattr on default
zfsstrpool/fs01-zfs copies 1 default
zfsstrpool/fs01-zfs version 4 -
zfsstrpool/fs01-zfs utf8only off -
zfsstrpool/fs01-zfs normalization none -
zfsstrpool/fs01-zfs casesensitivity sensitive -
zfsstrpool/fs01-zfs vscan off default
zfsstrpool/fs01-zfs nbmand off default
zfsstrpool/fs01-zfs sharesmb off default
zfsstrpool/fs01-zfs refquota none default
zfsstrpool/fs01-zfs refreservation none default
zfsstrpool/fs01-zfs primarycache all default
zfsstrpool/fs01-zfs secondarycache all default
zfsstrpool/fs01-zfs usedbysnapshots 0 -
zfsstrpool/fs01-zfs usedbydataset 21K -
zfsstrpool/fs01-zfs usedbychildren 0 -
zfsstrpool/fs01-zfs usedbyrefreservation 0 -
zfsstrpool/fs01-zfs logbias latency default
zfsstrpool/fs01-zfs dedup verify local
zfsstrpool/fs01-zfs mlslabel verify -
■動作テスト
総計で約22Gバイトほどの多数のファイルをZFSファイルシステムに書き込み、圧縮や重複排除の機能の効果を確認した。
ファイル数は約11万で、odsやxls等のファイルが主である。
数種類のテンプレートから作成されたもので、プログラムで自動生成したものではない。
平均すれば一ファイルあたり200Kバイトほど。
その中には無圧縮のbmp画像を含んだ500kバイトを超えるものもある。
ファイルは、rsyncコマンドでリモートホストから転送した。
<結果>
# zfs get all | grep compressratio
書込み前
zfsstrpool compressratio 1.00x -
zfsstrpool/fs01-zfs compressratio 1.00x -
書込み後
zfsstrpool compressratio 1.33x -
zfsstrpool/fs01-zfs compressratio 1.33x -
# zpool list
書込み前
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
zfsstrpool 496G 116K 496G 0% 1.00x ONLINE -
書込み後
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
zfsstrpool 496G 8.39G 488G 1% 2.13x ONLINE -
# zfs list
書込み前
NAME USED AVAIL REFER MOUNTPOINT
zfsstrpool 111K 488G 21K /zfsstrpool
zfsstrpool/fs01-zfs 21K 488G 21K /home/files
書込み後
NAME USED AVAIL REFER MOUNTPOINT
zfsstrpool 17.7G 480G 21K /zfsstrpool
zfsstrpool/fs01-zfs 17.7G 480G 17.7G /home/files
# df -h
書込み前
Filesystem Size Used Avail Use% マウント位置
zfsstrpool 489G 21K 489G 1% /zfsstrpool
zfsstrpool/fs01-zfs 489G 21K 489G 1% /home/files
書込み後
Filesystem Size Used Avail Use% マウント位置
zfsstrpool 480G 21K 480G 1% /zfsstrpool
zfsstrpool/fs01-zfs 498G 18G 480G 4% /home/files
# df -m
書込み前
Filesystem 1M-ブロック 使用 使用可 使用% マウント位置
zfsstrpool 499965 1 499965 1% /zfsstrpool
zfsstrpool/fs01-zfs 499965 1 499965 1% /home/files
書込み後
Filesystem 1M-ブロック 使用 使用可 使用% マウント位置
zfsstrpool 491227 1 491227 1% /zfsstrpool
zfsstrpool/fs01-zfs 509339 18112 491227 4% /home/files
■メンテナンス
プール名(zfsstrpool)を指定して、データの完全性をチェックする。
# zpool scrub zfsstrpool
これによって、チェックプロセス(スクラブ)がバックグラウンドで動作する。
次のコマンドで、チェックプロセスの進捗状況をチェックする。
# zpool status
pool: zfsstrpool
state: ONLINE
scrub: scrub in progress for 0h0m, 0.57% done, 0h14m to go
config:
NAME STATE READ WRITE CKSUM
zfspool-skr0 ONLINE 0 0 0
vda3 ONLINE 0 0 0
errors: No known data errors
■ZFSファイルシステムをアンマウントして削除する。
1、まず、確認のためプールを含めたZFSファイルシステムの一覧を表示させた。
# zfs list
NAME USED AVAIL REFER MOUNTPOINT2、削除するZFSファイルシステムを指定し、削除を行った。
zfsstrpool 124K 167G 21K /zfsstrpool
zfsstrpool/fs01-zfs 21K 167G 21K /home/files
(下記コマンドで、いきなり削除されるので注意する。)
# zfs destroy zfsstrpool/fs01-zfs
一覧を表示させた。(削除されていることを確認できた。)
# zfs list
NAME USED AVAIL REFER MOUNTPOINT(注意)下記コマンドは、プールを削除するものであるため、この場合には無効である。
zfsstrpool 88.5K 167G 21K /zfsstrpool
# zpool destroy zfsstrpool/fs01-zfs
cannot open 'zfsstrpool/fs01-zfs': invalid character '/' in pool name
use 'zfs destroy' to destroy a dataset
■その他
アンマウントしてZFS-FUSEを停止する。
# service zfs-fuse stop
Syncing disks [ OK ]ストレージがアンマウントされるので、当然アクセスができなくなる。
Unmounting ZFS filesystems [ OK ]
Stopping zfs-fuse: [ OK ]
Syncing disks again [ OK ]
ZFS-FUSEをスタートしてマウントを行う。
# service zfs-fuse start
Starting zfs-fuse: [ OK ]ストレージがマウントされて、アクセスが可能になる。
Immunizing zfs-fuse against OOM kills [ OK ]
Mounting zfs partitions: [ OK ]
ZFS-FUSEの再起動を行う。
(異常が生じた場合などにこの操作を行う必要があった。)
# service zfs-fuse restart
Syncing disks [ OK ]
Unmounting ZFS filesystems [ OK ]
Stopping zfs-fuse: [ OK ]
Syncing disks again [ OK ]
Starting zfs-fuse: [ OK ]
Immunizing zfs-fuse against OOM kills [ OK ]
Mounting zfs partitions: [ OK ]
<参考>
(1) Will ZFS and non-ECC RAM kill your data?
< http://jrs-s.net/2015/02/03/will-zfs-and-non-ecc-ram-kill-your-data/ > 2016年11月10日
(2) Bug 924012 - zfs-fuse crashes during chmod
< https://bugzilla.redhat.com/show_bug.cgi?id=924012 > 2017年7月2日
ZFS ファイルシステムの整合性をチェックする
< https://docs.oracle.com/cd/E56342_01/html/E53916/gbbwa.html > 2016年11月22日
Destroying a ZFS File System
< http://docs.oracle.com/cd/E19253-01/819-5461/gammq/index.html > 2016年11月24日
Creating and Destroying ZFS Storage Pools
< https://docs.oracle.com/cd/E23824_01/html/821-1448/gaypw.html > 2017年4月4月
Recovering Destroyed ZFS Storage Pools
< http://docs.oracle.com/cd/E19253-01/819-5461/gcfhw/index.html > 2017年4月4月