Ext4 vs. XFS vs. Btrfs vs. ZFS for NAS

Ale*_*haw 37 xfs zfs network-attached-storage ext4 btrfs

我的用例:我在 M.2 SSD 上安装了 Ubuntu Server 18.04。我有一个 4TB 硬盘,我想添加为存储。由于它主要用于大型媒体文件和备份,因此不会经常写入。

您认为哪种文件系统最适合此用例?

我的主要候选者是 Ext3/4、XFS、Btrfs 和 ZFS(随意争论另一个)。

我不是在问“什么是最好的文件系统?”——没有“最好的”这样的东西。 我只是问人们哪个文件系统可能最适合这个用例。请尝试包括:

  • 有什么缺点或风险吗?我听说如果断电,XFS 会损坏数据。与没有 ECC RAM 的 ZFS 相同。
  • 以后是否可以在不丢失数据的情况下添加 RAID-1?我现在没有足够的钱购买另一个硬盘驱动器(我将它用于外部驱动器;RAID 不会取代备份),但我可能会在以后添加一个。这不是一个要求,只是一些可能很好的东西。
  • 读/写性能如何?Btrfs 可能满足我的大部分需求,但在 Phoronix 基准测试中速度非常慢。XFS 具有令人印象深刻的性能,但我听说它会导致数据丢失。

谢谢你的建议。

sho*_*hok 32

我通常使用以下两个文件系统之一:

  • XFS 适用于与 CoW 不兼容的任何东西(或用于数据存储已经在 CoW 文件系统上的虚拟机)或需要极快的直接 I/O 时;

  • ZFS 用于其他任何事情。

对于您的用例,我将使用 ZFS,特别是考虑到 Ubuntu 18.04 已经提供了它。由于您可以轻松地将另一个镜腿连接到现有设备,因此 ZFS 非常适合该要求。例如,让您的磁盘命名nvme0p1

  • zpool create tank /dev/nvme0p1 创建名为“tank”的单个 vdev 池;
  • zpool attach tank <newdev> /dev/nvme0p1 启用镜像。

如果由于某些原因,您不/不能使用 ZFS,那么 MDRAID 和 XFS 是您的朋友:

  • mdadm --create /dev/md200 -l raid1 -n 2 /dev/nvme0p1 missing 将创建一个缺少支路的 RAID1 阵列(参见 #1);
  • mdadm --manage /dev/md200 --add <newdev> 附加一个新的镜腿(形成一个完整的 RAID1,见 #2)

创建阵列后,您可以通过 XFS 对其进行格式化 mkfs.xfs

建议使用 BTRFS,因为性能和弹性都低于标准。例如,来自Debian wiki

当前 (2019-07-07, linux ? 5.1.16) 存在一个错误,该错误导致双磁盘 raid1 配置文件在第二次以降级状态挂载时永远变为只读——例如,由于缺少/损坏/SATA 链接重置盘

另请注意,使用 BTRFS(阅读:Synology)的商业 NAS 供应商不使用其自己的集成 RAID 功能;相反,他们使用经过验证的 Linux MDRAID 层。

编辑:虽然有些人认为 XFS 容易丢失数据,但这根本不正确。好吧,与 ext3 相比,XFS(和其他支持延迟分配的文件系统)在不受控制的断电情况下可能会丢失更多未同步的数据。但同步数据(即:重要写入)是 100% 安全的。此外,一个加剧 XFS 数据丢失的特定错误已在 10 多年前得到纠正。除了这个错误之外,任何延迟分配就绪的文件系统(包括 ext4 和 btrfs)都将在控制器断电的情况下丢失大量或未同步的数据。

与 ext4 相比,XFS 具有无限的 inode 分配、高级分配提示(如果您需要)以及在最新版本中的 reflink 支持(但它们需要在 Ubuntu 18.04 中明确启用,有关其他信息,请参阅mkfs.xfs 手册页


1:/proc/mdstat缺少设备的示例文件:

Personalities : [raid1]
md200 : active raid1 loop0[0]
      65408 blocks super 1.2 [2/1] [U_]

unused devices: <none>
Run Code Online (Sandbox Code Playgroud)

2:/proc/mdstat添加第二个设备后的文件

Personalities : [raid1]
md200 : active raid1 loop1[2] loop0[0]
      65408 blocks super 1.2 [2/2] [UU]

unused devices: <none>
Run Code Online (Sandbox Code Playgroud)


Mik*_*l H 6

这看起来更像是针对超级用户而不是针对 serverfault 的问题,但其中一些想法也适用于该站点,因此我将尝试回答一些问题:

  • XFS 以不喜欢断电而闻名。从那以后发生了很多事情,现在 RedHat、Oracle 等将它用作默认文件系统,所以如果今天这个问题比以前小得多,我不会感到惊讶。特别是如果你有一个不错的备份策略,如果你的用例是从这个文件系统中看到速度优势的那种,那么可能值得冒险。
  • 没有 ECC RAM 的 ZFS 仍然具有非常好的功能,但是您冒着无法捕捉到一些坏数据实例的风险。我在没有 ECC 内存的情况下在类似于您所描述的家庭环境中运行 ZFS 多年,并且从未经历过明显的数据丢失,但是我再次没有将关键数据完全存储在该卷上。从那以后,我迁移到了合适的服务器硬件,现在对将我的存储实际用于重要的东西感到更加自在。
  • 使用 ZFS,您应该能够简单地将磁盘添加到单磁盘池以创建镜像。我还没有在实践中尝试过,但是在检查duckduckgo时,我得到了多个声称成功的搜索结果。我不确定其他系统,但只要您的文件系统下有某种卷管理器,从单个磁盘转到 RAID1 应该是微不足道的。
  • 基于 CoW 的文件系统(zfs、btrfs)比功能不那么丰富的系统要慢,而且它们更依赖于有足够强大的硬件支持它们。

就像在公司环境中一样,我肯定会花时间以我的预期负载运行基准测试,以获得性能与功能的第一手经验。


Tho*_*sen 5

我会使用有问题的操作系统建议的任何日志文件系统作为默认值,除非我有很好的理由不这样做。上次我检查 Ubuntu 是 ext4。

原因很简单:默认是最有可能被使用最多的,所以任何错误被发现和修复的机会是最大的。您提到的文件系统之间的差异在日常轻度使用中不太可能有太大意义。如果性能非常重要,那么请考虑获得更多内存,以便您的操作系统有更多的缓存空间。

也就是说,如果您要“跨”操作系统使用驱动器,我建议您获得两个,或者至少将您拥有的一个拆分为两个物理分区,然后在有媒体的那个上使用 NTFS 或 exFAT。