Linux的Z文件系统(ZFS)简介
什么是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