背景说明

在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

总结

通过以上的方案可以很好的定制化一个特殊的目录,更好的用于管理和规范一个用于执行任务的文件系统,避免资源的恶意占用等问题

文档参考: