Linux的Z文件系统(ZFS)简介

时间:2020-01-09 10:37:06  来源:igfitidea点击:

什么是ZFS,为什么要使用它?

Z文件系统是Sun Microsystems构建的免费开放源代码逻辑卷管理器,可在其Solaris操作系统中使用。它最吸引人的功能包括:

无限的可扩展性

嗯,从技术上讲,它并不是无止境的,但是它是一个128位的文件系统,能够管理zettabytes(十亿TB)的数据。无论我们有多少硬盘空间,ZFS都将适合对其进行管理。

最高完整性

我们在ZFS内部执行的所有操作均使用校验和来确保文件完整性。我们可以放心,文件及其冗余副本不会遇到静默数据损坏的情况。同样,当ZFS忙于静静地检查数据的完整性时,它将在可能的时候进行自动修复。

驱动器池

ZFS的创建者希望我们将其视为类似于计算机使用RAM的方式。当计算机需要更多内存时,我们可以放另一根木棍,然后完成。与ZFS相似,当我们需要更多硬盘驱动器空间时,请放入另一个硬盘驱动器,然后完成。当我们需要更大的存储池时,无需花费时间对磁盘进行分区,格式化,初始化或者其他操作,只需添加磁盘即可。

RAID

ZFS能够支持许多不同的RAID级别,同时提供与硬件RAID控制器相媲美的性能。这样可以节省资金,简化设置,并可以访问ZFS改进了的高级RAID级别。

安装ZFS

由于我们仅介绍本指南的基础知识,因此我们不会将ZFS安装为根文件系统。本节假定我们使用的是ext4或者其他文件系统,并且希望将ZFS用于某些辅助硬盘驱动器。以下是在某些最受欢迎的Linux发行版上安装ZFS的命令。

Solaris和FreeBSD应该已经安装了ZFS并可以使用。

Ubuntu:

$ sudo add-apt-repository ppa:zfs-native/stable

$ sudo apt-get update

$ sudo apt-get install ubuntu-zfs

Debian:

$ su 

# wget http://archive.zfsonlinux.org/debian/pool/main/z/zfsonlinux/zfsonlinux_2%7Ewheezy_all.deb

# dpkg -i zfsonlinux_2~wheezy_all.deb

# apt-get update

# apt-get install debian-zfs

RHEL / CentOS:

$ sudo yum localinstall --nogpgcheck http://archive.zfsonlinux.org/epel/zfs-release-1-3.el6.noarch.rpm

$ sudo yum install zfs

如果我们还有其他发行版,请查看zfsonlinux.org并单击"软件包"列表下的发行版,以获取有关如何安装ZFS的说明。

在继续阅读本指南时,我们将使用Ubuntu,因为这似乎是Linux极客的第一选择。无论如何,我们仍然应该能够遵循,因为ZFS命令不会在不同的发行版之间发生变化。

安装需要花费一段时间,但是一旦完成,请运行$ sudo zfs list以确保正确安装。我们应该得到如下输出:

我们现在正在使用全新安装的Ubuntu服务器,只有一个硬盘驱动器。

配置ZFS

现在,假设我们在计算机中又增加了六个硬盘。

$ sudo fdisk -l | grep Error将向我们显示我们刚安装的六个硬盘驱动器。它们目前不可用,因为它们不包含任何类型的分区表。

如前所述,ZFS的优点之一是我们不需要打扰分区(尽管我们可以这样做)。首先,通过运行以下命令来取出三个硬盘并将它们放入存储池中:

$ sudo zpool create -f geek1 /dev/sdb /dev/sdc /dev/sdd

" zpool create"是用于创建新存储池的命令,"-f"将覆盖发生的任何错误(例如,如果磁盘已包含信息)," geek1"是存储池的名称。和/ dev / sdb / dev / sdc / dev / sdd是我们放入池中的硬盘。

创建池之后,我们应该可以使用df命令或者sudo zfs list看到它:

如我们所见,/ geek1已经挂载并可以使用了。

如果要查看为池选择了哪三个磁盘,可以运行sudo zpool status:

到目前为止,我们要做的是创建一个9 TB动态条带池(实际上是RAID 0)。如果我们不了解这意味着什么,可以想象我们在/ geek1上创建了一个3 KB的文件。 1 KB会自动进入sdb,1 KB会自动进入sdc,1 KB会进入sdd。然后,当我们去读取3 KB文件时,每个硬盘驱动器将向我们提供1 KB,并结合三个驱动器的速度。这使写入和读取数据变得很快,但也意味着我们只有一个故障点。如果只有一个硬盘驱动器发生故障,我们将丢失3 KB文件。

假设保护数据比快速访问数据更为重要,让我们看一下其他流行的设置。首先,我们将删除已创建的zpool,以便可以在更冗余的设置中使用这些磁盘:

$ sudo zpool destroy geek1

Bam,我们的zpool不见了。这次,让我们使用三个磁盘来创建RAID-Z池。 RAID-Z本质上是RAID 5的改进版本,因为它通过使用写时复制避免了写漏洞。 RAID-Z至少需要三个硬盘,这是RAID 0和RAID 1之间的一种折衷方案。在RAID-Z池中,我们仍然可以获得块级条带化的速度,但也具有分布式奇偶校验。如果池中的单个磁盘失效,只需更换该磁盘,ZFS就会根据来自其他磁盘的奇偶校验信息自动重建数据。要丢失存储池中的所有信息,两个磁盘将不得不消失。为了使事情变得更加冗余,我们可以使用RAID 6(对于ZFS为RAID-Z2)并具有双重奇偶校验。

为此,我们可以使用与之前相同的zpool create命令,但在池名称后指定raidz

$ sudo zpool create -f geek1 raidz /dev/sdb /dev/sdc /dev/sdd

如我们所见,df -h表明我们的9 TB池现在已减少到6 TB,因为3 TB被用于保存奇偶校验信息。使用" zpool status"命令,我们可以看到我们的池与以前的池基本相同,但是现在使用RAID-Z。

为了说明向存储池中添加更多磁盘是多么容易,我们将其他三个磁盘(另一个9 TB)作为另一个RAID-Z配置添加到geek1存储池中:

$ sudo zpool add -f geek1 raidz /dev/sde /dev/sdf /dev/sdg