我安装了一个/
启用了压缩的 btrfs 分区:
mount -o subvol=@,defaults,noatime,nodiratime,compress=zstd,space_cache=v2 /dev/mapper/archlinux /mnt
我想在某些文件夹上禁用 CoW 机制,例如:
- 包含我的 VM 磁盘的文件夹
- 任何可能包含 SQLite 数据库的文件夹(主要用于浏览器)
这是什么btrfs 文档状态 :
如果启用压缩,则禁用 nodatacow 和 nodatasum。
但它也指出
如果启用 nodatacow 或 nodatasum,则会禁用压缩。
我同意它们是互斥的这一事实,但是我确实想知道如果我设置chattr +C
为文件夹,哪一个将优先。我的改变会永久有效吗?或者当我使用该选项重新安装分区时,它会在下次启动时被覆盖吗compress
?我的直觉告诉我,这chattr +C
将优先,但我找不到任何文件可以证实这一点。
第二个问题是:有没有办法在所有新创建的 SQLite 数据库上自动禁用 CoW?起初我想编写一个 systemd 计时器,它会扫描整个文件系统以查找 SQLite 数据库并设置chattr +C
对其进行设置。但随后在chattr 手册页我读了以下内容:
如果它设置在已经有数据块的文件上,则分配给该文件的块何时完全稳定是不确定的。
所以基本上我不应该chattr +C
在现有的非空文件上使用。有没有办法连接到文件系统,以便任何以 SQLite 魔术字节结尾\.(sqlite|db)
或具有 SQLite 魔术字节的文件都不会使用 CoW ?或者我别无选择,只能在安装目标应用程序之前手动创建 NoCoW 文件夹?我不一定知道 X 或 Y 应用程序是否正在使用 SQLite 后端,每次我意识到应用程序正在使用 SQLite 时,删除所有应用程序数据来设置 NoCoW 会非常不方便。您建议如何以某种方式自动化此过程?
编辑:
您认为发行版维护者有责任chattr +C
在安装使用 SQLite 的软件包时进行设置吗?