如何在Linux上的ZFS中设置快照和克隆

时间:2020-03-05 15:32:50  来源:igfitidea点击:

Ubuntu 16.04中值得注意的新功能是添加了ZFS文件系统。
长期以来,此文件系统被称为Solaris的杀手级功能。
它已被移植到Linux,但是由于Sun明智地选择了不兼容的许可证,因此它不会被集成到主线内核中。
他们这样做是为了声称可以拥有Linux没有的某些功能。
明智的选择对他们没有任何好处,我们在这里不会谈论Sun的命运,也不会在GPL许可的内核中使用CDDL许可的内核模块的合法性。
事实是,无论法律警告如何,Canonical都将ZFS放入Ubuntu。

安装ZFS文件系统并制作磁盘阵列

我们要做的第一件事是使用命令安装ZFS文件系统

sudo apt install zfs

接下来,我们需要查看必须使用哪些磁盘,因此让我们使用lsblk命令

我向VM添加了4个磁盘,每个磁盘8GB,因此我们将使用它们来测试ZFS。
首先,我们将使阵列跨越所有4个磁盘。
它将进行条带化,以实现最佳速度和尺寸。
这些是虚拟磁盘,并非像它们中的任何一个一样会发生故障,因此条带RAID 0似乎可以进行测试。
对于生产,我们需要RAID 5.

sudo zpool create -f theitroad /dev/sdb /dev/sdc /dev/sdd /dev/sde

此命令将在所有提到的驱动器上跨越raid 0阵列。
它们在我的VM上都是空的,但是如果我们使用的是真正的驱动器,请确保在任何驱动器上都没有唯一重要数据的唯一副本,因为它将丢失。
如果我们想知道为什么我们必须使用选项-f,那是因为默认情况下ZFS假定EFI和GPT,而我创建的VirtualBox VM具有BIOS和MBR。
然后让我们看看我们创建了什么。

sudo zpool status theitroad

现在,我们需要在我们创建的theitroad zpool上创建ZFS文件系统。

sudo zfs create theitroad/test

此命令在轮询和挂载中创建ZFS文件系统测试。
让我们看一下该文件系统:

sudo zfs list -r theitroad

如何拍摄ZFS快照

由于其中有空的zpool和空的文件系统,因此让我们对其进行快照。
快照的格式为zpoolname/fsname @ snapshotname,因此我们将使用以下命令:

sudo zfs snapshot theitroad/test@snap1
sudo zfs list -t snapshot

现在让我们创建一些数据,以便我们可以返回快照并查看情况如何变化。

sudo nano /theitroad/test/ourdata.txt

在nano类型123或者所需的任何随机数据中,然后将其保存。
使用cat命令检查是否有数据,然后使用以下命令再制作一个快照

sudo zfs snapshot theitroad/test@snap2

然后让我们重新打开数据文件并添加更多数字。

sudo nano /theitroad/test/ourdata.txt

例如,将其设置为12345.
现在,我们回滚到快照。
以下是命令以及输出:

miki@miki-VirtualBox:~$cat /theitroad/test/ourdata.txt
12345
miki@miki-VirtualBox:~$sudo zfs rollback theitroad/test@snap2
miki@miki-VirtualBox:~$cat /theitroad/test/ourdata.txt
123
miki@miki-VirtualBox:~$sudo zfs rollback theitroad/test@snap1
cannot rollback to 'theitroad/test@snap1': more recent snapshots or bookmarks exist
use '-r' to force deletion of the following snapshots and bookmarks:
theitroad/test@snap2
miki@miki-VirtualBox:~$sudo zfs rollback -r theitroad/test@snap1
miki@miki-VirtualBox:~$cat /theitroad/test/ourdata.txt
cat: /theitroad/test/ourdata.txt: No such file or directory
miki@miki-VirtualBox:~$

我们看到回滚sudo zfs rollback theitroad/test @ snapname是执行回滚的命令,剩下的就是说明数据的变化。
当我们回到起点时,根本没有文件,这是正确的,因为我们在制作文件之前先制作了快照。
但是要返回第一个快照,我们必须使用标志-r删除snap2,因为ZFS仅允许返回最新的快照。
因此,它通过删除snap2使snap1最新。
我们可以使用以下命令删除其余快照:

sudo zfs destroy theitroad/test@snap1

如何执行ZFS克隆

zfs中的克隆是从快照创建的,如果文件系统的快照位于不同的装入点和其名称下,则它会使文件系统的快照成为克隆。
出于所有目的和目的,它将以不同的文件系统开始,尽管其文件系统的内容与上一个文件系统的内容相同。
由于具有重复数据删除功能,新文件系统似乎没有占用任何空间,但是随着文件系统开始分散,该空间将开始被使用。
因此,让我们首先在文件系统中创建一些文件和目录

sudo touch /theitroad/test/file{1..9} && sudo mkdir /theitroad/test/dir{1..9}
miki@miki-VirtualBox:~$ls /theitroad/test/
dir1 dir3 dir5 dir7 dir9 file2 file4 file6 file8
dir2 dir4 dir6 dir8 file1 file3 file5 file7 file9

接下来,我们将制作快照并将快照中的文件系统克隆到名为clonedfs的新文件系统中。

sudo zfs snapshot theitroad/test@snap3
sudo zfs clone theitroad/test@snap3 theitroad/clonedfs
sudo zfs list

接下来让我们检查clonedfs的内容:

miki@miki-VirtualBox:~$ls /theitroad/clonedfs/
dir1 dir3 dir5 dir7 dir9 file2 file4 file6 file8
dir2 dir4 dir6 dir8 file1 file3 file5 file7 file9

这是相同的。
至此我们完成了,让我们删除。

不能先删除快照再删除快照

miki@miki-VirtualBox:~$sudo zfs destroy theitroad/test@snap3
cannot destroy 'theitroad/test@snap3': snapshot has dependent clones
use '-R' to destroy the following datasets:
theitroad/clonedfs

因此,我们可以在删除快照时使用-R选项来执行此操作,也可以先删除克隆,然后再执行重做命令。
我们将做第一个选择。

sudo zfs destroy -R theitroad/test@snap3

然后我们破坏测试文件系统

sudo zfs destroy -R theitroad/test

然后让我们删除zpool

sudo zpool destroy theitroad

在RAIDZ上打个招呼

在本教程中,我们使用了经典的RAID O,但在生产中,我们可能需要尝试RAIDZ。
这是创建具有不同raidz级别的zpool的方法。

sudo zpool create theitroad raidz /dev/sdb /dev/sdc /dev/sdd /dev/sde

要更改raidz级别,只需键入raidz2或者raidz3而不是raidz。