存储池
创建基本存储池
创建一个名为mypool的新池,该池由磁盘sde组成。
zpool create -f mypool raidz sde
-f : 忽略磁盘分区标签。
raidz: 突袭级别,是RAID-5的变体。(???)
创建完成之后,查看挂载情况如下:
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
···
mypool 193G 128K 193G 1% /mypool
磁盘sde自动分区情况如下:
[root@localhost ~]# lsblk
···
sde 8:64 0 200G 0 disk
├─sde1 8:65 0 200G 0 part
└─sde9 8:73 0 8M 0 part
创建镜像存储池
zpool cerate -f mypool mirror sdb sdc mirror sdd sde
存储池添加磁盘
zpool add {zfspoolname} {device} -f
查看存储池状态
zpool status
zpool status -v
zpool status mypool
查看存储池的I/O统计信息
zpool iostat -v mypool
删除ZFS存储池
zpool destroy mypool
管理文件系统
创建ZFS文件系统
存储池建好之后,还需要在存储池中创建ZFS文件系统(也就是数据集dataset)。
例:在mypool/home文件系统中创建一个名为zhangsan的文件系统。
zfs create mypool/home/zhangsan
注意建的文件系统需要逐层目录建立,否则会报错"parent does not exist":
[root@localhost ~]# zfs create mypool/home/zhangsan
cannot create 'mypool/home/zhangsan': parent does not exist
[root@localhost ~]# zfs create mypool/home
[root@localhost ~]# ll /mypool
总用量 1
drwxr-xr-x. 2 root root 2 12月 26 14:22 home
[root@localhost ~]# ll /mypool/home
总用量 0
[root@localhost ~]# zfs create mypool/home/zhangsan
[root@localhost ~]# ll /mypool/home
总用量 1
drwxr-xr-x. 2 root root 2 12月 26 14:22 zhangsan
[root@localhost ~]# ll /mypool/home/zhangsan/
总用量 0
[root@localhost ~]#
建好文件系统之后,zfs会自动挂载该文件系统。
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
···
mypool 193G 128K 193G 1% /mypool
mypool/home 193G 128K 193G 1% /mypool/home
mypool/home/zhangsan 193G 128K 193G 1% /mypool/home/zhangsan
[root@localhost ~]#
挂载点也可以通过命令行参数指定。
例:在mypool/home文件系统中创建一个名为lisi的文件系统,并挂在到/data/lisi
zfs create -o mountpoint=/data/list mypool/home/lisi
lisi的挂载情况:
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
···
mypool 193G 128K 193G 1% /mypool
mypool/home 193G 128K 193G 1% /mypool/home
mypool/home/zhangsan 193G 128K 193G 1% /mypool/home/zhangsan
mypool/home/lisi 193G 128K 193G 1% /data/list
查看ZFS文件系统
[root@localhost ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
mypool 252K 193G 25.5K /mypool
mypool/home 73.5K 193G 25.5K /mypool/home
mypool/home/lisi 24K 193G 24K /data/list
mypool/home/zhangsan 24K 193G 24K /mypool/home/zhangsan
重命名ZFS文件系统
重命名后的新位置必须要在同一个池中。
例:将mypool/home/lisi文件系统重命名为mypool/home/lisisi
zfs rename mypool/home/lisi mypool/home/lisisi
例:将将mypool/home/lisi文件系统重命名为mypool/otherhome/lisisi
zfs rename mypool/home/lisi mypool/otherhome/lisisi
销毁ZFS文件系统
例:销毁创建出来的lisi文件系统。
销毁之后,lisi的挂载点也会自动删除。
zfs destroy mypool/home/lisi
如果lisi文件系统正在使用,也可以强制删除:
zfs destroy -f mypool/home/lisi
如果lisi文件系统中有子目录,需要递归删除:
zfs destroy -r mypool/home/lisi
如果lisi文件系统具有间接依赖项,需要使用-R选项:
zfs destroy -R mypool/home/lisi
创建ZFS文件系统快照
快照名称需要满足ZFS组件命名要求:
- 每个组件只能包含字母、数字以及"_"、“-”、“:”、“.”。
- 池名称必须以字母开头,但有几点限制:
不能起名为log,log是保留名称。
不允许以mirror、raidz、raidz1、raidz2、raidz3或spare开头,这些名称也是保留名称。
数据集名称不得包含百分比符号(%)。
数据集名称必须以字母、数字字符开头。
数据集名称不得包含百分比符号(%)。
例:给mypool/home/zhangsan文件系统创建快照,名称为zhangsan_snap。
zfs snapshot mypool/home/zhangsan@zhangsan_snap
如果zhangsan有子目录,添加-r参数
zfs snapshot -r mypool/home/zhangsan@zhangsan_snap
查看ZFS文件系统快照
查看上方创建的快照信息:
zfs list -t snapshot -r mypool/home
输出信息如下:
[root@localhost ~]# zfs list -t snapshot -r mypool/home
NAME USED AVAIL REFER MOUNTPOINT
mypool/home/zhangsan@zhangsan_snap 0B - 24K -
[root@localhost ~]# zfs list -t snapshot -r mypool/home/zhangsan
NAME USED AVAIL REFER MOUNTPOINT
mypool/home/zhangsan@zhangsan_snap 0B - 24K -
销毁ZFS文件系统快照
例:销毁快照mypool/home/zhangsan@zhangsan_snap。
zfs destroy mypool/home/zhangsan@zhangsan_snap
在没有删除快照的情况下,删除数据集,会报错cannot destroy ‘mypool/home/zhangsan’: filesystem has children:
从报错看出打出来的快照也是一个数据集。
[root@localhost ~]# zfs destroy mypool/home/zhangsan
cannot destroy 'mypool/home/zhangsan': filesystem has children
use '-r' to destroy the following datasets:
mypool/home/zhangsan@zhangsan_snap
重命名ZFS快照
例:将快照mypool/home/zhangsan@zhangsan_snap重命名为mypool/home/zhangsan@zhangsan_snap1
zfs rename mypool/home/zhangsan@zhangsan_snap mypool/home/zhangsan@zhangsan_snap1
比对ZFS快照差异
给zhangsan文件系统中写入一个文件,重新打快照
[root@localhost ~]# date > /mypool/home/zhangsan/date.txt
[root@localhost ~]# zfs snapshot mypool/home/zhangsan@zhangsan_snap2
[root@localhost ~]# zfs list -t snapshot -r mypool/home
NAME USED AVAIL REFER MOUNTPOINT
mypool/home/zhangsan@zhangsan_snap1 22K - 24K -
mypool/home/zhangsan@zhangsan_snap2 0B - 26K -
[root@localhost ~]#
比对两次快照的差异:
[root@localhost ~]# zfs diff mypool/home/zhangsan@zhangsan_snap1 mypool/home/zhangsan@zhangsan_snap2
+ /mypool/home/zhangsan/date.txt
+ /mypool/home/zhangsan/date.txt/<xattrdir>
+ /mypool/home/zhangsan/date.txt/<xattrdir>/security.selinux
M /mypool/home/zhangsan/
回滚ZFS快照
将zhangsan的文件内容回滚到快照mypool/home/zhangsan@zhangsan_snap1状态,这个快照状态下zhangsan目录下没有文件。
观察下方输出,发现创建的文件date.txt确实不见了。
[root@localhost ~]# ll /mypool/home/zhangsan/ -a
总用量 2
drwxr-xr-x. 2 root root 3 12月 26 15:02 .
drwxr-xr-x. 3 root root 3 12月 26 14:22 ..
-rw-r--r--. 1 root root 43 12月 26 15:02 date.txt
[root@localhost ~]# zfs rollback mypool/home/zhangsan@zhangsan_snap1
cannot rollback to 'mypool/home/zhangsan@zhangsan_snap1': more recent snapshots or bookmarks exist
use '-r' to force deletion of the following snapshots and bookmarks:
mypool/home/zhangsan@zhangsan_snap2
[root@localhost ~]# zfs rollback -r mypool/home/zhangsan@zhangsan_snap1
[root@localhost ~]# ll /mypool/home/zhangsan -a
总用量 1
drwxr-xr-x. 2 root root 2 12月 26 14:22 .
drwxr-xr-x. 3 root root 3 12月 26 14:22 ..
[root@localhost ~]#
回滚到snap1之后,在snap1之后创建的快照会被销毁。
[root@localhost ~]# zfs list -t snapshot -r mypool/home
NAME USED AVAIL REFER MOUNTPOINT
mypool/home/zhangsan@zhangsan_snap1 13K - 24K -
[root@localhost ~]#
创建ZFS克隆
克隆是基于快照进行克隆。
例:基于快照mypool/home/zhangsan@zhangsan_snap2创建克隆 mypool/home/zhangsan_clone
zfs clone mypool/home/zhangsan@zhangsan_snap2 mypool/home/zhangsan_clone
创建克隆之后,检查克隆出的数据集:
[root@localhost ~]# zfs clone mypool/home/zhangsan@zhangsan_snap2 mypool/home/zhangsan_clone
[root@localhost ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
mypool 356K 193G 25.5K /mypool
mypool/home 97.5K 193G 25.5K /mypool/home
mypool/home/lisi 24K 193G 24K /data/list
mypool/home/zhangsan 48K 193G 26K /mypool/home/zhangsan
mypool/home/zhangsan_clone 0B 193G 26K /mypool/home/zhangsan_clone
[root@localhost ~]# ll /mypool/home/zhangsan_clone
总用量 1
-rw-r--r--. 1 root root 43 12月 26 15:20 date.txt
[root@localhost ~]# ll /mypool/home/
总用量 1
drwxr-xr-x. 2 root root 3 12月 26 15:20 zhangsan
drwxr-xr-x. 2 root root 3 12月 26 15:20 zhangsan_clone
[root@localhost ~]#
销毁ZFS克隆
zfs destroy mypool/home/zhangsan_clone
参考资料
- 使用 zpool 命令示例在 Linux 上设置 ZFS 文件系统-云社区-华为云
- 创建、销毁和重命名 ZFS 文件系统 - Oracle Solaris 管理:ZFS 文件系统
- ZFS 快照概述 - Oracle Solaris 管理:ZFS 文件系统
- ZFS 克隆概述 - Oracle Solaris 管理:ZFS 文件系统
- 深入理解zfs文件系统.pdf