背景說明
在Linux操作系統下有時需要限制一個指定文件夾的大小和文件夾內可存儲的文件數量,有可能是出於安全的考量或者定制化的配置,這里我們提供了一種方案:用dd創建一個空的img鏡像,進行格式化的配置,然后將其綁定到指定的文件夾上可以限制該文件夾的一些屬性。
分配空置的img鏡像
通過dd
指令可以分配一個全為0
的10M大小的img鏡像:
[dechin-manjaro limits-test]# dd if=/dev/zero of=test.img bs=10M count=1
記錄了1+0 的讀入
記錄了1+0 的寫出
10485760字節(10 MB,10 MiB)已復制,0.0390058 s,269 MB/s
[dechin-manjaro limits-test]# ll
總用量 10240
-rw-r--r-- 1 root root 10485760 1月 11 17:11 test.img
注:如果這里使用/dev/urandom
的話產生的img鏡像則是一個隨機的塊,可用於模擬一個存儲滿各種數據資源的磁盤。
綁定一個循環分區
首先查看可用的循環分區:
[dechin-manjaro limits-test]# losetup -f
/dev/loop0
我們發現可用的是loop0
這個分區,然后用該分區來初始化img鏡像:
[dechin-manjaro limits-test]# losetup /dev/loop0 test.img
[dechin-manjaro limits-test]# mkfs.ext4 /dev/loop0 -N 5
創建含有 10240 個塊(每塊 1k)和 16 個inode的文件系統
文件系統UUID:7448390b-a205-41bd-bdc7-42fbf29c00ec
超級塊的備份存儲於下列塊:
8193
正在分配組表: 完成
正在寫入inode表: 完成
創建日志(1024 個塊)完成
寫入超級塊和文件系統賬戶統計信息: 已完成
[dechin-manjaro limits-test]# losetup -d /dev/loop0
創建一個目錄並綁定已創建鏡像
[dechin-manjaro limits-test]# mkdir test-dir
[dechin-manjaro limits-test]# mount -o loop test.img test-dir/
查看與測試配置生效情況
執行命令以查看該綁定目錄的掛載情況,可發現該目錄已掛載在/dev/loop0
下:
[dechin-manjaro test-dir]# cd test-dir/
[dechin-manjaro test-dir]# df -h
文件系統 容量 已用 可用 已用% 掛載點
dev 20G 0 20G 0% /dev
run 20G 1.6M 20G 1% /run
/dev/nvme0n1p9 144G 41G 95G 31% /
tmpfs 20G 0 20G 0% /dev/shm
tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
tmpfs 20G 69M 20G 1% /tmp
/dev/nvme0n1p1 300M 31M 269M 11% /boot/efi
tmpfs 3.9G 104K 3.9G 1% /run/user/1000
/dev/loop0 9.0M 172K 8.2M 3% /home/dechin/projects/2021-security/limits-test/test-dir
[dechin-manjaro test-dir]# df -i
文件系統 Inodes 已用(I) 可用(I) 已用(I)% 掛載點
dev 4.9M 545 4.9M 1% /dev
run 4.9M 949 4.9M 1% /run
/dev/nvme0n1p9 9.2M 833K 8.4M 9% /
tmpfs 4.9M 1 4.9M 1% /dev/shm
tmpfs 1.0K 18 1006 2% /sys/fs/cgroup
tmpfs 400K 199 400K 1% /tmp
/dev/nvme0n1p1 0 0 0 - /boot/efi
tmpfs 998K 92 998K 1% /run/user/1000
/dev/loop0 16 11 5 69% /home/dechin/projects/2021-security/limits-test/test-dir
從以上執行結果,我們還可以看到這個目錄還有剩余9M的可用空間以及5個的可用文件innode數量。這里的innode數量是Linux系統對於文件和文件夾的一個標識符號,每一個文件或者文件夾都有這個標識,如果只給這個掛載盤分配5個可用的innode,這表示在該目錄下最多只能存在5個的文件或者文件夾,這里讓我們用實際的案例來測試一下:
[dechin-manjaro test-dir]# touch 1
[dechin-manjaro test-dir]# touch 2
[dechin-manjaro test-dir]# touch 3
[dechin-manjaro test-dir]# touch 4
[dechin-manjaro test-dir]# touch 5
[dechin-manjaro test-dir]# touch 6
touch: 無法創建 '6': 設備上沒有空間
在上面這個測試中我們發現,對於innode數量的限制已經生效,接下來把這些文件都刪除后,測試一下文件夾大小的限制:
[dechin-manjaro test-dir]# dd if=/dev/urandom of=test.img bs=10M count=1
dd: 寫入 'test.img' 出錯: 設備上沒有空間
記錄了1+0 的讀入
記錄了0+0 的寫出
9039872字節(9.0 MB,8.6 MiB)已復制,0.289899 s,31.2 MB/s
[dechin-manjaro test-dir]# ll
總用量 8841
drwx------ 2 root root 12288 1月 11 17:24 lost+found
-rw-r--r-- 1 root root 9039872 1月 11 17:54 test.img
這里我們嘗試去創建一個10M的文件,但是由於目錄本身的限制,以及lost+found
這個目錄已經占用了一部分的資源,因此最終只有9M的文件大小能夠分配成功。到這里為止,我們的測試就已經結束了,經過驗證配置是完全生效的。
取消該文件的掛載
首先返回到綁定文件夾所在的目錄層,然后執行umount
指令:
[dechin-manjaro limits-test]# ll
總用量 9969
drwxr-xr-x 3 root root 1024 1月 11 17:54 test-dir
-rw-r--r-- 1 root root 10485760 1月 11 17:54 test.img
[dechin-manjaro limits-test]# umount test-dir/
[dechin-manjaro limits-test]# df -h
文件系統 容量 已用 可用 已用% 掛載點
dev 20G 0 20G 0% /dev
run 20G 1.6M 20G 1% /run
/dev/nvme0n1p9 144G 41G 95G 31% /
tmpfs 20G 0 20G 0% /dev/shm
tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
tmpfs 20G 69M 20G 1% /tmp
/dev/nvme0n1p1 300M 31M 269M 11% /boot/efi
tmpfs 3.9G 104K 3.9G 1% /run/user/1000
在umount
之后,我們發現在掛載目錄中的test-dir
已經消失,這表示取消掛載成功。
總結概要
通過以上的方案可以很好的定制化一個特殊的目錄,更好的用於管理和規范一個用於執行任務的文件系統,避免資源的惡意占用等問題。
版權聲明
本文首發鏈接為:https://www.cnblogs.com/dechinphy/p/limits.html
作者ID:DechinPhy
更多原著文章請參考:https://www.cnblogs.com/dechinphy/