ZFS是一个文件系统和卷管理器,支持高存储容量,支持压缩,并可以防止数据损坏。 ZFS,与DigitalOcean的合并块存储 ,提供的存储解决方案,易于设置和扩展。
在本指南中,您将为FreeBSD上的ZFS配置块加密的存储卷,以确保数据安全。
先决条件
- 在支持块存储的数据中心中的FreeBSD Droplet(具有至少4GB的RAM)作为ZFS往往是非常内存密集型的,特别是如果你有兴趣做块重复数据删除。 我们将使用当你创建一个FreeBSD的Droplet将被自动创建默认的FreeBSD帐户。 要了解更多关于登录到您的FreeBSDDroplet和基础管理,检查出入门FreeBSD的系列教程。
- 100 GB卷附加到您的Droplet。 当您创建Droplet您可以创建此卷,也可以使用本指南创建和附加卷。
本教程还将使用第二个100GB卷演示如何向池中添加卷,但不需要预先设置它; 在第5步期间将在上下文中覆盖指令。
第1步 - 分区卷
即使我们将整个卷用于单个文件系统,通常一个好主意是在卷上放置一个分区映射。 这使我们可以应用我们创建的有意义的标签分区。
首先,我们确认音量已附加并可用。 登录您的Droplet。
ssh freebsd@your_server_ip
登录后,确认该卷已连接通过查看输出dmesg
命令。 对于FreeBSD的Droplet本地SSD出现vtbd0
和任何附加卷将出现da
的设备。
使用grep
过滤结果dmesg
的命令da0
,这是我们的附着量。 了解更多关于grep
在我们的教程使用grep和正则表达式搜索在Linux文本模式 。
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
命令并指定密钥的长度,我们要加密的分区:
sudo geli init -l 256 /dev/gpt/volume-nyc1-01
该-l
选项指定密钥的长度,其中,必须为128位或256位的AES-XTS算法。 我们使用我们之前指定的标签引用分区。
当您执行命令时,将提示您输入密码:
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文件系统在该池中使用zfs list
命令:
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内核模块在我们启动操作系统时启动。 该模块是,当我们跑了为我们自动加载zpool create
与命令sudo
,但如果模块自动加载它会更好。
要做到这一点,编辑文件/etc/rc.conf
:
sudo vi /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上的ZFS FreeBSD使用手册 。