如何在Linux上使用ZFS中的快照,克隆和复制

在上一个教程中,我们学习了如何创建zpool和一个ZFS文件系统或数据集。在本教程中,我将一步一步告诉您如何工作...

在上一个教程中 ,我们学习了如何创建zpool和ZFS文件系统或数据集。 在本教程中,我将逐步介绍如何使用ZFS快照,克隆和复制。 快照,克隆。 而复制是ZFS文件系统中最强大的功能。

ZFS快照 - 概述

快照是ZFS最强大的功能之一,快照提供文件系统或卷的只读,时间点副本,不会在ZFS池中占用额外的空间。 当更改块引用时,快照仅使用空格。 快照通过仅记录当前数据集和先​​前版本之间的差异来保留磁盘空间。

用于快照的典型示例是在执行诸如软件安装或系统升级的风险操作时,快速备份文件系统的当前状态。

创建和销毁ZFS快照

卷的快照无法直接访问,但可以克隆,备份和回滚卷。 创建和销毁ZFS快照非常简单,我们可以使用zfs snapshotzfs 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选项。 快照名称必须满足以下命名要求:

filesystem@snapname
volume@snapname

# zfs snapshot datapool/docs@version1
# zfs list -t snapshot
NAME                     USED  AVAIL  REFER  MOUNTPOINT
datapool/docs@version1      0      -  19.5K  -

创建数据池/文档的快照。

要破坏快照,我们可以像往常一样使用zfs destroy命令。

# zfs destroy datapool/docs@version1
# zfs list -t snapshot
no datasets available

回滚快照

对于模拟,我们需要在/ docs目录中创建一个测试文件。

# echo "version 1" > /docs/data.txt
# cat /docs/data.txt
version 1

# zfs snapshot datapool/docs@version1
# zfs list -t snapshot
NAME                     USED  AVAIL  REFER  MOUNTPOINT
datapool/docs@version1     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/docs@version1  9.50K      -  19.5K  -
# zfs rollback datapool/docs@version1
# cat /docs/data.txt
version 1

我们可以看到, data.txt的内容回到以前的内容。

如果要重命名快照,可以使用zfs rename命令。

# zfs rename datapool/docs@version1 datapool/docs@version2
# zfs list -t snapshot
NAME                     USED  AVAIL  REFER  MOUNTPOINT
datapool/docs@version2  9.50K      -  19.5K  -

注意:如果存在此数据集的快照,则不能销毁数据集,但是我们可以使用-r选项来覆盖该数据集。

# zfs destroy datapool/docs
cannot destroy 'datapool/docs': filesystem has children
use '-r' to destroy the following datasets:
datapool/docs@version2

# 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/docs@today
# zfs list -t snapshot
NAME                  USED  AVAIL  REFER  MOUNTPOINT
datapool/docs@today      0      -    19K  -

现在我们从今天的快照数据池/ docs @中创建一个克隆

# zfs clone datapool/docs@today 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 / docs @今天已被克隆到/ datapool / pict。 当我们检查/ datapool / pict目录的内容时,内容应该与/ datapool / docs相同。

# ls /datapool/pict
folder1  folder2  folder3  folder4  folder5

克隆快照之后,在删除数据集之前,无法删除快照。

# zfs destroy datapool/docs@today
cannot destroy 'datapool/docs@today': snapshot has dependent clones
use '-R' to destroy the following datasets:
datapool/pict

# zfs destroy datapool/pict

最后我们可以摧毁快照。

# zfs destroy datapool/docs@today
# zfs list -t snapshot
no datasets available

ZFS复制概述

这个ZFS复制的基础是一个快照,我们可以随时创建快照,我们可以创建尽可能多的快照。 通过持续创建,传输和还原快照,可以提供一台或多台机器之间的同步。 ZFS提供了一个内置的序列化功能,可以将数据流的表示形式发送到标准输出。

配置ZFS复制

在本节中,我想向您展示如何将数据集复制到备份 ,但是不仅可以将数据存储在连接到本地系统的另一个池上,还可以通过网络将其发送到另一个系统。 用于复制数据的命令是zfs sendzfs 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

pool:backuppool
状态:在线
扫描:无请求
配置:

名称状态阅读写入CKSUM
backuppool ONLINE 0 0 0
镜像0在线0 0 0
sde在线0 0 0
sdf ONLINE 0 0 0

错误:没有已知的数据错误

创建一个我们将要复制的数据集。

# zfs snapshot datapool/docs@today
# zfs list -t snapshot
NAME                  USED  AVAIL  REFER  MOUNTPOINT
datapool/docs@today      0      -    19K  -
# ls /docs/
folder1  folder2  folder3  folder4  folder5

现在是做复制的时候了。

# zfs send datapool/docs@today | 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 / docs @今天已成功复制到备份/备份

要将数据集复制到另一台机器,我们可以使用以下命令:

# zfs send datapool/docs@today | ssh otherserver zfs recv backuppool/backup

完成

结论

快照,克隆和复制是ZFS最强大的功能。 快照用于创建文件系统或卷的时间点副本,克隆用于创建重复的数据集,复制用于将数据集从一个数据池复制到同一台计算机上的另一个数据池,或复制数据池之间的不同机器。