在Linux系統下限制指定目錄的大小以及檔案/資料夾數量
背景說明
在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
已經消失,這表示取消掛載成功。
總結
通過以上的方案可以很好的定製化一個特殊的目錄,更好的用於管理和規範一個用於執行任務的檔案系統,避免資源的惡意佔用等問題。