如何在 Linux 上的 ZFS 中使用快照、克隆和复制
在此页
- ZFS 快照 - 概述
- 创建和销毁 ZFS 快照
- 回滚快照
- ZFS 克隆概述
- 创建和销毁 ZFS 克隆
- ZFS 复制概述
- 配置 ZFS 复制
- 结论
在上一个教程中,我们学习了如何创建 zpool 和 ZFS 文件系统或数据集。在本教程中,我将逐步向您展示如何使用 ZFS 快照、克隆和复制。快照,克隆。和复制是 ZFS 文件系统最强大的特性。
ZFS 快照 - 概述
快照是 ZFS 最强大的功能之一,快照提供文件系统或卷的只读时间点副本,不会占用 ZFS 池中的额外空间。当块引用更改时,快照仅使用空间。快照通过仅记录当前数据集与先前版本之间的差异来节省磁盘空间。
快照的典型用途是在执行软件安装或系统升级等危险操作时,快速备份文件系统的当前状态。
创建和销毁 ZFS 快照
卷的快照不能直接访问,但可以克隆、备份和回滚。创建和销毁 ZFS 快照非常容易,我们可以使用 zfs snapshot 和 zfs destroy 命令。
创建一个名为数据池的池。
# zpool create datapool mirror /dev/sdb /dev/sdc
# zpool list
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
datapool 1.98G 65K 1.98G - 0% 0% 1.00x ONLINE -
现在,我们有了一个名为数据池的池,接下来我们必须创建一个 ZFS 文件系统来模拟快照功能。
# zfs create datapool/docs -o mountpoint=/docs
# zfs list -r datapool
NAME USED AVAIL REFER MOUNTPOINT
datapool 93.5K 1.92G 19K /datapool
datapool/docs 19K 1.92G 19K /docs
要创建文件系统的快照,我们可以通过指定池和快照名称来使用 zfs snapshot 命令。如果我们想递归地创建快照,我们可以使用 -r 选项。快照名称必须满足以下命名要求:
# zfs snapshot datapool/ 0 - 19.5K -
创建数据池/文档的快照。
要销毁快照,我们可以像往常一样使用 zfs destroy 命令。
# zfs destroy datapool/
# zfs list -t snapshot
no datasets available
回滚快照
为了模拟,我们需要在 /docs 目录中创建一个测试文件。
# echo "version 1" > /docs/data.txt
# cat /docs/data.txt
version 1
# zfs snapshot datapool/ 9K - 19.5K -
现在我们更改/docs/data.txt的内容
# echo "version 2" > /docs/data.txt
# cat /docs/data.txt
version 2
我们可以完全回滚到一个较旧的快照,这将为我们提供拍摄快照时的时间点副本。
# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
datapool/
# cat /docs/data.txt
version 1
我们可以看到,data.txt 的内容又回到了之前的内容。
如果我们想重命名快照,我们可以使用 zfs rename 命令。
# zfs rename datapool/ 9.50K - 19.5K -
注意:如果该数据集的快照存在,则无法销毁该数据集,但我们可以使用 -r 选项来覆盖它。
# zfs destroy datapool/docs
cannot destroy 'datapool/docs': filesystem has children
use '-r' to destroy the following datasets:
datapool/
# zfs destroy -r datapool/docs
# zfs list -t snapshot
no datasets available
ZFS 克隆概述
克隆是一个可写卷或文件系统,其初始内容与创建它的数据集相同。
创建和销毁 ZFS 克隆
只能从快照创建克隆,并且只有删除基于该快照的克隆才能删除快照。要创建克隆,请使用 zfs clone 命令。
# zfs create datapool/docs -o mountpoint=/docs
# zfs list -r datapool
NAME USED AVAIL REFER MOUNTPOINT
datapool 93.5K 1.92G 19K /datapool
datapool/docs 19K 1.92G 19K /docs
# mkdir /docs/folder{1..5}
# ls /docs/
folder1 folder2 folder3 folder4 folder5
# zfs snapshot datapool/ 0 - 19K -
现在我们从快照数据池/[email 创建一个克隆
# zfs clone datapool/ datapool/pict
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
datapool 166K 1.92G 19K /datapool
datapool/docs 19K 1.92G 19K /docs
datapool/pict 1K 1.92G 19K /datapool/pict
克隆过程完成,快照 datapool/[email 已被克隆到 /datapool/pict。当我们查看/datapool/pict 目录的内容时,内容应该与/datapool/docs 相同。
# ls /datapool/pict
folder1 folder2 folder3 folder4 folder5
我们克隆快照后,除非删除数据集,否则无法删除快照。
# zfs destroy datapool/': snapshot has dependent clones
use '-R' to destroy the following datasets:
datapool/pict
# zfs destroy datapool/pict
最后我们可以销毁快照。
# zfs destroy datapool/
# zfs list -t snapshot
no datasets available
ZFS 复制概述
这个ZFS复制的基础是快照,我们可以随时创建快照,而且我们可以创建任意数量的快照。通过不断创建、传输和恢复快照,您可以在一台或多台机器之间提供同步。 ZFS 提供了一个内置的序列化功能,可以将数据的流表示形式发送到标准输出。
配置 ZFS 复制
在本节中,我想向您展示如何将数据集从数据池复制到备份池,但不仅可以将数据存储在连接到本地系统的另一个池中,还可以通过网络将其发送到另一个系统。用于复制数据的命令是 zfs send 和 zfs receive。
创建另一个名为 backuppool 的池。
# zpool create backuppool mirror sde sdf
# zpool list
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
backuppool 1.98G 50K 1.98G - 0% 0% 1.00x ONLINE -
datapool 1.98G 568K 1.98G - 0% 0% 1.00x ONLINE -
检查池状态:
# zpool status
pool: datapool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
datapool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
errors: No known data errors
池:备份池
状态:在线
扫描:未请求
配置:
名称 状态 读写校验和
备份池 在线 0 0 0
镜像-0 在线 0 0 0
sde 在线 0 0 0
sdf 在线 0 0 0
错误:没有已知的数据错误
创建一个可以很好复制的数据集。
# zfs snapshot datapool/ 0 - 19K -
# ls /docs/
folder1 folder2 folder3 folder4 folder5
是时候进行复制了。
# zfs send datapool/ | zfs receive backuppool/backup
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
backuppool 83K 1.92G 19K /backuppool
backuppool/backup 19K 1.92G 19K /backuppool/backup
datapool 527K 1.92G 19K /datapool
datapool/docs 19K 1.92G 19K /docs
# ls /backuppool/backup
folder1 folder2 folder3 folder4 folder5
数据集 datapool/[email 已成功复制到 backuppool/backup。
要将数据集复制到另一台机器,我们可以使用以下命令:
# zfs send datapool/ | ssh otherserver zfs recv backuppool/backup
完毕。
结论
快照、克隆和复制是 ZFS 最强大的特性。快照用于创建文件系统或卷的时间点副本,克隆用于创建重复数据集,复制用于将数据集从一个数据池复制到同一台机器上的另一个数据池,或在不同机器之间复制数据池机器。