ZFS概念

  • ZFS(Zettabyte File System)文件系统也叫动态文件系统(Dynamic File System),是第一个128位文件系统。ZFS 强健、可伸缩,且易于管理。
  • ZFS 使用存储池的概念来管理物理存储。ZFS 将设备聚集到存储池中,而不是强制要求创建虚拟卷。
  • 存储池描述了存储的物理特征(设备布局、数据冗余等),并充当可以从其创建文件系统的任意数据存储库。文件系统不再受限于单个设备,允许它们与池中的所有文件系统共享磁盘空间。

ZFS安装

  • 查看CentOS的版本安装对应的rpm包
[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core)
如果是其他版本的将el7_n,中的n修改为对应的版本号就可以了
[root@localhost ~]# yum install http://download.zfsonlinux.org/epel/zfs-release.el7_5.noarch.rpm -y

出现Complete!则表示成功。

  • 修改文件/etc/yum.repo.d/zfs.repo,将[zfs-kmod]下的enabled数值改为1
  • 执行yum命令安装zfs
[root@localhost ~]# yum install zfs -y

出现Complete!则表示成功。

  • 执行lsmod | grep zfs查看是否加载到内核,若未加载到内核,则执行modprobe zfs将zfs加载到内核。
[root@localhost ~]# lsmod | grep zfs
[root@localhost ~]# modprobe zfs
[root@localhost ~]# lsmod | grep zfs
zfs                  3564468  0 
zunicode              331170  1 zfs
zavl                   15236  1 zfs
icp                   270148  1 zfs
zcommon                73440  1 zfs
znvpair                89131  2 zfs,zcommon
spl                   102412  4 icp,zfs,zcommon,znvpair

内核中存在zfs相关模块,说明加载成功,接下来就可以使用zfs相关功能了。

ZFS使用之存储池(zpool)

  1. zfs 存储池相关概念
  • 存储池的最基本元素是物理存储器。理存储器可以是大小至少为 128 MB 的任何块设备。通常,此设备是 /dev/dsk 目录中对系统可见的一个硬盘驱动器。
  • 存储设备可以是整个磁盘 (c1t0d0) 或单个分片 (c0t0d0s7)。建议的操作模式是使用整个磁盘,在这种情况下,无需对磁盘进行特殊格式化。ZFS 可格式化使用 EFI 标签的磁盘以包含单个大分片。
  1. 创建 ZFS 存储池(此处仅介绍基本存储池的相关操作)
    zpool create tank c1t0d0 c1t1d0 #创建了一个名为 tank 的新池,该池由磁盘 c1t0d0 和 c1t1d0 组成
  • 可以使用 zpool list 来查看存储池列表
[root@localhost ~]# zpool create tank /dev/sdc /dev/sdd
[root@localhost ~]# zpool list
NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank  39.8G   747K  39.7G         -     0%     0%  1.00x  ONLINE  -
  1. 向存储池添加设备
    zpool add tank c2t1d0 #向存储池tank中添加设备
  • 可以使用zpool status zpoolname查看存储池的状态信息
[root@localhost ~]# zpool add tank /dev/sde

[root@localhost ~]# zpool status tank
  pool: tank
 state: ONLINE
  scan: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	tank        ONLINE       0     0     0
	  sdc       ONLINE       0     0     0
	  sdd       ONLINE       0     0     0
	  sde       ONLINE       0     0     0

errors: No known data errors
  1. 销毁存储池
    zpool destroy zpoolname
[root@localhost ~]# zpool destroy zpooltest1
[root@localhost ~]# zpool list
NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank  59.6G   120K  59.6G         -     0%     0%  1.00x  ONLINE  -
  1. 查看存储池相关信息(zpool list和zpool ststus见前文)
  • 显示特定的存储池统计信息
    zpool list -o name,size
[root@localhost ~]# zpool list -o name,size
NAME         SIZE
tank        59.6G
zpooltest1  9.94G
  • 显示 ZFS 存储池命令历史记录
    zpool history
[root@localhost ~]# zpool history tank
History for 'tank':
2020-03-01.16:44:27 zpool create tank /dev/sdc /dev/sdd
2020-03-01.16:52:00 zpool add tank /dev/sde

[root@localhost ~]# zpool history
History for 'tank':
2020-03-01.16:44:27 zpool create tank /dev/sdc /dev/sdd
2020-03-01.16:52:00 zpool add tank /dev/sde

History for 'zpooltest1':
2020-03-01.17:09:02 zpool create zpooltest1 /dev/sdb

  • 查看 ZFS 存储池的 I/O 统计信息
    zpool iostat
[root@localhost ~]# zpool iostat
              capacity     operations     bandwidth 
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
tank         120K  59.6G      0      0     46  5.79K
zpooltest1   108K  9.94G      0      1    223  15.6K
----------  -----  -----  -----  -----  -----  -----
[root@localhost ~]# zpool iostat tank
              capacity     operations     bandwidth 
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
tank         120K  59.6G      0      0     46  5.75K

ZFS使用之文件系统

  1. 创建文件系统
  • zfs create tank/test1 #在 tank中创建了一个名为 test1 的文件系统
    如果新文件系统创建成功,则 ZFS 会自动挂载该文件系统。
[root@localhost ~]# zfs create tank/test1
[root@localhost ~]# zfs list
NAME         USED  AVAIL  REFER  MOUNTPOINT
tank         123K  57.8G    24K  /tank
tank/test1    24K  57.8G    24K  /tank/test1
  • 也可在创建文件系统时设置文件系统属性:
    zfs create -o mountpoint=/export/zfs tank/test2 #创建tank/test2 文件系统,并为其创建挂载点 /export/zfs
[root@localhost ~]# zfs create -o mountpoint=/export/zfs tank/test2
[root@localhost ~]# zfs list
NAME         USED  AVAIL  REFER  MOUNTPOINT
tank         160K  57.8G    24K  /tank
tank/test1    24K  57.8G    24K  /tank/test1
tank/test2    24K  57.8G    24K  /export/zfs
  1. 销毁文件系统
    zfs destroy tank/test1 #销毁tank/test1 文件系统。如果要销毁的文件系统处于繁忙状态而无法取消挂载,则 zfs destroy 命令将失败。要销毁活动文件系统,请使用 -f 选项。由于此选项可取消挂载、取消共享和销毁活动文件系统,从而导致意外的应用程序行为,因此请谨慎使用此选项。
[root@localhost ~]# zfs destroy tank/test1 -f
[root@localhost ~]# zfs list
NAME         USED  AVAIL  REFER  MOUNTPOINT
tank         728K  57.8G    24K  /tank
tank/test2    24K  57.8G    24K  /export/zfs
  1. 重命名 文件系统
    zfs rename tank/test2 tank/testrename #将文件系统tank/test2重命名为/tankrename
[root@localhost ~]# zfs rename tank/test2 tank/rename
[root@localhost ~]# zfs list
NAME          USED  AVAIL  REFER  MOUNTPOINT
tank          141K  57.8G    24K  /tank
tank/rename    24K  57.8G    24K  /export/zfs

ZFS使用之 ZFS volumn(zfs卷)

  1. 创建
  • zfs create [-ps] [-b blocksize] [-o property=value] … -V [size] [volume]
    zfs create -V 20G tank/testvolumn1 #创建zfs卷
[root@localhost ~]# zfs create -V 20G tank/testvolumn1
[root@localhost ~]# zfs list
NAME               USED  AVAIL  REFER  MOUNTPOINT
tank              20.6G  37.1G    24K  /tank
tank/rename         24K  37.1G    24K  /export/zfs
tank/testvolumn1  20.6G  57.8G    12K  -
  • 格式化文件系统
    mkfs.fs /dev/pool_name/volume_name
    mkfs.ext3 /dev/tank/testvolumn1 #格式化zfs卷为ext3文件系统
    使用lsblk -f查看磁盘信息,存在新建的volumn信息:
[root@localhost ~]# lsblk -f
...
zd0             ext3                        1a5c6d71-1975-4c01-bc9e-94d3febcf011
  • 挂载卷
    创建挂载点:mkdir /testvolumn1
    挂载:mount /dev/tank/testvolumn1 /testcolumn1
    使用lsblk -f可以看到该volumn信息,使用df -h可以看到挂载信息
[root@localhost ~]# mkdir /testvolumn1
[root@localhost ~]# mount /dev/tank/testvolumn1 /testvolumn1/
[root@localhost ~]# lsblk -f
...
zd0             ext3                        1a5c6d71-1975-4c01-bc9e-94d3febcf011   /testvolumn1
[root@localhost ~]# df -h
...
/dev/zd0                  20G   45M   19G   1% /testvolumn1
  1. 重命名
    zfs rename
    zfs rename oldvolumnname newvolumnname #重命名zfs逻辑卷
    使用lsblk -f查看磁盘信息,存在新建的volumn信息:
[root@localhost ~]# zfs rename tank/testvolumn1 tank/testvolumnrename
[root@localhost ~]# zfs list
NAME                    USED  AVAIL  REFER  MOUNTPOINT
tank                   20.6G  37.1G    24K  /tank
tank/rename              24K  37.1G    24K  /export/zfs
tank/testvolumnrename  20.6G  57.3G   455M  -

3.销毁
zfs sestroy (volumn未挂载的情况下)

[root@localhost ~]# zfs destroy tank/testvolumnrename -f
[root@localhost ~]# zfs list
NAME          USED  AVAIL  REFER  MOUNTPOINT
tank          171K  57.8G    24K  /tank
tank/rename    24K  57.8G    24K  /export/zfs

ZFS使用之快照和克隆

以下操作大部分皆适用于ZFS文件系统&volumn,特殊情形会在相对应的部分标出。

  1. 快照
  • 概述
    • 快照是文件系统或卷的只读副本。快照几乎可以即时创建,而且最初不占用池中的其他磁盘空间。但是,活动数据集中的数据更改时,快照仍将继续引用旧数据,这会占用磁盘空间,从而阻止释放磁盘空间。
    • ZFS 快照具有以下特征:
      可在系统重新引导后存留下来。
      理论最大快照数是 2的64次方。
      快照不使用单独的后备存储。快照直接占用存储池(从中创建这些快照的文件系统或卷所在的存储池)中的磁盘空间。
      递归快照可作为一个原子操作快速创建。要么一起创建快照(一次创建所有快照),要么不创建任何快照。原子快照操作的优点是始终在一个一致的时间捕获快照数据,即使跨后代文件系统也是如此。
      注意:无法直接访问卷的快照,但是可以对它们执行克隆、备份、回滚等操作。
  • 创建快照
    zfs snapshot tank/rename@sunday #将创建一个 tank/rename 的快照,其名称为 sunday。
    可以使用zfs list -t snapshot 查看快照列表
[root@localhost ~]# zfs snapshot tank/rename@sunday
[root@localhost ~]#  zfs list -t snapshot -r tank/rename
NAME                 USED  AVAIL  REFER  MOUNTPOINT
tank/rename@sunday     0B      -    24K  -
  • 回滚 ZFS 快照
    • 可以使用 zfs rollback 命令放弃自特定快照创建以来对文件系统所做的全部更改。文件系统恢复到创建快照时的状态。缺省情况下,该命令无法回滚到除最新快照以外的快照。
    • 要回滚到早期快照,必须销毁所有的中间快照。可以通过指定 -r 选项销毁早期的快照。
    • 如果存在任何中间快照的克隆,则还必须指定 -R 选项以销毁克隆。
    • - 如果要回滚的文件系统当前为挂载状态,则会取消挂载并重新挂载。如果无法取消挂载该文件系统,则回滚将失败。-f 选项可强制取消挂载文件系统(如有必要)。

zfs rollback tank/rename

[root@localhost ~]#  zfs list -t snapshot -r tank/rename
NAME                 USED  AVAIL  REFER  MOUNTPOINT
tank/rename@sunday     0B      -    24K  -
tank/rename@Monday     0B      -    24K  -
[root@localhost ~]# zfs rollback tank/rename@sunday
cannot rollback to 'tank/rename@sunday': more recent snapshots or bookmarks exist
use '-r' to force deletion of the following snapshots and bookmarks:
tank/rename@Monday
[root@localhost ~]# zfs rollback tank/rename@sunday -r
[root@localhost ~]#  zfs list -t snapshot -r tank/rename
NAME                 USED  AVAIL  REFER  MOUNTPOINT
tank/rename@sunday     0B      -    24K  -

可以看到,因为已回滚到以前的 sunday 快照,所以销毁了 Monday快照。

  • 确定不同快照间的差异(该操作不适用于zfs volumn 快照)
    zfs diff snap1 snap2
    如下为不同时间创建快照,查看快照间差异:
[root@localhost ~]# ls /export/zfs
test1
[root@localhost ~]#zfs snapshot tank/rename@snap1
[root@localhost ~]# ls /export/zfs
test1  test2
[root@localhost ~]# zfs snapshot tank/rename@snap2
[root@localhost ~]# zfs diff tank/rename@snap1 tank/rename@snap2
M	/export/zfs/
+	/export/zfs/test2
[root@localhost ~]# 

在输出中,M 表示该目录已经过修改。+ 表示 test2 存在于较新的快照中。
当输出中存在“-”时,表示文件或目录出现在较旧的快照中,但未出现在较新的快照中,当输出中存在“R”时,表示文件或目录已重命名。

  • 销毁ZFS 快照
    zfs destroy tank/rename@snap1 #销毁快照zfs destroy tank/rename@snap1
[root@localhost ~]#  zfs list -t snapshot -r tank/rename
NAME                 USED  AVAIL  REFER  MOUNTPOINT
tank/rename@sunday    14K      -    24K  -
tank/rename@snap1     13K      -    24K  -
tank/rename@snap2     13K      -    25K  -
[root@localhost ~]# zfs destroy tank/rename@snap1
[root@localhost ~]#  zfs list -t snapshot -r tank/rename
NAME                 USED  AVAIL  REFER  MOUNTPOINT
tank/rename@sunday    14K      -    24K  -
tank/rename@snap2     13K      -    25K  -
[root@localhost ~]# 
  1. 克隆
  • 概述
    • 克隆是可写入的卷或文件系统,其初始内容与从中创建它的数据集的内容相同。与快照一样,创建克隆几乎是即时的,而且最初不占用其他磁盘空间。此外,还可以创建克隆的快照。
    • 克隆只能从快照创建。克隆快照时,会在克隆和快照之间建立隐式相关性。即使克隆是在文件系统分层结构中的其他位置创建的,但只要克隆存在,就无法销毁原始快照。origin 属性显示此相关项,而 zfs destroy 命令会列出任何此类相关项(如果存在)。
    • 克隆不继承从其中创建它的数据集的属性。使用 zfs get 和 zfs set 命令,可以查看和更改克隆数据集的属性。
    • 由于克隆最初与原始快照共享其所有磁盘空间,因此其 used 属性值最初为零。随着不断对克隆进行更改,它使用的磁盘空间将越来越多。原始快照的 used 属性不包括克隆所占用的磁盘空间
  • 创建ZFS克隆
    clone [-p] [-o property=value] … <filesystem|volume>
    zfs clone tank/rename@sunday tank/clone1 #将创建一个名为 tank/clone1 的新克隆,其初始内容与快照tank/rename@sunday的内容相同
[root@localhost ~]#zfs clone tank/rename@sunday tank/clone1
[root@localhost ~]# zfs list
NAME              USED  AVAIL  REFER  MOUNTPOINT
tank             21.1G  36.7G    24K  /tank
tank/clone1         0B  36.7G    24K  /tank/clone1
tank/clone2         1K  36.7G   455M  -
tank/rename        52K  36.7G    25K  /export/zfs
tank/testvolumn  21.1G  57.3G   455M  -

可以看到新增的tank/clone1文件系统

  • 使用 ZFS 克隆替换 ZFS 文件系统
[root@localhost ~]# zfs snapshot tank/test@1
[root@localhost ~]# zfs clone tank/test@1 tank/testclone
[root@localhost ~]# zfs list
NAME              USED  AVAIL  REFER  MOUNTPOINT
tank             21.5G  36.3G    26K  /tank
tank/clone1        24K  36.3G    24K  /tank/clone1
tank/test         423M  36.3G   423M  /tank/test
tank/testclone      0B  36.3G   423M  /tank/testclone
tank/testvolumn  21.1G  56.9G   455M  -
[root@localhost ~]# zfs promote tank/testclone
[root@localhost ~]# zfs list
NAME              USED  AVAIL  REFER  MOUNTPOINT
tank             21.5G  36.3G    26K  /tank
tank/clone1        24K  36.3G    24K  /tank/clone1
tank/test           0B  36.3G   423M  /tank/test
tank/testclone    423M  36.3G   423M  /tank/testclone
tank/testvolumn  21.1G  56.9G   455M  -

根据前后输出的zfs信息可以看到,注意源 test文件系统的磁盘空间记帐信息已被testclone文件系统取代。

  • 销毁ZFS克隆
    zfs destroy
[root@localhost ~]# zfs list -r tank
NAME              USED  AVAIL  REFER  MOUNTPOINT
tank             21.1G  36.7G    25K  /tank
tank/clone1        24K  36.7G    24K  /tank/clone1
tank/clone2         1K  36.7G   455M  -
tank/testvolumn  21.1G  57.3G   455M  -
[root@localhost ~]# zfs destroy tank/clone2
[root@localhost ~]# zfs list
NAME              USED  AVAIL  REFER  MOUNTPOINT
tank             21.1G  36.7G    25K  /tank
tank/clone1        24K  36.7G    24K  /tank/clone1
tank/testvolumn  21.1G  57.3G   455M  -

可参考链接:https://docs.oracle.com/cd/E26926_01/html/E25826/gbchp.html