如何在FreeBSD上使用DigitalOcean块存储配置加密ZFS池
ZFS 是一种文件系统和卷管理器,支持高存储容量、支持压缩并可以防止数据损坏。 ZFS 与 DigitalOcean 的 块存储 结合使用时,可提供易于设置和扩展的存储解决方案。
在本指南中,您将为 FreeBSD 上的 ZFS 配置块存储卷,这些卷已加密以确保您的数据安全。
先决条件
- 数据中心中支持块存储的 FreeBSD Droplet,至少有 4GB 的 RAM,因为 ZFS 往往会占用大量内存,特别是如果您对块重复数据删除感兴趣。 我们将使用默认的 freebsd 帐户,该帐户在您创建 FreeBSD Droplet 时自动创建。 要了解有关登录 FreeBSD Droplet 及其基本管理的更多信息,请查看 FreeBSD 入门 教程系列。
- 连接到您的 Droplet 的 100 GB 卷。 您可以在创建 Droplet 时创建此卷,也可以使用 this guide 创建和附加卷。
本教程还将使用第二个 100GB 卷来演示如何将卷添加到池中,但您无需事先进行设置; 这些说明将在第 5 步的上下文中介绍。
第 1 步 — 对卷进行分区
即使我们将整个卷用于单个文件系统,在卷上放置分区图通常也是一个好主意。 这让我们可以应用我们创建的有意义的标签分区。
首先,让我们确认该卷已附加且可用。 登录到您的液滴。
ssh freebsd@your_server_ip
登录后,通过查看 dmesg
命令的输出确认卷已附加。 FreeBSD Droplet 的本地 SSD 显示为 vtbd0
,任何附加的卷都将显示为 da
设备。
使用 grep
过滤 dmesg
命令的结果,用于我们附加的卷 da0
。 学习更多关于grep
在我们的教程中在 Linux 中使用 Grep 和正则表达式搜索文本模式 .
dmesg | grep ^da0
您将看到类似于以下内容的输出:
Outputda0 at vtscsi0 bus 0 scbus2 target 0 lun 1 da0: <DO Volume 1.5.> Fixed Direct Access SPC-3 SCSI device da0: 300.000MB/s transfers da0: Command Queueing enabled da0: 102400MB (209715200 512 byte sectors: 255H 63S/T 13054C)
验证卷可用后,使用 GPT 格式创建分区映射。 执行以下命令:
sudo gpart create -s gpt da0
接下来,为 ZFS 创建一个分区。
sudo gpart add -t freebsd-zfs -l volume-nyc1-01 da0
-t
标志让我们指定分区类型,-l
选项让我们为分区应用标签。 标签可以是我们喜欢的任何东西。 在这种情况下,我们将使它与卷的名称相匹配,以帮助保持直截了当。
现在让我们保护我们将放置在此分区上的数据不被窥探。
第 2 步 — 设置加密
加密数据有很多好处,而且很容易设置。 让我们激活 aesni 驱动程序,以便我们可以使用硬件加速 AES 加密:
sudo kldload aesni
现在我们可以在分区上配置geli加密。 我们将使用 geli
命令并指定密钥长度和要加密的分区:
sudo geli init -l 256 /dev/gpt/volume-nyc1-01
-l
选项指定密钥长度,对于 AES-XTS 算法,密钥长度必须是 128 位或 256 位。 我们使用之前指定的标签来引用分区。
执行命令时,系统会提示您输入密码:
OutputEnter new passphrase: Reenter new passphrase: Metadata backup can be found in /var/backups/gpt_volume-nyc1-01.eli and can be restored with the following command: # geli restore /var/backups/gpt_volume-nyc1-01.eli /dev/gpt/volume-nyc1-01
每当您的 Droplet 重新启动时,您都需要输入此密码来重新附加加密分区。 这是为了换取更好的安全性而带来的轻微不便。
现在附加加密分区:
sudo geli attach /dev/gpt/volume-nyc1-01
初始化分区时,系统会提示您输入密码:
OutputEnter passphrase:
这将设置 /dev/gpt/volume-nyc1-01.eli
,这是分区的解密版本。 写入该块设备的数据被加密并写出到底层设备。 这是我们将附加到存储池的路径,接下来我们将创建该路径。
第 3 步 — 设置 ZFS 池
ZFS 存储池或 zpool 是卷的集合,它是 ZFS 管理其文件系统的方式。 而且它们很容易创建。 由于 DigitalOcean 卷实现了自己的数据冗余,因此无需创建多个卷并对其进行镜像,或者在 RAID-Z 配置中运行它们; 我们可以直接在池中使用单个卷。
zpool create
命令创建一个新的 zpool。 它接受池的名称和要添加到池中的卷。
sudo zpool create tank /dev/gpt/volume-nyc1-01.eli
我们为我们的池使用通用名称 tank
,但您可以使用任何您喜欢的名称。
由于卷是通过网络连接的,因此文件访问将比在本地 SSD 上慢。 为了尽量减少通过网络写入设备的数据量,让我们在 ZFS 文件系统层启用压缩。 这完全是可选的,可以在每个文件系统的基础上进行设置。
我们将使用 LZ4 压缩算法,该算法针对速度进行了优化,同时仍能提供不错的压缩。 有关其他选项,请参阅 zfs 手册页。
sudo zfs set compression=lz4 tank
现在让我们看看我们的游泳池。 我们可以使用 zpool list
命令获取一些详细信息:
zpool list
OutputNAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT tank 99.5G 98.5K 99.5G - 0% 0% 1.00x ONLINE -
由于分区和格式化开销,池的总大小略小于总卷大小。
我们还可以使用 zfs list
命令查看该池中的 ZFS 文件系统:
zfs list
OutputNAME USED AVAIL REFER MOUNTPOINT tank 61K 96.4G 19K /tank
或使用 df
命令:
df -h
OutputFilesystem Size Used Avail Capacity Mounted on /dev/gpt/rootfs 57G 2.2G 50G 4% / devfs 1.0K 1.0K 0B 100% /dev tank 96G 19K 96G 0% /tank
您将经常使用这些命令来检查新文件系统的运行状况。
在我们继续之前,让我们确保 ZFS 内核模块在我们引导操作系统时启动。 当我们使用 sudo
运行 zpool create
命令时,模块会自动为我们加载,但如果模块自动加载会更好。
为此,请编辑文件 /etc/rc.conf
:
sudo vi /etc/rc.conf
在文件中任何现有行之后添加此行:
/etc/rc.conf
zfs_enable="YES"
然后将更改保存到文件中。 当服务器重新启动时,将加载 ZFS 内核模块。
ZFS 的好处之一是能够随着我们需求的增加向池中添加更多存储。 让我们探索它是如何工作的。
第 4 步 — 向池中添加额外的卷
如果我们需要更多空间,我们可以使用额外的卷来扩展池。 使用 ZFS,只需向池中添加一个额外的设备即可。
首先,我们需要另一个设备。 将一个新的 100GB 卷附加到您的 Droplet。 有关如何执行此操作的详细信息,请参阅 本指南 。
卷准备好后,返回服务器终端并验证新卷是否存在并已连接。 新卷将被标识为 da1
。
dmesg | grep ^da1
Outputda1 at vtscsi0 bus 0 scbus2 target 0 lun 2 da1: <DO Volume 1.5.> Fixed Direct Access SPC-3 SCSI device da1: 300.000MB/s transfers da1: Command Queueing enabled da1: 102400MB (209715200 512 byte sectors: 255H 63S/T 13054C)
接下来,使用与第一个卷相同的过程对新卷进行分区和标记。 首先创建分区:
sudo gpart create -s gpt da1
然后创建卷:
sudo gpart add -t freebsd-zfs -l volume-nyc1-02 da1
由于您现有的卷已加密,因此请在此新卷上启用加密:
sudo geli init -l 256 /dev/gpt/volume-nyc1-02
系统将再次提示您输入密码,以便可以解密和附加卷。
OutputEnter new passphrase: Reenter new passphrase: Metadata backup can be found in /var/backups/gpt_volume-nyc1-02.eli and can be restored with the following command: # geli restore /var/backups/gpt_volume-nyc1-02.eli /dev/gpt/volume-nyc1-02
然后附加这个新卷,并在提示时提供密码:
sudo geli attach /dev/gpt/volume-nyc1-02
最后将其添加到 ZFS 池中:
sudo zpool add tank /dev/gpt/volume-nyc1-02.eli
文件系统会自动扩展到池的大小,您可以使用以下命令进行验证:
zpool list
OutputNAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT tank 199G 140K 199G - 0% 0% 1.00x ONLINE -
我们可以使用 zfs list
命令仔细检查:
zfs list
输出显示 tank
卷和正确的空间量:
OutputNAME USED AVAIL REFER MOUNTPOINT tank 62.5K 193G 19K /tank
当您需要更多空间时,只需重复此过程即可将更多卷添加到池中。
我们已将加密分区添加到我们的池中,因此让我们看看如何在服务器重新启动后重新附加它们。
第 5 步 — 处理重启
当您重新启动服务器时,将不再附加加密分区。 您必须手动附加它们。 为了练习,让我们重新启动,以便您可以看到该过程。
使用 shutdown
命令重新启动服务器,这将断开您的 SSH 会话。
sudo shutdown -r now
您的系统可能需要大约一分钟才能重新启动。 机器重新联机后,重新登录到您的 Droplet。
ssh freebsd@your_server_ip
然后附加加密的分区。
sudo geli attach /dev/gpt/volume-nyc1-01
sudo geli attach /dev/gpt/volume-nyc1-02
附加每个分区时,系统会提示您输入在初始化该分区时输入的密码。
现在使用 zpool
查看池的结果:
sudo zpool list
附加分区后,ZFS 会自动查看池并挂载文件系统。
OutputNAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT tank 199G 95.5K 199G - 0% 0% 1.00x ONLINE -
如果我们没有加密卷,我们就不必担心重启期间的这些额外步骤。 我们用便利换取更高的安全性; 没有密码,没有人可以附加卷并查看内容。
结论
如您所见,ZFS 和 DigitalOcean 的块存储可以轻松创建一个可扩展的加密文件系统以满足您的需求。 您可以在 FreeBSD 手册 中了解有关 FreeBSD 上 ZFS 的更多信息。