Linux不支持直接限制单个文件夹大小,本质是将其变为独立挂载点:1、tmpfs(内存,重启清空);2、loop挂载镜像文件(持久化,需dd/losetup/mkfs/mount);3、quota(按用户/组限制分区总量,非目录维度)。

Linux 本身不支持直接对“某个文件夹”设大小上限——文件系统层级没有「目录配额」这个概念。所谓“限制文件夹大小”,本质是把该目录变成一个独立的、有容量边界的挂载点。方法就三种:用 tmpfs(内存)、用 loop 设备挂载镜像文件、或用 quota 限制用户/组总用量。选哪种,取决于你要限制的是“单个目录的独占空间”,还是“某个用户在某分区下所有数据的总量”。
用 tmpfs 挂载实现轻量级、易清理的目录大小限制
适合临时目录、缓存目录、CI 构建中间产物等场景,特点是快、简单、重启即清空。
-
tmpfs是内存虚拟文件系统,size=参数直接指定最大字节数,比如mount -t tmpfs -o size=512M none /path/to/dir - 必须确保目标目录为空且未被占用,否则
mount会失败;已有内容会被遮盖,不是清空 - 不支持硬链接、设备文件、setuid 等特性,且断电/重启后内容全丢——别用来存重要数据
- 单位支持
K/M/G,但内核最终按字节处理;size=1G和size=1073741824等效
用 loop 设备挂载镜像文件实现持久化、可复用的目录大小限制
这是最接近“给一个文件夹硬性划出固定空间”的做法,镜像文件存在磁盘上,重启后只要重新挂载即可继续使用。
- 先创建镜像:
dd if=/dev/zero of=/var/lib/mylimit.img bs=1M count=100(生成 100MB 空镜像) - 绑定 loop 设备:
losetup /dev/loop0 /var/lib/mylimit.img;若/dev/loop0已被占用,改用/dev/loop1等,用losetup -a查看可用设备 - 格式化:
mkfs.ext4 /dev/loop0(推荐 ext4,支持日志和标准权限) - 挂载:
mkdir -p /srv/limited && mount /dev/loop0 /srv/limited - 卸载顺序不能错:先
umount /srv/limited,再losetup -d /dev/loop0;否则下次挂载会报“device busy”
用 quota 限制用户或组在某分区下的总用量(而非单个目录)
如果你真正想控的是“某用户往 /home/user/appdata 写太多”,而这个目录又在 /home 分区下,那 quota 才是正解——但它管的是用户/组维度,不是路径维度。
- 确认分区启用 quota:检查
/etc/fstab中对应行是否含usrquota(用户)或grpquota(组),没有就加,并执行mount -o remount /home - 初始化数据库:
quotacheck -cug /home(生成aquota.user和aquota.group) - 设置限额:
edquota -u username,在编辑器里填bsoft(软限,触发警告)和bhard(硬限,写入失败),单位是 KB - 启用:
quotaon /home;之后该用户在/home下所有子目录的写入总量都会受控 - 注意:
quota不区分目录,只认 UID/GID;如果多个用户共用一个目录,得用组 quota + 正确设置setgid
真正容易被忽略的点是:没有一种方法能“无侵入地给任意现有目录加大小限制”。你必须要么把它变成挂载点(tmpfs 或 loop),要么接受 quota 的用户/组粒度。试图用 setfacl 或 chattr 实现目录大小限制,纯属误解——它们管权限和属性,不管容量。


















