现在我有个需求,限制一个 linux 文件夹的大小,目的是把这个目录挂载给 docker 的时候,也能限制 docker 内程序使用的空间大小,之所以限制,是因为 docker 内的程序是给用户使用的,软件也不是自己开发,就不好在软件层面限制硬盘使用大小了。
docker 可以使用下面的方式创建一个受限的 volume ,来源 [stackoverflow](https://stackoverflow.com/questions/40494536/how-to-specify-the-size-of-a-shared-docker-volume)
```shell
docker volume create -d flocker -o size=20GB my-named-volume
```
但是因为我要挂载到外边,后面话要涉及到文件访问备份等一系列操作,所以我找到下面这个更简单灵活的方法。
---
通过文件创建一个虚拟文件系统,然后挂载到指定目录
创建对应的硬盘文件
```shell
dd if=/dev/zero of=~/mydatafile bs=1M count=10
```
* bs=1m 是块大小为1m
* count=10 是有10个块,也就是10m,所以说这里可以创建任意大小,就是通过这个做到文件限制的
* mydatafile 是文件名
在这个文件上创建一个硬盘分区
```shell
mkfs.ext4 ~/mydatafile
```
创建好硬盘分区,就可以挂载了
```shell
#创建一个挂载用文件夹
mkdir /mnt/test
#挂载硬盘文件到对应的文件夹
mount -o loop,rw ~/mydatafile /mnt/test
```
通过 `df` 可以查看刚才挂载的硬盘情况,像是下面这样
```shell
/dev/loop0 5804 5600 0 100% /mnt/test
```
> 因为文件系统也会占用空间,所以文件大小并不等于实际可用空间大小
在我测试文件写入时,复制两个4m大小的文件,成功触发了限制
```shell
cp testfile /mnt/test/1
cp testfile /mnt/test/2
#cp: error writing '/mnt/test/2': No space left on device
```
后面只需要把这个挂载的目录再挂给 docker 容器,就可以限制 docker 容器内软件的硬盘占用了。
后面需要备份数据的话,也可以取消挂载后直接复制刚才创建的硬盘文件
实现linux文件夹大小限制