linux 下磁碟配額設置

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0
不管磁碟空間有多麼大,磁碟空間不夠使用似乎是一個永遠的事實。而且Linux系統在默認情況下,並不限制每個用戶使用磁碟空間的大小,如果某個用戶疏忽 或惡意將磁碟佔滿,將導致系統無法進行寫操作甚至崩潰。因此Linux提供了限制用戶磁碟空間的手段,以便促使每個用戶合理有效地使用分配給他的空間。

設置用戶和組配額的分配量對磁碟配額的限制一般是從一個用戶佔用磁碟大小和所有文件的數量兩個方面來進行的。設置磁碟配額時,「某用戶在系統中共計只能使 用50MB磁碟空間」,這樣的限制要求是無法實現的;只能設置「某用戶在/home分區能使用30MB,在/backup分區能使用20MB」。磁碟配額 的設置單位是分區,針對分區啟用配額限制功能后才可以對用戶設置,而不理會用戶文件放在該文件系統中的哪個目錄中,其他系統,如Unix、 Windows,原理與Linux相同。在具體操作之前,我們先了解一下磁碟配額的兩個基本概念:軟限制和硬限制。

◆軟限制:一個用戶在一定時間範圍內(默認為一周,可以使用命令「edquota -t」重新設置,時間單位可以為天、小時、分鐘、秒)超過其限制的額度,在不超出硬限制的範圍內可以繼續使用空間,系統會發出警告(警告信息設置文件為 「/etc/warnquota.conf」),但如果用戶達到時間期限仍未釋放空間到限制的額度下,系統將不再允許該用戶使用更多的空間。
◆硬限制:一個用戶可擁有的磁碟空間或文件的絕對數量,絕對不允許超過這個限制。

明白了上面的基本概念,我們就可以配置磁碟配額了。設置磁碟配額的步驟:
(1)啟動分區配額功能;
(2)生成配額信息文件;
(3)設置用戶和組配額;
(4)啟動磁碟配額服務。

1. 啟動分區配額功能
 

  用管理員身份登錄系統,編輯系統配置文件/etc/fstab中相應分區(以/home分區為例)的設置選項,若開啟用戶配額添加選項「usrquota」,用戶組配額添加選項「grpquota」,中間以逗號隔開。
LABEL=/home /home ext3 defaults,usrquota 1 2
   用戶組配額用以限定一組用戶共計可以使用的空間數,一般應用較少,本例只啟動用戶配額。
   分區配額功能生效需要重新啟動系統,或者簡單一點,重新掛載此分區,讓其新加參數生效:
# mount -o remount /home

2. 生成配額信息文件
   檢測分區中當前用戶空間使用情況,並生成保存配額信息的資料庫文件:
# quotacheck -F vfsv0 -uv /home (生成符合系統要求的 aquota.usr)
# quotacheck -g /home (生成符合系統要求的 aquota.group)
   選項「-F vfsv0」指定磁碟配額功能實現的軟體版本,當前流行的Linux版本基本都為Quota 2.0 ,可以使用命令「man quotacheck」查看到此信息,不必像絕大多數的文章和書籍資料中手工「touch」創建。
   選項「-u」指定生成用戶配額信息文件「aquota.user」(Quota 1.0為quota.user),如果設置了用戶組配額則添加選項「-g」生成配額信息文件「aquota.group」,選項「-v」表示執行時顯示詳 細信息。執行結果中自動報告了分區/home的空間使用情況,並自動生成了配額信息文件「aquota.user」,其許可權為600 。
   若較老的Linux系統(Quota 1.0)要升級到Quota 2.0 ,可以使用命令「convertquota」將老格式文件「quota.user」和「quota.group」轉換為新格式「aquota.user」和「aquota.group」。

3. 設置用戶和組配額
   使用edquota命令為每個用戶設置磁碟配額,如下例為用戶Sam設置配額:
# edquota Sam
   系統會調用Vim/Vi生成一臨時文件,編輯方法與vi完全相同,以ZZ或:wq命令退出。在此文件中可對用戶Sam配額信息進行編輯,默認文件內容如下:
Disk quotas for user Sam (uid 500):
Filesystem    blocks      soft      hard    inodes    soft    hard
/dev/hda3       5         0        0        5       0      0
   其中「Filesystem」欄位表明使用磁碟配額的分區對應的設備名稱,「blocks」和「inodes」分別表明了用戶當前已經使用的磁碟空間(以 KB為單位)和建立的文件數(此限制一般較少應用),「soft」和「hard」即為前文提及的軟限制和硬限制(大多數應用不設置軟限制)。
   編輯此文件,把軟、硬限制設置到合適的數值,保存退出,可以看到「aquota.user」文件的大小改變,說明用戶的配額已經儲存。設置組配額可以使用命令「edquota -g 組名」。
   設置大量用戶的磁碟配額,若分配給用戶的配額相同,可以使用命令edquota的「-p」選項在用戶之間複製配額設置,可用下面的命令給這些用戶賦予與protuser相同的限額:
# edquota [-u] -p protuser user1 user2 user3
# edquota -g -p protgroup group1 group2 group3
   例如將用戶Sam的配額信息複製給Helen和Jack:
# edquota -p Sam Helen Jack
   這樣可將配額模板用戶設置複製給任意多用戶,或可利用此命令編寫shell腳本批量複製。此外,也可以使用命令「setquota」來設置磁碟配額,如:
# setquota Mary 0 20480 0 0 /home
   這樣可以限定用戶Mary可以在/home分區使用空間20MB ,具體用法在此不在贅述。

   在第三步中設置用戶Sam配額為10MB ,如下:
Disk quotas for user Sam (uid 500):
Filesystem    blocks      soft      hard    inodes    soft    hard
/dev/hda3       5         0       10240     5       0      0
   切換到用戶Sam ,做磁碟爆滿測試:
# dd if=/dev/zero of=quotatest bs=1024k count=10240000
hda3: write failed, user block limit reached.
dd: writing `quotatest': Disk quota exceeded
1+0 records in
0+0 records out
1036288 bytes (1.0 MB) copied, 0.0174559 seconds, 59.4 MB/s
   用戶Sam達到限定的磁碟空間,出現了上面的提示信息,他將不能再創建文件,有效的控制了用戶磁碟空間的使用。
 
4. 啟動磁碟配額服務
   使用命令quotaon用來激活配額系統並允許配額檢查:
# quotaon /home
   若關閉配額服務則使用命令「quotaoff」。
   分區的磁碟配額功能設置后,每次開機會自動載入並啟動服務,務須另行在啟動腳本中設置。

5. 其他功能設置設定soft quota和hard quota之間的時間
# edquota -t
出現一個 vi 窗口:
Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
Filesystem Block grace period Inode grace period
/dev/hda7 7days 7days

修改成自己所需要的,並保存退出就設置這個時間啦。在這之後可能需要重新啟動,以使磁碟限額生效。

6. 檢查磁碟空間限制的一致性
   系統會自動每次重新啟動時,在檢查硬碟後進行( /etc/rc.sysinit ),無須親自進行。假若分區已經以「讀寫」方式掛上時要小心,例如:
# quotacheck /home
quotacheck: Quota for users is enabled on mountpoint /home so quotacheck might damage the file.
Please turn quotas off or use -f to force checking.

   這時, 由於某種需要,或者在某種情況,「不得不」運行這個命令 :
# quotacheck -mf [-u] /dev/hda7
# quotacheck -mf -g /dev/hda7
   參數 -m[M] 意思是:強迫在「讀、寫」模式下檢查硬碟的 quota (有一定的「正在寫」的數據丟失可能,應確保沒有進程在寫這個分區。建議在單用戶模式下進行。

例如:(在平時檢查)
# quotacheck /var/spool/ -f
quotacheck: Cannot remount filesystem mounted on /var/spool read-only so counted values might not be right.
Please stop all programs writing to filesystem or use -m flag to force checking.

# quotacheck /var/spool/ -m
quotacheck: Quota for users is enabled on mountpoint /var/spool so quotacheck might damage the file.
Please turn quotas off or use -f to force checking.

7. 取消磁碟空間和i節點數目的限制
# quotaoff /home (取消磁碟空間限制。)
# quotaon /home (現在啟動磁碟空間限制。)
# quotaon /home (如果已經啟動磁碟空間限制,會出現以下錯誤:)
quotaon: using /home/aquota.group on /dev/hda7: Device or resource busy
quotaon: using /home/aquota.user on /dev/hda7: Device or resource busy

8. 查看磁碟配額
 用戶查看自己當前的配額信息,可使用命令「quota」:
# quota
Disk quotas for user Sam (uid 500):
Filesystem blocks  quota  limit  grace  files  quota  limit  grace
/dev/hda3   1022    0   1024           6     0     0    
   其中「quota」欄位為軟限制,「limit」欄位為硬限制,「grace」欄位為軟限制達到后寬限期(前文「edquota -t」設定的時間)。
   若管理員查看各個用戶的磁碟配額使用情況,可以使用命令「repquota」:
# repquota /home
*** Report for user quotas on device /dev/hda3
Block grace time: 7days; Inode grace time: 7days
Block limits               File limits
User       used       soft       hard grace       used       soft       hard grace
-----------------------------------------------------------------
root --       10545       0       0       4       0       0     
sam --               1024       0       1024       8       0       0     
helen --       5       0       10240       5       0       0
…………
   從結果中可以方便的查看到用戶的配額使用情況。如果想獲得其他更多信息還可以執行命令「quotastats」,詳見幫助。

inode與block使用說明
   磁碟配額限制空間使用的方法有兩種,即分別對inode和block進行限制。磁碟配額可以限定用戶在分區中使用的空間大小(blocks),也可以限定 用戶可以在分區中最多創建的文件數(inodes),需要注意的是,只要用戶所創建的文件超過他可以使用的inode數額,即使這些文件是空的,他再次創 建文件的行為也將被限制。
   此處說明一下inode的概念。在Linux中創建一個文件,系統就為該文件分配一個惟一的inode ,文件的inode用於訪問文件的屬性。也就是說,Linux系統中每個文件都要對應一個inode,通俗點說Linux內核不認識字母,所以用戶要有UID、用戶組要有GID、進程要有PID……,文件要有inode ,一旦inode丟失文件將無法被訪問。
使用命令「ls -i」可以查看到文件的inode號。
# ls -i
163523 inittab 163524 services 163525 a b
   Linux系統中的硬鏈接文件與原文件大小一樣,且可同步更新,因為硬鏈接是一個指向文件的指針,它與原文件的inode相同。
   如果系統中有名稱特殊的文件,如「a b」,使用「rm」命令無法對其操作(因「rm」會判斷為要刪除兩個文件「a」和「b」),此時可以利用inode的原理,假設「a b」的inode為163535,查看詳細信息執行:
# find . -inum 163535 -exec ls -l {} \;
-rw-r--r-- 1 root root 0 Nov 27 15:21 ./a b
   刪除此文件執行:
# find . -inum 163535 -exec rm {} \;
   選項「-inum」即為查找文件的inode ,選項「-exec」為find命令的連接符。
   另外,在部署磁碟配額前,要考慮哪些分區需要設置。一般而言,保存用戶宿主目錄的分區(一般為/home)一定要設置磁碟配額,公共存儲用戶數據的分區要設置磁碟配額(如公司的網路備份應用伺服器)。
 
磁碟爆滿測試
   一個沒有設置磁碟配額的Linux系統中,使用某一普通用戶登錄,執行命令:
# dd if=/dev/zero of=quotatest bs=1024k count=10240000
   命令將生成一個固定大小的文件。其中「if」表示輸入,偽設備/dev/zero不斷生成字元串「0」,初始化文件;「of」表示輸出,此例為在用戶當前 目錄下生成文件「quotatest」;「bs」為「block size」指定數據塊大小,單位設定為「1024k」即1MB;「count」為總計生成的文件(「quotatest」)大小,若「bs」為1MB,則 「10240000」為10000GB。
   大多數伺服器磁碟空間沒有這麼大,上面的命令沒執行完空間就耗光了。筆者用一台一般配置的筆記本電腦測試,寫入速度約為60MB/s,一分鐘就可以寫 3GB,如果您的伺服器是100GB的,半個小時后磁碟空間就會達到100%,此時用戶無法創建文件、管理員無法添加用戶、系統無法寫入日誌……甚至系統 重啟后將無法正常啟動,因為磁碟空間爆滿,啟動過程中臨時文件無法生成。
   如果您真的做了上述的測試,系統無法正常啟動,可以使用Linux安裝光碟引導,在安裝界面輸入「linux rescue」進入修復模式后刪掉文件「quotatest」,即可恢復。
   由此可見,若不設置磁碟配額,即使不是黑客,任一普通用戶都可以隨時摧毀我們的系統。





[火星人 ] linux 下磁碟配額設置已經有552次圍觀

http://coctec.com/docs/linux/show-post-51456.html