戰(zhàn)指南:從ext4到xfs的配置與避坑)
1. 磁盤配額到底解決了什么問題磁盤配額這個功能說復(fù)雜不復(fù)雜說簡單也不簡單。簡單理解就是給用戶或組設(shè)置一塊磁盤空間的消費(fèi)上限超過這個上限就禁止繼續(xù)寫入。這在多用戶服務(wù)器、共享存儲、虛擬主機(jī)生產(chǎn)環(huán)境里幾乎是剛需。我踩過最典型的一個坑是早年給公司搭文件共享服務(wù)器沒配配額結(jié)果某個同事直接往共享目錄里拖了幾百GB的虛擬機(jī)鏡像一夜之間整個存儲池滿了所有業(yè)務(wù)系統(tǒng)同時報錯磁盤空間不足。從那以后我學(xué)乖了凡是要給多人用的目錄配額一定先配好再交付。那磁盤配額能干什么幾條實(shí)在的能力限制單個用戶在特定文件系統(tǒng)上的空間占用按塊block限制限制單個用戶可創(chuàng)建的文件數(shù)量按inode限制限制一組用戶的總空間占用和文件數(shù)量組配額設(shè)置軟限制和硬限制軟限制是警告閾值超過后系統(tǒng)會提示但允許繼續(xù)用一段時間硬限制是絕對上限超過就直接拒絕寫入通過寬限期grace time控制在軟限制之上還能撐多久到期后軟限制自動變成硬限制這套機(jī)制特別適合幾類場景企業(yè)對內(nèi)文件服務(wù)器、高校機(jī)房或?qū)嶒?yàn)室共享存儲、云服務(wù)器上給客戶開通的多租戶站點(diǎn)、以及任何形式的公共FTP/NFS存儲目錄。單機(jī)個人電腦其實(shí)不太用得上但如果你的電腦上建了多用戶賬號給家人或同事用配一下也省心。2. 配額機(jī)制的底層原理搞懂這些再動手2.1 限制的是塊和inode而不是文件大小這件事很多人第一次看配額會困惑為什么有的配額配置界面顯示的是1K Blocks其實(shí)Linux文件系統(tǒng)在底層管理空間的時候是以**塊block**為單位劃分的一個塊默認(rèn)是4KB。一個100KB的文件實(shí)際占用的是25個塊而不是一個100KB的文件。配額限制的就是這些塊的總數(shù)也就是用戶實(shí)際消耗的物理空間。inode這個維度就更底層了。每個文件至少要占用一個inodeinode里存的不是數(shù)據(jù)而是文件的元數(shù)據(jù)——權(quán)限、所有者、時間戳、數(shù)據(jù)塊指針等。如果一個文件系統(tǒng)inode耗盡即使物理空間還一大堆你也創(chuàng)建不了新文件。所以配額表里通常同時提供blocks和inodes兩個維度blocks管空間大小inodes管文件數(shù)量。2.2 軟限制、硬限制和寬限期三者協(xié)作的邏輯軟限制soft limit是一個提醒值。比如你給某個用戶設(shè)了軟限制5GB、硬限制8GB、寬限期7天。用戶用到5GB之后系統(tǒng)會告警但用戶還是能繼續(xù)寫一直寫到8GB被硬限制堵死但如果用戶一直是超了5GB但沒到8GB的狀態(tài)超過7天寬限期系統(tǒng)就會直接禁止繼續(xù)分配塊除非刪除文件把用量壓回5GB以下。硬限制hard limit就是一道硬墻。到了這個值not only新寫入被拒絕之前的文件也刪不掉不是的硬限制只阻止新數(shù)據(jù)的寫入用戶依然可以刪除自己的文件騰出空間。這一點(diǎn)在排查問題的時候特別重要——用戶說我刪了文件還是寫不進(jìn)去多半是刪除后仍然超出硬限制或者配額按塊計算、小碎文件刪了不少但釋放的塊不多。2.3 用戶配額、組配額、項(xiàng)目配額有什么區(qū)別Linux配額支持三個作用域用戶user quota、組group quota、項(xiàng)目/目錄project quota。用戶配額最容易理解限制的對象是UID每個人的占用獨(dú)立算賬。適合個人目錄、home目錄這類場景。組配額限制的對象是GID。比如某個項(xiàng)目組共享一個目錄組內(nèi)5個人都往里寫配額只統(tǒng)計這5個人共同消耗的總量。這比單獨(dú)給每個人限制更有實(shí)際意義——項(xiàng)目組需要的是一個項(xiàng)目總盤子。項(xiàng)目配額是較新內(nèi)核2.6.35引入的機(jī)制按目錄維度管理目錄打上project ID標(biāo)簽后不管哪些用戶往里寫都?xì)w到同一個配額賬戶里。適合托管目錄、共享目錄這種以目錄為邊界的管理模型。實(shí)務(wù)上最常用的組合是用戶配額組配額同時啟用。舉例用戶A限額2GB、用戶B限額2GB同時A和B組成的組G限額3GB。這樣既防止個人濫用也防止整個團(tuán)隊用爆公共盤。2.4 開啟配額對文件系統(tǒng)有什么要求不是隨便一個分區(qū)就能直接開啟配額的關(guān)鍵前提有三個文件系統(tǒng)類型要支持。ext3、ext4、xfs、btrfs都原生支持配額ext4和xfs是生產(chǎn)環(huán)境中最穩(wěn)的選擇。老舊的ext2也可以但沒必要。FAT32/NTFS這類文件系統(tǒng)在Linux下掛載的話配額支持很弱建議不要折騰。必須掛載在獨(dú)立分區(qū)上。配額是一個文件系統(tǒng)級別的特性不能跨多個掛載點(diǎn)統(tǒng)一配額。你如果只給/home配了配額用戶把數(shù)據(jù)塞到/data下配額管不著。所以規(guī)劃配額之前先想清楚哪些目錄需要配額最好一開始就把它們單獨(dú)分區(qū)。掛載參數(shù)要帶上配額開關(guān)。ext4需要usrquota和/或grpquota掛載選項(xiàng)xfs比較特殊配額是文件系統(tǒng)自帶的特性掛載時需要uquota/gquota或prjquota參數(shù)不同發(fā)行版寫法略有差異。注意改掛載選項(xiàng)要寫入/etc/fstab并正確重掛載或重啟否則重啟后配額狀態(tài)會丟失。xfs格式的配額文件在掛載時是不能直接使用quotacheck等傳統(tǒng)命令的操作方式不同這個后文細(xì)說。3. 實(shí)操前準(zhǔn)備分區(qū)、掛載點(diǎn)、工具安裝3.1 推薦的環(huán)境與版本基準(zhǔn)我后面寫的所有步驟都是基于主流的RHEL/CentOS 7/8/9 或 Ubuntu 20.04/22.04 環(huán)境內(nèi)核版本4.x及以上文件系統(tǒng)以ext4為主xfs部分單獨(dú)說明。如果你用的是老系統(tǒng)命令參數(shù)可能會有細(xì)微差別但整體流程不變。先說一個實(shí)用判斷拿到一臺機(jī)器做配額之前先跑一下df -hT看清楚當(dāng)前分區(qū)和文件系統(tǒng)類型。見過太多人不管三七二十一先裝quota工具裝完發(fā)現(xiàn)要配額的分區(qū)是xfs手忙腳亂。先看環(huán)境再動手能省一半排查時間。3.2 安裝quota工具包quota工具在絕大多數(shù)發(fā)行版的基礎(chǔ)倉庫里都有# CentOS / RHEL / Rocky yum install -y quota # Ubuntu / Debian apt install -y quota # 新一點(diǎn)的系統(tǒng)可能要用 dnf dnf install -y quota裝完之后驗(yàn)證一下rpm -qa | grep quota dpkg -l | grep quota如果這條命令沒有輸出說明沒裝上。此外建議順手裝一個ncdu或du習(xí)慣后面核對配額用量的時候要用到。3.3 準(zhǔn)備好一個獨(dú)立分區(qū)硬性條件為了演示我們假設(shè)機(jī)器上有一塊獨(dú)立磁盤/dev/sdb1掛載在/data目錄專門用于多用戶共享文件。先把分區(qū)格式化mkfs.ext4 /dev/sdb1如果有現(xiàn)成的/home獨(dú)立分區(qū)也可以直接拿它演示。但不管用哪個你絕對不能對根分區(qū)/做配額操作實(shí)踐因?yàn)楦謪^(qū)一旦配額配置失誤很可能導(dǎo)致系統(tǒng)起不來或用戶登錄異常。演示環(huán)境怎么折騰都行生產(chǎn)環(huán)境務(wù)必小心。格式化完成后創(chuàng)建掛載點(diǎn)并掛載mkdir -p /data mount /dev/sdb1 /data df -h /data3.4 修改fstab讓配額開關(guān)永久生效很多教程會教你先手動改掛載參數(shù)掛載一遍再來說fstab。我建議直接一步到位編輯/etc/fstab加上配額選項(xiàng)然后用mount -o remount重掛載。這樣不重啟也能生效而且重啟后配置不會丟。以/dev/sdb1 /data為例fstab里的寫法是/dev/sdb1 /data ext4 defaults,usrquota,grpquota 0 0usrquota表示啟用用戶配額grpquota表示啟用組配額。如果你只需要用戶配額只寫usrquota即可如果兩個都需要就都寫上別漏。改完fstab后執(zhí)行mount -o remount /data然后確認(rèn)掛載參數(shù)已經(jīng)生效cat /proc/mounts | grep /data輸出里能看到usrquota,grpquota字樣就說明掛載參數(shù)帶上了。如果fstab寫錯了這個命令可能報錯系統(tǒng)會提示你重新檢查。千萬別跳過這一步去重啟重啟后發(fā)現(xiàn)系統(tǒng)起不來再去改fstab那就被動了。提示如果是xfs文件系統(tǒng)fstab里的掛載選項(xiàng)通常寫uquota,gquota或者usrquota,grpquota在新內(nèi)核同樣識別xfs下的配額文件是作為文件系統(tǒng)內(nèi)部元數(shù)據(jù)自動管理的不需要手動創(chuàng)建aquota.user等文件。3.5 確認(rèn)內(nèi)核是否支持配額絕大多數(shù)發(fā)行版內(nèi)核都默認(rèn)打開了配額支持但保險起見可以確認(rèn)一下grep -i quota /boot/config-$(uname -r)能看到類似CONFIG_QUOTAy、CONFIG_QUOTACTLy、CONFIG_QUOTA_NETLINK_INTERFACEy的輸出就行。如果這些配置項(xiàng)是m或沒有需要重新編譯內(nèi)核或換個內(nèi)核版本。這個步驟在標(biāo)準(zhǔn)云鏡像上幾乎從沒出過問題但檢查成本極低順手做沒壞處。4. 初始化配額數(shù)據(jù)庫并設(shè)置用戶/組配額4.1 創(chuàng)建配額文件quotacheckext文件系統(tǒng)啟用配額后系統(tǒng)需要在文件系統(tǒng)根目錄維護(hù)配額記錄文件傳統(tǒng)上是aquota.user和aquota.group新版系統(tǒng)也支持quota.user但aquota系列最通用。初始化命令quotacheck -cug /data參數(shù)解釋-c創(chuàng)建配額文件如果不存在-u啟用用戶配額檢查-g啟用組配額檢查-v顯示詳細(xì)過程可選但推薦能看到每個文件系統(tǒng)的處理情況你可以在/data目錄下用ls -l確認(rèn)ls -l /data/aquota.user /data/aquota.group如果跑完quotacheck報錯“Cannot find quota file”或者“Permission denied”多半是前面掛載參數(shù)沒生效或者SELinux在攔。解決辦法后面第7節(jié)會單獨(dú)講。4.2 首次掃描的作用與注意事項(xiàng)quotacheck的機(jī)制是遍歷文件系統(tǒng)里每個文件的屬主和所屬組把所有已占用空間和inode數(shù)據(jù)匯總寫入配額文件。在已有大量數(shù)據(jù)的目錄上首次啟用配額這一步是必須的因?yàn)橄到y(tǒng)此前并不知道每個用戶已經(jīng)消耗了多少。這里有一個關(guān)鍵的運(yùn)維經(jīng)驗(yàn)對線上正在服務(wù)的數(shù)據(jù)目錄執(zhí)行quotacheck要在業(yè)務(wù)低谷期做最好先卸載或只讀掛載在做。因?yàn)閽呙杵陂g文件的變化可能導(dǎo)致配額記錄和實(shí)際不一致。生產(chǎn)實(shí)例如果實(shí)在不能停機(jī)可以接受短暫的不一致跑完后再用quotacheck重掃一次。但千萬別在配額文件生成過程中貿(mào)然重啟。4.3 用edquota交互式為單個用戶設(shè)置配額創(chuàng)建好配額數(shù)據(jù)庫之后給用戶zhangsan設(shè)置配額edquota -u zhangsan這條命令會打開一個文本編輯器界面內(nèi)容類似Disk quotas for user zhangsan (uid 1001): Filesystem blocks soft hard inodes soft hard /dev/sdb1 104 12 24 7 3 5各列含義blocks該用戶當(dāng)前已占用的塊數(shù)每塊大小在掛載參數(shù)里確定默認(rèn)1KB單位顯示soft/hard空間塊軟限制和硬限制inodes該用戶當(dāng)前已創(chuàng)建的文件/目錄數(shù)量soft/hard右側(cè)兩列inode的軟限制和硬限制注意編輯時左右兩組soft/hard要對應(yīng)清楚左側(cè)是存儲空間、右側(cè)是文件數(shù)量。我自己第一次配置時就搞混過把文件數(shù)硬限制當(dāng)成空間限制了害得用戶沒法建目錄反而可以隨便寫數(shù)據(jù)——這錯得很隱蔽。把數(shù)字改好保存退出。比如要限制空間2GB硬限制2048MB即2048個1KB單位不對這里單位是1K blocks2GB要寫成2048000個1K block稍微算一下和文件數(shù)10000個Filesystem blocks soft hard inodes soft hard /dev/sdb1 104 1843200 2048000 7 9000 10000這里就是單位換算的關(guān)鍵坑1K blocks進(jìn)位的單位是KB2048000個單位是2048000KB約2GB實(shí)際2,048,000KB 1.95GB但四舍五入可接受。我建議直接按KB來換算2GB 2 × 1024 × 1024 2097152 KB但寫的時候注意2048000和2097152就差一點(diǎn)分區(qū)大小足夠就行設(shè)置成整數(shù)比較方便管理。我的習(xí)慣是用2048000這種整數(shù)因?yàn)榭粗庇^。4.4 批量設(shè)置配額從參考用戶復(fù)制如果用戶數(shù)量多一個個edquota顯然低效。edquota提供了-p參數(shù)可以把一個參考用戶的配額原樣復(fù)制給其他用戶edquota -p zhangsan lisi wangwu這樣lisi和wangwu就復(fù)制了zhangsan的配額設(shè)置。對幾十個用戶批量初始化時非常方便。更徹底的方式是寫個循環(huán)腳本結(jié)合setquota命令非交互設(shè)置for user in zhangsan lisi wangwu; do setquota -u $user 1843200 2048000 9000 10000 /data donesetquota的參數(shù)順序是-u 用戶名 軟塊數(shù) 硬塊數(shù) 軟inode數(shù) 硬inode數(shù) 文件系統(tǒng)。所有值都是數(shù)字單位是1KB塊/個。4.5 配置組配額組配額設(shè)置方式和用戶配額幾乎一樣只是-u換成-gedquota -g project_team組配額默認(rèn)會統(tǒng)計該組所有成員寫入的塊數(shù)總和。假設(shè)project_team組里有5個人你給組配額設(shè)了10GB硬限制那么這5個人加在一起最多寫到10GB。這里有個重點(diǎn)用戶配額和組配額是疊加生效的。比如用戶A個人硬限制2GB組G硬限制3GB那么A的寫入受“兩者中先命中的那個”約束。他寫到2GB會撞到用戶硬限制但整個組才消耗了1.5GB組配額還沒觸發(fā)。反之如果A已經(jīng)寫了1GB組里其他人寫了2.5GB組硬限制已經(jīng)觸發(fā)A即使個人沒用完也寫不進(jìn)去。這種雙維度限制在項(xiàng)目制環(huán)境里非常好用但要跟用戶解釋清楚規(guī)則不然會被罵“為什么我限額還沒到就寫不進(jìn)去了”。4.6 設(shè)置寬限期寬限期的默認(rèn)值是7天如果你覺得太長或太短可以改edquota -t界面會顯示類似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/sdb1 7days 7days改成3天/dev/sdb1 3days 3days寬限期只對軟限制有意義。如果你直接設(shè)置硬限制寬限期對它完全無效——硬限制從生效那一刻起就不可逾越。5. 配額狀態(tài)查看與配額報告5.1 用quota命令查單用戶用量切換成普通用戶身份執(zhí)行quota -u zhangsan輸出類似Disk quotas for user zhangsan (uid 1001): Filesystem usage quota limit grace files quota limit grace /dev/sdb1 104K 1843200K 2048000K 7 9000 10000這里的quota列對應(yīng)軟限制limit列對應(yīng)硬限制。用戶自己也可以執(zhí)行這個命令看自己用了多少。如果某個用戶進(jìn)入了grace期輸出里會顯示剩余時間一眼就能看出他是不是“踩線”了。5.2 用repquota生成全體配額報告運(yùn)維視角下最常用的命令其實(shí)是repquotarepquota -a-a表示報告所有啟用了配額的文件系統(tǒng)。輸出*** Report for user quotas on device /dev/sdb1 Block grace time: 3days; Inode grace time: 3days Block limits File limits User used soft hard grace used soft hard grace ---------------------------------------------------------------------- root -- 215424 0 0 5500 0 0 zhangsan -- 104 1843200 2048000 7 9000 10000 lisi - 4096 102400 2048000 2days 12 9000 10000注意第二行zhangsan前面的標(biāo)記--代表一切正常沒有超過軟限制-代表空間或inode超了軟限制但硬限制還沒到正在grace期內(nèi)-同理只是方向不同代表軟硬限制都超了比如lisi那行出現(xiàn)了-和2days說明他已經(jīng)超過了塊軟限制還剩2天寬限期。這種輸出非常適合寫腳本監(jiān)控如果報告中出現(xiàn)非--的行就告警通知管理員查看。5.3 用quotacheck重新校正配額數(shù)據(jù)配額數(shù)據(jù)是動態(tài)維護(hù)的正常情況下每次寫入都會實(shí)時更新。但偶爾會遇到配額記錄和實(shí)際不符的怪問題比如用戶copy了文件但配額統(tǒng)計沒變或者明明刪了大量文件配額占用卻不降。這時重新跑一次quotacheck就能校正quotacheck -avug-a檢查所有配額文件系統(tǒng)-v打印詳細(xì)過程。跑完后配額記錄會和實(shí)際用量重新對齊。這個命令本身有開銷文件越多、體量越大耗時越長。建議在文件系統(tǒng)變化不頻繁的窗口期跑比如深夜定時任務(wù)。6. xfs文件系統(tǒng)配額配置的特異性6.1 為什么xfs不能照抄ext4的步驟很多人在xfs上執(zhí)行quotacheck會得到類似quota not enabled on filesystem的報錯或者直接卡死原因在于xfs的配額機(jī)制和ext系完全不同。xfs從誕生起就把配額作為文件系統(tǒng)內(nèi)建的“日志型”功能配額信息通過掛載參數(shù)直接開啟不需要外部配額文件因此也不存在aquota.user這種文件。xfs的掛載選項(xiàng)常見寫法是/dev/sdb1 /data xfs defaults,uquota,gquota 0 0其中uquota用戶配額gquota組配額。老內(nèi)核版本也接受usrquota,grpquota但新版xfs更推薦直接用uquota,gquota。掛載后在xfs文件系統(tǒng)上設(shè)置配額也有專門工具xfs_quota -x -c limit bsoft1843200 bhard2048000 isoft9000 ihard10000 -u zhangsan /data參數(shù)分解-x進(jìn)入專家模式-c執(zhí)行命令limit bsoft1843200 bhard2048000設(shè)置塊軟限制/硬限制isoft9000 ihard10000設(shè)置inode軟限制/硬限制-u zhangsan針對用戶/data目標(biāo)文件系統(tǒng)查看xfs配額報告的指令是xfs_quota -x -c report -u /data輸出和repquota類似同樣能列出每個用戶的使用量、軟硬限制和grace狀態(tài)。6.2 ext4和xfs配額管理的差異對照我列一個簡單的對照表方便你判斷自己該按哪套流程走對比項(xiàng)ext3/ext4xfs是否生成磁盤配額文件存在aquota.user/aquota.group不生成外部文件由元數(shù)據(jù)管理是否需要quotacheck需要用于初始化和校正不需要底層掃描配額信息可靠啟用掛載參數(shù)usrquota,grpquotauquota,gquota/prjquota配額設(shè)置命令edquota / setquotaxfs_quota -c limit ...配額報告命令repquota / quotaxfs_quota -c report ...日志型一致性一般掃描校正強(qiáng)日志記錄適合規(guī)模中小型單機(jī)/家庭服務(wù)器企業(yè)級/大容量/高并發(fā)如果你用的是新版CentOS/Rocky默認(rèn)安裝的xfs根文件系統(tǒng)想給home目錄配配額直接走xfs路線別再折騰edquota了。但傳統(tǒng)ext4環(huán)境在所有舊文檔和老教程里還是絕對主流兩種都掌握才不會被卡住。7. 常見問題排查與實(shí)戰(zhàn)避坑技巧7.1 quotacheck報錯Cannot find quota file或Operation not permitted這兩類報錯出現(xiàn)時最先懷疑的方向不是quota工具本身而是掛載參數(shù)或SELinux。排查順序# 確認(rèn)掛載參數(shù)是否帶上了 mount | grep /data # 確認(rèn)fstab是否寫對 cat /etc/fstab | grep /data # 臨時禁用SELinux測試排查用 setenforce 0 quotacheck -cug /data如果setenforce 0后要再次測試出問題看ausearch -m avc -ts recent | grep quota確認(rèn)是否被SELinux攔截。真正的修復(fù)方法是調(diào)整SELinux布爾值或文件上下文而不是長期關(guān)閉SELinux。quota相關(guān)目錄的SELinux類型通常需要設(shè)為quota_db_trestorecon -Rv /data但最直接的做法是給掛載目錄設(shè)置正確的上下文。這個知識點(diǎn)容易被人忽略因?yàn)槟J(rèn)SELinux策略下普通數(shù)據(jù)目錄的上下文不是quota專用類型導(dǎo)致寫aquota文件被拒。7.2 配額已設(shè)但用戶仍能無限寫入這類問題是我在群里看到提問頻率最高的。原因通常是下面幾種掛載參數(shù)根本沒帶上配額標(biāo)志。檢查/proc/mounts輸出如果只有defaults而沒有usrquota,grpquota配額功能形同虛設(shè)。配額作用于了錯誤的分區(qū)。用戶把文件寫到了另一個沒開配額的分區(qū)上配額當(dāng)然管不到。比如你只在/data開了配額用戶的$HOME在/home且沒開配額他把數(shù)據(jù)放到家目錄就繞過了所有限制。軟限制設(shè)置得太大或忘記了硬限制。有些人只設(shè)了軟限制沒設(shè)硬限制寬限期一過系統(tǒng)可能直接拒絕——但這個“可能”取決于版本和配置。老版本在寬限期結(jié)束后才會把軟限制變硬限制如果你的版本行為不是這樣就會看起來“沒限制”。用戶是root。root用戶默認(rèn)不受配額限制這是設(shè)計如此不要花時間去“修復(fù)”。逐一排查時別忘了看quota -u 用戶名的實(shí)際輸出。有時候你以為設(shè)置了實(shí)際上沒保存成功。7.3 刪除文件后配額用量不下降這個情況很多人遇到以后第一反應(yīng)是系統(tǒng)壞了其實(shí)大概率不是。原因在于配額統(tǒng)計的是塊占用不是文件數(shù)量并且塊是預(yù)分配的。舉個例子用戶寫了一個100GB的稀疏文件比如dd創(chuàng)建大文件然后seek跳著寫文件系統(tǒng)可能預(yù)分配或稀疏映射了很多塊。刪除部分文件后如果還在硬限制之上寫入依然被拒看起來就是“我刪了但還是寫不進(jìn)去”。另一個常見情況是文件被進(jìn)程持續(xù)占用。用戶刪了文件但因?yàn)槟硞€服務(wù)還持有文件句柄磁盤空間并沒有真正釋放進(jìn)程內(nèi)read/write不會中斷。這種情況你可以這樣確認(rèn)lsof L1 | grep deleted看到still open的deleted文件就知道是哪個進(jìn)程占了。殺掉對應(yīng)進(jìn)程或重啟服務(wù)后空間才真正歸還。7.4 重啟后配額丟失重啟后配額丟失幾乎可以確定是fstab沒有修改或者掛載參數(shù)沒有正確寫入。有些人圖省事只手動mount時帶了參數(shù)重啟后系統(tǒng)按fstab默認(rèn)配置掛載配額開關(guān)自然沒了。排查cat /etc/fstab | grep /data如果fstab里沒配額選項(xiàng)重新編輯并重啟或者重新mount -o remount。還有一個細(xì)節(jié)是老舊的Linux版本fstab中連續(xù)掛載參數(shù)之間不能有空格寫成defaults,usrquota,grpquota而不是defaults, usrquota, grpquota否則重啟時解析會出問題。7.5 生產(chǎn)環(huán)境第一次啟用配額的操作節(jié)奏這個屬于經(jīng)驗(yàn)篇了。生產(chǎn)環(huán)境第一次啟用配額我建議的節(jié)奏是先在測試機(jī)上完整走一遍全流程記錄每個命令的實(shí)際輸出找業(yè)務(wù)低谷窗口備份數(shù)據(jù)或做快照修改fstab添加配額掛載選項(xiàng)執(zhí)行mount -o remount觀察系統(tǒng)日志dmesg | tail確認(rèn)掛載成功無報錯執(zhí)行quotacheck -cugm /data其中-m是“不阻止寫入”的強(qiáng)制模式適合在線執(zhí)行雖然我還是推薦短時只讀掛載更穩(wěn)用edquota/setquota批量設(shè)置配額用repquota -a核對數(shù)據(jù)是否準(zhǔn)確觀察24小時確認(rèn)無異常后再把流程納入常規(guī)維護(hù)手冊7.6 監(jiān)控配額使用率的實(shí)用腳本思路配額管理不能設(shè)完就撒手不管建議寫個簡單的告警腳本放到cron里。我用得最多的核心邏輯是解析repquota的輸出找到超過軟限制的用戶并發(fā)送通知一個bash函數(shù)就夠repquota -a | awk $3 ~ /[0-9]/ $3 $4 {print $1, $2, $3, $4}這段的意思是輸出文件中第三列used超過第四列soft limit的記錄。你把它接入短信或釘釘webhook就成一個最小可用的配額告警系統(tǒng)。當(dāng)然生產(chǎn)環(huán)境用成熟監(jiān)控平臺如zabbix、prometheusnode_exporter更正規(guī)但這個“做殼”思路能幫你快速發(fā)現(xiàn)問題。8. 一個小眾但在多項(xiàng)目環(huán)境非常實(shí)用的擴(kuò)展項(xiàng)目配額上文提了一句project quota這里展開說一下。傳統(tǒng)的用戶/組配額在“一個用戶參與多個項(xiàng)目”的場景里會失控一個用戶分了2GB總配額但他可能給項(xiàng)目A、項(xiàng)目B、項(xiàng)目C各寫了1GB加在一起自己先撞了墻項(xiàng)目之間的隔離也沒做到。項(xiàng)目配額project quota把“誰寫”變成“寫到哪里”以目錄為維度做限制。典型操作# 對目錄打項(xiàng)目ID標(biāo)簽 mkdir -p /data/proj_a chattr -R p /data/proj_a # 打開project屬性非所有文件系統(tǒng)支持ext4需要內(nèi)核CONFIG_EXT4_FS_PROJECTy # xfs上直接分配prjquota xfs_quota -x -c project -s -p /data/proj_a proj_a /data xfs_quota -x -c limit -p bhard10g proj_a /dataext4項(xiàng)目配額的配置流程相對繁瑣而且需要內(nèi)核編譯支持。我自己的經(jīng)驗(yàn)是如果你想用目錄維度配額直接選xfs別在ext4上硬磕省心太多。xfs的項(xiàng)目配額是RHEL/CentOS特意在系統(tǒng)安裝時預(yù)置了prjquota支持生產(chǎn)上非常穩(wěn)。項(xiàng)目配額有一個附帶的好處即使權(quán)限上不同用戶混寫同一個目錄項(xiàng)目配額也能統(tǒng)一算總賬非常適合臨時拉人進(jìn)項(xiàng)目又不想逐個改用戶配額的協(xié)作環(huán)境。9. 我踩過幾次坑之后的最終體會說實(shí)話磁盤配額本身并不難大部分坑都出在文件系統(tǒng)類型判斷錯誤和掛載參數(shù)沒有真正生效這兩件事上。我給新手的忠告是上手之前先用df -hT認(rèn)清楚文件系統(tǒng)再決定走ext4流程還是xfs流程改完fstab后不要偷懶跳過mount -o remount加cat /proc/mounts驗(yàn)證這兩個動作加起來不過幾秒鐘卻能在配額全流程里省掉成小時的排查。另外配額始終是管理工具不是存儲備份。它只能防止單點(diǎn)用戶撐爆磁盤不能替你處理誤刪、病毒、磁盤物理故障。真正重要的業(yè)務(wù)目錄配額要和監(jiān)控告警、定期快照、定期巡檢配合起來才是一套比較完整的數(shù)據(jù)保護(hù)方案。如果你目前只是在一臺小服務(wù)器上給幾個同事分空間按照第4節(jié)的流程配好用戶配額就足夠了沒必要一開始就上項(xiàng)目配額。真到了多項(xiàng)目、多目錄、多人交叉寫入的規(guī)模再切xfs項(xiàng)目配額完全不遲。配額這東西配好之后平時幾乎感覺不到它存在但一旦有人把整盤寫滿你會慶幸當(dāng)初花了一個下午把這事兒做完了。