ZFS 快照简介
ZFS 快照是存储池某个时间点的只读副本。与其他文件系统的快照方法不同,ZFS 快照不需要复制或移动数据,因此创建和删除快照非常快,且不会对系统性能产生大的影响。此外,因为 ZFS 快照只存储自快照创建后数据的改变,所以它们使用的空间非常小。
ZFS 快照工作原理基于 ZFS 的 copy-on-write 机制。在 ZFS 中,当数据被修改时,ZFS 不是直接覆盖原有的数据,而是在不同的位置写入新的数据。只有在新的数据成功写入后,ZFS 才会更新指向这些数据的指针。这种机制保证了 ZFS 操作的原子性,防止了数据的部分写入,从而保证了数据的一致性。
当创建 ZFS 快照时,ZFS 会保留一个指向当前数据状态的指针。这意味着即使数据被修改,原有的数据仍然可以通过快照访问。因此,ZFS 快照只需要存储自快照创建后数据的改变,而原有的数据则由存储池和所有的快照共享。
ZFS 快照有许多用途。例如,您可以使用快照来保护数据,防止误删除或误修改。您也可以使用快照来创建数据的历史版本,以便于恢复旧的数据或分析数据的变化。此外,ZFS 还允许您将快照发送到远程的 ZFS 系统,这可以用于数据备份或复制。
ZFS 快照管理
这里基于 SSD 文件系统来简单说一下快照管理。
# 查看文件系统,已经存在 SSD 文件系统
[root@localhost ~]# df -lh
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 7.7G 0 7.7G 0% /dev/shm
tmpfs 3.1G 8.8M 3.1G 1% /run
/dev/mapper/rl-root 70G 3.7G 67G 6% /
/dev/sdb2 1014M 303M 712M 30% /boot
/dev/sdb1 599M 7.0M 592M 2% /boot/efi
/dev/mapper/rl-home 145G 1.1G 144G 1% /home
tmpfs 1.6G 4.0K 1.6G 1% /run/user/0
SSD 3.6T 128K 3.6T 1% /SSD
# 添加一个文件
[root@localhost SSD]# echo "123" > 1.txt
# 查看文件是存在的
[root@localhost SSD]# ls -l
total 2
-rw-r--r-- 1 root root 4 Jun 15 20:36 1.txt
# 创建快照,这里是基于 SSD 这个文件系统创建快照,并非 SSD 存储池创建快照。
[root@localhost SSD]# zfs snap SSD@snap20230615
# 查看快照信息
[root@localhost SSD]# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
SSD@snap20230615 0B - 35.9K -
# 删除对应文件
[root@localhost SSD]# rm -rf 1.txt
# 文件已经没有了
[root@localhost SSD]# ll
total 0
# 回滚快照
[root@localhost SSD]# zfs rollback SSD@snap20230615
# 文件恢复
[root@localhost SSD]# ll
total 2
-rw-r--r-- 1 root root 4 Jun 15 20:36 1.txt
# 删除快照
[root@localhost SSD]# zfs destroy SSD@snap20230615
# 克隆快照与快照不同,克隆快照可以编辑管理文件,快照是只读的。
# 克隆快照,需要先创建一个快照,再进行克隆
[root@localhost SSD]# zfs snap SSD@snap20230615
[root@localhost SSD]# zfs clone SSD@snap20230615 SSD/my_clone
# 查看克隆
[root@localhost /]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
SSD 360K 3.52T 35.9K /SSD
SSD/my_clone 0B 3.52T 35.9K /SSD/my_clone
# 克隆以后就会自动创建对应文件系统
[root@localhost SSD]# df -lh
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 7.7G 0 7.7G 0% /dev/shm
tmpfs 3.1G 8.8M 3.1G 1% /run
/dev/mapper/rl-root 70G 3.7G 67G 6% /
/dev/sdb2 1014M 303M 712M 30% /boot
/dev/sdb1 599M 7.0M 592M 2% /boot/efi
/dev/mapper/rl-home 145G 1.1G 144G 1% /home
tmpfs 1.6G 4.0K 1.6G 1% /run/user/0
SSD 3.6T 128K 3.6T 1% /SSD
SSD/my_clone 3.6T 128K 3.6T 1% /SSD/my_clone
# 进入对应目录
[root@localhost SSD]# cd /SSD/my_clone
# 向 1.txt 文件中添加数据
[root@localhost my_clone]# echo "789" >> 1.txt
# 查看文件已经更改
[root@localhost my_clone]# cat 1.txt
123
456
789
# 但我们查看原有/SSD/1.txt没有变化
[root@localhost my_clone]# cat /SSD/1.txt
123
456
# 删除快照克隆
[root@localhost /]# zfs destroy SSD/my_clone
写在最后
在这篇文章中,我们对 ZFS 快照的工作原理和应用进行了深入的探讨。希望这些信息能帮助您更好地理解和利用 ZFS 快照来保护和管理您的数据。然而,ZFS 的功能远不止于此,快照只是其中的一部分。
在 ZFS 中,除了文件系统和快照,还有一个重要的概念,那就是“卷”。卷是一个可以作为块设备使用的存储实体,它们在一些特定的场景下,如虚拟化,数据库存储等,都有非常重要的作用。
在下一篇文章中,我们将聚焦于 ZFS 的卷管理,从创建和配置卷,到理解卷如何与文件系统和快照交互,我们将带领您深入了解这一重要特性。让我们期待下一篇文章,继续探索 ZFS 的世界。
下篇预告: DIY NAS 系列08 — ZFS 卷管理