跳转到内容

磁盘配额 ​

读完这一篇,你能给某个用户或用户组设一个空间上限,知道它是怎么计算的,以及它不能做什么。

配额是按「文件属主」算的,不是按共享文件夹 ​

这是最容易搞错的一点。OMV 的配额是 Linux 文件系统的用户配额和用户组配额:

  • 它统计的是这个文件系统上,属于某个用户(或某个组)的所有文件占用的空间。
  • 同一个文件系统上的所有共享文件夹合在一起算,不会分开计。
  • 想「给某个共享文件夹限制 500 GiB」,配额做不到。要么把它放在单独的文件系统(分区、逻辑卷)里,要么换用能按目录或数据集限额的方案,例如 ZFS 数据集配额。

OMV 界面里只能设硬限制,没有软限制、文件数限制和宽限期:超过上限,写入立刻失败。

哪些文件系统支持 ​

文件系统OMV 界面配额
EXT4(以及 EXT2、EXT3)、XFS、F2FS、JFS支持
Btrfs不支持(OMV 界面没有这个功能)
NTFS、exFAT、FAT32、HFS+ 等不支持

文件系统必须是已挂载、状态可用、且不是只读,文件系统 页上的配额按钮才可点。

新版 OMV(7.4.6 起)创建 EXT4 时使用 ext4 内置的配额功能(-O quota),挂载选项带 usrquota,grpquota,见创建并挂载文件系统。更早创建的 EXT4 可能用的是旧的日志配额方式(usrjquota=…),同样能用。

配额会让写入失败,包括服务的写入

影响范围:被设了上限的用户或组在这个文件系统上的所有写入。达到上限后,SMB 复制会报错,用这个用户身份运行的容器或服务也会写入失败,表现为服务异常而不是明确的「空间不足」。

前置条件:

  • 弄清楚文件属于谁。容器常以 root 或自己的 PUID 写文件,不要给它们的用户设一个太小的值。
  • 如果你要给 users 这样的共享用户组设配额:按 OMV 默认,共享文件夹的目录带 setgid,新建的文件属组通常都是 users,这个组的配额就等于限制所有人合计使用的空间。除非你就是这个意思,否则别这样做。
  • 第一次设置,先用一个测试用户试一遍。

怎么回退:把对应用户或组的配额改回 0(不限制),保存并应用。

操作步骤 ​

  1. 打开 存储器 → 文件系统(Storage → File Systems),选中要限额的文件系统,点工具栏的配额图标(Quota,饼图)。
  2. 页面列出所有非系统用户和非系统用户组,每行显示名称、类型(用户或用户组)、已用容量和配额。右上角有搜索框。
  3. 选中一行,点编辑。表单里类型和名称是只读的,填:
    • 配额(Quota):整数,0 表示不限制;
    • 单位(Unit):KiB、MiB、GiB 或 TiB,默认 GiB。
  4. 点保存,回到列表,对其他用户重复。
  5. 点页面顶部黄色提示条上的应用。

应用时 OMV 会对这个文件系统执行 quotaon 开启配额,再对每一条记录执行 setquota 写入上限。EXT4 旧式的日志配额还会先运行 quotacheck,大文件系统上可能要等一会儿。这一切的前提是文件系统的挂载选项里带有配额选项,见下一节。

「已用容量」只对设置过配额的人显示

列表里「已用容量」只对已经配置过配额的用户和组读取,其他行显示 0 B。想看所有人的实际占用,用下面的 repquota。

核心的配额页,和挂载编辑器里的配额按钮 ​

OMV 里有两处界面都和「配额」有关,作用不同,很容易混淆:

核心的配额页挂载编辑器里的配额按钮
在哪存储器 → 文件系统,选中文件系统,点配额服务 → 挂载编辑器(Services → Mount Editor)。它是 omv-extras 的 openmediavault-mounteditor 插件,见挂载编辑器与符号链接
做什么给用户或用户组设空间上限,也就是本文前面讲的全部内容只改这个文件系统的挂载选项,不设置任何上限
具体动作保存后写进数据库,应用时执行 quotaon 和 setquota添加配额选项:ext4、xfs、jfs 加上 usrquota,grpquota,ext3、f2fs 加上日志配额选项。移除配额选项:去掉这些选项
生效方式保存后点黄色提示条上的应用添加:点按钮后数据库里的选项立即更新,再点黄色提示条上的应用;按插件的提示,有的选项要重启才生效。移除:确认后立即应用并尝试重新挂载,同时删除挂载点根目录下的 aquota.user 和 aquota.group

两者是前后两步的关系:核心配额页设置的上限,只会应用到挂载选项里带 quota 字样的文件系统。没有这类选项时,OMV 部署配额不会执行 quotaon 和 setquota,只会清理文件系统根目录下的 aquota.user、aquota.group。挂载编辑器的配额按钮管的就是这个前提。所以:

  • OMV 8 新建的 EXT4 和 XFS 本来就带 usrquota,grpquota(见创建并挂载文件系统),不需要用挂载编辑器添加。挂载选项里已经有 usrjquota=… 的老 EXT4,也不需要。
  • 只有当这个文件系统的挂载选项里缺了配额选项(例如被人改掉过),并且 quotaon -p 显示配额没有开,才去挂载编辑器补上。补完重新挂载或重启,再在 OMV 的 shell(SSH 或本机控制台,以 root 身份)里让 OMV 重新部署一次配额:
sh
omv-salt deploy run quota
  • 平时设置、修改、取消某个用户的限额,一律在核心配额页做。

别为了「试试」去点「移除配额选项」

它会立即重新挂载,并删除挂载点下的 aquota.user、aquota.group。核心配额页里已经设好的上限还留在数据库里,但没有配额选项的文件系统不会再应用它们,用户的限制等于悄悄失效。要放开某个用户的限制,在核心配额页把他的配额改成 0,不要动挂载选项。

配额和 SMB 显示的容量 ​

Windows 资源管理器里共享的容量,是服务端报告的。Samba 的逻辑是:取文件系统剩余空间和该用户的配额剩余空间中较小的一个报给客户端,这样设了配额的用户看到的「可用空间」就是他还能写多少。这一行为依赖 Samba 的配额支持,待实机核实。

有一个例外:Btrfs 上的共享,OMV 给 Samba 配置了自定义的 dfree command(omv-btrfs-dfree),它的输出会取代 Samba 对配额的计算。不过 Btrfs 在 OMV 里本来也没有配额。

改了配额之后,客户端显示的容量可能要过一会儿才刷新。

检查结果 ​

在 OMV 的 shell(SSH 或本机控制台,以 root 身份)执行,都是只读命令:

sh
quotaon -p /srv/dev-disk-by-uuid-<UUID>
repquota -us /srv/dev-disk-by-uuid-<UUID>

quotaon -p 显示用户和用户组配额当前是否开启;repquota 列出每个用户的当前占用和限额。提示配额没有开启,说明这个文件系统没有以带配额选项的方式挂载,见上一节和下面的常见问题。

用测试用户验证:新建一个测试用户 quotatest,把它在这个文件系统上的配额设成 100 MiB 并应用,用它登录 SMB,复制一个超过 100 MiB 的文件,应该在接近上限时失败。验证完把配额改回 0,删除测试用户。

常见问题 ​

配额按钮是灰的。 文件系统类型不支持(如 Btrfs、NTFS)、没有挂载、状态是「丢失」,或者它是系统盘上的根文件系统。

设了配额但 quotaon -p 显示未开启。 这个文件系统的挂载选项里没有带 quota 字样,OMV 部署时不会对它执行 quotaon 和 setquota。按上一节的办法,用挂载编辑器插件的添加配额选项补上,重新挂载或重启后再执行 omv-salt deploy run quota。修改挂载选项的风险见文件系统挂载选项与 fstab。

用户列表里没有我要的用户。 列表只含非系统用户和非系统用户组。刚建的用户看不到时,刷新页面,并到 用户 → 用户(Users → Users)确认它已经创建成功。

设了很大的上限却不起作用。 配额只限制属于该用户或组的文件。root 写入的文件、别的用户写入的文件都不计入。SMB 用户写文件时,文件通常属于登录的那个用户;容器则按容器进程的 UID。

整盘 rsync 复制时报 aquota.user、aquota.group 的错误。 旧式日志配额会在文件系统根目录放这两个文件,复制时可以排除它们。见 OMV wiki 的说明。新创建的 EXT4 用内置配额,没有这两个文件。

想按共享文件夹限额。 配额做不到,见开头的说明。

参考资料 ​

OpenMediaVault 非官方中文使用指南,与 openmediavault 项目及其开发者无隶属关系。