linux - ext4 中的项目配额

标签 linux filesystems ext4 xfs

这与 ext4 文件系统上的项目配额/目录配额设置有关。在 ext4 文件系统中允许项目配额的补丁是通过补丁 https://lore.kernel.org/patchwork/patch/541895/ 提交的。 .

我已尝试以下步骤(随后是相关命令): 1.在 block 设备上创建文件系统 mkfs.ext4/dev/nvme0n1

  • 启用项目配额 une2fs -O 项目 -Q prjquota/dev/nvme0n1

  • 挂载 block 设备: mount -o prjquota/dev/nvme0n1/test

  • 在装载路径上启用配额: 配额-Pv -F vfsv1/测试

  • 为项目配额创建项目 ID/项目名称: echo 51:/测试/第一>>/etc/projects echo testproj:51 >>/etc/projid

  • 编辑与项目用户相关的配额:testproj edquota -P testproj

  • 设置软 block 单位为10,硬 block 单位为20

  • 确认配额已设置
  • repquota -avugP

    设备/dev/nvme0n1 上的项目配额报告 区 block 宽限时间:7天; inode 宽限时间:7天 block 限制 文件限制

    项目使用了软硬恩典使用了软硬恩典

    测试项目 -- 0 10 20 0 0 0

  • 开始在/test/first 下的所述目录上写入/执行 IO
  • fallocate -l 10G ten.txt

  • 我可以看到在上述位置创建了一个大小为 10G 的文件,并且在 #7 中运行上述命令我可以看到消耗的 inode 没有变化。
  • 还有其他步骤可以在 ext4 文件系统上启用配额吗?

    内核版本:4.15.0-36-generic

    最佳答案

    我相信你错过了

    chattr +P -p 51 /test/first
    

    /etc/projects 似乎仅由 XFS 工具使用。另外/etc/projid 仅用于 pretty-print 。

    仅供引用,这是我想出的程序:

    (实际创建 block 设备的步骤 0:

    dd if=/dev/zero of=/tmp/fs bs=1024 count=80000
    losetup -f /tmp/fs
    losetup -l
    

    )

    1. 创建一个具有足够大 inode 的文件系统:
    mkfs.ext4 -I 256 /dev/loop0
    
  • 启用项目配额并确保默认情况下已安装文件系统(此处使用带有 -E 的扩展选项,避免了第 3 步中的安装选项,但也相当偷偷摸摸,因为您不这么做'在/proc/mounts 中看不到它是这样挂载的)
  • tune2fs -Q prjquota  /dev/loop0
    tune2fs -E mount_opts=prjquota /dev/loop0
    
  • 安装它
  • mount /dev/loop0 /mnt/loop/
    
  • 命令上的配额似乎没有用,所以跳过这个

  • 设置一个 proj 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
    

    这里完全填满了文件系统。

    编辑:有关项目配额限制的更多信息 Re: Project Quota file owner could change its project ID? , Re: ext4 and project quotas bugs (/ features)

    关于linux - ext4 中的项目配额,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52665377/

    相关文章:

    java - 当调用 writeToDirectory 并且目标文件夹中存在同名文件时,Mule 入站端点会保留记录错误

    linux - 没有 fsync() 的 rename() 安全吗?

    linux - 如果设备是 ext4,如何将 block 号映射到 vm.block_dump=1 产生的 dmesg 输出中的文件名?

    linux - 我该如何调试执行脚本的 cron 作业,但脚本似乎未完成?

    linux - 如何在变量中执行字符串命令?

    C 线程文件系统操作 : to ftw() or to fts_open()?

    filesystems - 什么是 ext3 中的孤立列表?

    unix - ext4 可以检测损坏的文件内容吗?

    c++ - 为什么 extern "C"与运行时确定的共享对象库一起使用?

    vhost 的 Php 版本,apache2