文、專任講師小州
前言:
全新的硬碟購買回來後,通常硬碟需要使用之前都要先經過磁碟分割的動作,並適當的格式化建立檔案系統才可以正常使用。目前許多外接的硬碟,尤其隨身碟這類都已經在出貨之前預先完成這類流程。在 linux 系統環境安裝了適當的硬碟後,通常也會使用適當的磁碟分割工具先完成所需要的自訂分割環境,最終才格式化成為所需要的檔案系統。所以本篇來談談新式 linux 下的磁碟分割工具。
傳統 fdisk 程式:
傳統大家在 linux 環境下的磁碟分割工具都是使用 fdisk 這個命令,相信許多使用 linux 的管理人員對這個指令都會很熟悉。不過伴隨著目前硬碟製程的進步,單一顆硬碟已經可以高達 2TB 的儲存容量,傳統 MBR 開機磁區內的 Partition Table 的儲存記錄也出現了記錄的定址問題,所以為了解決這個問題就新設計了 GUID Partition Table 磁碟分割表的儲存架構來解決這個問題。不過 linux 環境大家常使用的 fdisk 命令本身並不支援讀取與 建立 GUID 磁碟分割表的格式,所以解決的方式就是使用 GNU 所開發設計的 parted 命令就可以正確支援了。
GNU parted 程式:
parted 程式本身為 GNU 所開發,雖然說 parted 是一個磁碟分割程式,不過正確來說這個程式本身不單純支援傳統的磁碟分割功能,也支援建立磁碟分割後可以順便格式化建立檔案系統。其他部分也支援分割區的大小調整等功能,是一個完整與多功能複合的磁碟分割整合管理工具。
過 parted 命令列方式對許多初學者來說是稍微複雜一點,有一個專案計畫本身為 gparted,本身可以執行於 X 環境下的 parted的圖形介面的程式可以讓操作更簡單達成所需要的目的。詳細可以參考:
http://gparted.sourceforge.net/
GNU parted 程式進入方式:
本篇使用環境為 RHEL6 環境,所以本篇以該版本 為測試的運作所需環境,執行 parted 程式可以傳入要處理的磁碟的裝置名稱,比方 /dev/sda 與 /dev/hda 等名稱,輸入 help 查看使用的命令,最後使用 quit 結束程式。
#parted /dev/sda
.....
quit
GNU parted 命令項目
進入 parted 程式後,執行 help 可以列出所有可用的命令項目。不過這邊使用之前需要先告知的是,parted 程式的新增刪除等等命令都是立即進行的,與傳統 fdisk 命令的設計方式不一樣,所以練習時候務必要小心以免遺失資料。這邊簡單介紹相關命令用法,詳細用法部分也可以使用 help 命令,後面傳入要查看的命令說明。比方 help print 這樣使用方式。
select DEVICE
可以指定目前工作使用的裝置名稱,比方傳入指定 /dev/sda 與 /dev/sdb 等項目。
使用範例:select /dev/sdb
print [devices|free|list,all|NUMBER]
這是列出相關裝置相關資訊,可以給予不同項目列出不同所需要資訊。
使用範例:print devices
unit UNIT
指定顯示與處理的單位方式。後面可以傳入 kB, MB, GB, TB, compact, cyl, chs, %, kiB, MiB, GiB, TiB 等單位表示。
使用範例:unit cyl
rm NUMBER
這是刪除指定的分割區項目,後面傳入要刪除的分割區編號。編號可以使用 print 先查看確認。
使用範例:rm 1
要注意是刪除是邏輯分割區的話,結果後續的編號會往前移動遞補上。比方刪除 11 編號的分割區,原本 12 編號分割區往前為 11
check NUMBER
檢查指定分割區內的檔案系統是否故障。通常需要先 umount 該使用的裝置後才可以進行。
使用範例:check 1
cp [FROM-DEVICE] FROM-NUMBER TO-NUMBER
複製指定硬碟內的某個分割區內檔案系統內所有的資料到另外一個分割區內
使用範例:cp 1 2
resize NUMBER START END
將指定的分割區空間縮小或是增大,包含所組成的檔案系統空間內容。
使用範例:resize 2 100 500
上面表示把編號 2 該分割區檔案系統大小進行調整。比方本來佔用範圍是 100-800 (700MB),調整成為 100-500 (400MB)
set NUMBER FLAG STATE 與 toggle [NUMBER [FLAG]]
設定指定分割區的標籤狀態資訊。FLAG 可以傳入 swap, hidden, raid, lvm, lba 等項目。
使用範例:set 1 boot on (把 1 該分割區設定為 active 旗標)
使用範例:set 2 lvm on (把 2 該分割區設定為 linux lvm 代碼 8e 磁區)
使用範例:set 3 swap on (把 3 該分割區設定為 linux swap 代碼 82 磁區)
move NUMBER START END
調整分割區的位置。
使用範例:move 2 200 500
比方 2 該分割區檔案系統位置本來為 100MB-500MB。上面表示把編號為 2 該分割區檔案系統的位置移動到由 200MB 開始的位置,結束位置為 500MB
mklabel,mktable LABEL-TYPE
建立指定分割表類型。LABEL-TYPE 項目可以傳入 msdos, gpt,... 等等項目
使用範例:mklabel msdos (傳統的 msdos 分割表類型)
使用範例:mklabel gpt (gpt 格式分割表類型)
mkpart PART-TYPE [FS-TYPE] START END
建立分割區項目
PART-TYPE 可以傳入 primary, logical, extended 項目,FS-TYPE 可以傳入 ext4, ext3, ext2, fat32, linux-swap,.. 等等項目
使用範例:mkpart primary 100 300 (建立 primary 分割區,類型預設為 linux native,大小為 100MB 到 300MB 的範圍,共 200MB)
使用範例:mkpart primary linux-swap 300 400(建立 primary 分割區,類型 linux swap,大小為 300MB 到 400MB 的範圍,共 100MB)
使用範例:mkpart primary ext2 400 800 (建立 primary 分割區,類型預設為 linux native,大小為 400MB 到 800MB 的範圍,共 400MB)
mkpartfs PART-TYPE FS-TYPE START END
建立分割區並格式化成為指定格式
PART-TYPE 可以傳入 primary, logical, extended 項目,FS-TYPE 可以傳入 ext4, ext3, ext2, fat32, linux-swap,.. 等等項目
使用範例:mkpartfs primary linux-swap 100 300 (建立 primary 分割區,類型 linux swap,大小為 100MB 到 300MB 的範圍,共 200MB)
使用範例:mkpartfs primary ext2 300 800 (建立 primary 分割區,類型預設為 linux native,大小為 300MB 到 800MB 的範圍,共 500MB)
mkfs NUMBER FS-TYPE
將指定分割區格式化成為指定格式
FS-TYPE 可以傳入 ext4, ext3, ext2, fat32, linux-swap,.. 等等項目
範例:mkfs 1 ext2 (將編號為 1 分割區格式化成為 ext2 檔案系統 )
範例:mkfs 2 linux-swap (將編號為 2 分割區格式化成為 linux swap 格式 )
rescue START END
傳入指定的範圍,搜尋被刪除的分割區項目並救回
使用範例:rescue 100 1000 (在 100M 與 1000M 空間範圍內進行搜尋是否有符合被刪除的分割磁區)
GNU parted 實際測試使用:
目前主機上有兩顆硬碟,分別為 sda 與 sdb。其中 sda 為使用中的硬碟,sdb 為提供測試使用的新硬碟項目。
-----------------------------------------------------------------------------------------------
[root@localhost ~]# parted /dev/sda
GNU Parted 2.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted)
(parted) print devices
/dev/sda (8590MB)
/dev/sdb (42.9GB)
/dev/mapper/system-swap (1074MB)
/dev/mapper/system-root (7407MB)
使用 print devices 可以查看目前系統所有硬碟可用的區塊裝置項目。
-----------------------------------------------------------------------------------------------
(parted) print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 8590MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 1049kB 106MB 105MB primary ext4 boot
2 106MB 8590MB 8484MB primary lvm
(parted)
使用單純的 print 查看目前硬碟資訊,這顆硬碟是使用傳統 msdos 分割表類型,全部大約 8G 多,共兩個分割區。
-----------------------------------------------------------------------------------------------
(parted) unit cyl
(parted) print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 1044cyl
Sector size (logical/physical): 512B/512B
BIOS cylinder,head,sector geometry: 1044,255,63. Each cylinder is 8225kB.
Partition Table: msdos
Number Start End Size Type File system Flags
1 0cyl 12cyl 12cyl primary ext4 boot
2 12cyl 1044cyl 1031cyl primary lvm
使用 unit 命令切換到傳統 cylinder 的模式顯示
-----------------------------------------------------------------------------------------------
(parted) select /dev/sdb
Using /dev/sdb
(parted)
(parted) print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
使用 select 切換工作的硬碟,最後使用 print 查看目前硬碟沒有任何分割區建立
-----------------------------------------------------------------------------------------------
(parted) mklabel gpt
Warning: The existing disk label on /dev/sdb will be destroyed and all data on
this disk will be lost. Do you want to continue? y
(parted) print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
(parted)
使用 mklabel 可以指定硬碟使用不同分割表類型,上面為指定 gpt 格式。若是硬碟超過 2TB 的儲存空間要建立適當分割區,通常需要使用 gpt 格式的分割表。不過需要有 OS 支援才可以正確存取。
-----------------------------------------------------------------------------------------------
(parted) mklabel msdos
Warning: The existing disk label on /dev/sdb will be destroyed and all data on
this disk will be lost. Do you want to continue?
Yes/No? y
(parted) print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size File system Name Flags
(parted)
使用 mklabel 可以指定硬碟使用不同分割表類型,上面為指定傳統的 msdos 分割表格式
-----------------------------------------------------------------------------------------------
(parted) mkpart primary 100 200
(parted) mkpart primary 200 300
(parted) mkpart extended 300 -1
(parted) mkpart logical 300 500
(parted) mkpart logical 501 1000
(parted) print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 99.6MB 200MB 101MB primary
2 200MB 300MB 99.6MB primary
3 300MB 42.9GB 42.6GB extended lba
5 301MB 500MB 199MB logical
6 501MB 1000MB 499MB logical
分別使用 mkpart 建立 3 個主分割區,最後空間分配建立個延伸分割區,最後再建立 2 個邏輯分割區項目。
這邊附註就是,通常建立分割區時候,空的硬碟第一個分割區建立的位置可以指定 1MB 開始的地方即可使用,上面的操作方式浪費前面快 100MB 的空間沒有使用。
-----------------------------------------------------------------------------------------------
(parted) set 1 boot on
(parted) set 5 lvm on
(parted) set 6 raid on
(parted) print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 99.6MB 200MB 101MB primary boot
2 200MB 300MB 99.6MB primary
3 300MB 42.9GB 42.6GB extended lba
5 301MB 500MB 199MB logical lvm
6 501MB 1000MB 499MB logical raid
使用 set 命令,將第 1 個分割區設定 active boot flag,將第 5 個分割區改成 linux lvm 分割區項目,將第 6 個分割區改成 linux raid 分割區項目
(parted) mkfs
WARNING: you are attempting to use parted to operate on (mkfs) a file system.
parted's file system manipulation code is not as robust as what you'll find in
dedicated, file-system-specific packages like e2fsprogs. We recommend
you use parted only to manipulate partition tables, whenever possible.
Support for performing most operations on most types of file systems
will be removed in an upcoming release.
Warning: The existing file system will be destroyed and all data on the partition
will be lost. Do you want to continue?
Yes/No? y
Partition number? 1
File system type? [ext2]?
(parted)
使用 mkfs 將第 1 個分割區程式化成為 ext2fs。若是直接使用 mkfs 1 ext2 會顯示如下訊息:
(parted) mkfs 1 ext2
WARNING: you are attempting to use parted to operate on (mkfs) a file system.
parted's file system manipulation code is not as robust as what you'll find in
dedicated, file-system-specific packages like e2fsprogs. We recommend
you use parted only to manipulate partition tables, whenever possible.
Support for performing most operations on most types of file systems
will be removed in an upcoming release.
Warning: The existing file system will be destroyed and all data on the partition
will be lost. Do you want to continue?
parted: invalid token: 1
Yes/No?
所以改成 mkfs y 1 ext2 就可以正常使用了。不過畫面內來看 parted 不建議使用 mkfs 該命令直接建立檔案系統,使用 e2progfs 套件包內的 mke2fs 等命令建立會比較能夠符合目前更新現況發展。
-----------------------------------------------------------------------------------------------
(parted) rm 1
(parted) rm 2
(parted) rm 3
(parted) print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
(parted)
使用 rm 命令,就可以刪除指定分割區項目,所以目前沒有任何建立的分割區項目
-----------------------------------------------------------------------------------------------
(parted) mkpartfs primary ext2 1 200
(parted) mkpartfs primary linux-swap 200 300
WARNING: you are attempting to use parted to operate on (mkpartfs) a file system.
parted's file system manipulation code is not as robust as what you'll find in
dedicated, file-system-specific packages like e2fsprogs. We recommend
you use parted only to manipulate partition tables, whenever possible.
Support for performing most operations on most types of file systems
will be removed in an upcoming release.
(parted)
(parted) print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 1049kB 200MB 199MB primary ext2
2 200MB 300MB 99.6MB primary linux-swap(v1)
使用 mkpartfs 可以直接建立指定分割區並格式化分割區建立檔案系統。不過 parted 建議還是 -----------------------------------------------------------------------------------------------
(parted) rm 1
(parted) rescue 1 300
Information: A ext2 primary partition was found at 1049kB -> 200MB. Do you want
to add it to the partition table?
Yes/No/Cancel? yes
(parted) print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size File system Name Flags
1 1049kB 200MB 199MB ext2
2 200MB 300MB 99.6MB linux-swap(v1) primary
(parted)
最後就是刪除 1 這個分割區,然後透過 rescue 命令進行搜尋,最後有找到刪除的分割區並加以復原。最後:本篇簡單介紹了 gnu parted 程式用法,大致上提供了一些常見命令的使用方式,希望可以讓大家對 parted 有一些認識與了解。
延伸閱讀
聯成電腦講師專欄:linux 下使用 Exfat 檔案系統格式的儲存裝置

> "要注意是刪除是邏輯分割區的話,結果後續的編號未往前移動遞補上。比方刪除 11 編號的分割區,原本 12 編號分割區往成為 11 " 這句話的 "未往前" 應該是 "會往前"? "往成為" 應該是 "往前為"? > 另外我想問一下, 如果現在已經有一個分割區, [/dev/sda1], 位置是 0GiB~100GiB. 現在想要再分割一個新分割區 [/dev/sda2], 容量 200GiB. 如果用 parted 的 mkpart 功能, 要怎麼設定起始位置剛好 "貼" 在100GiB 位置的後面呢, 然後往後加 200GiB? (因為 fdisk 可以用 + 號) 因為我發現 parted 可以設定重疊的分割區(不符合邏輯), 不知道為什麼.
bambooindark 早安~~手誤部分已更正~謝謝提醒~下列為小州老師針對問題回覆: 1. 一般談傳統硬碟組成就是三個項目來計算可用空間,其中就是 Cylinder/Head/Sector, 把這些數字相乘可以得到全部 Sector 數量,而傳統每個 Sector 是 512Byes 的空間, 所以再乘上 512 就是硬碟全部的可用空間。早期用 DOS 的年代系統能夠存取硬碟會用到所謂 int 13h 的 bios 呼叫中斷功能,這個存取硬碟溝通讀寫就是指定傳入要應對使用哪個 Cylinder/Head/Sector 數值來表示要使用哪個硬碟區域,簡單來說這類硬碟存取溝通定址 一般傳統就稱呼 C.H.S 定址,其中: C: 1024 (0-1023), H: 16 (0-15), S: 63(0-62) 簡單大略算法 1024 * 16 * 63 * 512 = 528482304 = 504MB 上面這樣定址計算最大是 504MB 上下。 後來硬碟越來越大要解決而且要與之前相容,所以有 Extended INT 13H 的呼叫,可以讓 H 到 256 (0-255),一般大約可以定址到 8GB 容量。 簡單大略算法 1024 * 256 * 63 = 8455716864 = 7.875MB 2. 受限於當初制定 int 13h 時候本身能夠指定的 Cylinder/Head/Sector 本身的大小限制, 傳統 C.H.S 存取定址有容量上的定址限制,後來為了解決該問題採用了一個標準叫做 LBA 存取定址模式,全名為 Logical Block Addressing,簡單說以磁區數量為存取溝通單位為主了, LBA 0 表示第一個磁區,LBA 表示第二個磁區以此類推。而最早期以當初 ATA IDE 硬碟來說用 22bit定址,後來陸續有 ATA-1 甚至到 ATA-6 發展時代,所以定址大小到 ATA-6 已經是改用48bit 來定址了,容量數量支援就可以更大,定址空間以 48bit 來說把這個數值分配直接作為 可分配的磁區數量的話那直接就是表示 2^48 磁區數量,若以 512 bytes/sector 來說就大約 可以到 131072 TB。 3. 傳統 linux 分割程式都是使用 fdisk 來劃分,而傳統劃分的基礎是以 cylinder(磁柱) 為單位,雖然底層早就是用 LBA 存取了,所以應對轉換下一般大硬碟來說在分割畫面內大多就是直接會把 Cylinder 數值直接讓他能夠超過 1023 來顯示表示,所以目前在 linux 使用 fdisk 通常查看都會是上萬個 cylinder 的數值顯示。 4. linux 環境分割工具很多,傳統 fdisk 是使用 C.H.S 定址顯示方式來分割,不過其實在比較 晚期的 linux 系統下的 fdisk 工具也預設改用建議改用 Sector 為基礎的顯示與分割動作, 而 GNU parted 是很早使用預設使用 compact 單位操作,可以指定用 cylinder, sector 或是多少空間為基礎來分割劃分,底層會用 LBA 地址的磁區結果應對儲存。parted 可以用 unit 切換預設顯示單位,比方 unit cylinder, unit s, unit compact,而劃分時候 Start/End 可以在輸入數字之後加上單位,比方 100c, 200s, 100m 這類。 5. 拉回到原本發問的話題來說,parted 預設應該是使用 compact 呈現單位,所以看到應該預設 會像是 100m - 900m 或是 900m - 100G 等這類顯示格式。compact 預設顯示會以大約佔用 的空間 容量來顯示分配情況,所以以你的問題來說第一個是 0GB-100GB,第二個要建立 200G 的話,一般就是指定起始 100G,結束為 300G 就可以達成需求,parted 會自動轉換好最後實際應對的磁區位置,實際上兩個分割區不會有範圍重疊這類問題,若要確認觀察可以用 unit s 切換 到磁區模式,用 print 查看一下就可以知道實際位於的磁區範圍。另外 parted 沒有辦法用 + 這類指定要增加多少容量範圍。 6. 這邊補充的是,以 centos linux 6 來說,fdisk 程式在分割預設是使用 cylinder 為範圍區分,不過可以輸入 u 切換到以 sector 單位來進行劃分。而在 centos 7 開始的 fdisk 預設也都是使用這個模式了,使用 u 反而是切換到傳統 CHS 顯示模式,不過不建議 用 CHS 傳統格式來劃分了,除非有特殊原因要不然不建議。再來 fdisk 在磁區顯示模式當下 結束的位置可以輸入 +100M 這類,就是表示多新增容量要 100M 的分割區,這比 parted 方便。 7. 另外前幾年開始其實實體的硬碟本身製造以 Sector 來說也不再是使用每個磁區為 512bytes 的 基本單位了,而是改成 4KB 為一個最小單位,一般稱呼 4K 對齊的進階格式,以目前的資料環境 來說也顯的更有效率,不過磁碟分割時候每個分割區劃分也要正確考慮到這個項目,若分割區劃分 沒有切齊這樣 4K 的情況,後續使用這樣分割區時候效能就會降低,所以劃分分割區的位置範圍 要以 8 倍數為基準的磁區位置當區段才能夠讓存取效能達到一般具備的水準。目前的 fdisk 與 parted 都可以自動在劃分注意處理這個議題了,比方 fdisk 預設用 sector 為處理,建立 第一個分割區時候會自動抓起始是 2048 這個磁區劃分,parted 也會自動處理這個情況,並且 若劃分分割區沒有正確對齊也會發出警告。 提供參考。 以上謝謝小州老師回覆和bambooindark詢問^^。
感謝 lccnetvip 的回答, 非常的詳細. 題外話, 之後分割可能有動到什麼東西 (parted 竟然是同步寫入天啊, 不像 fdisk 預設不會) 結果開機有問題. 不過 Grub 重裝又正常可以開機了.
不客氣喔~~ 建議可以去上小州老師的課~可以得到更多收穫~~^^