器磁盤擴(kuò)容與數(shù)據(jù)盤分區(qū)掛載實(shí)操指南)
1. 先分清系統(tǒng)盤和數(shù)據(jù)盤再談擴(kuò)容和分區(qū)做運(yùn)維這些年磁盤操作是我處理頻率最高的需求之一。尤其是云服務(wù)器用戶經(jīng)常會(huì)遇到兩類問題一是系統(tǒng)盤容量不夠業(yè)務(wù)日志和數(shù)據(jù)庫把40G的盤塞得滿滿當(dāng)當(dāng)二是買了數(shù)據(jù)盤卻不會(huì)分區(qū)格式化一直放著浪費(fèi)。這篇文章就把阿里云系統(tǒng)盤擴(kuò)容、數(shù)據(jù)盤分區(qū)、格式化、掛載、取消掛載整條鏈路完整梳理一遍所有命令都是我實(shí)際跑過的可以直接照著敲。先說清楚一個(gè)基礎(chǔ)概念系統(tǒng)盤是隨實(shí)例一起創(chuàng)建、承載操作系統(tǒng)的云盤在Linux里通常是/dev/vda數(shù)據(jù)盤是額外購買的獨(dú)立云盤對(duì)應(yīng)/dev/vdb、/dev/vdc等設(shè)備名。兩者最大的區(qū)別在生命周期系統(tǒng)盤和實(shí)例強(qiáng)綁定實(shí)例釋放時(shí)默認(rèn)一起釋放數(shù)據(jù)清零數(shù)據(jù)盤則是獨(dú)立資源可以從實(shí)例上卸下來重新掛到別的實(shí)例上實(shí)例重裝系統(tǒng)也不會(huì)影響數(shù)據(jù)。正因?yàn)檫@個(gè)區(qū)別我給自己定了一條鐵規(guī)矩操作系統(tǒng)和代碼放系統(tǒng)盤數(shù)據(jù)庫、日志、用戶上傳的文件這些核心數(shù)據(jù)一律放數(shù)據(jù)盤。這個(gè)習(xí)慣救過我很多次有次實(shí)例系統(tǒng)故障需要重裝系統(tǒng)盤格式化重來數(shù)據(jù)盤原封不動(dòng)掛回去就恢復(fù)了整個(gè)過程損失幾乎為零。這篇文章適合兩類讀者一是剛開始用云服務(wù)器、對(duì)磁盤概念比較模糊的新手跟著操作能少走彎路二是已經(jīng)跑了一段時(shí)間業(yè)務(wù)、碰到磁盤空間告急需要立刻擴(kuò)容救火的朋友。下面的內(nèi)容按操作順序來先講系統(tǒng)盤擴(kuò)容的完整流程再講數(shù)據(jù)盤從裸盤到可用空間的三步操作最后覆蓋取消掛載和常見故障排查。2. 系統(tǒng)盤擴(kuò)容控制臺(tái)操作加底層磁盤調(diào)整2.1 控制臺(tái)操作與準(zhǔn)備工作系統(tǒng)盤擴(kuò)容的第一站不在服務(wù)器里而是阿里云控制臺(tái)。進(jìn)入ECS實(shí)例列表找到目標(biāo)實(shí)例點(diǎn)擊“云盤”標(biāo)簽頁系統(tǒng)盤那一行右側(cè)會(huì)有“擴(kuò)容”入口。點(diǎn)擊后控制臺(tái)會(huì)顯示當(dāng)前容量和你這臺(tái)實(shí)例規(guī)格支持?jǐn)U容到的最大容量確認(rèn)后按提示操作即可。這里有幾個(gè)容易踩的坑提前說清楚。第一系統(tǒng)盤擴(kuò)容有上限不同實(shí)例規(guī)格的支持范圍不一樣界面上會(huì)明確標(biāo)注不要想當(dāng)然覺得可以無限擴(kuò)。第二擴(kuò)容方式分為在線擴(kuò)容和離線擴(kuò)容部分實(shí)例支持不停機(jī)在線擴(kuò)容但如果你跑的數(shù)據(jù)庫或者關(guān)鍵業(yè)務(wù)對(duì)穩(wěn)定性要求極高我建議還是申請(qǐng)一個(gè)維護(hù)窗口停服操作最穩(wěn)妥避免擴(kuò)容過程中出現(xiàn)意外IO抖動(dòng)。第三擴(kuò)容后容量會(huì)重新計(jì)費(fèi)費(fèi)用按新容量檔位走控制臺(tái)會(huì)彈出提示別忽略不看??刂婆_(tái)擴(kuò)容完成后你登錄服務(wù)器執(zhí)行l(wèi)sblk會(huì)看到磁盤本身容量已經(jīng)變大了但分區(qū)大小還是老樣子。這是因?yàn)樵票P擴(kuò)容只是把底層塊設(shè)備放大了操作系統(tǒng)里的分區(qū)表和文件系統(tǒng)還停留在原來的尺寸。打個(gè)比方樓房里給你打通了一間新屋子但門還沒開東西依然搬不進(jìn)去。接下來要做的就是“開門”——擴(kuò)展分區(qū)再擴(kuò)展文件系統(tǒng)。2.2 確認(rèn)分區(qū)表類型登錄服務(wù)器后先查看當(dāng)前磁盤現(xiàn)狀確保你對(duì)環(huán)境心里有數(shù)lsblk正常情況下比如原本40G的系統(tǒng)盤擴(kuò)容到80G你會(huì)看到/dev/vda的大小已經(jīng)變成80G但/dev/vda1還是40G剩下的40G處于未分配狀態(tài)。接著確認(rèn)分區(qū)表類型這一步?jīng)Q定了后續(xù)用哪種方式擴(kuò)展分區(qū)fdisk -l /dev/vda輸出里如果寫著“Disk label type: dos”說明是MBR分區(qū)表如果是“gpt”說明是GPT分區(qū)表。MBR是老標(biāo)準(zhǔn)2TB容量和4個(gè)主分區(qū)是它的硬邊界GPT是后來的標(biāo)準(zhǔn)突破了2TB限制分區(qū)數(shù)量也基本不受限。就系統(tǒng)盤擴(kuò)容這個(gè)場景來說MBR和GPT都能操作但命令細(xì)節(jié)不同看清類型再動(dòng)手。順帶提醒一句阿里云的Linux系統(tǒng)盤大部分是MBR分區(qū)表尤其是默認(rèn)創(chuàng)建的系統(tǒng)盤。如果你拿到的環(huán)境比較新也可能是GPT不要想當(dāng)然。2.3 擴(kuò)容核心操作growpart擴(kuò)展分區(qū)現(xiàn)在進(jìn)入真正的“開門”環(huán)節(jié)。絕大多數(shù)主流Linux發(fā)行版都預(yù)裝了cloud-guest-utils工具包里面帶一個(gè)growpart命令專門用來把分區(qū)擴(kuò)展到整個(gè)磁盤。如果你的系統(tǒng)里沒有先安裝# Debian / Ubuntu 系 apt-get install cloud-guest-utils # CentOS / RHEL / Alibaba Cloud Linux 系 yum install cloud-utils-growpart安裝完成后執(zhí)行擴(kuò)展growpart /dev/vda 1注意growpart的語法是“設(shè)備名 分區(qū)號(hào)”兩部分中間有空格分區(qū)號(hào)只寫數(shù)字。我見過有人寫成growpart /dev/vda1直接報(bào)錯(cuò)“The partition number is required”看著像低級(jí)錯(cuò)誤但忙亂的時(shí)候真的容易犯。如果你遇到提示說分區(qū)無法在線擴(kuò)展先檢查一下有沒有可用的塊設(shè)備變化沒生效有時(shí)候需要partprobe /dev/vda讓內(nèi)核重新讀取分區(qū)表。老版本系統(tǒng)如果沒有g(shù)rowpart網(wǎng)上流傳的辦法是用fdisk刪除分區(qū)再重建把結(jié)束扇區(qū)改到最大這個(gè)做法在數(shù)據(jù)無損的情況下理論上可行但風(fēng)險(xiǎn)實(shí)在太大分區(qū)表操作一旦手抖數(shù)據(jù)就永遠(yuǎn)找不回來了。我的建議很明確能用growpart就用growpart千萬別為了省兩步安裝命令去玩fdisk刪分區(qū)。2.4 擴(kuò)展文件系統(tǒng)resize2fs與xfs_growfs分區(qū)擴(kuò)大以后文件系統(tǒng)還停在舊尺寸必須再走一步。先確認(rèn)你的根分區(qū)是什么文件系統(tǒng)df -hTType列能看到根分區(qū)是ext4還是xfs或者其他類型。對(duì)應(yīng)的擴(kuò)展命令# ext4 系列 resize2fs /dev/vda1 # xfs 系列 xfs_growfs /這兩個(gè)命令的對(duì)應(yīng)關(guān)系千萬不要搞混。resize2fs的參數(shù)是設(shè)備名而且支持在掛載狀態(tài)下在線執(zhí)行xfs_growfs的參數(shù)則是掛載點(diǎn)比如根路徑就是/它不能直接對(duì)設(shè)備名操作。如果你拿xfs的分區(qū)去跑resize2fs會(huì)直接報(bào)錯(cuò)“Bad magic number in super-block”反過來在ext4上跑xfs_growfs也一樣不行。執(zhí)行完成后用df -h驗(yàn)證一下根分區(qū)的容量確認(rèn)已經(jīng)變成擴(kuò)容后的新值這次系統(tǒng)盤擴(kuò)容就算完整走完了。最后強(qiáng)調(diào)一個(gè)救命的習(xí)慣在growpart之前先在控制臺(tái)給系統(tǒng)盤打一份快照。磁盤操作不是兒戲尤其生產(chǎn)環(huán)境一個(gè)小失誤可能導(dǎo)致整臺(tái)實(shí)例無法啟動(dòng)快照就是你的后悔藥。打快照不需要停實(shí)例成本也低卻能在關(guān)鍵時(shí)刻救回一命這筆投入非常值得。3. 數(shù)據(jù)盤分區(qū)從一塊裸盤到可用的空間3.1 新盤掛載后的樣子數(shù)據(jù)盤的分區(qū)、格式化、掛載是三個(gè)必須按順序完成的操作缺一個(gè)都沒法正常使用。就像買了一塊新硬盤裝上電腦先要分盤再格式化然后才能往里存文件。新購買并掛載的數(shù)據(jù)盤在Linux系統(tǒng)里默認(rèn)是一塊沒有分區(qū)的裸盤。用lsblk查看你會(huì)看到類似/dev/vdb的設(shè)備大小是你購買時(shí)的容量但下面沒有任何子分區(qū)。執(zhí)行fdisk -l /dev/vdb輸出里也沒有分區(qū)信息這就是標(biāo)準(zhǔn)的裸盤狀態(tài)。3.2 分區(qū)方案怎么規(guī)劃在開始分區(qū)之前先想清楚你要分幾個(gè)區(qū)。絕大部分云服務(wù)器場景我的建議都是只分一個(gè)區(qū)用滿整塊盤。原因很簡單云盤和物理機(jī)硬盤不一樣它本質(zhì)是虛擬化出來的存儲(chǔ)資源容量擴(kuò)展非常靈活不像物理機(jī)需要提前花心思規(guī)劃未來幾年的容量分布。分多個(gè)區(qū)不僅增加管理復(fù)雜度還容易出現(xiàn)一個(gè)區(qū)空間爆滿、另一個(gè)區(qū)大量閑置的尷尬情況最后還得靠擴(kuò)容來回折騰。如果你確實(shí)有特殊需求需要多個(gè)分區(qū)我也建議優(yōu)先考慮LVM方案而不是用固定分區(qū)。LVM的好處是后面空間不夠了可以再買一塊盤加進(jìn)卷組把邏輯卷在線擴(kuò)大完全不影響現(xiàn)有分區(qū)和數(shù)據(jù)。固定分區(qū)就沒有這個(gè)靈活性到時(shí)候只能靠縮容騰挪操作復(fù)雜得多。3.3 使用fdisk做MBR分區(qū)容量小于2TB的數(shù)據(jù)盤最常用的分區(qū)工具是fdisk。執(zhí)行fdisk /dev/vdb進(jìn)入交互模式后按順序操作輸入n創(chuàng)建新分區(qū)輸入p指定主分區(qū)類型分區(qū)編號(hào)默認(rèn)1直接回車起始扇區(qū)默認(rèn)2048直接回車從盤的開頭開始結(jié)束扇區(qū)默認(rèn)到磁盤末尾直接回車用滿整個(gè)空間輸入w保存分區(qū)表并退出整個(gè)過程中除了w必須手動(dòng)確認(rèn)其他步驟都可以直接回車吃默認(rèn)值非常省事。執(zhí)行完成后用fdisk -l /dev/vdb查看能看到一個(gè)/dev/vdb1分區(qū)就說明成功了。這里要提醒一個(gè)MBR的硬限制一張MBR分區(qū)表最多只能有4個(gè)主分區(qū)如果超過這個(gè)數(shù)量得用擴(kuò)展分區(qū)加邏輯分區(qū)的方案。但對(duì)云盤來說基本用不上這套花活一塊盤一個(gè)主分區(qū)用滿最干凈。3.4 使用parted做GPT分區(qū)如果你的數(shù)據(jù)盤容量超過2TBfdisk就無能為力了MBR的上限就是2TB必須改用parted工具做GPT分區(qū)表。交互方式parted /dev/vdc mklabel gpt mkpart primary 0% 100% quit我來解釋這三條命令mklabel gpt把分區(qū)表格式改成GPTmkpart primary 0% 100%創(chuàng)建一個(gè)從0%到100%的主分區(qū)用滿整個(gè)磁盤。如果不想用百分比也可以指定絕對(duì)容量比如mkpart primary 0 100GB但我個(gè)人偏好0%到100%簡單直觀不會(huì)因?yàn)閱挝粨Q算出問題。parted也支持非交互式操作把命令一次性拼接執(zhí)行適合在腳本里用parted -s /dev/vdc mklabel gpt mkpart primary ext4 0% 100%執(zhí)行完后lsblk就能看到新分區(qū)了。無論用哪種工具分區(qū)完成后如果發(fā)現(xiàn)系統(tǒng)沒有立刻識(shí)別到新分區(qū)執(zhí)行一下partprobe讓內(nèi)核重新讀取分區(qū)表這個(gè)命令專治“明明分區(qū)了但看不到”的怪問題。3.5 分區(qū)完的檢查動(dòng)作分區(qū)創(chuàng)建完成不要急著格式化先做兩個(gè)檢查。第一是確認(rèn)分區(qū)格式正確fdisk -l /dev/vdb看一下Start和End扇區(qū)第二是檢查分區(qū)是否對(duì)齊分區(qū)起始扇區(qū)是2048的整數(shù)倍就是對(duì)齊的?,F(xiàn)在大多數(shù)工具默認(rèn)已經(jīng)幫你做好了對(duì)齊不需要手動(dòng)干預(yù)但養(yǎng)成看一眼的習(xí)慣總沒有壞處。扇區(qū)不對(duì)齊會(huì)導(dǎo)致IO放大本來一次讀寫就能完成的工作要多消耗幾次性能白白打折。4. 格式化分區(qū)、掛載與開機(jī)自動(dòng)掛載4.1 文件系統(tǒng)選型ext4還是xfs分區(qū)完成之后進(jìn)入格式化環(huán)節(jié)。格式化要做的第一件事是選文件系統(tǒng)類型最常用的是ext4和xfs兩種。我的使用經(jīng)驗(yàn)是如果數(shù)據(jù)盤主要跑數(shù)據(jù)庫、存大量小文件選ext4更穩(wěn)妥它的inode機(jī)制在處理海量小文件時(shí)表現(xiàn)均衡歷史上驗(yàn)證充分如果是大數(shù)據(jù)存儲(chǔ)、大文件讀寫、或者日志這種頻繁寫入刪除的場景xfs表現(xiàn)更好刪除大量文件時(shí)不會(huì)像ext4那樣出現(xiàn)明顯卡頓RHEL/CentOS系的新系統(tǒng)默認(rèn)就推薦xfs。不過說句實(shí)在話云盤底層IO性能已經(jīng)很強(qiáng)了兩種文件系統(tǒng)在絕大多數(shù)日常業(yè)務(wù)里的差異并不明顯你選定一個(gè)用順手了就行不要今天用ext4明天換xfs環(huán)境里混用太多種類只會(huì)增加后期維護(hù)成本。4.2 格式化實(shí)操與重要警告選定文件系統(tǒng)后執(zhí)行格式化# ext4 mkfs.ext4 /dev/vdb1 # xfs mkfs.xfs /dev/vdb1格式化時(shí)可以附帶一些參數(shù)比如ext4默認(rèn)會(huì)預(yù)留5%的塊給root用戶和系統(tǒng)維護(hù)對(duì)1TB的盤來說就是50G空間有點(diǎn)浪費(fèi)。我一般會(huì)調(diào)成1%mkfs.ext4 -m 1 /dev/vdb1這里必須敲響警鐘格式化是不可逆操作一旦執(zhí)行盤上的所有數(shù)據(jù)會(huì)被清空。在跑命令之前先lsblk確認(rèn)目標(biāo)設(shè)備名沒有搞錯(cuò)再檢查這塊盤上有沒有需要保留的數(shù)據(jù)。千萬別拿系統(tǒng)盤當(dāng)數(shù)據(jù)盤格式化真出這種事輕則系統(tǒng)崩潰重則數(shù)據(jù)永遠(yuǎn)找不回來。我自己就見過同事把vda和vdb搞混的案例一塊盤的物理毀滅就是一條命令的事。格式化前反復(fù)核對(duì)設(shè)備名多花十秒鐘能避免一輩子的遺憾。4.3 手動(dòng)掛載格式化完成后創(chuàng)建掛載點(diǎn)并掛載mkdir -p /data mount /dev/vdb1 /data執(zhí)行完df -h看到/data目錄的容量就是數(shù)據(jù)盤的大小說明掛載成功了。也可以用lsblk查看掛載點(diǎn)會(huì)清晰地顯示在分區(qū)下面。這個(gè)階段屬于手動(dòng)掛載一次性的。服務(wù)器一重啟掛載關(guān)系就會(huì)消失你需要再手動(dòng)執(zhí)行一次mount才能用。想讓數(shù)據(jù)盤開機(jī)自動(dòng)掛載必須配置fstab見下一步。4.4 fstab配置開機(jī)自動(dòng)掛載的正確姿勢先拿到分區(qū)的UUIDblkid /dev/vdb1輸出類似UUIDxxxxxx TYPEext4。然后編輯/etc/fstab把下面這行追加到文件末尾UUIDxxxxxx /data ext4 defaults 0 2這行的格式需要解釋清楚。第一列是UUID我用它而不是/dev/vdb1這類設(shè)備名因?yàn)樵骗h(huán)境里設(shè)備名不穩(wěn)定實(shí)例偶爾重啟后盤符可能從vdb變成vdc寫設(shè)備名的話系統(tǒng)會(huì)找不到盤。UUID是分區(qū)的唯一身份證不會(huì)變。第二列是掛載點(diǎn)。第三列是文件系統(tǒng)類型。第四列defaults代表默認(rèn)掛載選項(xiàng)。第五列0表示不參與備份。第六列2表示開機(jī)時(shí)在根分區(qū)之后檢查該文件系統(tǒng)不需要檢查就寫0。配置完成后強(qiáng)烈建議先驗(yàn)證mount -amount -a會(huì)按fstab內(nèi)容嘗試掛載所有還未掛載的文件系統(tǒng)不報(bào)錯(cuò)說明配置沒問題。進(jìn)一步可以卸載再重新掛載測試最后在掛載目錄里創(chuàng)建文件驗(yàn)證可寫umount /data mount -a touch /data/test rm -f /data/test這一步驗(yàn)證不能省。fstab寫錯(cuò)最典型的結(jié)果是服務(wù)器重啟時(shí)卡住停在“A start job is running for...”的等待狀態(tài)最后掉進(jìn)緊急模式屏幕上一堆暗紅色的報(bào)錯(cuò)。想修復(fù)就得通過救援模式去改文件操作復(fù)雜心態(tài)也容易崩。寫fstab的時(shí)候多花一分鐘驗(yàn)證重啟的時(shí)候就少受一小時(shí)折磨。4.5 目錄權(quán)限與掛載參數(shù)優(yōu)化掛載完成后根據(jù)業(yè)務(wù)需要調(diào)整目錄權(quán)限。比如你的應(yīng)用要以某個(gè)特定用戶身份運(yùn)行就要把目錄owner改過去chown -R admin:admin /data chmod 755 /data如果權(quán)限沒設(shè)置對(duì)最常見的結(jié)果是nginx、tomcat這類服務(wù)跑起來后瘋狂報(bào)“Permission denied”日志里全是紅色錯(cuò)誤排查半天才發(fā)現(xiàn)是目錄歸屬不對(duì)而不是程序本身的問題。對(duì)于IO壓力大的業(yè)務(wù)我還會(huì)在fstab里加上noatime參數(shù)UUIDxxxxxx /data ext4 defaults,noatime 0 2這個(gè)參數(shù)的作用是關(guān)閉文件訪問時(shí)間的實(shí)時(shí)更新減少每次讀文件時(shí)的一次額外寫入。對(duì)高并發(fā)讀多寫少的場景效果很明顯屬于性價(jià)比很高的優(yōu)化項(xiàng)。5. 取消掛載、解除綁定與數(shù)據(jù)盤跨實(shí)例遷移5.1 umount卸載的標(biāo)準(zhǔn)流程取消掛載的核心命令是umountumount /data第一個(gè)坑就是“target is busy”。只要掛載目錄正在被任何進(jìn)程使用比如某個(gè)服務(wù)在讀寫文件或者你當(dāng)前shell的當(dāng)前工作目錄就在/data下面umount就會(huì)報(bào)設(shè)備忙。所以在卸載之前先執(zhí)行cd /切出掛載點(diǎn)目錄然后卸載。如果還報(bào)busy找出占用進(jìn)程的方式有兩種lsof f -- /data fuser -vm /datalsof會(huì)列出掛載目錄上被打開的文件以及對(duì)應(yīng)的進(jìn)程fuser -vm則直接輸出占用進(jìn)程的用戶和PID。確定占用進(jìn)程后正常停止服務(wù)或者結(jié)束進(jìn)程再執(zhí)行umount。如果情況緊急服務(wù)一時(shí)半會(huì)兒停不下來數(shù)據(jù)又不重要可以用強(qiáng)制方式fuser -km /data這條命令會(huì)殺掉所有正在使用該掛載點(diǎn)的進(jìn)程。我一般不推薦上來就強(qiáng)殺但生產(chǎn)環(huán)境磁盤打滿、需要立刻卸載盤釋放空間時(shí)這是最快速的手段。強(qiáng)殺之后記得手動(dòng)確認(rèn)服務(wù)已恢復(fù)。5.2 fstab條目清理如果之前配置過開機(jī)自動(dòng)掛載卸載盤之前一定要先處理fstab把對(duì)應(yīng)行注釋掉或者刪除vim /etc/fstab我習(xí)慣用行首加#注釋而不是直接刪除萬一以后還要掛回來搜索出這行改一下就能復(fù)用。忘記這一步的后果很嚴(yán)重下次重啟系統(tǒng)按照fstab找不到這個(gè)分區(qū)啟動(dòng)過程會(huì)卡住等待可能直接掉進(jìn)緊急模式。本來只想卸載個(gè)數(shù)據(jù)盤結(jié)果整臺(tái)服務(wù)器起不來這就是典型的“小操作大事故”。5.3 控制臺(tái)卸載數(shù)據(jù)盤服務(wù)器層面的umount做完之后數(shù)據(jù)盤和實(shí)例之間還連著需要到控制臺(tái)解綁。進(jìn)入ECS實(shí)例的云盤列表找到數(shù)據(jù)盤點(diǎn)擊“更多-卸載”。控制臺(tái)會(huì)先檢查云盤狀態(tài)卸載成功后云盤狀態(tài)變成“待掛載”這時(shí)候它可以作為一塊獨(dú)立的云盤資源掛到其他實(shí)例上。還有個(gè)細(xì)節(jié)值得注意如果購買數(shù)據(jù)盤時(shí)勾選了“隨實(shí)例釋放”那么卸載之后這個(gè)關(guān)聯(lián)就斷了云盤變成一個(gè)獨(dú)立資源以后釋放實(shí)例時(shí)它不會(huì)再跟著一起釋放。記得去云盤列表確認(rèn)一下計(jì)費(fèi)方式和釋放策略避免產(chǎn)生額外費(fèi)用或數(shù)據(jù)保留的意外情況。5.4 數(shù)據(jù)盤換實(shí)例掛載時(shí)的注意點(diǎn)數(shù)據(jù)盤從A實(shí)例卸載后掛到B實(shí)例有幾個(gè)容易被忽略的點(diǎn)。第一B實(shí)例的操作系統(tǒng)內(nèi)核要支持?jǐn)?shù)據(jù)盤的文件系統(tǒng)比如老版本系統(tǒng)對(duì)xfs支持不好掛上去之后分區(qū)可能識(shí)別不了。第二掛載過去后原來目錄的UID和GID可能和新系統(tǒng)里的用戶對(duì)不上表現(xiàn)為目錄明明存在但應(yīng)用進(jìn)程沒有權(quán)限讀寫需要重新執(zhí)行chown修正。第三fstab必須在新實(shí)例上重新配置設(shè)備名、掛載點(diǎn)都要按新環(huán)境調(diào)整。第四如果盤上是數(shù)據(jù)庫文件要確認(rèn)數(shù)據(jù)庫版本兼容直接把老版本數(shù)據(jù)文件掛到新版本數(shù)據(jù)庫上可能打不開。這些點(diǎn)不起眼但生產(chǎn)環(huán)境任何一個(gè)疏忽都可能演變成事故。做運(yùn)維就是這樣能把不起眼的事情考慮周全才能避免深夜的告警電話。6. 常見問題與排錯(cuò)記錄6.1 擴(kuò)容后看不到新增容量表現(xiàn)原因處理方法lsblk顯示磁盤已變大分區(qū)沒變分區(qū)未擴(kuò)展執(zhí)行g(shù)rowpart擴(kuò)展分區(qū)growpart成功df容量沒變化文件系統(tǒng)未擴(kuò)展根據(jù)文件系統(tǒng)類型執(zhí)行resize2fs或xfs_growfslsblk顯示磁盤還是原大小控制臺(tái)擴(kuò)容未生效或?qū)嵗粗貑⒋_認(rèn)云盤擴(kuò)容狀態(tài)必要時(shí)重啟實(shí)例這個(gè)類別的問題十有八九落在“忘了擴(kuò)文件系統(tǒng)”上。growpart處理完分區(qū)文件系統(tǒng)的元數(shù)據(jù)并不會(huì)自動(dòng)感知新空間你必須手動(dòng)執(zhí)行resize2fs或者xfs_growfs這一步不能跳過。記住這個(gè)三步鏈路控制臺(tái)擴(kuò)容塊設(shè)備growpart擴(kuò)分區(qū)resize2fs/xfs_growfs擴(kuò)文件系統(tǒng)。少一步容量就到不了手。6.2 fstab配錯(cuò)導(dǎo)致無法啟動(dòng)最經(jīng)典的現(xiàn)象是重啟后卡在開機(jī)過程最后提示“You are in emergency mode”或者類似的錯(cuò)誤。原因多半是fstab里的UUID寫錯(cuò)、分區(qū)不存在、或者文件系統(tǒng)類型寫錯(cuò)。修復(fù)流程是用救援模式或者控制臺(tái)VNC登錄先把根分區(qū)重新掛載為可讀寫mount -o remount,rw /然后編輯fstab把出錯(cuò)的行注釋掉重啟驗(yàn)證。這個(gè)問題我自己在新手期就踩過后來養(yǎng)成了兩條習(xí)慣第一fstab里永遠(yuǎn)用UUID不用設(shè)備名第二改完fstab必須執(zhí)行mount -a驗(yàn)證。這兩條習(xí)慣直接決定你下次重啟會(huì)不會(huì)多出來一臺(tái)起不來的機(jī)器。6.3 設(shè)備忙卸載不掉原因和處理上面已經(jīng)講過這里補(bǔ)充一個(gè)容易忽略的場景如果掛載點(diǎn)目錄是其他進(jìn)程的工作目錄即使沒有正在讀寫文件umount依然會(huì)報(bào)busy。所以排查的時(shí)候除了看服務(wù)進(jìn)程還要檢查有沒有shell停在這個(gè)目錄里。用fuser -vm能一眼看清占用情況比瞎猜強(qiáng)得多。6.4 df與lsblk顯示的容量對(duì)不上df顯示的是文件系統(tǒng)視角的容量lsblk顯示的是設(shè)備視角的容量兩者本來就是不同層面的信息。擴(kuò)容后發(fā)現(xiàn)df沒變化基本就是漏了resize2fs這一步。另外一個(gè)常見詭異情況是df顯示磁盤還有很大剩余空間但業(yè)務(wù)寫入時(shí)提示“No space left on device”。這時(shí)候別盯著容量看了執(zhí)行df -i查看inode使用率。inode是文件系統(tǒng)里存儲(chǔ)文件元數(shù)據(jù)的索引節(jié)點(diǎn)如果建了大量小文件把inode耗盡即使磁盤空間剩余再多也寫不進(jìn)新文件。這個(gè)問題在日志類、緩存類應(yīng)用里特別常見處理辦法是清理小文件或者從一開始計(jì)劃文件系統(tǒng)時(shí)預(yù)留足夠的inode數(shù)量。6.5 分區(qū)掛載后權(quán)限不對(duì)數(shù)據(jù)盤掛載到新實(shí)例目錄owner的UID/GID對(duì)不上就會(huì)出現(xiàn)文件在root下可見、但業(yè)務(wù)進(jìn)程無法訪問的情況。處理方式是新實(shí)例上執(zhí)行chown -R重新設(shè)置歸屬。這個(gè)問題不是文件系統(tǒng)壞了純粹是權(quán)限映射的錯(cuò)位別一頭扎進(jìn)去排查半天。6.6 大容量磁盤格式化耗時(shí)較長對(duì)幾個(gè)TB的數(shù)據(jù)盤執(zhí)行mkfs不會(huì)瞬間完成屏幕上可能長時(shí)間沒有輸出。這不是卡死了是正常的格式化過程。ext4格式化大容量盤時(shí)在后臺(tái)初始化inode表期間不要強(qiáng)制中斷命令否則可能留下未完成的文件系統(tǒng)后續(xù)使用時(shí)報(bào)錯(cuò)。耐心等它跑完或者用mkfs.ext4 -E lazy_itable_init1跳過部分后臺(tái)初始化讓文件系統(tǒng)在運(yùn)行期間逐步完成能明顯縮短初始格式化時(shí)間。7. 個(gè)人經(jīng)驗(yàn)與收尾磁盤相關(guān)操作我堅(jiān)持一個(gè)原則每次變更都留檔。之前做系統(tǒng)盤擴(kuò)容和數(shù)據(jù)盤掛載時(shí)我都會(huì)把lsblk、df、fdisk的輸出前后對(duì)比記錄下來包括操作時(shí)間、執(zhí)行命令、驗(yàn)證結(jié)果。這些隨手記的“流水賬”在半年后排查問題時(shí)價(jià)值非常大。磁盤報(bào)錯(cuò)時(shí)翻出當(dāng)時(shí)的記錄往往幾秒鐘就能定位是哪一步出了問題比在控制臺(tái)和終端之間反復(fù)來回折騰高效得多。另外一個(gè)實(shí)用習(xí)慣是給關(guān)鍵分區(qū)做標(biāo)簽備份。無論是系統(tǒng)盤擴(kuò)容前打快照還是數(shù)據(jù)盤格式化前做鏡像這種“先備份再操作”的流程我已經(jīng)刻進(jìn)肌肉記憶了。云盤的快照成本很低但它能保證你犯的任何錯(cuò)誤都有回頭路。運(yùn)維這行干久了你會(huì)發(fā)現(xiàn)大部分事故都不是操作復(fù)雜造成的而是省略了該有的防護(hù)步驟??煺站褪悄堑雷畋阋说姆谰€。如果你在擴(kuò)容、分區(qū)、掛載過程中遇到其他奇怪的報(bào)錯(cuò)也建議按“控制臺(tái)狀態(tài)-設(shè)備層-分區(qū)層-文件系統(tǒng)層-掛載層”這個(gè)順序逐層排查基本能覆蓋90%的磁盤問題。祝你的磁盤空間永遠(yuǎn)夠用擴(kuò)容永遠(yuǎn)順利。