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)
- zfs 存储池相关概念
- 存储池的最基本元素是物理存储器。理存储器可以是大小至少为 128 MB 的任何块设备。通常,此设备是 /dev/dsk 目录中对系统可见的一个硬盘驱动器。
- 存储设备可以是整个磁盘 (c1t0d0) 或单个分片 (c0t0d0s7)。建议的操作模式是使用整个磁盘,在这种情况下,无需对磁盘进行特殊格式化。ZFS 可格式化使用 EFI 标签的磁盘以包含单个大分片。
-
创建 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 -
- 向存储池添加设备
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
-
销毁存储池
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 -
- 查看存储池相关信息(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使用之文件系统
- 创建文件系统
-
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
-
销毁文件系统
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
-
重命名 文件系统
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卷)
- 创建
-
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
- 重命名
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,特殊情形会在相对应的部分标出。
- 快照
- 概述
- 快照是文件系统或卷的只读副本。快照几乎可以即时创建,而且最初不占用池中的其他磁盘空间。但是,活动数据集中的数据更改时,快照仍将继续引用旧数据,这会占用磁盘空间,从而阻止释放磁盘空间。
-
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 ~]#
- 克隆
- 概述
- 克隆是可写入的卷或文件系统,其初始内容与从中创建它的数据集的内容相同。与快照一样,创建克隆几乎是即时的,而且最初不占用其他磁盘空间。此外,还可以创建克隆的快照。
- 克隆只能从快照创建。克隆快照时,会在克隆和快照之间建立隐式相关性。即使克隆是在文件系统分层结构中的其他位置创建的,但只要克隆存在,就无法销毁原始快照。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