背景说明
在Linux操作系统下有时需要限制一个指定文件夹的大小和文件夹内可存储的文件数量,有可能是出于安全的考量或者定制化的配置,这里我们提供了一种方案:用dd创建一个空的img镜像,进行格式化的配置,然后将其绑定到指定的文件夹上可以限制该文件夹的一些属性。
分配空置的img镜像
通过dd
指令可以分配一个全为0
的1G大小的img镜像:
[root@jira-30 test]# dd if=/dev/zero of=test.img bs=1G count=1
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB) copied, 2.58912 s, 415 MB/s
[root@jira-30 test]# ll -h
total 1.0G
-rw-r--r-- 1 root root 1.0G Dec 15 08:51 test.img
[root@jira-30 test]#
注:如果这里使用/dev/urandom
的话产生的img镜像则是一个随机的块,可用于模拟一个存储满各种数据资源的磁盘
绑定一个循环分区
- 首先查看可用的循环分区
[root@jira-30 test]# losetup -f
/dev/loop2
我们发现可用的是loop0
这个分区,然后使用该分区来初始化img镜像:
[root@jira-30 test]# losetup /dev/loop2 test.img
[root@jira-30 test]# mkfs.xfs /dev/loop2
[root@jira-30 test]# mkfs.xfs /dev/loop2
Discarding blocks...Done.
meta-data=/dev/loop2 isize=512 agcount=4, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@jira-30 test]# losetup -d /dev/loop2
创建一个目录,并绑定已创建的镜像
[root@jira-30 test]# mkdir test
[root@jira-30 test]# mount -o loop test.img test/
查看与测试配置生效情况
执行命令以查看该绑定目录的挂载情况,可发现该目录已挂载在/dev/loop2
下:
[root@jira-30 test]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 9.0M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 50G 24G 27G 48% /
/dev/mapper/centos-data 101G 9.7G 92G 10% /data
tmpfs 379M 0 379M 0% /run/user/0
/dev/dm-4 10G 5.3G 4.8G 53% /data/docker/devicemapper/mnt/c270fdbe9445446ba1e348cc464c8a16835ca1105c6626ca34c6533059937cac
/dev/loop2 1014M 33M 982M 4% /data/test/test
从以上执行查来看,我们这个目录还剩982M的可用空间,接下来我们测试下文件夹大小的限制:
[root@jira-30 test]# dd if=/dev/urandom of=test.img bs=100M count=100
dd: warning: partial read (33554431 bytes); suggest iflag=fullblock
dd: error writing ‘test.img’: No space left on device
0+31 records in
0+30 records out
1027407872 bytes (1.0 GB) copied, 7.75648 s, 132 MB/s
[root@jira-30 test]# ll -h
total 980M
-rw-r--r-- 1 root root 980M Dec 15 09:11 test.img
[root@jira-30 test]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 9.0M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 50G 24G 27G 48% /
/dev/mapper/centos-data 101G 11G 91G 11% /data
tmpfs 379M 0 379M 0% /run/user/0
/dev/dm-4 10G 5.3G 4.8G 53% /data/docker/devicemapper/mnt/c270fdbe9445446ba1e348cc464c8a16835ca1105c6626ca34c6533059937cac
/dev/loop2 1014M 1013M 2.0M 100% /data/test/test
取消挂载
umount /data/test/test
重新挂载
回到创建test.img的目录,执行命令
mount -o loop test.img /data/test/test
扩容空间
# 创建一个2G大小的空镜像文件2G.img
[root@jira-30 test]# dd if=/dev/zero of=2G.img bs=2G count=1
# 扩容
[root@jira-30 test]# cat 2G.img >> test.img
[root@jira-30 test]# xfs_growfs test.img
meta-data=/dev/mapper/centos-data isize=256 agcount=9, agsize=3276800 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0 finobt=0 spinodes=0
data = bsize=4096 blocks=26474496, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal bsize=4096 blocks=6400, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@jira-30 test]#
# 扩容目录
[root@jira-30 test]# umount /data/test/test
[root@jira-30 test]# mount -o loop test.img /data/test/test
[root@jira-30 test]# xfs_growfs /dev/loop2
meta-data=/dev/loop2 isize=512 agcount=4, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 262144 to 786431
- 查看扩容结果
[root@jira-30 test]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 9.0M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 50G 24G 27G 48% /
/dev/mapper/centos-data 101G 17G 85G 17% /data
tmpfs 379M 0 379M 0% /run/user/0
/dev/dm-4 10G 5.3G 4.8G 53% /data/docker/devicemapper/mnt/c270fdbe9445446ba1e348cc464c8a16835ca1105c6626ca34c6533059937cac
/dev/loop2 3.0G 1013M 2.1G 34% /data/test/test
总结
通过以上的方案可以很好的定制化一个特殊的目录,更好的用于管理和规范一个用于执行任务的文件系统,避免资源的恶意占用等问题
文档参考: