CentOS7でzfsを動かしてみる
FreeBSDでzfs FreeBSD/zfs
CentOS7のyumには登録されていないパッケージで、ライセンス的に?なのですが、使いたいから入れてみた。
minimumで仮想CentOS7を作り、そこにzfs向けとして256GB(Thin Provision)のHDD4本を追加した
[root@zfs ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
[root@zfs ~]#
[root@zfs ~]# cat /proc/partitions
major minor #blocks name
2 0 4 fd0
11 0 470528 sr0
8 32 268435456 sdc
8 16 268435456 sdb
8 0 16777216 sda
8 1 524288 sda1
8 2 524288 sda2
8 3 2097152 sda3
8 4 13629440 sda4
8 64 268435456 sde
8 48 268435456 sdd
[root@zfs ~]#
留意
この4つの仮想HDD(sdb,sdc,sdd,sde)は parted で mklabel gpt とします。(参照: ubuntu/zfs#fa90acb2)
[root@zfs ~]# parted /dev/sdb
GNU Parted 3.1
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt
(parted) quit
Information: You may need to update /etc/fstab.
[root@zfs ~]#
ZFS on Linuxhttp://zfsonlinux.org/にRHEL/CentOS向けのリポジトリがある。これを登録する
[root@zfs ~]# rpm -Uvh http://download.zfsonlinux.org/epel/zfs-release.el7_3.noarch.rpm
http://download.zfsonlinux.org/epel/zfs-release.el7_3.noarch.rpm を取得中
警告: /var/tmp/rpm-tmp.5XkOPb: ヘッダー V4 RSA/SHA256 Signature、鍵 ID f14ab620: NOKEY
準備しています... ################################# [100%]
更新中 / インストール中...
1:zfs-release-1-4.el7_3.centos ################################# [100%]
[root@zfs ~]#
すると、/etc/yum.repos.d にzfs.repoが配置される。
[root@zfs ~]# ls -l /etc/yum.repos.d/
合計 40
-rw-r--r--. 1 root root 1664 11月 30 03:12 CentOS-Base.repo
-rw-r--r--. 1 root root 1309 11月 30 03:12 CentOS-CR.repo
-rw-r--r--. 1 root root 649 11月 30 03:12 CentOS-Debuginfo.repo
-rw-r--r--. 1 root root 630 11月 30 03:12 CentOS-Media.repo
-rw-r--r--. 1 root root 1331 11月 30 03:12 CentOS-Sources.repo
-rw-r--r--. 1 root root 2893 11月 30 03:12 CentOS-Vault.repo
-rw-r--r--. 1 root root 314 11月 30 03:12 CentOS-fasttrack.repo
-rw-r--r--. 1 root root 1056 7月 24 06:37 epel-testing.repo
-rw-r--r--. 1 root root 957 7月 24 06:37 epel.repo
-rw-r--r-- 1 root root 1225 12月 13 08:27 zfs.repo
[root@zfs ~]#
次に、zfsにはepelリポジトリ提供の dkmsパッケージ が必要です。
なのでそのepelのリポジトリも登録します
[root@zfs ~]# yum install epel-release
次に、実際にzfs関連モジュールをインストールしますが、確認としてzfs.repoで提供される中身を見てみる
[root@zfs ~]# yum list |grep zfs
zfs-release.noarch 1-4.el7_3.centos installed
libnvpair1.x86_64 0.6.5.8-1.el7_3.centos zfs
libuutil1.x86_64 0.6.5.8-1.el7_3.centos zfs
libzfs2.x86_64 0.6.5.8-1.el7_3.centos zfs
libzfs2-devel.x86_64 0.6.5.8-1.el7_3.centos zfs
libzpool2.x86_64 0.6.5.8-1.el7_3.centos zfs
spl.x86_64 0.6.5.8-1.el7_3.centos zfs
spl-debuginfo.x86_64 0.6.5.8-1.el7_3.centos zfs
spl-dkms.noarch 0.6.5.8-1.el7_3.centos zfs
zfs.x86_64 0.6.5.8-1.el7_3.centos zfs
zfs-debuginfo.x86_64 0.6.5.8-1.el7_3.centos zfs
zfs-dkms.noarch 0.6.5.8-1.el7_3.centos zfs
zfs-dracut.x86_64 0.6.5.8-1.el7_3.centos zfs
zfs-test.x86_64 0.6.5.8-1.el7_3.centos zfs
[root@zfs ~]#
下記コマンドでzfsのインストールを行います。
[root@zfs ~]# yum install zfs
この直後にzpoolコマンドを実行すると
[root@zfs ~]# zpool list
The ZFS modules are not loaded.
Try running '/sbin/modprobe zfs' as root to load them.
[root@zfs ~]#
といわれます。/sbin/modprobe zfsを実行してzfsが利用可能になるのですが、再起動すると外れる。。。
それを回避するには
[root@zfs ~]# systemctl enable zfs-import-cache
[root@zfs ~]# systemctl enable zfs-mount
[root@zfs ~]# systemctl enable zfs-import.target
を有効にしておく
*zfsのマウントポイントが存在した場合、この方式で再起動後でもzfsカーネルモジュールが外れなく、zfsマウントが反映されるって感じかな
まずは、zfsカーネルモジュール zfs.ko をロードします
[root@zfs ~]# /sbin/modprobe zfs
そして、zfsストレージプールを作成します。
プールの性格をストライピングにするなら
[root@zfs ~]# zpool create tank /dev/sdb /dev/sdc /dev/sdd /dev/sde
とします。確認は
[root@zfs ~]# zpool status tank
pool: tank
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
errors: No known data errors
[root@zfs ~]#
にて行える。
このストレージプールを作成すると同時にファイルシステムにも登録される
[root@zfs ~]# df -lTh -F zfs
ファイルシス タイプ サイズ 使用 残り 使用% マウント位置
tank zfs 985G 0 985G 0% /tank
[root@zfs ~]#
この大本のストレージプールからサブボリュームを作成して、それを特定のマウントポイントにするには
[root@zfs ~]# zfs create tank/scratch
[root@zfs ~]# df -lTh -F zfs
ファイルシス タイプ サイズ 使用 残り 使用% マウント位置
tank zfs 985G 0 985G 0% /tank
tank/scratch zfs 985G 0 985G 0% /tank/scratch
[root@zfs ~]#
[root@zfs ~]# zfs umount tank/scratch
[root@zfs ~]# df -lTh -F zfs
ファイルシス タイプ サイズ 使用 残り 使用% マウント位置
tank zfs 985G 0 985G 0% /tank
[root@zfs ~]#
[root@zfs ~]# mkdir /scratch
[root@zfs ~]# zfs set mountpoint=/scratch tank/scratch
[root@zfs ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 95K 984G 19K /tank
tank/scratch 19K 984G 19K /scratch
[root@zfs ~]#
[root@zfs ~]# df -lTh -F zfs
ファイルシス タイプ サイズ 使用 残り 使用% マウント位置
tank zfs 985G 0 985G 0% /tank
[root@zfs ~]#
[root@zfs ~]# zfs mount tank/scratch
[root@zfs ~]# df -lTh -F zfs
ファイルシス タイプ サイズ 使用 残り 使用% マウント位置
tank zfs 985G 0 985G 0% /tank
tank/scratch zfs 985G 0 985G 0% /scratch
[root@zfs ~]#
作ったストレージプールを解消するには
zpool destroy <ストレージプール>
とする
一時ファイルの置き場所としてなのなら
[root@zfs ~]# chmod 1777 /scratch
[root@zfs ~]# ls -ld /scratch
drwxrwxrwt 3 root root 4 12月 21 22:38 /scratch
[root@zfs ~]#
とする
[root@ss1 ~]# crontab -e
55 23 * * 5 /usr/sbin/zpool scrub tank
cat /proc/spl/kstat/zfs/arcstats
arcstat.py 10 10
zfs set atime=off tank
[root@zfs ~]# zpool create tank raidz1 ata-WDC_WD60EFRX-68L0BN1_WD-WXxxxxxxxxx1 \
ata-WDC_WD60EFRX-68L0BN1_WD-WXxxxxxxxxx2 \
ata-WDC_WD60EFRX-68L0BN1_WD-WXxxxxxxxxx3 \
ata-WDC_WD60EFRX-68L0BN1_WD-WXxxxxxxxxx4 \
ata-WDC_WD60EFRX-68L0BN1_WD-WXxxxxxxxxx5 \
ata-WDC_WD60EFRX-68L0BN1_WD-WXxxxxxxxxx6 \
ata-WDC_WD60EFRX-68L0BN1_WD-WXxxxxxxxxx7 \
ata-WDC_WD60EFRX-68L0BN1_WD-WXxxxxxxxxx8
[root@zfs ~]# zpool list
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
tank 43.5T 1.45M 43.5T - 0% 0% 1.00x ONLINE -
[root@zfs ~]# zpool status
pool: tank
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WXxxxxxxxxx1 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WXxxxxxxxxx2 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WXxxxxxxxxx3 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WXxxxxxxxxx4 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WXxxxxxxxxx5 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WXxxxxxxxxx6 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WXxxxxxxxxx7 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WXxxxxxxxxx8 ONLINE 0 0 0
errors: No known data errors
[root@zfs ~]# zfs get all tank
:
tank dedup off default
:
[root@zfs ~]#
log
[root@zfs ~]# zpool add tank log -f /dev/sdi1
[root@zfs ~]# zpool status
pool: tank
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WXxxxxxxxxx1 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WXxxxxxxxxx2 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WXxxxxxxxxx3 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WXxxxxxxxxx4 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WXxxxxxxxxx5 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WXxxxxxxxxx6 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WXxxxxxxxxx7 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WXxxxxxxxxx8 ONLINE 0 0 0
logs
sdi1 ONLINE 0 0 0
errors: No known data errors
[root@zfs ~]#
zpool iostat
capacity operations bandwidth
pool alloc free read write read write
-------------------------------------------- ----- ----- ----- ----- ----- -----
tank 30.1T 13.4T 0 19.4K 0 878M
raidz1 30.1T 13.4T 0 19.4K 0 878M
ata-WDC_WD60EFRX-68L0BN1_WD-WX41DA55Sxxx - - 0 2.49K 0 109M
ata-WDC_WD60EFRX-68L0BN1_WD-WX41D95Pxxxx - - 0 2.15K 0 111M
ata-WDC_WD60EFRX-68L0BN1_WD-WXN1H8xxxxxx - - 0 2.44K 0 110M
ata-WDC_WD60EFRX-68L0BN1_WD-WXB1HB4xxxxx - - 0 2.21K 0 110M
ata-WDC_WD60EFRX-68L0BN1_WD-WX21Dxxxxxxx - - 0 2.56K 0 110M
ata-WDC_WD60EFRX-68L0BN1_WD-WXN1xxxxxxxW - - 0 2.48K 0 108M
ata-WDC_WD60EFRX-68L0BN1_WD-WXB1xxxxxxxN - - 0 2.89K 0 110M
ata-WDC_WD60EFRX-68L0BN1_WD-WXB1xxxxxxPK - - 0 2.17K 0 110M
logs - - - - - -
sdi1 0 256G 0 0 0 0
1.4TBのファイル削除に 52sec要した
18GBなら0.45sec
47GBなら1.5sec
80GBなら2.8sec
zpool を /dev/sdb, /dev/sdc とかで作ってしまい
[root@zfs ~]# zpool status
pool: tank
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
errors: No known data errors
[root@zfs ~]#
この状態でデバイスを追加して sdc が sdd と変更されると zpool は構成できない.
このsdb, sdc をもっと固有の名前に変更するには
[root@zfs ~]# zpool export tank
と一旦プールをアンマウントさせて
「/dev/disk/by-id」か「/dev/disk/by-path」で再構成する
[root@zfs ~]# zpool import -d /dev/disk/by-path -aN
「-d」dir|device
Uses device or searches for devices or files in dir. The -d option can be specified multiple times.
「-a」Searches for and imports all pools found.
「-N」Import the pool without mounting any file systems.
これで下記のように切り替わる
[root@zfs ~]# zpool status
pool: tank
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
pci-0000:03:00.0-scsi-0:0:1:0 ONLINE 0 0 0
pci-0000:03:00.0-scsi-0:0:3:0 ONLINE 0 0 0
errors: No known data errors
[root@zfs ~]#
ただ「-N」を入れたのでmountは行われない。マウントするには
[root@zfs ~]# zfs mount tank
とする。これで正常に切り替わり、ファイルシステムが使えることを確認できる
この後にストレージを追加して sdc が sdd に変わっても問題なくzpoolが使える