#author("2021-08-02T06:57:44+00:00","default:sysosa","sysosa")
CentOS7でzfsを動かしてみる
&size(10){FreeBSDでzfs [[FreeBSD/zfs]]};

CentOS7のyumには登録されていないパッケージで、ライセンス的に?なのですが、使いたいから入れてみた。

minimumで仮想CentOS7を作り、そこにzfs向けとして256GB(Thin Provision)のHDD4本を追加した
#code(nonumber){{
[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 ~]#
}}
&color(white,blue){留意};
この4つの仮想HDD(sdb,sdc,sdd,sde)は parted で &color(orchid){mklabel gpt}; とします。(参照: [[ubuntu/zfs#fa90acb2]])
#code(nonumber){{
[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 ~]#
}}


***リポジトリの登録 [#y2500173]
ZFS on Linux[[http://zfsonlinux.org/>+http://zfsonlinux.org/]]にRHEL/CentOS向けのリポジトリがある。これを登録する

#code(nonumber){{
[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 に&color(magenta){zfs.repo};が配置される。

#code(nonumber){{
[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には&color(orangered){epel};リポジトリ提供の &color(magenta){dkms};パッケージ が必要です。
なのでその&color(orangered){epel};のリポジトリも登録します
#code(nonumber){{
[root@zfs ~]# yum install epel-release
}}

***zfsのインストール [#lb8b1022]

次に、実際にzfs関連モジュールをインストールしますが、確認として&color(magenta){zfs.repo};で提供される中身を見てみる
#code(nonumber){{
[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のインストールを行います。
#code(nonumber){{
[root@zfs ~]# yum install zfs
}}
この直後に&color(orangered){zpool};コマンドを実行すると
#code(nonumber){{
[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が利用可能になるのですが、再起動すると外れる。。。
それを回避するには
#code(nonumber){{
[root@zfs ~]# systemctl enable zfs-import-cache
[root@zfs ~]# systemctl enable zfs-mount
[root@zfs ~]# systemctl enable zfs-import.target
}}
を有効にしておく
&color(red){*};&size(10){zfsのマウントポイントが存在した場合、この方式で再起動後でもzfsカーネルモジュールが外れなく、zfsマウントが反映されるって感じかな};


***ストレージプール作成 [#s4c09cb5]
まずは、zfsカーネルモジュール &color(orange){zfs.ko}; をロードします
#code(nonumber){{
[root@zfs ~]# /sbin/modprobe zfs
}}

そして、zfsストレージプールを作成します。
プールの&color(darkmagenta){性格};をストライピングにするなら
#code(nonumber){{
[root@zfs ~]# zpool create tank /dev/sdb /dev/sdc /dev/sdd /dev/sde
}}
とします。確認は
#code(nonumber){{
[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 ~]#
}}
にて行える。
このストレージプールを作成すると同時にファイルシステムにも登録される
#code(nonumber){{
[root@zfs ~]# df -lTh -F zfs
ファイルシス   タイプ サイズ  使用  残り 使用% マウント位置
tank           zfs      985G     0  985G    0% /tank
[root@zfs ~]#
}}
この大本のストレージプールからサブボリュームを作成して、それを特定のマウントポイントにするには
#code(nonumber){{
[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 ~]#
}}

***ストレージプールの解消 [#b79a7eeb]
作ったストレージプールを解消するには
zpool destroy <ストレージプール>
とする


*** scratch のパーミッション変更 [#afb4a063]
一時ファイルの置き場所としてなのなら
#code(nonumber){{
[root@zfs ~]# chmod 1777 /scratch

[root@zfs ~]# ls -ld /scratch
drwxrwxrwt 3 root root 4 12月 21 22:38 /scratch
[root@zfs ~]#
}}
とする


***scrub [#he3f5cb9]
#code(nonumber){{
[root@ss1 ~]# crontab -e
55 23 * * 5 /usr/sbin/zpool scrub tank
}}

***(めも) [#i5e85507]
cat /proc/spl/kstat/zfs/arcstats
arcstat.py 10 10
zfs set atime=off tank

***raid-z [#ud87cb2f]
#code(nonumber){{
[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
#code(nonumber){{
[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
#code(nonumber){{
                                                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
}}
***めも [#b836b663]
1.4TBのファイル削除に 52sec要した
18GBなら0.45sec
47GBなら1.5sec
80GBなら2.8sec

***zpoolを /dev/sdX で作ってしまったら... [#kf0981eb]
zpool を /dev/sdb, /dev/sdc とかで作ってしまい
#code(nonumber){{
[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 をもっと固有の名前に変更するには
#code(nonumber){{
[root@zfs ~]# zpool export tank
}}
と一旦プールをアンマウントさせて
「/dev/disk/by-id」か「/dev/disk/by-path」で再構成する

#code(nonumber){{
[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.

}}

これで下記のように切り替わる
#code(nonumber){{
[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は行われない。マウントするには
#code(nonumber){{
[root@zfs ~]# zfs mount tank
}}
とする。これで正常に切り替わり、ファイルシステムが使えることを確認できる
この後にストレージを追加して sdc が sdd に変わっても問題なくzpoolが使える
1

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS