我正在运行带有 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 是否发生了这种情况?使用nodatacow
make 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 +C
,touch
要么先将内容复制到其中(详情见[2])。
因此,使用nodatacow
mount 选项和单独的文件系统来存储 VM 或 DB 文件可能更容易,就像您已经做过的那样。(您可以考虑是否要将 Btrfs 用于该文件系统,因为在这个用例中它没有太多好处。)
通常,在 btrfs 上存储 VM 或 DB 文件时,还应考虑包含autodefrag
mount 选项,否则,具有许多随机写入的大型 VM 或 DB 文件可能会很快碎片化并降低性能 [3]。
[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