乾貨|Linux中限制目錄佔用空間

中興開發者社群發表於2017-11-09

點選上方“中興開發者社群”,關注我們

每天讀一篇一線開發者原創好文640?wx_fmt=png&wxfrom=5&wx_lazy=1

背景

系統執行過程中,一些程式會向硬碟中寫入大量的資料,如果寫入的資料量不做控制,總有一天硬碟會被寫滿,導致一些奇奇怪怪的問題。

為了避免硬碟被寫滿,一般情況下我們需要監控指定的目錄中檔案總大小,如果超出大小則做刪除處理,這種方式麻煩點在於需要建立一個守護程式專門守護目錄,實時或者定時統計目錄中所有檔案的大小,這種方式下,守護程式會佔用很多CPU時間,影響系統效能。

另外一種思路就是使用記憶體盤或者檔案盤,將記憶體或者檔案對映為一個獨立的檔案系統,將此檔案系統掛載到指定目錄,當使用者向此目錄寫入資料時,會被嚴格限制在指定的大小。考慮到資料需要持久化,這裡用檔案對映磁碟的方式。


檔案對映

建立檔案盤

首先我們需要建立一個檔案,作為該檔案系統的宿主(類似於ISO檔案),接著把該檔案作為磁碟使用,在此檔案上建立檔案系統。

需要注意的是,Linbux中mkfs命令只能在塊裝置上執行,而檔案不能直接作為塊裝置,這個矛盾需要解決,幸好系統中提供了一種“偽裝置”功能,可以將一個裝置和檔案關聯起來,訪問此偽裝置時實際訪問的就是關聯的檔案(ISO檔案就是一個很好的範例),有了這種辦法,我們就可以在執行格式化前將檔案通過losetup命令對映為指定裝置,然後針對此裝置操作即可。


建立檔案系統

範例建立一個50M的檔案,並將此檔案系統格式化為Ext3格式;

  1. dd if=/dev/zero of=file.disk bs=1M count=50

  2. losetup /dev/loop100 file.disk

  3. mkfs.ext3 /dev/loop100

  4. losetup -d /dev/loop100


掛載檔案系統

接著將此檔案mount到本機的一個目錄中(工作目錄為/home/hxg/test/disk):

  1. cd /home/hxg/test/disk

  2. mount -o loop file.disk mhere/

用df命令看下當前系統上的磁碟,發現多出來一個/dev/loop2裝置,此裝置掛載到了/home/hxg/test/disk/mhere目錄上:

  1. [root@hxg33 disk]# df

  2. Filesystem                1K-blocks     Used Available Use% Mounted on

  3. /dev/mapper/ncl-root       11397120  2428540   8968580  22% /

  4. /dev/loop2                    45478      827     42091   2% /home/hxg/test/disk/mhere

如何確定/dev/loop2裝置就是我們剛剛建立的file.disk檔案呢?使用losetup檢視,可以看到該裝置指向的檔案為/home/hxg/test/disk/file.disk:

  1. [root@hxg33 disk]# losetup -l loop2

  2. NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE

  3. /dev/loop2         0      0         1  0 /home/hxg/test/disk/file.disk

驗證

建立一個30MB的檔案,建立成功:

  1. [root@hxg33 mhere]# dd if=/dev/zero of=file.disk bs=1M count=30

  2. 30+0 records in

  3. 30+0 records out

  4. 31457280 bytes (31 MB) copied, 0.144564 s, 218 MB/s

接著再建立一個30MB的檔案,建立失敗,原因是磁碟滿了:

  1. [root@hxg33 mhere]# dd if=/dev/zero of=file1.disk bs=1M count=30

  2. dd: error writing file1.disk’: No space left on device

  3. 14+0 records in

  4. 13+0 records out

  5. 14082048 bytes (14 MB) copied, 1.69731 s, 8.3 MB/s

總結

通過檔案對映磁碟的方式,然後將此虛擬磁碟對映到指定目錄,我們就能很好的保證此目錄空間能夠很好的限制住。不足就是在建立檔案磁碟的時候,就已經預先指定了大小並分配了空間。

但無論如何,此方法能完全杜絕硬碟寫爆的風險。


擴充閱讀

乾貨|監控硬碟讀寫


640?wx_fmt=jpeg

相關文章