我相信你错过了一个
chattr +P -p 51 /test/first
/etc/projects 似乎只被 XFS 工具使用。此外 /etc/projid 仅用于漂亮的打印。
仅供参考,这是我想出的程序:
(实际创建块设备的步骤 0:
dd if=/dev/zero of=/tmp/fs bs=1024 count=80000
losetup -f /tmp/fs
losetup -l
)
- 创建一个具有足够大 inode 的文件系统:
mkfs.ext4 -I 256 /dev/loop0
- 启用项目配额并确保默认安装文件系统(这里使用扩展选项 with
-E,避免在步骤 3 中使用安装选项,但也很偷偷摸摸,因为您在 /proc/mounts 中看不到它,因为它是这样安装的)
tune2fs -Q prjquota /dev/loop0
tune2fs -E mount_opts=prjquota /dev/loop0
- 安装它
mount /dev/loop0 /mnt/loop/
命令的配额似乎没有用,所以跳过这个
设置一个项目 ID,但作为下一个系统管理员登录到您的盒子的纯粹礼貌。实际上不需要
echo testproj:51 >> /etc/projid
- 实际上使您的文件夹成为项目的一部分(您的列表中缺少该文件夹)
mkdir abc
chattr +P -p 51 abc
- 编辑配额。让我们使用 setquota 工具,它可以稍后在一些 ansible playbook 中使用,这与运行交互式编辑器的 edquota 不同:
setquota -P testproj 0 1234 0 0 /mnt/loop/
- 确认配额已设置
repquota -P /mnt/loop/
# in some parsable format, assuming you wrote some simple enough strings in projid, since the xml formatter is pretty basic
repquota -P /mnt/loop/ -O xml
- 验证它是否有效:
作为普通用户:
dd if=/dev/zero of=someoutput oflag=append
loop0: write failed, project block limit reached.
dd: writing to 'someoutput': Disk quota exceeded
2471+0 records in
2470+0 records out
1264640 bytes (1.3 MB, 1.2 MiB) copied, 0.00985608 s, 128 MB/s
- 验证您可以轻松地逃脱它,作为普通用户:
chattr -p 43 someoutput
dd if=/dev/zero of=someoutput oflag=append
dd: writing to 'someoutput': No space left on device
127427+0 records in
127426+0 records out
65242112 bytes (65 MB, 62 MiB) copied, 0.561987 s, 116 MB/s
这里完全填满了文件系统。
编辑:有关项目配额限制的更多信息回复:项目配额文件所有者可以更改其项目 ID?, Re: ext4 和项目配额错误 (/ features)