FreeBSD的 ZFS 果然不让人失望,在保证数据安全的前提下,效率也非常的高。4块硬盘组成的raidz较NVME固态硬盘的速率略低,但不明显。

而快照则是ZFS更核心的功能,ZFS可以达到秒级创建快照,这个速度严重的超出了自己的认知。

创建数据集(档案系统)

zfs并不是可以直接对所有的文件夹设置快照的,要想对某个文件夹设置快照,则需要先建立档案系统(数据集),比如我当前存在存储池yzpool,则可以使用以下命令建立存储池:

# zfs create yzpool/data
# zfs create yzpool/data/hosts
# zfs create yzpool/data/hosts/20pro

注意:在建立数据集时,需要由父到子依次建立。

此时我们便建立了3个数据集,分别是data, data/hosts以及data/hosts/20pro。然后我们便可以对这个20pro文件夹设置快照了。

如果我们想更方便的管理数据集,还可以使用zfs set mountpoint=/mnt/mydataset poolname/mydataset来挂载数据集。

创建快照

此时进入data/hosts/20pro文件夹,并创建一个测试文件:echo "sfsdf" >> hello.text,然后执行

# zfs snapshot yzpool/data/hosts/20pro@22-11-19

便成功的创建了第一个快照,快照创建的位置位于yzpool/data/hosts/20pro文件夹下的.zfs/snapshot子文件夹,可以使用ls命令来直接查看。

# ls -a -l .zfs/snapshot/ 
total 1
dr-xr-xr-x+ 3 root  wheel  3 Nov 20 01:50 .
dr-xr-xr-x+ 3 root  wheel  3 Nov 20 01:48 ..
drwxr-xr-x  2 root  wheel  3 Nov 20 01:49 22-11-19

顺便看一下快照大小:

# du .zfs/snapshot/
7    .zfs/snapshot/22-11-19
7    .zfs/snapshot/

创建恢复快照

接着我们新增一个文件,并且修改原文件:

root@nfs:/yzpool/data/hosts/20pro # echo "123" >> hello.text 
root@nfs:/yzpool/data/hosts/20pro # cat hello.text 
sfsdf
123
root@nfs:/yzpool/data/hosts/20pro # echo "456" >> text.text
root@nfs:/yzpool/data/hosts/20pro # cat text.text 
456

然后我们再建立个快照:

root@nfs:/yzpool/data/hosts/20pro # zfs snapshot yzpool/data/hosts/20pro@22-11-19-18-13
root@nfs:/yzpool/data/hosts/20pro # ls -a -l .zfs/snapshot/
total 1
dr-xr-xr-x+ 4 root  wheel  4 Nov 20 01:59 .
dr-xr-xr-x+ 3 root  wheel  3 Nov 20 01:48 ..
drwxr-xr-x  2 root  wheel  3 Nov 20 01:49 22-11-19
drwxr-xr-x  2 root  wheel  4 Nov 20 01:55 22-11-19-18-13
root@nfs:/yzpool/data/hosts/20pro # du .zfs/snapshot/
14    .zfs/snapshot/22-11-19-18-13
7    .zfs/snapshot/22-11-19
21    .zfs/snapshot/

当前的情况下,我们拥有了两个快照,第一个快照中我们新建了一个文件,第二个快照中有两个文件。

现在我们再建立第3个文件:

root@nfs:/yzpool/data/hosts/20pro # echo "333" >> 3.txt
root@nfs:/yzpool/data/hosts/20pro # ls
3.txt        hello.text    text.text

最后我们尝试进行快照恢复,需要注意的是:快照间是有依存关系的,比如我们现在想恢复快照22-11-19,则会得到不能够直接恢复的警告:

root@nfs:/yzpool/data/hosts/20pro # zfs rollback yzpool/data/hosts/20pro@22-11-19
cannot rollback to 'yzpool/data/hosts/20pro@22-11-19': more recent snapshots or bookmarks exist
use '-r' to force deletion of the following snapshots and bookmarks:
yzpool/data/hosts/20pro@22-11-19-18-13

这里由于我们创建快照将基于最近的快照,具体的原因不太好解释,总之就是记住如果有重要数据的话,恢复快照前对快照对行备份就对了。

在这里我们使用-r参考来恢复到非最新的快照,则会发现快照22-11-19-18-13直接被删除了。

root@nfs:/yzpool/data/hosts/20pro # zfs rollback -r yzpool/data/hosts/20pro@22-11-19
root@nfs:/yzpool/data/hosts/20pro # ls
hello.text
root@nfs:/yzpool/data/hosts/20pro # ls .zfs/snapshot/
22-11-19

自动快照

定义一个保留1周的自动快照是个备份的好办法,自动备份的方式有很多,在这我们使用zfsnap2

# pkg install zfsnap2

安装完成后测试一下,比如对根数据集data创建快照:

# [root@nfs /yzpool/data/hosts/20pro]# zfsnap snapshot -v -a 1w yzpool/data
/sbin/zfs snapshot  yzpool/data@2022-11-20_03.01.57--1w ... DONE
[root@nfs /yzpool/data/hosts/20pro]# zfs list -t snapshot
NAME                                  USED  AVAIL     REFER  MOUNTPOINT
yzpool/data@2022-11-20_03.01.57--1w     0B      -      140K  -
yzpool/data/hosts/20pro@22-11-19       93K      -      145K  -
[root@nfs /yzpool/data/hosts/20pro]# zfsnap snapshot -v -a 1w -r yzpo

如果我们想为数据集建立递归快照,则还可以加入-r参数:

[root@nfs /yzpool/data/hosts/20pro]# zfs list -t snapshot
NAME                                              USED  AVAIL     REFER  MOUNTPOINT
yzpool/data@2022-11-20_03.01.57--1w                 0B      -      140K  -
yzpool/data@2022-11-20_03.03.04--1w                 0B      -      140K  -
yzpool/data/hosts@2022-11-20_03.03.04--1w           0B      -      140K  -
yzpool/data/hosts/20pro@22-11-19                   93K     
yzpool/data/hosts/20pro@2022-11-20_03.03.04--1w     0B      -      157K  -
yzpool/data/hosts/test@2022-11-20_03.03.04--1w      0B      -      140K  -

此时将自动为 data, data/hosts, data/hosts/20pro, data/hosts/test分别创建快照。该快照的有效期为1周,在1周后如果执行了销毁操作,则该快照将被自动销毁。

由于当前时间还不够1周,所以测试zfsnap的销毁快照操作后,什么也不会发生:

# zfsnap destroy -rv yzpool/data

更多的用法请参考zfsnap官方文档

熟悉了用户以后,最后我们在切换为root用户的前提下,为每天的快照备份、销毁来制定个计划任务。

[root]# crontab -e
10   2  *   *   *    /usr/local/sbin/zfsnap snapshot -v -a 1w -r yzpool/data >> /yzpool/log/zfsnap.log
43   3  *   *   *    /usr/local/sbin/zfsnap destroy -rv yzpool/data >> /yzpool/log/zfsnap.log

如果你采用的是直接编辑/etc/crontab文件,则还应该在定时任务中加入执行的用户。

10   2  *   *   *  root  /usr/local/sbin/zfsnap snapshot -v -a 1w -r yzpool/data >> /yzpool/log/zfsnap.log
43   3  *   *   *  root  /usr/local/sbin/zfsnap destroy -rv yzpool/data >> /yzpool/log/zfsnap.log

此时每天的2点10分将进行快照生成(这个很快),每天的3点43将删除过期的快照(由于需要进行快照数据的合并,这个反而要花一些时间)。

注意:一定要写好命令的全路径,所以计划任务不会顺利执行。

永远选择相信计算机,而不是选择相信自己。我们建立完计划任务还需要如下测试,比如测试第1个任务:

$ env -i SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin HOME=/root NAME=root /usr/local/sbin/zfsnap snapshot -v -a 1w -r yzpool/data >> /yzpool/log/zfsnap.log

删除数据集

数据集的删除并不像普通文件夹那样可以使用rm命令,而是使用zfs destroy命令,如果该数据集关联了相关快照,则会得到以下提示:

# [root@nfs /yzpool/data/hosts]# zfs destroy yzpool/data/hosts/test
cannot destroy 'yzpool/data/hosts/test': filesystem has children
use '-r' to destroy the following datasets:
yzpool/data/hosts/test@2022-11-20_03.03.04--1w

此时加入-r参数即可完成删除操作,同时该操作也同步删除了该数据集对应的快照:

[root@nfs /yzpool/data/hosts]# zfs destroy -r yzpool/data/hosts/test

rsync

最后,我们再结合rsync文件定时同步,从而达到快照及rsync双重备份的目的。

命令汇总

# 创建数据集
# zfs create yzpool/data
# zfs create yzpool/data/hosts
# 查看数据集
# zfs list
# 删除数据集
# zfs destroy yzpool/data/hosts/test
# 强制删除数据集
# zfs destroy -r yzpool/data/hosts/test
# 创建快照
# zfs snapshot yzpool/data/hosts/20pro@22-11-19
# 查看快照
# zfs list -t snapshot

参考

https://docs.oracle.com/cd/E38902_01/html/E38893/gbciq.html#g...

https://docs.freebsd.org/zh-tw/books/handbook/zfs/


潘杰
3.1k 声望239 粉丝

引用和评论

0 条评论