zfs-root linux系统使用什么ZFS文件结构?

gla*_*len 8 linux zfs filesystems

在 ZFS 中,您可以构建文件系统层次结构,为每个文件系统包含不同的 fs 属性。例如,一个区域的压缩,其他区域的 no-exec/suid,noatime。

例如,FreeBSD 的 HOWTO 建议创建以下文件系统:

zfs create -o compression=off   -o atime=off                    zroot/root
zfs create -o compression=on    -o setuid=off                   zroot/tmp
zfs create -o                                                   zroot/usr
zfs create -o                                                   zroot/usr/home
zfs create -o compression=lzjb                  -o setuid=off   zroot/usr/ports
zfs create -o compression=off   -o exec=off     -o setuid=off   zroot/usr/ports/distfiles
zfs create -o compression=off   -o exec=off     -o setuid=off   zroot/usr/ports/packages
zfs create -o compression=lzjb  -o exec=off     -o setuid=off   zroot/usr/src
zfs create                                                      zroot/var
zfs create -o compression=lzjb  -o exec=off     -o setuid=off   zroot/var/crash
zfs create                      -o exec=off     -o setuid=off   zroot/var/db
zfs create -o compression=lzjb  -o exec=on      -o setuid=off   zroot/var/db/pkg
zfs create                      -o exec=off     -o setuid=off   zroot/var/empty
zfs create -o compression=lzjb  -o exec=off     -o setuid=off   zroot/var/log
zfs create -o compression=gzip  -o exec=off     -o setuid=off   zroot/var/mail
zfs create                      -o exec=off     -o setuid=off   zroot/var/run
zfs create -o compression=lzjb  -o exec=on      -o setuid=off   zroot/var/tmp
Run Code Online (Sandbox Code Playgroud)

我听说不要在 /var 上使用 Linux 本机 ZFS 打开压缩或其他功能,因为它会崩溃。ZFS 文件系统结构和特性(压缩、atime、禁用 setuid 等)在 Linux 系统上应该是什么?

小智 1

我听说不要在 /var 上使用 Linux 本机 ZFS 打开压缩或其他功能,因为它会崩溃。

我想不出在 /var 上启用压缩可能导致系统崩溃的任何原因:压缩在块级别上完全透明地完成。无论是否激活压缩,文件级操作都没有区别。

使用lz4算法进行压缩,您将获得相当不错的数据压缩,而几乎不需要额外的 CPU 利用率。事实上:我经常听到在所有文件系统上打开压缩的建议,并且我已经在生产系统上稳定运行多年的所有池上默认启用了压缩。

因此,如果您不使用高性能数据库等边缘用例,我建议始终启用压缩。

关于其他选项:

  • atime=off:将atime设置为 off 可以显着提高性能,尤其是在处理大量小文件时。这并不是 ZFS 所特有的:更新许多文件的访问时间确实需要时间。
  • setuid=off:Setuid 允许以文件所有者权限执行文件,而不管谁在执行该文件。如果您不需要Setuid,它会增加安全级别以对整个池或数据集禁用此功能。
  • exec=off:这将完全禁用文件的执行。这也可以提高安全级别。但请记住仅在不会放置可执行二进制文件的数据集上使用此选项。一个很好的例子是在 Web 服务器环境中,潜在的攻击者无法执行脚本,即使他设法上传脚本。

我在你发布的 FreeBSD HOWTO 的建议中看不出有什么不好的地方,除了我不会使用lzjb进行压缩,而只是设置compression=on来使用最新的默认算法(可能是lz4 的写作)。

使用zfs create命令指定这些选项这一事实并不意味着这些设置只能设置一次。事实上,你可以做一个

zfs get all <dataset>
Run Code Online (Sandbox Code Playgroud)

查看当前设置并使用 更新它们zfs set <option> <dataset>

例如,如果您有一个压缩=off的数据集,您可以简单地执行

zfs set compression=on <dataset>
Run Code Online (Sandbox Code Playgroud)

来启用它。这不会压缩该数据集中的所有数据,但设置此选项后写入数据集的所有块都将被压缩。您甚至可以从一种压缩算法切换到另一种压缩算法,而无论写入块时使用哪种压缩算法,或者即使根本启用了压缩,存储在该数据集中的所有数据仍然可以访问。