LVM在線擴(kuò)容實(shí)戰(zhàn):lvextend與xfs_growfs詳解)
如果你手頭有一臺(tái) CentOS Stream 9 服務(wù)器某天突然收到根分區(qū)使用率 97% 的告警日志寫(xiě)不進(jìn)去、服務(wù)開(kāi)始報(bào)錯(cuò)、連 SSH 都卡頓而生產(chǎn)環(huán)境又不可能說(shuō)重啟就重啟——這時(shí)候你需要的正是 LVM 在線擴(kuò)容?;?LVM 的邏輯卷管理CentOS Stream 9 的根分區(qū)可以在系統(tǒng)不重啟、服務(wù)不停機(jī)的情況下直接擴(kuò)大全程只需要幾條命令。這篇教程就是我從實(shí)際運(yùn)維里整理出來(lái)的完整流程從原理到命令、從判斷到避坑全都寫(xiě)清楚了。操作步驟不復(fù)雜不需要多深的 Linux 功底第一次做擴(kuò)容的運(yùn)維新手可以照著敲搶修現(xiàn)場(chǎng)的技術(shù)同學(xué)也可以直接拿來(lái)當(dāng)手冊(cè)用。先說(shuō)明一下教程里的命令我都按真實(shí)場(chǎng)景驗(yàn)證過(guò)示例環(huán)境里 VG 名是 cs、根 LV 路徑是 /dev/cs/root但這只是我機(jī)器的命名。你機(jī)器上的 VG 名可能是 centos、rhel 或者其他什么一切以你自己的 vgs、lvs 輸出為準(zhǔn)不要照抄名字。1. 擴(kuò)容前先理清三件事根分區(qū)為什么會(huì)滿、LVM 憑什么能在線擴(kuò)1.1 根分區(qū)寫(xiě)滿的典型場(chǎng)景與后果根分區(qū)是 Linux 系統(tǒng)里最容易被塞滿的地方而且往往是在你毫無(wú)防備的時(shí)候出問(wèn)題。我接手過(guò)的故障里最常見(jiàn)的幾種情況是業(yè)務(wù)日志和系統(tǒng)日志持續(xù)增長(zhǎng)比如 /var/log 下的 messages、journal 文件沒(méi)有配置輪轉(zhuǎn)幾天就能吃掉十幾 GB。容器鏡像和容器數(shù)據(jù)堆積Docker/containerd 的默認(rèn)數(shù)據(jù)目錄通常就在 /var/lib/docker 或 /var/lib/containers鏡像拉多了、日志沒(méi)清理空間很快就沒(méi)了。內(nèi)核更新和軟件包緩存dnf 升級(jí)殘留的舊內(nèi)核、緩存包都占用 /boot 和 /usr 所在分區(qū)的空間。數(shù)據(jù)庫(kù)、緩存文件直接寫(xiě)在根分區(qū)上比如 MySQL 的 datadir 沒(méi)有單獨(dú)規(guī)劃盤隨著業(yè)務(wù)增長(zhǎng)把根分區(qū)填滿。臨時(shí)文件/tmp 下有程序異常生成的大文件文件被進(jìn)程占用刪不掉肉眼很難發(fā)現(xiàn)。根分區(qū)寫(xiě)滿的后果不只是不能寫(xiě)文件這么簡(jiǎn)單。系統(tǒng)很多核心功能依賴 / 目錄下的可寫(xiě)空間比如 /run 下的 socket 文件、/tmp 下的臨時(shí)文件、/var 下的鎖文件。一旦滿了可能會(huì)出現(xiàn)進(jìn)程崩潰、數(shù)據(jù)庫(kù)拒絕寫(xiě)入、SSH 登錄后無(wú)法創(chuàng)建歷史記錄文件、cron 任務(wù)靜默失敗等一堆看起來(lái)毫無(wú)關(guān)聯(lián)的詭異問(wèn)題。所以遇到根分區(qū)快滿的時(shí)候最優(yōu)解不是急著刪文件你根本不知道哪些能刪而是先把容量擴(kuò)上去讓系統(tǒng)恢復(fù)健康之后再?gòu)娜莸嘏挪槭鞘裁闯缘袅丝臻g。1.2 LVM 的三層抽象PV、VG、LV 一次講透想理解 LVM 在線擴(kuò)容必須先把它的三層結(jié)構(gòu)搞清楚。LVMLogical Volume Manager邏輯卷管理把磁盤管理分成了三層PVPhysical Volume物理卷可以是一塊整盤也可以是一個(gè)分區(qū)。它就代表物理上真實(shí)存在的存儲(chǔ)空間。VGVolume Group卷組由一塊或多塊 PV 組成的一個(gè)容量池。PV 可以隨時(shí)加入 VG所以 VG 的容量可以動(dòng)態(tài)變大。LVLogical Volume邏輯卷從 VG 這個(gè)容量池里劃分出來(lái)的虛擬磁盤。系統(tǒng)真正格式化、掛載、寫(xiě)入數(shù)據(jù)的是 LV。根分區(qū)在 LVM 場(chǎng)景下就是一個(gè) LV。用日常的東西類比PV 是你買回來(lái)的一桶桶水VG 是你家的蓄水池LV 是從水池接出來(lái)的一根水管。水池里的水可以隨時(shí)從外面提桶加進(jìn)來(lái)水管也可以隨時(shí)換更粗的。對(duì)使用水的家電來(lái)說(shuō)它只看到水管出口的出水量完全不知道水池?cái)U(kuò)容這件事——這就是在線擴(kuò)容的神奇之處。CentOS Stream 9 默認(rèn)安裝的時(shí)候如果選的是自動(dòng)分區(qū)方案根分區(qū)通常就在 LVM 上/boot 是獨(dú)立分區(qū)根目錄掛載在一個(gè) LV 上。這也就意味著只要你當(dāng)初沒(méi)有手動(dòng)改過(guò)分區(qū)方式大概率可以直接用 LVM 在線擴(kuò)容。1.3 在線擴(kuò)容的前提、邊界與安全底線LVM 在線擴(kuò)容不是所有場(chǎng)景都能用的動(dòng)手之前要先確認(rèn)三個(gè)前提根分區(qū)必須是由 LVM 管理的。怎么確認(rèn)執(zhí)行 lsblk如果根目錄對(duì)應(yīng)的設(shè)備路徑是 /dev/mapper/xxx 或者 lvm 類型就說(shuō)明是 LVM。如果根分區(qū)是普通分區(qū)比如 /dev/sda2 直接掛載到 /那這套流程用不了只能通過(guò)其他方式處理比如用 parted 調(diào)整分區(qū)風(fēng)險(xiǎn)更高或者遷移數(shù)據(jù)。要擴(kuò)容的 LV 所在 VG 有足夠的可用空間或者你有辦法補(bǔ)充新磁盤、擴(kuò)展原磁盤的容量。這是擴(kuò)容的糧草。當(dāng)前文件系統(tǒng)支持在線擴(kuò)容。CentOS Stream 9 默認(rèn)根分區(qū)是 XFSXFS 完全支持在線擴(kuò)展如果是 ext4 也支持在線擴(kuò)展。要注意的是XFS 只能擴(kuò)大不能縮小所以擴(kuò)容操作本身安全但千萬(wàn)不要想著用 LVM 縮小 XFS 根分區(qū)。安全底線方面我的習(xí)慣是任何磁盤操作之前先做一份云平臺(tái)快照或者至少確認(rèn)這臺(tái)機(jī)器有最近的備份。lvextend 本身是相當(dāng)安全、成熟的元數(shù)據(jù)操作但它畢竟是動(dòng)底層存儲(chǔ)的東西花幾分鐘打個(gè)快照能讓你在操作失誤時(shí)全身而退。另外操作盡量放在業(yè)務(wù)低峰期雖然在線擴(kuò)容對(duì)服務(wù)影響很小但邏輯卷元數(shù)據(jù)和文件系統(tǒng)增長(zhǎng)會(huì)有瞬時(shí) IO 負(fù)載。2. 體檢環(huán)節(jié)四組命令看清根分區(qū)的真實(shí)家底2.1 第一步先看清楚當(dāng)前根分區(qū)的用量與掛載情況不管多急著擴(kuò)容動(dòng)手前都要先做一次體檢。我通常按固定順序跑以下幾組命令首先看根分區(qū)的使用率和文件系統(tǒng)類型df -hT /這個(gè)命令的 T 參數(shù)很關(guān)鍵它會(huì)顯示文件系統(tǒng)類型。輸出里能看到掛載點(diǎn)是 / 的設(shè)備比如 /dev/mapper/cs-rootType 是 xfs。記住這個(gè)類型后面決定用哪個(gè)擴(kuò)容命令。然后再看整體磁盤結(jié)構(gòu)和掛載關(guān)系lsblklsblk 會(huì)以樹(shù)形結(jié)構(gòu)顯示所有塊設(shè)備。一個(gè)典型的輸出長(zhǎng)這樣NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 60G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 59G 0 part └─cs-root 253:0 0 40G 0 lvm /看到 cs-root 這一行掛載在 /說(shuō)明根分區(qū)確實(shí)是 LV。同時(shí)注意 sda2 分區(qū)大小是 59G而 LV root 只有 40G——也就是說(shuō)卷組里很可能還有空閑空間這就是我們?cè)诰€擴(kuò)容的底氣。2.2 LVM 家底盤點(diǎn)vgs、lvs、pvs 三個(gè)命令怎么讀接下來(lái)用 LVM 自帶的三個(gè)命令看家族明細(xì)vgs lvs pvs三個(gè)命令分別對(duì)應(yīng)查看卷組、邏輯卷、物理卷的概況。輸出示例# vgs VG #PV #LV #SN Attr VSize VFree cs 1 1 0 wz--n- 58.99g 19.00g # lvs LV VG Attr LSize Pool Origin Data% Meta% root cs -wi-ao---- 40.00g這里的 VFree 列是 19.00g表示卷組 cs 里還有 19GB 沒(méi)分配的空間。你現(xiàn)在要做的判斷很簡(jiǎn)單VFree 有空間直接給根 LV 擴(kuò)容。VFree 是 0 或者不夠用就需要先給 VG 增加容量見(jiàn)后面第 4 章。如果覺(jué)得 vgs 輸出不夠詳細(xì)可以用 vgdisplay 看更完整的信息比如 PE 大小和空閑 PE 數(shù)量。vgdisplay cs里會(huì)看到 Free PE / Total PEPE 是 LVM 分配空間的最小單位默認(rèn)一般是 4MiB。知道 PE 大小有助于理解 lvextend 用 -l 指定數(shù)量時(shí)的換算關(guān)系。2.3 判斷擴(kuò)容路徑與文件系統(tǒng)類型避免選錯(cuò)命令體檢做完其實(shí)已經(jīng)把走哪條路想清楚了如果 lsblk 顯示根分區(qū)是 LV 類型且 vgs 顯示 VFree 有空間走直接擴(kuò) LV這條路對(duì)應(yīng)第 3 章。如果 vgs 顯示 VFree 已經(jīng)耗盡但磁盤本身還有未分配空間比如 sda 是 100G但 sda2 分區(qū)只有 60G可以走擴(kuò)展分區(qū) pvresize這條路對(duì)應(yīng) 4.2 節(jié)。如果機(jī)器上還有一塊新加的空白磁盤走新盤建 PV 并入 VG這條路對(duì)應(yīng) 4.1 節(jié)。文件系統(tǒng)類型決定了最后的 grow 命令CentOS Stream 9 默認(rèn)是 XFS用 xfs_growfs如果當(dāng)初手選成了 ext4用 resize2fs。用 lvextend -r 的話可以自動(dòng)識(shí)別但手動(dòng)操作時(shí)必須分清。一句話總結(jié)擴(kuò)容的本質(zhì)是先在 VG 層把水加夠再在 LV 層把水管加粗最后讓文件系統(tǒng)感知到新容量。每一步都有對(duì)應(yīng)命令缺一不可。3. 主流程第一步VG 有富余時(shí)直接在線擴(kuò) LV3.1 推薦做法lvextend -r 一步完成 LV 與文件系統(tǒng)擴(kuò)容體檢確認(rèn) VG 還有 19G 空閑之后擴(kuò)容命令其實(shí)就一行。先看根 LV 的名字比如 /dev/cs/root然后執(zhí)行l(wèi)vextend -r -l 100%FREE /dev/cs/root這條命令里-r 是 --resizefs 的簡(jiǎn)寫(xiě)含義是擴(kuò)展邏輯卷之后自動(dòng)擴(kuò)展文件系統(tǒng)一步到位。-l 100%FREE 表示把卷組里所有剩余空閑空間全部分配給這個(gè) LV。注意這個(gè)百分比是相對(duì)于 VG 的空閑空間不是 LV 當(dāng)前大小。執(zhí)行后你會(huì)看到類似這樣的輸出Size of logical volume cs/root changed from 40.00 GiB (10240 extents) to 59.00 GiB (15104 extents). Logical volume cs/root successfully resized. File system xfs found on cs/root, mounted at / File system size changed from 40.00 GiB to 59.00 GiB看到 File system size changed 這一行說(shuō)明文件系統(tǒng)也自動(dòng)擴(kuò)展成功了。整個(gè)過(guò)程不需要重啟也不需要卸載根分區(qū)服務(wù)全程在線。這就是 LVM 在線擴(kuò)容最舒服的地方。如果你不想把 VG 里的空間全給根分區(qū)想留一點(diǎn)余量給后續(xù)建其他 LV 用可以改成指定增量大小比如lvextend -r -L 15G /dev/cs/root-L 后面跟的是具體大小15G 表示在原有基礎(chǔ)上增加 15GBVG 里還會(huì)剩 4G 空間。習(xí)慣上我更推薦有明確容量需求時(shí)用 -L想快速救急時(shí)用 -l 100%FREE。3.2 手動(dòng)路線lvextend 之后 xfs_growfs 與 resize2fs 該怎么選雖然 -r 參數(shù)很方便我還是要單獨(dú)講一下手動(dòng)路線因?yàn)閷?shí)際運(yùn)維中你總會(huì)遇到 -r 不好使的時(shí)候比如宿主機(jī) lvm2 版本較老、或者文件系統(tǒng)工具缺失。手動(dòng)路線分兩步。第一步同樣擴(kuò) LVlvextend -L 19G /dev/cs/root注意這里不加 -rLV 擴(kuò)容后文件系統(tǒng)大小不變。此時(shí)你執(zhí)行 df -hT 會(huì)看到容量沒(méi)有任何變化這是正常的因?yàn)槲募到y(tǒng)還沒(méi)有感知新空間。第二步根據(jù)文件系統(tǒng)類型選命令。前面 df -hT 已經(jīng)確認(rèn)了根分區(qū)是 XFS執(zhí)行xfs_growfs /xfs_growfs 的參數(shù)是掛載點(diǎn)不是設(shè)備路徑。對(duì)于根分區(qū)直接寫(xiě) / 就夠了。它會(huì)掃描掛載在 / 上的 XFS 文件系統(tǒng)并把容量擴(kuò)展到設(shè)備實(shí)際大小輸出里會(huì)出現(xiàn)data blocks changed from ... to ...看到這行就說(shuō)明擴(kuò)展生效。如果你當(dāng)初把 / 做成了 ext4則用resize2fs /dev/cs/rootresize2fs 的參數(shù)是設(shè)備路徑和 xfs_growfs 恰好相反。它同樣支持在線擴(kuò)展 ext4輸出類似Resizing the filesystem on /dev/cs/root to 12345678 (4k) blocks.。新手最容易犯的錯(cuò)就是把命令和文件系統(tǒng)搞混XFS 用 resize2fs 會(huì)直接報(bào)錯(cuò)ext4 用 xfs_growfs 也會(huì)告訴你找不到 XFS 文件系統(tǒng)。所以每次擴(kuò)容前用 df -hT / 看一眼類型幾秒鐘的事。3.3 擴(kuò)容完成的驗(yàn)證與輸出解讀擴(kuò)容不是執(zhí)行完命令就收工驗(yàn)證環(huán)節(jié)必須做。我一般按下面的順序確認(rèn)df -hT / vgs lvsdf 看使用率降沒(méi)降vgs 看 VFree 是否歸零取決于你用了哪種擴(kuò)容方式lvs 看 LV 新大小。還是用前面的例子擴(kuò)容前后對(duì)比大概是這樣檢查項(xiàng)擴(kuò)容前擴(kuò)容后/ 文件系統(tǒng)大小40G59G/ 使用率98%66% 左右VG 空閑19G0如果用了 100%FREELV 大小40G59G如果 df 顯示容量沒(méi)變請(qǐng)回到 3.2 節(jié)手動(dòng)執(zhí)行 xfs_growfs / 或者 resize2fs。我見(jiàn)過(guò)很多同事擴(kuò)完 LV 忘了擴(kuò)文件系統(tǒng)隔天一臉懵地來(lái)問(wèn)我為什么 lvextend 沒(méi)生效其實(shí)命令本身沒(méi)有任何問(wèn)題。另外一個(gè)小細(xì)節(jié)執(zhí)行 lvextend 時(shí)輸出的 extents 數(shù)字是和 VG 的 PE 大小掛鉤的。默認(rèn) PE 是 4MiB所以 1GB 大約是 256 個(gè) PE??吹?10240 extents 對(duì)應(yīng) 40GB、15104 extents 對(duì)應(yīng) 59GB換算一下能幫你快速判斷 LVM 元數(shù)據(jù)層面是否真的按預(yù)期分配了。4. VG 不夠用了怎么辦新增磁盤與云盤擴(kuò)容兩條路徑4.1 新增數(shù)據(jù)盤并入 VG從識(shí)別磁盤到 vgextend 的完整命令鏈VFree 是 0 的時(shí)候第一步先讓 VG 變大。最常見(jiàn)的做法是給機(jī)器加一塊新磁盤把整塊盤或盤上分區(qū)變成 PV再并入 VG。以云環(huán)境為例給實(shí)例新掛載一塊 100G 數(shù)據(jù)盤后先確認(rèn)系統(tǒng)識(shí)別到了lsblk如果看到類似 /dev/sdb 這樣的新設(shè)備大小 100G且沒(méi)有掛載點(diǎn)就可以直接拿它做 PV。我個(gè)人的偏好是云盤直接用整塊盤做 PV不建分區(qū)表省事且性能無(wú)損。執(zhí)行pvcreate /dev/sdb vgextend cs /dev/sdbpvcreate 是把這塊盤變成物理卷。vgextend 是把它并入名為 cs 的卷組。成功后能看到Volume group cs successfully extended。再跑一遍 vgsVFree 應(yīng)該多了 100G。如果你更習(xí)慣分區(qū)方式或者要加進(jìn) VG 的盤將來(lái)可能還有其他用途那就先進(jìn) fdisk 建分區(qū)fdisk /dev/sdb交互式操作里依次按 n新建分區(qū)、p主分區(qū)、回車分區(qū)號(hào)默認(rèn) 1、回車兩次扇區(qū)默認(rèn)、t修改類型、輸入 8eLinux LVM、w寫(xiě)入。之后刷新分區(qū)表并創(chuàng)建 PVpartprobe /dev/sdb pvcreate /dev/sdb1 vgextend cs /dev/sdb1整塊盤和分區(qū)兩種路徑殊途同歸最終效果都是給 VG 增加容量。之后回到第 3 章的 lvextend 流程把空間分給根分區(qū)即可。4.2 云控制臺(tái)原地?cái)U(kuò)容系統(tǒng)盤growpart 配合 pvresize 的經(jīng)典流程除了加新盤云環(huán)境里還有一種很常見(jiàn)的場(chǎng)景直接擴(kuò)容已有系統(tǒng)盤。比如最初系統(tǒng)盤 60G你在控制臺(tái)把它擴(kuò)到了 200G。這種場(chǎng)景下磁盤設(shè)備不會(huì)變成新的 /dev/sdb而是 /dev/sda 本身變大但分區(qū)和 PV 還停留在原來(lái)的 60G 尺寸需要分三步把增量空間一層層認(rèn)進(jìn)來(lái)。第一步確認(rèn)內(nèi)核已經(jīng)識(shí)別到新容量lsblk正常情況下 sda 會(huì)顯示 200G但 sda1、sda2 分區(qū)還是原大小。如果 sda 都還是 60G說(shuō)明內(nèi)核還沒(méi)刷新磁盤容量執(zhí)行 4.3 里的 SCSI 掃描或重啟。第二步擴(kuò)展分區(qū)。假設(shè)根 PV 在 /dev/sda2 上先用 growpart 把分區(qū)擴(kuò)到磁盤末尾dnf install -y cloud-utils-growpart growpart /dev/sda 2 partprobe /dev/sdagrowpart 后面第一個(gè)參數(shù)是磁盤設(shè)備第二個(gè)是分區(qū)號(hào)。運(yùn)行結(jié)束后 sda2 分區(qū)會(huì)占滿整個(gè) sda 的剩余空間。第三步擴(kuò)展 PVpvresize /dev/sda2pvresize 的作用是讓 PV 使用擴(kuò)容后的整個(gè)分區(qū)空間。執(zhí)行完可以用 pvs 對(duì)比前后 Size。如果 PV 當(dāng)初是直接建在整塊盤上的比如 PV 就是 /dev/sda跳過(guò) growpart直接執(zhí)行 pvresize /dev/sda 即可。到這里 VG 的容量已經(jīng)變大vgs 應(yīng)該能看到 VSize 和 VFree 都增加了。剩下的老套路lvextend -r 或手動(dòng) xfs_growfs /。這套流程在阿里云這類云平臺(tái)上是通用的。只要底層是 virtio 等虛擬化設(shè)備且系統(tǒng)引導(dǎo)沒(méi)問(wèn)題CentOS Stream 9 都能支持熱擴(kuò)容后在線完成上述操作。不同點(diǎn)只在于控制臺(tái)觸發(fā)擴(kuò)容后內(nèi)核刷新磁盤容量可能在幾秒到幾分鐘內(nèi)完成少數(shù)情況需要重啟一次。4.3 新盤識(shí)別不出來(lái)時(shí)的排查順序加新盤后 lsblk 看不到設(shè)備這是大家在云環(huán)境里問(wèn)得最多的問(wèn)題。我的排查順序固定如下先看 /proc/partitionscat /proc/partitions如果這里能看到 sdb說(shuō)明內(nèi)核已經(jīng)識(shí)別只是 lsblk 輸出可能沒(méi)刷新執(zhí)行 udevadm settle 再看一次。如果是傳統(tǒng) SCSI 虛擬磁盤可以觸發(fā)一次總線重新掃描for host in /sys/class/scsi_host/host*; do echo - - - $host/scan; done執(zhí)行后立即 lsblk 檢查???dmesg 日志dmesg | grep -i sd\|virtio\|sdb能看到磁盤設(shè)備相關(guān)日志比如 sdb 是否被發(fā)現(xiàn)、是否有 IO 錯(cuò)誤。如果以上都不行在業(yè)務(wù)窗口允許的情況下重啟一次。云平臺(tái)控制臺(tái)掛載的磁盤在大多數(shù)虛擬化環(huán)境里支持熱插拔識(shí)別但極少數(shù)老型號(hào)虛擬化平臺(tái)對(duì)熱添加支持不徹底重啟是最干脆的兜底方案。排查的時(shí)候不要急一塊磁盤沒(méi)有出現(xiàn)無(wú)非是鏈路問(wèn)題、驅(qū)動(dòng)問(wèn)題、平臺(tái)問(wèn)題三類一層層確認(rèn)就好。最忌諱的是 lsblk 沒(méi)看到新盤就反復(fù)執(zhí)行 pvcreate那樣只會(huì)得到Device /dev/sdb not found的報(bào)錯(cuò)。5. 擴(kuò)容實(shí)操中的翻車現(xiàn)場(chǎng)與保險(xiǎn)措施5.1 最容易踩的雷設(shè)備名看錯(cuò)、類型選錯(cuò)、XFS 不可縮擴(kuò)容本身不復(fù)雜但我接手過(guò)的擴(kuò)容事故幾乎都集中在三個(gè)點(diǎn)上。第一個(gè)是設(shè)備名看錯(cuò)。pvextend、pvcreate 都是不可逆或者很難逆轉(zhuǎn)的操作如果你機(jī)器上有 /dev/sda系統(tǒng)盤和 /dev/sdb新數(shù)據(jù)盤手一抖把 pvcreate /dev/sda 敲下去系統(tǒng)盤直接變成 PV引導(dǎo)和數(shù)據(jù)都可能出問(wèn)題。我的習(xí)慣是操作前先用 lsblk -o NAME,SIZE,MODEL,SERIAL 對(duì)一遍設(shè)備和盤的大小、型號(hào)確認(rèn)哪個(gè)是目標(biāo)盤。第二個(gè)是文件系統(tǒng)類型選錯(cuò)。XFS 的根分區(qū)用 resize2fs 是無(wú)效的會(huì)提示 superblock 不對(duì)ext4 的根分區(qū)用 xfs_growfs 也會(huì)直接報(bào)錯(cuò)。擴(kuò)容前用一次 df -hT / 確認(rèn)類型比事后排查省太多時(shí)間。第三個(gè)是把 XFS 當(dāng)成 ext4 一樣能縮能擴(kuò)。XFS 文件系統(tǒng)只支持?jǐn)U容不支持縮小。如果你哪天看到根分區(qū)太大想縮一縮這種需求正確的做法是備份、重建 LV、恢復(fù)數(shù)據(jù)而不是用 lvreduce 去縮。任何對(duì) XFS 的 lvreduce 嘗試都可能讓文件系統(tǒng)元數(shù)據(jù)錯(cuò)亂這是我在實(shí)際工作中非常忌諱的操作。還有一個(gè)隱藏的坑lvextend -l 100%FREE 會(huì)把卷組里所有空閑空間都給當(dāng)前 LV。如果你的 VG 里還有別的 LV 需要保留擴(kuò)容余地這個(gè)命令就不合適建議用 -L 精確指定增長(zhǎng)量。做之前用 vgs 看一眼 VFree明確這些空閑我要分多少出去。5.2 動(dòng)手前的三道保險(xiǎn)快照、fstab 備份、LV 路徑核對(duì)我在生產(chǎn)環(huán)境做任何 LVM 操作之前都會(huì)花幾分鐘做三道保險(xiǎn)這套流程幫我避免了至少三次事故保險(xiǎn)一云平臺(tái)快照。在控制臺(tái)給系統(tǒng)盤打一份快照或鏡像??煺帐钱惒降拇_??煺諣顟B(tài)變成已完成再繼續(xù)否則快照可能不含最新數(shù)據(jù)。如果機(jī)器沒(méi)有云平臺(tái)快照能力可以用 LVM 本身的快照功能但對(duì)新手來(lái)說(shuō)云平臺(tái)快照更直觀可靠。保險(xiǎn)二備份關(guān)鍵配置和現(xiàn)有布局。執(zhí)行cp /etc/fstab /etc/fstab.bak blkid /tmp/blkid_before_resize.txt vgs /tmp/vgs_before_resize.txt lvs /tmp/lvs_before_resize.txt這幾行命令把你的文件系統(tǒng)表、設(shè)備 UUID、卷組和邏輯卷狀態(tài)都留了個(gè)底。萬(wàn)一后續(xù)操作影響了啟動(dòng)還能參照這些文件恢復(fù)。保險(xiǎn)三核對(duì) LV 路徑。在 lvextend 之前花五秒鐘跑一遍 lvs 確認(rèn)要擴(kuò)容的 LV 路徑準(zhǔn)確。我見(jiàn)過(guò)有人把 /dev/cs/root 寫(xiě)成了 /dev/cs/boot擴(kuò)容了不該擴(kuò)的卷雖然不至于數(shù)據(jù)丟失但違背了操作意圖。另外強(qiáng)烈建議把長(zhǎng)命令放進(jìn) tmux 或 screen 會(huì)話里執(zhí)行tmux new -s resize原因很現(xiàn)實(shí)擴(kuò)容期間如果 SSH 斷掉命令可能只執(zhí)行一半雖然 LVM 有恢復(fù)機(jī)制但 tmux 能保證你的會(huì)話和命令在斷連后繼續(xù)跑完。這個(gè)習(xí)慣在搶修時(shí)尤其值錢。5.3 什么時(shí)候仍然需要重啟什么時(shí)候完全不用寫(xiě)到這里把在線擴(kuò)容和重啟的邊界說(shuō)清楚省得大家誤解。完全不用重啟的操作已有 VG 空閑空間直接 lvextend -r 擴(kuò)展根 LV全程不用重啟。新磁盤熱插拔成功、并入 VG 后再擴(kuò)根 LV全程不用重啟。云盤控制臺(tái)擴(kuò)容后內(nèi)核已經(jīng)識(shí)別到新容量且通過(guò)分區(qū)擴(kuò)展 pvresize 完成空間認(rèn)領(lǐng)全程不用重啟??赡苄枰貑⒌那闆r云盤控制臺(tái)擴(kuò)容后lsblk 遲遲不顯示新容量所有 SCSI 掃描手段都無(wú)效此時(shí)需要重啟一次讓內(nèi)核重新讀取磁盤容量。你操作的是非 LVM 分區(qū)比如 /boot 所在分區(qū)那不在本文討論范圍且通常需要更復(fù)雜的處理。誤操作改了 /etc/fstab、/boot 下文件等啟動(dòng)相關(guān)內(nèi)容這時(shí)機(jī)器會(huì)異常需要盡快修復(fù)并重啟驗(yàn)證。一句話總結(jié)LVM 在線擴(kuò)容的絕大多數(shù)場(chǎng)景都不需要重啟而且這正是它作為生產(chǎn)環(huán)境根分區(qū)方案的核心價(jià)值。最后分享一點(diǎn)個(gè)人習(xí)慣擴(kuò)容完成后我會(huì)順手把根分區(qū)使用率降到安全范圍以內(nèi)但真正的收尾是排查空間為什么會(huì)被占滿。常見(jiàn)做法是 du -sh /var/log /var/lib /home 等目錄找出空間大戶配置日志輪轉(zhuǎn)、設(shè)置容器日志大小限制。畢竟擴(kuò)容只是治標(biāo)把容量規(guī)劃和日志治理做好才是治本。這套組合下來(lái)CentOS Stream 9 的根分區(qū)基本上就很難再給你惹麻煩了。