工具parted完全指南:GPT分區(qū)、在線擴(kuò)容與自動(dòng)化腳本實(shí)踐)
做服務(wù)器運(yùn)維這些年我?guī)缀趺刻於家疟P分區(qū)打交道。今天想認(rèn)真聊一聊parted分區(qū)工具這是GNU出品的一個(gè)命令行分區(qū)工具也是我在處理GPT分區(qū)表、超大容量磁盤和自動(dòng)化初始化任務(wù)時(shí)的首選。很多人一上來(lái)就習(xí)慣用fdisk但碰到超過(guò)2TB的磁盤或者需要在腳本里批量創(chuàng)建分區(qū)時(shí)fdisk就顯得力不從心。parted既能管MBR也能管GPT還提供了穩(wěn)定的非交互模式特別適合寫進(jìn)自動(dòng)化流程。不管你是運(yùn)維工程師、測(cè)試環(huán)境的搭建者還是偶爾給自己電腦加一塊硬盤的折騰黨這篇文章都能幫上忙。我會(huì)從工具選擇、分區(qū)表原理、實(shí)操步驟到生產(chǎn)環(huán)境常見故障把parted分區(qū)工具的完整用法整理一遍。1. 為什么選擇parted三個(gè)關(guān)鍵場(chǎng)景和與fdisk的對(duì)比1.1 我什么時(shí)候會(huì)優(yōu)先用parted而不是fdisk實(shí)際運(yùn)維中我優(yōu)先選parted主要是在三類場(chǎng)景。第一類是新服務(wù)器初始化數(shù)據(jù)盤。服務(wù)器上的數(shù)據(jù)盤往往不止一塊容量從1TB到幾十TB都有可能。用parted一條命令建好GPT分區(qū)表再一條命令創(chuàng)建分區(qū)整個(gè)過(guò)程可以完全在無(wú)交互狀態(tài)下完成比手動(dòng)敲fdisk里的菜單高效太多。第二類是調(diào)整分區(qū)大小。parted的resizepart命令可以直接修改分區(qū)邊界配合resize2fs或xfs_growfs使用通常不需要重啟系統(tǒng)就能完成在線擴(kuò)容。fdisk在這方面很弱它只能刪掉分區(qū)重建操作風(fēng)險(xiǎn)完全不同量級(jí)。第三類是寫自動(dòng)化腳本。parted的-s非交互模式支持一條命令直接完成mklabel、mkpart等操作非常適合Shell腳本、Ansible等配置管理工具。fdisk和gdisk雖然也能用管道輸入模擬非交互但輸出格式不穩(wěn)定出錯(cuò)排查成本很高。再說(shuō)一個(gè)很現(xiàn)實(shí)的原因parted是幾乎所有主流Linux發(fā)行版都自帶或軟件源里直接能裝的工具沒(méi)有額外依賴。你不需要為一個(gè)分區(qū)操作去單獨(dú)安裝什么圖形界面它就是一個(gè)干干凈凈的命令行工具。1.2 parted和fdisk、gdisk的定位差異三個(gè)工具經(jīng)常被拿來(lái)對(duì)比但它們的定位是有明顯區(qū)別的。工具分區(qū)表支持腳本化能力分區(qū)大小調(diào)整適用場(chǎng)景fdisk主要面向MBR新版可處理GPT一般適合交互不支持MBR分區(qū)的日常查看和修改gdisk面向GPT可處理MBR較弱重交互不支持GPT分區(qū)表的修復(fù)和轉(zhuǎn)換partedMBR和GPT都支持強(qiáng)-s模式穩(wěn)定支持resizepart新盤初始化、批量分區(qū)、擴(kuò)容fdisk是MBR時(shí)代的經(jīng)典工具不少人習(xí)慣敲fdisk /dev/sdb再按n創(chuàng)建分區(qū)。但MBR對(duì)超過(guò)2TB的磁盤束手無(wú)策而且主分區(qū)數(shù)量最多4個(gè)碰到多分區(qū)場(chǎng)景會(huì)非常麻煩。新版fdisk雖然也支持GPT但它的工作方式還是圍繞交互菜單設(shè)計(jì)的。gdisk則是GPT時(shí)代的專門工具功能很強(qiáng)大尤其是修復(fù)損壞的GPT分區(qū)表時(shí)很有用。但它的腳本化能力一般如果你只是想快速建一個(gè)GPT分區(qū)并寫入文件系統(tǒng)用gdisk會(huì)感覺(jué)步驟冗余。parted的價(jià)值正好在兩者之間既支持全部主流分區(qū)表又能通過(guò)-s參數(shù)做到真正的靜默批量執(zhí)行。我對(duì)它的定位是“生產(chǎn)力工具”而不是“維修工具”。1.3 parted的能力邊界使用parted前要先明確它的能力范圍它做的是分區(qū)表層面的操作不負(fù)責(zé)創(chuàng)建文件系統(tǒng)。命令包括mklabel、mkpart、rm、resizepart、set等能創(chuàng)建和刪除分區(qū)、設(shè)置分區(qū)類型標(biāo)志、修改分區(qū)表標(biāo)簽類型。但你在parted里指定ext4、xfs這類參數(shù)時(shí)它只是把這個(gè)類型寫入分區(qū)表元數(shù)據(jù)并不會(huì)真正格式化分區(qū)。格式化要另外執(zhí)行mkfs.ext4或mkfs.xfs。這個(gè)能力邊界很重要。我有段時(shí)間看到新人用parted mkpart primary xfs 1MiB 100%然后就以為分區(qū)已經(jīng)是xfs文件系統(tǒng)了直接掛載報(bào)錯(cuò)。parted只負(fù)責(zé)“畫格子”往格子里填什么內(nèi)容是mkfs的事。另外parted對(duì)已掛載分區(qū)的操作是有限制的。你別指望在分區(qū)掛載狀態(tài)下去刪除它內(nèi)核會(huì)直接拒絕。這個(gè)限制不是parted的問(wèn)題而是Linux內(nèi)核的保護(hù)機(jī)制后面我會(huì)專門講。2. 分區(qū)前的核心原理MBR、GPT、對(duì)齊與單位2.1 MBR和GPT為什么我們要了解分區(qū)表類型要弄懂parted得先弄懂分區(qū)表是什么。分區(qū)表就是記錄磁盤上“哪里到哪里屬于哪個(gè)分區(qū)”的地址索引。MBRMaster Boot Record是上世紀(jì)80年代的設(shè)計(jì)。它用32位邏輯塊地址來(lái)描述分區(qū)邊界單塊磁盤最大只能管理大約2TiB容量。在MBR下一塊磁盤最多只能有4個(gè)主分區(qū)。為了突破這個(gè)限制后來(lái)引入了擴(kuò)展分區(qū)和邏輯分區(qū)的概念但實(shí)際使用中依然繁瑣而且邏輯分區(qū)的地址計(jì)算很容易出錯(cuò)。GPTGUID Partition Table是UEFI時(shí)代的標(biāo)準(zhǔn)。它用64位邏輯塊地址單盤容量上限高到我們?cè)诂F(xiàn)實(shí)里幾乎碰不到邊。它默認(rèn)支持128個(gè)分區(qū)每個(gè)分區(qū)都有獨(dú)立的GUID和名稱。更重要的一點(diǎn)是GPT在磁盤頭部和尾部各保存了一份分區(qū)表副本一旦主分區(qū)表?yè)p壞可以用備份分區(qū)表恢復(fù)。我在給新數(shù)據(jù)盤做初始化時(shí)只要磁盤容量超過(guò)2TB或者預(yù)計(jì)以后可能擴(kuò)容到2TB以上一律選擇GPT分區(qū)表。即便磁盤暫時(shí)小于2TB我也更傾向GPT因?yàn)檫@樣以后擴(kuò)容不用再折騰分區(qū)表轉(zhuǎn)換。parted里創(chuàng)建分區(qū)表的命令就一行parted -s /dev/sdb mklabel gpt如果是老式MBR則是parted -s /dev/sdb mklabel msdos這里用的-s就是后面會(huì)反復(fù)提到的靜默模式。2.2 扇區(qū)大小與1MiB對(duì)齊的由來(lái)“對(duì)齊”這個(gè)詞新手聽上去很玄其實(shí)原理不復(fù)雜。傳統(tǒng)磁盤的扇區(qū)是512字節(jié)邏輯扇區(qū)也是512字節(jié)。但現(xiàn)代大容量硬盤物理扇區(qū)普遍是4096字節(jié)這就是常說(shuō)的4K扇區(qū)。有些硬盤為了讓舊系統(tǒng)兼容對(duì)外仍把邏輯扇區(qū)報(bào)成512字節(jié)即512e模式。不管哪種情況如果你創(chuàng)建分區(qū)時(shí)起始位置沒(méi)有落在物理扇區(qū)的邊界上讀寫就可能出現(xiàn)跨扇區(qū)操作導(dǎo)致性能下降某些場(chǎng)景下甚至?xí)黠@拖慢IO。Linux社區(qū)通用的安全對(duì)齊點(diǎn)是1MiB。1MiB等于1048576字節(jié)正好是2048個(gè)512字節(jié)扇區(qū)的整數(shù)倍也正好是256個(gè)4096字節(jié)扇區(qū)的整數(shù)倍。以1MiB作為分區(qū)起始位置幾乎能保證和所有常見存儲(chǔ)設(shè)備的物理邊界對(duì)齊包括機(jī)械硬盤、SSD和云平臺(tái)的虛擬磁盤。parted在檢測(cè)到分區(qū)起始位置沒(méi)對(duì)齊時(shí)會(huì)打印類似下面的警告Warning: The resulting partition is not properly aligned for best performance.看到這個(gè)警告最省事的處理方式就是刪掉分區(qū)重建把起始位置從默認(rèn)的0或某個(gè)非對(duì)齊位置改成1MiB。2.3 parted的單位機(jī)制MB、MiB和百分比的陷阱parted里單位很靈活但這也是最容易踩坑的地方。進(jìn)入parted交互模式后print顯示的分區(qū)大小默認(rèn)使用MB也就是十進(jìn)制1MB等于1000000字節(jié)。但你指定分區(qū)大小時(shí)可以用MiB、GiB、TiB這些是二進(jìn)制單位1MiB等于1048576字節(jié)。兩者看起來(lái)差不多在大容量磁盤上累加出來(lái)的誤差很可觀。所以我的習(xí)慣是所有分區(qū)的start和end都用MiB或GiB指定避免用MB。parted還支持百分比比如parted -s /dev/sdb mkpart data ext4 1MiB 100%這條命令的意思是新建分區(qū)起始位置從1MiB開始結(jié)束位置延伸到磁盤末尾。對(duì)一塊全新數(shù)據(jù)盤來(lái)說(shuō)這個(gè)寫法非常方便直接占滿剩余空間。但要注意如果有多個(gè)分區(qū)某個(gè)分區(qū)使用100%作為結(jié)束位置它會(huì)一直延伸到磁盤末尾很可能覆蓋掉后面的分區(qū)。只有明確知道空間規(guī)劃時(shí)才建議用百分比。我在命令里常寫1MiB但在print輸出里看到的是1049kB因?yàn)閜arted顯示默認(rèn)單位是MB。想看二進(jìn)制單位可以在交互模式里敲(parted) unit MiB也可以用命令行參數(shù)直接指定parted -s /dev/sdb unit MiB print搞清楚單位之間的換算能幫你避免很多看似詭異的問(wèn)題。3. parted實(shí)操初始化、分區(qū)、腳本化和擴(kuò)容3.1 動(dòng)手前的檢查與風(fēng)險(xiǎn)預(yù)案先說(shuō)一句話parted沒(méi)有退款功能也不像rm那樣有交互確認(rèn)早期版本還問(wèn)幾句新版本在-s模式下是靜默執(zhí)行命令敲下去分區(qū)表就變了。所以動(dòng)手前我有一套固定檢查流程。第一步確認(rèn)設(shè)備名。用lsblk或df -h看清楚目標(biāo)磁盤對(duì)應(yīng)的是哪個(gè)設(shè)備名。生產(chǎn)環(huán)境里誤把sda當(dāng)成sdb操作搞掛系統(tǒng)盤的案例不止一次聽過(guò)。lsblk第二步確認(rèn)磁盤上沒(méi)有正在使用的分區(qū)??梢钥磎ount輸出也可以用df確認(rèn)沒(méi)有掛載點(diǎn)占用。第三步把當(dāng)前分區(qū)表先記錄一份parted -s /dev/sdb print有條件的可以截圖或者存到日志里。萬(wàn)一操作到一半發(fā)現(xiàn)不對(duì)勁這份記錄能幫你判斷原始的起點(diǎn)和終點(diǎn)。第四步確認(rèn)磁盤里的數(shù)據(jù)不需要保留。凡是涉及分區(qū)表重寫的操作數(shù)據(jù)備份永遠(yuǎn)是第一優(yōu)先級(jí)。parted的mklabel gpt會(huì)直接重建分區(qū)表等于把磁盤上原有的分區(qū)記錄清空。雖然數(shù)據(jù)塊本身未必被覆蓋但分區(qū)記錄沒(méi)了之后恢復(fù)成本非常高。無(wú)論什么時(shí)候都別在真正重要的數(shù)據(jù)盤上嘗試“先操作后恢復(fù)”。3.2 全新數(shù)據(jù)盤初始化和分區(qū)的完整步驟接下來(lái)演示一塊全新的數(shù)據(jù)盤/dev/sdb從零開始初始化的過(guò)程。先在多數(shù)Linux發(fā)行版上確認(rèn)parted是否安裝which parted如果沒(méi)安裝CentOS/RHEL系列用yumDebian/Ubuntu系列用aptyum install parted -y # 或者 apt install parted -y查看目標(biāo)磁盤的基本信息lsblk /dev/sdb parted -s /dev/sdb print如果print給出“unrecognised disk label”之類的提示說(shuō)明這塊盤還沒(méi)有可識(shí)別的分區(qū)表。創(chuàng)建GPT分區(qū)表parted -s /dev/sdb mklabel gpt再創(chuàng)建分區(qū)起始位置1MiB結(jié)束位置100%parted -s /dev/sdb mkpart data ext4 1MiB 100%這里的data是分區(qū)名稱在GPT里會(huì)很明確地顯示出來(lái)。ext4只是寫入分區(qū)表的文件系統(tǒng)類型標(biāo)記并不會(huì)真的格式化。如果你明確要用xfs可以寫xfs也可以只寫ext4再手動(dòng)格式化不影響最終結(jié)果。創(chuàng)建完成后讓內(nèi)核重新讀取分區(qū)表partprobe /dev/sdb有時(shí)候partprobe不會(huì)立即生效可以補(bǔ)一條udevadm settle最后格式化和掛載mkfs.ext4 /dev/sdb1 mkdir -p /data mount /dev/sdb1 /data如果想要開機(jī)自動(dòng)掛載還要在/etc/fstab里寫入U(xiǎn)UID而不是設(shè)備名。因?yàn)樵O(shè)備名在重啟后可能會(huì)變化而UUID是唯一且穩(wěn)定的。查看UUIDblkid /dev/sdb13.3 非交互模式腳本化批量分區(qū)的固定套路parted的-s參數(shù)是它最大的賣點(diǎn)。這個(gè)參數(shù)全稱是--script執(zhí)行過(guò)程中不會(huì)等待任何交互輸入出現(xiàn)錯(cuò)誤直接返回非零退出碼。你可以放心地把parted -s寫進(jìn)Shell腳本循環(huán)里。下面是我經(jīng)常用來(lái)批量初始化多塊數(shù)據(jù)盤的腳本范式#!/bin/bash set -e for disk in /dev/sdb /dev/sdc /dev/sdd; do echo Processing $disk parted -s $disk mklabel gpt parted -s $disk mkpart data ext4 1MiB 100% sleep 2 partprobe $disk mkfs.ext4 -F ${disk}1 done這里幾個(gè)細(xì)節(jié)值得說(shuō)明。set -e讓腳本在任意一條parted命令失敗時(shí)直接退出避免后續(xù)操作在錯(cuò)誤狀態(tài)下繼續(xù)執(zhí)行。sleep 2是給內(nèi)核一點(diǎn)時(shí)間來(lái)創(chuàng)建對(duì)應(yīng)的分區(qū)設(shè)備節(jié)點(diǎn)部分虛擬化環(huán)境下分區(qū)設(shè)備節(jié)點(diǎn)創(chuàng)建有延遲直接mkfs可能報(bào)“找不到設(shè)備”。mkfs.ext4 -F是強(qiáng)制格式化因?yàn)榇疟P上可能殘留舊的元數(shù)據(jù)。如果你不確定設(shè)備名可以用/dev/disk/by-id/下面的路徑來(lái)操作這樣不依賴/dev/sdX的枚舉順序。例如parted -s /dev/disk/by-id/wwn-0x5000c500a1b2c3d4 mklabel gpt然后用lsblk找到對(duì)應(yīng)的分區(qū)設(shè)備節(jié)點(diǎn)進(jìn)行格式化。在腳本里解析parted輸出時(shí)可以加上unit MiB讓輸出更統(tǒng)一。比如要檢查分區(qū)表類型可以這樣parted -s /dev/sdb print | grep -i Partition Table它會(huì)返回gpt或msdos非常便于腳本判斷。3.4 在線擴(kuò)容的完整流程從resizepart到resize2fs生產(chǎn)環(huán)境里經(jīng)常遇到虛擬機(jī)磁盤擴(kuò)容。比如虛擬機(jī)原來(lái)分配了50GB后來(lái)空間不夠在虛擬化層把磁盤擴(kuò)大到了100GB但操作系統(tǒng)里的分區(qū)表還停留在50GB。這時(shí)候parted就是解決這個(gè)問(wèn)題的核心工具。先確認(rèn)新的磁盤容量已經(jīng)被系統(tǒng)識(shí)別parted -s /dev/sdb unit MiB print如果顯示的還是舊容量可能需要先在虛擬化層掃描設(shè)備或者重啟虛擬機(jī)。接下來(lái)修改分區(qū)結(jié)束位置parted /dev/sdb resizepart 1 100%這條命令會(huì)把第1個(gè)分區(qū)的結(jié)束位置擴(kuò)展到磁盤末尾。注意這里我沒(méi)有加-s因?yàn)閜arted在修改已存在分區(qū)時(shí)通常需要確認(rèn)交互模式下看得更清楚。部分版本也支持直接用-s但交互輸入一次確認(rèn)會(huì)更穩(wěn)妥。執(zhí)行后讓內(nèi)核重新讀取分區(qū)表partprobe /dev/sdb到這里只是改了分區(qū)表分區(qū)里的文件系統(tǒng)大小還停留在原來(lái)的50GB。接下來(lái)要根據(jù)文件系統(tǒng)類型選擇擴(kuò)展命令。ext4文件系統(tǒng)使用resize2fsresize2fs /dev/sdb1xfs文件系統(tǒng)使用xfs_growfs注意它的參數(shù)是掛載點(diǎn)不是設(shè)備節(jié)點(diǎn)xfs_growfs /data這里還要提醒一點(diǎn)如果分區(qū)處于掛載狀態(tài)resizepart雖然可以操作分區(qū)表但內(nèi)核可能遲遲不接受新分區(qū)信息。穩(wěn)妥起見擴(kuò)容操作最好安排在業(yè)務(wù)低峰期必要時(shí)先卸載分區(qū)再操作。對(duì)根分區(qū)擴(kuò)容尤其要小心卸載是不現(xiàn)實(shí)的一旦內(nèi)核重讀分區(qū)表失敗只能重啟。parted有個(gè)歷來(lái)的坑resize命令和resizepart命令不是一回事。resize是老版parted里嘗試調(diào)整分區(qū)和文件系統(tǒng)的命令但對(duì)文件系統(tǒng)有嚴(yán)格限制resizepart是新版本推薦的底層做法它只修改分區(qū)表邊界不碰文件系統(tǒng)。所以我們的標(biāo)準(zhǔn)操作永遠(yuǎn)是先resizepart改分區(qū)表再用resize2fs或xfs_growfs擴(kuò)展文件系統(tǒng)。順序反了會(huì)出問(wèn)題。4. 生產(chǎn)環(huán)境避坑指南常見報(bào)錯(cuò)與排查方法4.1 分區(qū)表被占用設(shè)備正忙到底怎么解決這是parted操作里出現(xiàn)頻率最高的一類報(bào)錯(cuò)典型輸出是Error: Partition(s) on /dev/sdb are being used.含義是內(nèi)核還在使用目標(biāo)分區(qū)。造成的原因大概率是分區(qū)已掛載也可能被LVM卷組或swap分區(qū)占用。需要逐一排查。用df -h查看掛載情況用lsblk看分區(qū)是否被某個(gè)邏輯卷使用用swapon --show看swap分區(qū)。找到占用后執(zhí)行對(duì)應(yīng)的釋放操作umount /dev/sdb1 swapoff /dev/sdb1 vgchange -an 卷組名有時(shí)候你用df看不到任何信息但parted仍然報(bào)錯(cuò)這時(shí)候可以排查是不是有進(jìn)程在訪問(wèn)分區(qū)fuser -v /dev/sdb如果有進(jìn)程占用需要先停掉對(duì)應(yīng)服務(wù)。實(shí)在找不到占用方但又確認(rèn)分區(qū)沒(méi)有業(yè)務(wù)使用時(shí)可以嘗試sync然后重新執(zhí)行parted操作。如果仍然不行可能就需要停機(jī)重啟讓內(nèi)核完全釋放對(duì)磁盤的引用。4.2 GPT備份表?yè)p壞的修復(fù)方法GPT分區(qū)表在磁盤頭和尾各有一份。尾部備份表?yè)p壞并不影響系統(tǒng)正常識(shí)別分區(qū)但parted會(huì)給出警告提示W(wǎng)arning: The backup GPT table is corrupt, but the primary appears OK.處理方式很簡(jiǎn)單。進(jìn)入parted交互模式parted /dev/sdb執(zhí)行printparted會(huì)詢問(wèn)你是否修復(fù)。選擇Fix即可。它會(huì)用主分區(qū)表重新生成損壞的備份表。如果parted的交互修復(fù)沒(méi)生效或者想更深入地重建可以交給gdisk。在gdisk里執(zhí)行w寫入它會(huì)同時(shí)重建主分區(qū)表和備份分區(qū)表。gdisk是專門處理GPT的工具在分區(qū)表?yè)p壞修復(fù)方面比parted更專業(yè)。這里要區(qū)分情況如果備份表?yè)p壞問(wèn)題不大可以修復(fù)。如果主分區(qū)表也損壞那就意味著分區(qū)信息可能丟失了一部分得結(jié)合之前的print記錄和實(shí)際數(shù)據(jù)來(lái)判斷不能盲目Fix。4.3 分區(qū)重疊和空間不足的判斷創(chuàng)建分區(qū)時(shí)如果指定了錯(cuò)誤的范圍可能遇到兩類報(bào)錯(cuò)。第一類是Error: Cant have overlapping partitions.說(shuō)明你想要的分區(qū)結(jié)束位置已經(jīng)超出了上一個(gè)分區(qū)的邊界分區(qū)之間互相重疊。處理方法是先用print查看現(xiàn)有分區(qū)的完整范圍然后重新規(guī)劃新分區(qū)的start和end。第二類是Error: Unable to satisfy all constraints on the partition.這種情況通常是指定的結(jié)束位置超過(guò)了磁盤實(shí)際容量或者起始位置沒(méi)有對(duì)齊導(dǎo)致parted無(wú)法滿足條件??梢韵扔胾nit MiB print查看磁盤總大小再重新確認(rèn)start和end。還有一種隱蔽情況磁盤末尾剩余空間很小你按百分比創(chuàng)建分區(qū)時(shí)parted需要留出GPT備份表所需的空間所以實(shí)際可創(chuàng)建的分區(qū)不會(huì)占滿整個(gè)磁盤。如果看到“剩余空間不足”之類的報(bào)錯(cuò)試試把end稍微調(diào)小一點(diǎn)。4.4 腳本自動(dòng)化中的幾個(gè)經(jīng)典翻車案例這里把我在實(shí)際腳本中踩過(guò)的坑集中整理一下。第一個(gè)坑mkpart參數(shù)位置寫錯(cuò)。parted的mkpart命令有幾種合法寫法。在GPT下建議不要寫primary這個(gè)冗余參數(shù)直接寫名稱、文件系統(tǒng)類型、起始、結(jié)束parted -s /dev/sdb mkpart data ext4 1MiB 100%如果你寫成了parted -s /dev/sdb mkpart primary ext4 1MiB 100%也能跑因?yàn)閜arted把primary當(dāng)作part-type把ext4當(dāng)作名稱結(jié)果分區(qū)名稱會(huì)變成ext4而不是data。雖然不影響掛載但后期排查時(shí)分區(qū)名稱混亂會(huì)讓人困惑。第二個(gè)坑格式化前內(nèi)核沒(méi)有識(shí)別新分區(qū)。腳本里創(chuàng)建完分區(qū)后立即執(zhí)行mkfs偶爾會(huì)報(bào)/dev/sdb1: No such file or directory。解決方式是在中間加partprobe和sleep 2讓內(nèi)核和udev有時(shí)間刷新設(shè)備節(jié)點(diǎn)。第三個(gè)坑重復(fù)執(zhí)行腳本導(dǎo)致分區(qū)重疊。如果磁盤上已經(jīng)有分區(qū)再執(zhí)行一次mkpart data ext4 1MiB 100%parted會(huì)拒絕并提示空間不足或分區(qū)沖突。因此腳本里最好先判斷磁盤當(dāng)前是否有分區(qū)或者統(tǒng)一先mklabel gpt再創(chuàng)建。第四個(gè)坑對(duì)已有數(shù)據(jù)磁盤執(zhí)行mklabel。我在前面強(qiáng)調(diào)過(guò)mklabel會(huì)重建整個(gè)分區(qū)表等于把原有分區(qū)記錄全部清空。有些人在生產(chǎn)環(huán)境手快敲了這條命令結(jié)果數(shù)據(jù)找不回來(lái)了。執(zhí)行mklabel之前一定要確認(rèn)這塊盤不需要保留數(shù)據(jù)或者已經(jīng)完整備份。第五個(gè)坑使用/dev/sdX設(shè)備名時(shí)重啟后盤符漂移。如果腳本里硬編碼了/dev/sdb在一臺(tái)物理機(jī)上可能某次重啟后變成/dev/sdc。一個(gè)穩(wěn)妥的替代方案是使用/dev/disk/by-id/下的設(shè)備鏈接或者通過(guò)lsblk的序列號(hào)信息動(dòng)態(tài)匹配目標(biāo)磁盤。下面是parted常用命令速查表方便參考。命令作用parted -s /dev/sdb print查看分區(qū)表parted -s /dev/sdb mklabel gpt創(chuàng)建GPT分區(qū)表parted -s /dev/sdb mklabel msdos創(chuàng)建MBR分區(qū)表parted -s /dev/sdb mkpart data ext4 1MiB 100%創(chuàng)建分區(qū)parted -s /dev/sdb rm 1刪除第1個(gè)分區(qū)parted /dev/sdb resizepart 1 100%調(diào)整第1個(gè)分區(qū)結(jié)束位置parted -s /dev/sdb set 1 lvm on設(shè)置分區(qū)標(biāo)志parted -s /dev/sdb unit MiB print以MiB為單位查看分區(qū)表5. 這些年我總結(jié)的幾個(gè)實(shí)操習(xí)慣parted用久了我在生產(chǎn)環(huán)境里逐漸養(yǎng)成了幾個(gè)固定習(xí)慣。未必寫在官方文檔里但確實(shí)幫我躲過(guò)不少麻煩。第一個(gè)習(xí)慣是執(zhí)行任何寫操作前先跑一次不帶參數(shù)的parted print。哪怕只是把結(jié)果掃一眼讓“設(shè)備名”“磁盤容量”“當(dāng)前分區(qū)表類型”這三個(gè)信息在腦子里過(guò)一遍再?zèng)Q定后面敲什么命令。很多誤操作都是因?yàn)槟X子里的認(rèn)知和實(shí)際磁盤狀態(tài)不一致造成的。第二個(gè)習(xí)慣是每次只做一步做完就print確認(rèn)。比如新盤初始化我先執(zhí)行mklabel gpt然后print看分區(qū)表類型對(duì)不對(duì)再執(zhí)行mkpart再print看分區(qū)范圍對(duì)不對(duì)。看起來(lái)多敲了幾行命令但比一次性寫一條長(zhǎng)命令然后再驗(yàn)證要安全得多。parted是直接寫盤的工具腳本可以背鍋但數(shù)據(jù)恢復(fù)沒(méi)有后悔藥。第三個(gè)習(xí)慣是擴(kuò)容時(shí)永遠(yuǎn)先確認(rèn)文件系統(tǒng)類型再選擴(kuò)展命令。ext4是resize2fsxfs是xfs_growfs兩者不能混用。我見過(guò)同事對(duì)著xfs分區(qū)執(zhí)行resize2fs直接報(bào)錯(cuò)還不肯換命令最后花了更多時(shí)間排查。第四個(gè)習(xí)慣是在腳本里把parted命令和mkfs命令嚴(yán)格分開。parted只負(fù)責(zé)分區(qū)表mkfs才負(fù)責(zé)文件系統(tǒng)。依賴parted去“順便”格式化是誤解了它的職責(zé)邊界。只要這個(gè)邊界清晰腳本寫起來(lái)邏輯就非常干凈。parted分區(qū)工具本身就是個(gè)直接、高效、有點(diǎn)“危險(xiǎn)”的工具正因?yàn)樗僮骱?jiǎn)單我們更要在動(dòng)手前多一分謹(jǐn)慎。如果你剛接觸它建議先找一塊空白磁盤或者測(cè)試用的數(shù)據(jù)盤完整跑一遍流程感受一下不同參數(shù)對(duì)分區(qū)表的影響。等真正進(jìn)入生產(chǎn)環(huán)境這些經(jīng)驗(yàn)就會(huì)變成你的操作直覺(jué)。