我听说 ZFS 具有重复数据删除功能,因此您可以将同一个文件保存在多个位置,但只使用 ~1 个副本的空间。我注意到我倾向于以音乐/图像/等结尾。随着时间的推移,在我的硬盘驱动器的多个地方,并认为创建一个 ZFS 分区并将我的媒体移动到该分区会很好。我很难找到如何做到这一点,或者如果可能的话。大多数教程都说“使用 3 个磁盘并将它们与 ZFS 一起 RAID”,但我在一台只有一个磁盘的笔记本电脑上,以及一个我不打算擦除的预先存在的操作系统。我看到有关 ZFS 分区的评论(https://serverfault.com/questions/628632/should-i-create-zfs-zpools-with-whole-disks-or-partitions),但我还没有找到任何解释如何将单个 ZFS 分区添加到现有磁盘的内容。这样的事情能做到吗?(我的磁盘分区表类型是 msdos,顺便说一句,我运行的是 Ubuntu。)
如果您的目标是在保持节省空间的同时最大化您的媒体组织,则可以通过为您的媒体库布置一个目录树,然后明智地使用
cp
命令(复制数据)和ln
命令(创建硬或soft [if-s
is used] links) 来访问或复制参考数据,即使只是为了方便在不同的目录和不同的名称下使用相同的文件。仍然是同一个文件,只是指向它的硬链接或软链接不同。在手动级别,在非常简单的视图中,重复数据删除
ln
,同时cp
重复。添加 ZFS 提供了直接的好处,
ln
当您想使用cp
. 有很多用例,例如当媒体被有意分割、修改、编辑、排序等时,存储单独的媒体“剪辑”可以从 ZFS 重复数据删除中受益。ZFS 的成本是重复数据删除相当占用 RAM。内核必须将每个块的校验和或散列存储在磁盘上,并在块被写回池时实时访问该数组。所以当你的磁盘被填满(更多的 ZFS 块被写入)时,更多的 RAM 被填满,因为内核缓存了每个块数据的哈希值。取决于您的笔记本电脑有多少 RAM 和多少磁盘,这可能是也可能不是问题,但要注意重复数据删除的主要成本是有足够的 RAM 来存储整个磁盘的哈希数组。它可以用更少的 RAM 来完成,但是当内核试图在没有足够 RAM 一次保存整个哈希数组的系统上尝试将哈希数组换入和换出 RAM 时,写访问尤其会受到影响。
但话虽如此,试验小型 ZFS 池的一种方法可能是:
创建虚拟块设备
我在这里使用 FreeBSD 命令,但在 Ubuntu 上的步骤类似。我的示例块设备大小为 10G,但如果您有可用空间,您可以使用更大的大小。
创建一个
ztest.dat
10G 大小的文件:# truncate -s 10G ztest.dat
并创建一个由该文件支持的虚拟块设备:
# mdconfig -f ztest.dat
md0
那么我们的虚拟设备就是
/dev/md0
.创建一个简单的 ZPOOL 并启用重复数据删除
这会将
ztest
文件系统安装在/ztest
. 让我们也制作一个简单的 shell 函数,它可以快速显示/ztest
目录、文件系统和 ZFS 池的一些基本统计信息:然后使用这些工具,您可以在下面创建所需的媒体层次结构
/ztest
并开始将一些示例媒体文件复制到/ztest
文件系统中:A
dedupratio
为 1.00 表示未进行重复数据删除;文件系统中数据的逻辑大小是存储在池中的物理数据大小的 1.00 倍。但我们甚至还没有复制任何东西!现在让我们这样做:
并检查结果:
重复数据删除率仍然是 1.00,因为我们只存储了第一个媒体文件的一个副本。让我们创建一个副本:
现在去重率是 2.00,因为文件系统引用的逻辑数据比池中实际存储的数据大 2.00 倍。但请注意,来自的输出
zfs list
表明,尽管USED
值上升到6.25G
,但AVAIL
值几乎没有变化,在6.07G
。让我们创建更多的副本:所以现在,
du
认为我们存储了 12G 的文件:然而
zpool
显示我们在池中只分配了 3.14G 的数据,并且池中还有 6.36G 的未分配空间。等效使用
ln
无重复数据删除另一方面,仍然可以明智地使用缺少重复数据删除的文件系统来实现相同的目的,并且在复杂性、RAM 要求和速度方面的成本可能更低。
所以现在我们仍然有一个文件,可以从四个不同的位置(主副本
copy1.iso
和副本copy2
-copy4.iso
)访问。du
显示我们存储了 3.1G 的文件:ls
向我们展示了许多 inode 编号是相同的(硬链接),并且一个文件是符号链接。使用ln
允许我们将同一个文件放置在多个位置,而不会产生任何额外的存储开销。zfs 文件系统显示 3.1G 已使用,6.1G 可用:
zpool
同样显示我们已经分配了 3.12G 并且有 6.38G 可用。我希望这个示例将鼓励您开发自己的测试框架来试验 ZFS 重复数据删除,看看成本/收益比是否适合您。
回避问题
这种在文件支持的虚拟设备上建立 ZFS 池的实验性框架并不是将 ZFS 池添加到现有系统的长期解决方案。但它可以帮助您确定您当前的硬件是否可以提供必要的资源,以及您的特定用例中的数据和数据处理实践是否可以利用 ZFS 提供的优势。
如果您发现添加 ZFS 池是一个可取的目标,那么您在处理新磁盘分区和文件系统时需要考虑通常的先决条件:
一旦你有:
/dev/sda3
)/tank
您可以通过以下方式将 ZFS 池添加到现有系统:
如果需要,您可以使用以下方法启用重复数据删除:
请记住,这将是一个非冗余池:如果您的驱动器出现故障,您的数据就会消失。
zpool scrub
操作将能够检测数据损坏,但无法纠正发现的任何错误。享受!