在这种情况下,btrfs nodatacow 挂载选项如何影响这 3 个磁盘?

在这种情况下,btrfs nodatacow 挂载选项如何影响这 3 个磁盘?

我正在运行带有 BTRFS 的 Arch Linux。这台计算机有 3 个物理 HDD(没有 RAID 等)。我有一个磁盘安装在/,一个安装在/cow,一个安装在/nocow。这是 fstab:

# /etc/fstab
# <file system> <dir>   <type>  <options>       <dump>  <pass>
UUID=a101       /               btrfs           rw,noatime,nodiratime,compress=lzo,space_cache,subvol=/@ 0 0
UUID=b202       /cow            btrfs           rw,noatime,nodiratime,compress=lzo,space_cache,subvol=/@cow 0 0
UUID=c303       /nocow          btrfs           rw,noatime,nodiratime,compress=lzo,space_cache,nodatacow,subvol=/@nocow 0 0

我理解这nodatacow文件系统mount 选项,因此它将应用于该文件系统的所有已挂载子卷,使用时。但我对文件系统没有明确的定义。有时,文件系统可以跨越多个磁盘。上面的 fstab 是否发生了这种情况?使用nodatacowmake that option 安装一个磁盘是否适用于三个全部我的物理磁盘?或者,当我分别格式化每个磁盘并在每个磁盘上创建 BTRFS 文件系统时,我是否有 3 个单独的文件系统?

在相关主题上,我了解到启用 nodatacow 时,压缩将被禁用。我认为这意味着我应该compress=lzo从安装第三个磁盘的选项中删除,如下所示:

UUID=c303 /nocow btrfs rw,noatime,nodiratime,space_cache,nodatacow,subvol=/@nocow 0 0

最重要的问题是使用该nodatacow选项挂载这第三个磁盘是否影响整个文件系统(所有 3 个磁盘和其下的所有目录/)还是仅影响挂载点下的文件系统(部分)/nocow

使用会更好吗chattr +C /nocow?我没有这样做,因为我不确定该属性是否会影响稍后挂载在该目录的文件系统(并且挂载时没有使用该nodatacow选项)。

/nocow保存一些 mysql 数据库。

答案1

我理解 nodatacow 是一个文件系统挂载选项,因此,当使用时,它将应用于文件系统的所有已挂载子卷。但我对文件系统没有明确的定义。有时,文件系统可以跨越多个磁盘。上面的 fstab 是否也发生这种情况?

由于您正在安装三个不同的 UUID,我怀疑您确实有三个独立的文件系统。

但是,您还在挂载中指定了子卷。这表明您可能具有以下布局:

HDD1
└──── Filesystem 1 (a101)
      └──── Subvolume /@ mounted at /
HDD2
└──── Filesystem 2 (b202)
      └──── Subvolume /@cow mounted at /cow
HDD3
└──── Filesystem 3 (c303)
      └──── Subvolume /@nocow mounted at /nocow

您有三个独立的文件系统,每个文件系统都有一个子卷。在这种情况下,nodatacow挂载选项可以分别应用于这三个文件系统。

但是btrfs,您也可以只有一个文件系统(可能跨越多个硬盘,也可能但不一定使用某种形式的 RAID),并将该文件系统的单独子卷(类似于文件夹)安装到不同位置。这意味着您将拥有如下布局:

HDD1 [...HDDn]
└──── Filesystem 1
      ├──── Subvolume /@ mounted at /
      ├──── Subvolume /@cow mounted at /cow
      └──── Subvolume /@nocow mounted at /nocow

在这种情况下,nodatacow挂载选项将适用于所有子卷,因为它们位于同一个文件系统上。

使用 nodatacow 安装一个磁盘是否会使该选项适用于我的所有三个物理磁盘?

不。

或者,因为当我单独格式化每个磁盘并且在每个磁盘上创建了一个 BTRFS 文件系统时,我是否有 3 个单独的文件系统?

是的。

在相关主题上,我了解当启用 nodatacow 时,压缩将被禁用。

确实如此 [1],您可以在 /nocow 挂载上删除该挂载选项。但由于您有三个独立的文件系统,因此如果您愿意,仍然可以在启用压缩的情况下挂载其他两个文件系统(/ 和 /cow)。

用起来会不会更好一些chattr +C /nocow

使用像这样的扩展文件属性来实现 nocow 操作是一种可能的替代方法

  • chattr +C如果文件夹仍然是空的,你就必须删除它!
  • 您要么必须在已有的文件夹中创建新文件chattr +Ctouch要么先将内容复制到其中(详情见[2])。

因此,使用nodatacowmount 选项和单独的文件系统来存储 VM 或 DB 文件可能更容易,就像您已经做过的那样。(您可以考虑是否要将 Btrfs 用于该文件系统,因为在这个用例中它没有太多好处。)

通常,在 btrfs 上存储 VM 或 DB 文件时,还应考虑包含autodefragmount 选项,否则,具有许多随机写入的大型 VM 或 DB 文件可能会很快碎片化并降低性能 [3]。

[1]https://btrfs.wiki.kernel.org/index.php/Compression#How_does_compression_interact_with_direct_IO_or_COW.3F

[2]https://btrfs.wiki.kernel.org/index.php/FAQ#Can_copy-on-write_be_turned_off_for_data_blocks.3F

[3]https://btrfs.wiki.kernel.org/index.php/Gotchas#Fragmentation

相关内容