代磁盤分區(qū)工具的核心原理與實(shí)戰(zhàn)指南)
1. 從fdisk到parted為什么我們需要更現(xiàn)代的磁盤分區(qū)工具如果你在Linux服務(wù)器上折騰過磁盤尤其是處理過超過2TB的大容量硬盤那你大概率對fdisk這個(gè)老牌工具又愛又恨。愛它的簡單直接恨它在面對現(xiàn)代存儲(chǔ)需求時(shí)的力不從心。我第一次在數(shù)據(jù)中心給一臺(tái)新服務(wù)器配置4塊8TB的硬盤做RAID時(shí)就栽在了fdisk上——它壓根不支持創(chuàng)建大于2TB的分區(qū)。那一刻我意識(shí)到是時(shí)候讓工具箱里的parted命令站到C位了。parted是一個(gè)功能強(qiáng)大的磁盤分區(qū)和分區(qū)調(diào)整工具它生來就是為了解決fdisk的局限性。它原生支持GPTGUID分區(qū)表分區(qū)方案輕松應(yīng)對數(shù)TB乃至數(shù)ZB的磁盤容量同時(shí)還提供了交互式和命令行兩種操作模式以及更直觀的“對齊”等高級(jí)功能。無論是為全新的CentOS/Ubuntu系統(tǒng)規(guī)劃復(fù)雜的磁盤布局還是在線調(diào)整一個(gè)正在運(yùn)行的生產(chǎn)數(shù)據(jù)庫的分區(qū)大小parted都是更可靠的選擇。這篇文章我就以一個(gè)老運(yùn)維的身份帶你徹底吃透parted從核心概念到實(shí)戰(zhàn)操作再到那些手冊里不會(huì)寫的避坑技巧讓你下次面對磁盤時(shí)心里更有底。2. parted核心概念與設(shè)計(jì)思路解析2.1 分區(qū)表類型MBR與GPT的本質(zhì)區(qū)別要玩轉(zhuǎn)parted必須先理解它背后的“戰(zhàn)場”——分區(qū)表。這就像一本書的目錄告訴系統(tǒng)數(shù)據(jù)存放在磁盤的哪個(gè)位置。傳統(tǒng)工具fdisk主要服務(wù)于MBR分區(qū)表而parted則是為GPT分區(qū)表而生的現(xiàn)代工具。MBR即主引導(dǎo)記錄是一個(gè)存在了數(shù)十年的標(biāo)準(zhǔn)。它把分區(qū)信息保存在磁盤最開始的512字節(jié)里。這直接導(dǎo)致了它的幾個(gè)致命傷首先它只能記錄4個(gè)主分區(qū)想更多就得用擴(kuò)展分區(qū)和邏輯分區(qū)非常繞其次每個(gè)分區(qū)的起始和結(jié)束位置用32位表示這限制了單個(gè)分區(qū)最大只能到2TB最后MBR沒有備份一旦這512字節(jié)損壞整個(gè)磁盤的分區(qū)信息就可能丟失。GPT全局唯一標(biāo)識(shí)分區(qū)表是UEFI標(biāo)準(zhǔn)的一部分旨在徹底取代MBR。它的設(shè)計(jì)就現(xiàn)代多了分區(qū)表本身在磁盤頭部和尾部分別存有一份互為備份安全性大增它使用64位地址理論支持的分區(qū)大小上限是9.4ZB這是個(gè)天文數(shù)字并且它不再有4個(gè)主分區(qū)的限制通常支持128個(gè)分區(qū)以上?,F(xiàn)在新買的服務(wù)器和電腦只要不是特別老的系統(tǒng)默認(rèn)都使用GPT分區(qū)表。parted從設(shè)計(jì)之初就完美支持GPT這是它相比fdisk的根本優(yōu)勢。2.2 parted的核心設(shè)計(jì)哲學(xué)面向大容量與腳本化理解了GPT就能明白parted的設(shè)計(jì)思路。它不僅僅是一個(gè)分區(qū)創(chuàng)建工具更是一個(gè)磁盤布局管理器。其核心設(shè)計(jì)圍繞兩點(diǎn)展開第一是對大容量磁盤的原生友好。parted操作磁盤時(shí)默認(rèn)單位是更符合現(xiàn)代存儲(chǔ)的MiB、GiB、TiB注意這是1024進(jìn)制單位區(qū)別于廠商常用的1000進(jìn)制的MB、GB。你可以直接用mkpart primary 1MiB 100GiB這樣的命令創(chuàng)建一個(gè)精確大小的分區(qū)而不用像在fdisk里那樣去計(jì)算令人頭疼的柱面號(hào)。第二是強(qiáng)大的非交互與腳本化能力。parted支持在一條命令中完成所有操作例如parted /dev/sdb mklabel gpt mkpart primary ext4 1MiB 100%。這個(gè)特性在自動(dòng)化部署如使用Ansible、Puppet時(shí)極其有用。你可以將整個(gè)磁盤分區(qū)方案寫成一個(gè)腳本在成百上千臺(tái)服務(wù)器上快速、一致地執(zhí)行這是fdisk的交互模式難以實(shí)現(xiàn)的。2.3 與fdisk的工具選型決策那么什么時(shí)候該用parted什么時(shí)候fdisk還能湊合我的經(jīng)驗(yàn)法則是必須使用parted的場景磁盤容量大于2TB需要使用GPT分區(qū)表計(jì)劃在腳本或自動(dòng)化工具中調(diào)用分區(qū)操作。fdisk仍可一用的場景處理小容量U盤或舊硬盤小于2TB且為MBR分區(qū)進(jìn)行非常簡單的、一次性的分區(qū)操作且你對fdisk的交互界面更熟悉。不過我強(qiáng)烈建議即使在小容量磁盤上也優(yōu)先嘗試使用parted來熟悉其工作流。一旦掌握你會(huì)發(fā)現(xiàn)它在邏輯清晰度和操作效率上更勝一籌。3. parted命令詳解與實(shí)操要點(diǎn)3.1 基礎(chǔ)命令結(jié)構(gòu)與常用參數(shù)parted命令的基本語法是parted [選項(xiàng)] [設(shè)備 [命令 [參數(shù)...]]]。最常用的有兩種模式交互模式直接輸入parted /dev/sdX會(huì)進(jìn)入一個(gè)(parted)提示符的環(huán)境可以連續(xù)輸入多條命令。命令行模式直接在Shell中執(zhí)行一條完整的parted命令如parted /dev/sdb mklabel gpt。幾個(gè)你必須熟記于心的核心命令mklabel創(chuàng)建新的磁盤標(biāo)簽即分區(qū)表類型如gpt,msdos即MBR。mkpart創(chuàng)建新分區(qū)。需要指定分區(qū)類型primary/logical、文件系統(tǒng)類型僅作提示不格式化、起始點(diǎn)和結(jié)束點(diǎn)。rm刪除分區(qū)只需指定分區(qū)號(hào)。print打印分區(qū)表信息。print all可以查看所有磁盤信息。resizepart調(diào)整分區(qū)大小注意調(diào)整前需確保分區(qū)未掛載且文件系統(tǒng)本身支持并已完成調(diào)整。unit設(shè)置輸入輸出的顯示單位如unit MiB,unit GB。注意parted的很多命令是即時(shí)生效的它不像fdisk那樣有一個(gè)“寫入”命令。在parted中mkpart或rm命令一旦執(zhí)行分區(qū)表會(huì)立刻被修改。操作前務(wù)必雙倍確認(rèn)設(shè)備名/dev/sdb還是/dev/sdc。3.2 實(shí)戰(zhàn)演練為Ubuntu系統(tǒng)創(chuàng)建GPT分區(qū)假設(shè)我們有一塊全新的4TB硬盤/dev/sdb需要為Ubuntu系統(tǒng)創(chuàng)建三個(gè)分區(qū)1GB的EFI系統(tǒng)分區(qū)、100GB的根分區(qū)、以及剩余所有空間的家目錄分區(qū)。# 1. 啟動(dòng)parted指定設(shè)備 sudo parted /dev/sdb # 2. 創(chuàng)建GPT分區(qū)表 (parted) mklabel gpt # 3. 創(chuàng)建EFI系統(tǒng)分區(qū)通常需要FAT32文件系統(tǒng)且要有boot和esp標(biāo)志 (parted) mkpart primary fat32 1MiB 1025MiB (parted) set 1 boot on (parted) set 1 esp on # 4. 創(chuàng)建根分區(qū)ext4文件系統(tǒng) (parted) mkpart primary ext4 1025MiB 101025MiB # 大約100GB # 5. 創(chuàng)建家目錄分區(qū)占用剩余所有空間 (parted) mkpart primary ext4 101025MiB 100% # 6. 查看分區(qū)結(jié)果 (parted) print Model: ATA ST4000DM004-2CV1 (scsi) Disk /dev/sdb: 4001GB Sector size (logical/physical): 512B/4096B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 1075MB 1074MB fat32 primary boot, esp 2 1075MB 106GB 105GB ext4 primary 3 106GB 4001GB 3895GB ext4 primary # 7. 退出parted (parted) quit退出parted后我們還需要使用mkfs系列命令為這些分區(qū)實(shí)際創(chuàng)建文件系統(tǒng)sudo mkfs.vfat -F 32 /dev/sdb1 # 格式化EFI分區(qū)為FAT32 sudo mkfs.ext4 /dev/sdb2 # 格式化根分區(qū)為ext4 sudo mkfs.ext4 /dev/sdb3 # 格式化家目錄分區(qū)為ext43.3 分區(qū)對齊一個(gè)影響性能的關(guān)鍵細(xì)節(jié)在機(jī)械硬盤時(shí)代我們常聽說要對齊“柱面”。在固態(tài)硬盤和現(xiàn)代高級(jí)格式硬盤Advanced Format扇區(qū)常為4KB時(shí)代分區(qū)對齊同樣至關(guān)重要且parted讓它變得很簡單。未對齊的分區(qū)會(huì)導(dǎo)致讀寫操作跨越物理扇區(qū)邊界引發(fā)額外的讀寫開銷顯著降低IO性能尤其是對于SSD。parted從某個(gè)版本開始默認(rèn)會(huì)將分區(qū)的起始位置對齊到1MiB的邊界即2048個(gè)512B扇區(qū)這完美對齊了絕大多數(shù)現(xiàn)代存儲(chǔ)設(shè)備的物理扇區(qū)大小4KB和操作系統(tǒng)內(nèi)存頁大小。在上面的例子中你看到分區(qū)的Start值都是1049kB約1MiB的倍數(shù)這就是自動(dòng)對齊的結(jié)果。實(shí)操心得除非有極其特殊的舊系統(tǒng)兼容性需求否則永遠(yuǎn)信任并利用parted的默認(rèn)對齊。在mkpart時(shí)起始位置使用1MiB、2MiB這樣的值或者直接使用百分比時(shí)parted通常會(huì)幫你處理對齊。你可以用(parted) align-check optimal 分區(qū)號(hào)命令來檢查某個(gè)分區(qū)的對齊是否是最優(yōu)的。4. 高級(jí)操作與生產(chǎn)環(huán)境應(yīng)用4.1 非交互式腳本化分區(qū)自動(dòng)化是運(yùn)維的核心價(jià)值。下面是一個(gè)在Shell腳本中使用parted自動(dòng)初始化一塊磁盤的例子#!/bin/bash DISK/dev/sdc # 確保磁盤未被掛載 umount ${DISK}* 2/dev/null # 創(chuàng)建GPT標(biāo)簽 parted -s $DISK mklabel gpt # 創(chuàng)建單個(gè)占用全部空間的分區(qū) parted -s $DISK mkpart primary ext4 1MiB 100% # 格式化分區(qū) mkfs.ext4 -F ${DISK}1 # 創(chuàng)建掛載點(diǎn)并掛載 mkdir -p /data mount ${DISK}1 /data # 寫入fstab實(shí)現(xiàn)開機(jī)自動(dòng)掛載 echo ${DISK}1 /data ext4 defaults 0 0 /etc/fstab這個(gè)腳本使用了-s或--script選項(xiàng)讓parted進(jìn)入腳本模式不顯示任何提示信息非常適合嵌入到自動(dòng)化流程中。4.2 調(diào)整現(xiàn)有分區(qū)大小調(diào)整分區(qū)大小是高風(fēng)險(xiǎn)操作務(wù)必先備份數(shù)據(jù)這里演示如何將/dev/sdb3家目錄分區(qū)縮小100GB并將這100GB用于擴(kuò)展/dev/sdb2根分區(qū)。這通常需要先從/dev/sdb3中“挖”出一塊空閑空間。前提條件目標(biāo)分區(qū)/dev/sdb3必須未掛載。文件系統(tǒng)本身必須支持縮小如ext4/xfs通常支持在線縮小但操作前最好卸載。resize2fs或xfs_growfs等工具用于實(shí)際調(diào)整文件系統(tǒng)大小parted只調(diào)整分區(qū)表信息。操作順序永遠(yuǎn)是先縮小文件系統(tǒng) - 再縮小分區(qū)。# 1. 卸載分區(qū) sudo umount /dev/sdb3 # 2. 檢查文件系統(tǒng)ext4為例 sudo e2fsck -f /dev/sdb3 # 3. 縮小文件系統(tǒng)。假設(shè)當(dāng)前是3895GB要縮小100GB到3795GB。 # 注意resize2fs參數(shù)是目標(biāo)文件系統(tǒng)大小不是減少的量。 sudo resize2fs /dev/sdb3 3795G # 4. 使用parted縮小分區(qū)。需要計(jì)算新的結(jié)束點(diǎn)。 # 假設(shè)原分區(qū)從106GB開始大小3795GB那么新結(jié)束點(diǎn) 106GB 3795GB 3901GB sudo parted /dev/sdb (parted) resizepart 3 3901GB (parted) print # 確認(rèn)3號(hào)分區(qū)已縮小 # 5. 現(xiàn)在在3號(hào)分區(qū)之后有了一段空閑空間。我們需要先刪除2號(hào)分區(qū)再以更大的結(jié)束點(diǎn)重建它嗎 # 不對于相鄰分區(qū)更安全的做法是使用專業(yè)工具如gparted圖形界面或fdisk的刪除重建。 # 因?yàn)閜arted的resizepart不能直接擴(kuò)展一個(gè)被后續(xù)分區(qū)擋住的分區(qū)。 # 一個(gè)相對安全的命令行方案是 # a. 備份/dev/sdb2的數(shù)據(jù)。 # b. 刪除/dev/sdb2分區(qū) (parted) rm 2 # c. 重新創(chuàng)建更大的/dev/sdb2分區(qū)起始點(diǎn)不變結(jié)束點(diǎn)設(shè)為3901GB即原3號(hào)分區(qū)的新起點(diǎn)。 # d. 恢復(fù)數(shù)據(jù)并重新創(chuàng)建文件系統(tǒng)或使用resize2fs擴(kuò)展如果文件系統(tǒng)還在。重要警告在線調(diào)整分區(qū)特別是涉及多個(gè)分區(qū)的位置變動(dòng)是極其危險(xiǎn)的操作。在生產(chǎn)環(huán)境中如果條件允許我更傾向于備份數(shù)據(jù)、重新分區(qū)、恢復(fù)數(shù)據(jù)。如果必須在線操作強(qiáng)烈建議先在虛擬機(jī)上完整演練整個(gè)流程。4.3 處理“磁盤分區(qū)顯示狀態(tài)良好恢復(fù)分區(qū)”的疑難雜癥網(wǎng)絡(luò)熱詞中提到了“磁盤分區(qū)顯示狀態(tài)良好恢復(fù)分區(qū)”這通常指在Windows的“磁盤管理”中看到某個(gè)分區(qū)顯示為“狀態(tài)良好恢復(fù)分區(qū)”或“狀態(tài)良好EFI系統(tǒng)分區(qū)”等。在Linux的parted視角下這些分區(qū)只是帶有特定標(biāo)志的普通GPT分區(qū)。例如Windows的“恢復(fù)分區(qū)”通常是一個(gè)類型為“Microsoft recovery”的GPT分區(qū)。在parted中你可以用print看到所有分區(qū)的類型GUID。如果你想在Linux下處理或刪除一個(gè)Windows恢復(fù)分區(qū)請謹(jǐn)慎這可能影響系統(tǒng)恢復(fù)功能可以用parted /dev/sdX print找到對應(yīng)分區(qū)的Number。使用parted /dev/sdX rm [分區(qū)號(hào)]刪除它。對于“EFI系統(tǒng)分區(qū)”就是我們在3.2節(jié)創(chuàng)建的那個(gè)帶有boot和esp標(biāo)志的分區(qū)。parted的set命令可以管理這些標(biāo)志。5. 常見問題排查與操作實(shí)錄5.1 典型錯(cuò)誤與解決方案速查表問題現(xiàn)象可能原因解決方案Error: The location ... is outside of the device /dev/sdX指定的分區(qū)起始或結(jié)束位置超出了磁盤的實(shí)際大小。使用parted /dev/sdX print確認(rèn)磁盤總?cè)萘看_保分區(qū)范圍在0B到[磁盤大小]之間。通常結(jié)束點(diǎn)用100%最安全。Warning: The resulting partition is not properly aligned for best performance.分區(qū)起始位置未對齊。在mkpart時(shí)起始位置使用1MiB的倍數(shù)。使用align-check optimal [分區(qū)號(hào)]驗(yàn)證。Error: Partition(s) on /dev/sdX are being used.嘗試修改的分區(qū)正在被系統(tǒng)使用已掛載。必須先用umount命令卸載該分區(qū)。對于系統(tǒng)盤的關(guān)鍵分區(qū)如/或/boot需要從Live CD/USB環(huán)境啟動(dòng)進(jìn)行操作。parted命令執(zhí)行后系統(tǒng)不識(shí)別新分區(qū)分區(qū)表變更未被內(nèi)核重新讀取。運(yùn)行partprobe /dev/sdX命令通知內(nèi)核重新讀取分區(qū)表?;蛘咦詈唵蔚姆椒ㄊ侵貑⑾到y(tǒng)。刪除分區(qū)后print仍然顯示舊分區(qū)可能是緩存或者分區(qū)表未成功寫入。嘗試退出parted再重新進(jìn)入。如果問題依舊檢查磁盤是否只讀hdparm -r /dev/sdX或者嘗試使用wipefs命令清理分區(qū)簽名。無法對磁盤執(zhí)行任何操作磁盤可能被系統(tǒng)鎖定或存在活躍的進(jìn)程。檢查是否有l(wèi)vm、mdadmRAID或文件系統(tǒng)進(jìn)程占用。使用lsblk、fuser -m /dev/sdX1或lsof /dev/sdX1查找并終止相關(guān)進(jìn)程。5.2 數(shù)據(jù)安全操作黃金法則在我多年的運(yùn)維生涯中用血淚教訓(xùn)總結(jié)了幾條關(guān)于磁盤操作的鐵律三重確認(rèn)設(shè)備名在按下回車鍵前問自己三遍“我當(dāng)前操作的是/dev/sdb還是/dev/sdc”尤其是在擁有多塊硬盤的服務(wù)器上。一個(gè)有用的技巧是使用lsblk -f或blkid命令根據(jù)分區(qū)大小、標(biāo)簽或UUID來輔助確認(rèn)。備份先行任何非創(chuàng)建新分區(qū)的操作刪除、調(diào)整大小都必須先確保數(shù)據(jù)已備份。沒有備份的操作等于賭博。使用-s選項(xiàng)的風(fēng)險(xiǎn)在腳本中使用parted -s非常方便但也意味著它不會(huì)給出任何確認(rèn)提示。在將腳本投入生產(chǎn)環(huán)境前務(wù)必在測試環(huán)境用相同磁盤布局進(jìn)行驗(yàn)證。理解操作順序調(diào)整分區(qū)大小的正確順序是備份 - 卸載 - 檢查文件系統(tǒng) - 調(diào)整文件系統(tǒng) - 調(diào)整分區(qū)。擴(kuò)大分區(qū)則順序相反調(diào)整分區(qū) - 調(diào)整文件系統(tǒng)。Live環(huán)境是救星對于操作系統(tǒng)所在磁盤的分區(qū)操作永遠(yuǎn)在Live CD/USB如Ubuntu安裝盤環(huán)境下進(jìn)行。這能確保所有系統(tǒng)分區(qū)都處于未掛載狀態(tài)。5.3 性能調(diào)優(yōu)相關(guān)技巧除了分區(qū)對齊parted結(jié)合其他工具還能做一些性能調(diào)優(yōu)為SSD優(yōu)化對于固態(tài)硬盤在分區(qū)時(shí)可以考慮留出一部分空間不分區(qū)OP預(yù)留空間這有助于提升垃圾回收效率和延長壽命。例如一塊512GB的SSD你可以只分區(qū)到480GB。文件系統(tǒng)選擇在mkpart時(shí)指定的文件系統(tǒng)類型如ext4,xfs只是一個(gè)標(biāo)簽真正的格式化由mkfs完成。對于SSDext4啟用discard掛載選項(xiàng)或f2fs是不錯(cuò)的選擇。對于大容量機(jī)械硬盤倉庫盤xfs在處理大文件時(shí)可能有優(yōu)勢。分區(qū)規(guī)劃對于數(shù)據(jù)庫服務(wù)器將日志文件和數(shù)據(jù)文件放在不同的物理磁盤分區(qū)甚至是不同的物理磁盤上可以顯著提升IO性能。parted可以幫助你精確規(guī)劃每塊磁盤的布局。最后記住parted是你的工具不是魔法棒。它強(qiáng)大而危險(xiǎn)。每一次操作前深呼吸核對命令想象一下操作的結(jié)果。當(dāng)你能夠熟練地用它規(guī)劃整個(gè)存儲(chǔ)架構(gòu)時(shí)那種一切盡在掌控的感覺才是運(yùn)維工作最大的樂趣所在。