ZFS 文件系统提供了开箱即用的巨大容量、RAID 镜像和反损坏机制。了解如何使用 ZFS 安装 Ubuntu,以及如何创建镜像池。
什么是 ZFS?
ZFS 是一种高级文件系统,起源于 Sun Microsystems,用于其 Solaris 操作系统。在甲骨文于 2009 年收购 Sun 之后,ZFS 现在归甲骨文公司所有。
但是,在典型的利他行为中,从 2005 年起,Sun 发布了 ZFS 的开源版本。不可避免地,它被移植到 Linux 中,并在那里获得了更广泛的曝光。ZFS 的开源版本——openZFS——由OpenZFS 项目管理和维护 。
ZFS 是一种高容量、容错的文件系统。ZFS 最初代表 Zettabyte 文件系统。ZFS 体系结构基于 128 位,而不是其他文件系统中更常见的 64 位。能够处理更大的数值是使 ZFS 能够处理 zettabytes 存储的因素之一。为了让您了解这意味着什么,Zettabyte 是 10 亿 TB。
如今,ZFS 支持高达 256 zebibytes 的文件存储 。zebibyte(2 70 字节)比 zettabyte(10 21 字节)大,但不是一个数量级。ZFS 的功能远不止纯粹的容量 — 令人难以置信。ZFS 用作其自己的卷管理器和 RAID 控制器。它具有内置功能,例如真正的写时复制,可保护您的数据免受损坏。它结合了提供文件系统池化、克隆和复制的特性,以及它原生的类似 RAID 的功能。
Ubuntu 已经提供 ZFS 多年了,但总是有警告和警告。在 Ubuntu 20.10 中,警告被删除。Canonical 正式支持 ZFS,但仅限于全盘设置。要获得这种支持,您需要在安装 Ubuntu 时安装 ZFS。ZFS 选项仍然隐藏起来,但它们在那里,不再只是为了勇敢或鲁莽的人。
随着 Ubuntu 21.10 将于 2021 年 10 月发布,现在是了解 Ubuntu 中 ZFS 产品如何成熟的好时机。
在安装期间查找 ZFS 选项
在 Ubuntu 安装过程中,“安装类型”屏幕允许您选择擦除正在安装 Ubuntu 的磁盘或执行其他操作。单击“高级功能”按钮。
出现“高级功能”对话框。
选择“擦除磁盘并使用 ZFS”单选按钮,然后单击“确定”按钮。
“安装类型”屏幕将显示“ZFS Selected”以表明您已选择使用 ZFS。
单击“继续”按钮并照常完成安装。
如果您的计算机中安装了多个硬盘驱动器,您将能够选择 ZFS 使用它们的方式。Ubuntu 将提供建议的配置,但您可以根据自己的需要进行调整。
但是,如果您在安装 Ubuntu 后添加一些硬盘会怎样?您如何配置 ZFS 以使用新存储?这就是我们接下来要看的。
添加额外的硬盘
我们在用于研究本文的测试机器的单个硬盘上安装了带有 ZFS 的 Ubuntu。我们又添加了两个硬盘驱动器,使计算机总共三个硬盘驱动器。一个硬盘驱动器上安装了 Ubuntu,两个新驱动器是空白的、未格式化和卸载的。
我们需要做的第一件事是确定 Ubuntu 是如何引用新硬盘的。该lsblk命令列出了您计算机中安装的所有块设备。我们可以具体说明我们希望在结果中看到哪些输出列。
lsblk -o name,size,fstype,type,mountpoint
该-o(输出)选项后面是我们希望看到的列。我们选择了:
- name:Ubuntu 用来指代硬盘的名称。
- size:硬盘驱动器的大小。如果硬盘驱动器有多个分区,它们都会被列出并显示每个分区的大小。
- fstype:硬盘驱动器或分区之一的文件系统。
- type:该行是指磁盘、分区、CD-ROM 驱动器还是环回伪设备。
- mountpoint:文件系统在硬盘或分区上的挂载点。
有一堆squashfs环回设备,编号loop0通过loop6. 每次安装 snap 应用程序时,都会创建这些伪设备之一。它是封装和沙盒的一部分,它包裹在每个 snap 应用程序周围。
第一个硬盘驱动器被列为/dev/sda。这是一个 32 GB 的驱动器,上面有五个分区,列为/dev/sda1通过/dev/sda5。它们以不同的方式格式化。这是我们安装 Ubuntu 时计算机中的驱动器。
我们的两个新硬盘被列为/dev/sdb和/dev/sdc。它们也是 32 GB 驱动器,但未格式化且未安装。
池、RAID 0、RAID 1
为了利用新的硬盘,我们将它们添加到池中。您可以根据需要向池中添加任意数量的驱动器。有两种方法可以做到这一点。您可以配置池,以便您可以使用RAID 0 配置中每个硬盘驱动器的所有存储空间 ,或者您可以配置它们,使池仅提供池中最小硬盘驱动器的存储空间量,在 RAID 1 配置中。
RAID 0 的优势在于空间。但首选(也是极力推荐)配置是 RAID 1。RAID 1 将数据镜像到池中的所有驱动器。这意味着您可能会遇到硬盘驱动器故障,并且文件系统和数据仍然安全并且您的计算机仍然可以正常运行。您可以更换损坏的驱动器并将新驱动器添加到您的池中。
相比之下,对于 RAID 0,单个硬盘驱动器故障会使您的系统无法运行,直到您更换损坏的驱动器并从备份中执行还原。
RAID 1 池中的驱动器越多,它就越强大。RAID 1 至少需要两个驱动器。任一驱动器出现故障都会带来不便,但不会造成灾难。但是,当然,两个硬盘驱动器同时出现故障将是一个更大的问题。因此,答案似乎是汇集尽可能多的硬盘驱动器。
但是,当然,在实践中,您希望(或能够负担得起)分配给单个池的驱动器数量是有限的。如果您有八个备用硬盘驱动器,设置两个四驱动器 RAID 1 池可能比单个八驱动器池更好地利用硬件。请记住,RAID 1 池只能提供池中最小硬盘驱动器的存储,因此始终尝试在单个池中使用相同大小的驱动器。
创建 RAID 1 池
我们已将我们的新硬盘识别为/dev/sdb和/dev/sdc。要创建 ZFS RAID 1 池,我们使用以下命令:
sudo zpool create cloudsavvyit mirror /dev/sdb /dev/sdc
命令的组成部分是:
- sudo:我们正在更改系统配置,因此我们需要使用它sudo来获取 root 权限。
- zpool:这是 ZFS 池管理命令。
- create:这是我们要zpool为我们执行的操作。
- cloudavvyit:这是我们希望创建的池的名称。
- mirror:我们希望在所有驱动器上镜像我们的数据,为我们提供一个 RAID 1 池。省略“镜像”选项会创建一个 RAID 0 池。
- /dev/sdb:我们的第一个新硬盘。
- /dev/sdc:我们的第二个新硬盘。
你想打电话给你的游泳池,并更换名称替换“cloudsavvyit” /dev/sdb,并/dev/sdc用新的硬盘驱动器的标识。
创建一个游泳池有点反高潮。如果一切顺利,您会毫不客气地返回到命令提示符。我们可以使用status带有zpool命令的操作来查看新池的状态。
sudo zpool status cloudsavvyit
我们的新池已经创建,在线,我们的两个新驱动在池中,没有错误。这一切看起来都很棒。但是游泳池在哪里?让我们看看是否lsblk会向我们展示它的安装位置。
lsblk -o name,size,fstype,type,mountpoint
我们可以看到,我们的新的硬盘驱动器/dev/sdb,并/dev/sdc已与各两个分区划分,但没有安装点列出他们。池不像普通硬盘那样安装。例如,/etc/fstab文件中没有ZFS 池的条目。默认情况下,挂载点创建在根目录中。它与池同名。
ls /
如果您想在其他地方创建-m挂载点,请在创建池时使用(mount point) 选项,并提供您希望创建挂载点的路径。您还可以为挂载点指定不同的名称。
sudo zpool create -m /path/to/mount-point-name cloudavvyit mirror /dev/sdb
授予用户访问池的权限
该池存在,但只有 root 用户可以在其中存储数据。当然,这不是我们需要的。我们希望其他用户能够访问该池。
为实现这一目标,我们将:
- 在池中创建一个目录。
- 创建一个新组。
- 将新组设置为目录的组所有者。
- 将需要访问数据存储的用户添加到新组中。
这种方案提供了很大的灵活性。我们可以根据需要创建任意数量的数据存储目录,由不同的组拥有它们。授予用户对不同存储区域的访问权限就像将它们添加到适当的组一样简单。
我们将使用groupadd来创建一个用户组。我们的小组被称为“csavvy1”。然后,我们将使用该usermod命令将名为“dave”的用户添加到新组中。该-a(追加)选项添加新组现有组用户是在列表中。如果没有这个选项,用户从现有的所有组中删除,并添加到新的一个。这会导致问题,因此请确保使用该-a选项。
sudo groupadd csavvy1
sudo usermod -a -G csavvy1 dave
为了使他们的新组成员资格生效,用户必须注销并重新登录。
现在我们将在池中创建一个名为“data1”的目录。
sudo mkdir /cloudsavvyit/data1
该chgrp命令让我们设置目录的组所有者。
sudo chgrp csavvy1 /cloudsavvyit/data1
最后,我们将使用chmod. “s”是 SGID 特殊位。这意味着在“data1”目录中创建的文件和目录将继承该目录的组所有者。
sudo chmod g+rwsx /cloudsavvyit/data1/
我们的用户已注销并重新登录。让我们尝试在新 RAID 1 ZFS 池的新数据存储目录中创建一个文件。
touch /cloudsavvyit/data1/new-file.txt
让我们看看它是如何创建的。
ls /cloudsavvyit/data1 -lh
成功。如果我们尝试在 data1 存储区域之外创建另一个文件怎么办?
touch /cloudsavvyit/new-file2.txt
这按预期失败。我们的权限有效。我们的用户只能操作他有权访问的数据存储目录中的文件。
摧毁一个池
小心使用此命令。在继续之前,请确保您有备份。如果你确定你真的想要并且你已经验证你在池中有数据的其他副本,你可以使用以下命令销毁池:
sudo zpool destroy cloudsavvyit
将“cloudsavvyit”替换为您要销毁的池的名称。
你只有一个硬盘?
如果您只有一个硬盘驱动器,或者如果您的计算机有多个硬盘驱动器但它们的大小变化太大而无法形成一个有用的池,您仍然可以使用 ZFS。你不会得到 RAID 镜像,但内置的反损坏和数据保护机制仍然值得和有说服力的功能。
但请记住,没有文件系统(带或不带 RAID 镜像)意味着您可以忽略备份。