Linux 中的 Parted 是一個用來管理磁碟分割區的工具,舉凡磁碟分割區的新增、刪除、大小變更等動作都可以用這個工具來處理。

傳統上 Linux 系統中若要管理磁碟分割區,最常使用的工具就是 fdisk,而這個工具只適用於容量較小的硬碟,容量太大的硬碟就無法使用 fdisk 來處理,以下是 fdisk 線上手冊(man page)中的一段說明。

fdisk does not understand GUID partition tables (GPTs) and it is not designed for large partitions. In these cases, use the more advanced GNU parted(8).

fdisk 所能處理的磁碟容量上限是 2TB,若磁碟的容量大於 2TB 就無法使用 fdisk,這時候就要改用支援 GPT 的 格式的 Parted,以現在最新的硬碟來說,容量通常都是在 2TB 以上,所以學習使用 Parted 來管理磁碟分割區是很重要的。

由於 parted 的執行效果會立即生效,所有磁碟分割區的變更都會馬上寫入硬碟中,如果您沒有使用過 parted 的經驗,建議可以找一台沒有用的舊電腦來練習,或是使用虛擬機器(如 VirtualBox),以免不小心造成硬碟的資料損毀。

以下我們會介紹 Parted 的使用方式,並且提供許多 parted 指令的範例供大家參考。

安裝 Parted 磁碟分割工具

在 Debian 系列的 Linux 中(如 Ubuntu、Linux Mint 等),可以使用 apt 安裝 Parted:

sudo apt-get install parted

在 RHEL、CentOS 或 Fedora 中,則使用 yum 安裝:

sudo yum install parted

在 Fedora 22 以上的版本則使用 dnf 安裝:

dnf install parted

安裝好 Parted 之後,就可以繼續以下的操作。

基本 Parted 使用方式

使用 root 管理者權限執行 parted

sudo parted

這樣就會進入到 Parted 的操作環境中,這時候終端機上會顯示 parted 的版本資訊,並且出現 (parted) 的提示字元,類似這樣:

GNU Parted 2.3
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.

(parted) 

在 Parted 的操作環境中執行 help 指令可以顯示簡單的指令列表與操作說明:

(parted) help

如果要離開 Parted 操作環境,可以執行 quit

(parted) quit

列出 Linux 磁碟分割區

在 Parted 的操作環境中,執行 print 指令可以列出目前磁碟的分割區資訊:

(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  6442MB  6441MB  primary   ext4            boot
 2      6443MB  8589MB  2145MB  extended
 5      6443MB  8589MB  2145MB  logical   linux-swap(v1)

上面這個輸出是我在 VirtualBox 的虛擬機器中所測試的結果,如果在實際的實體機器上面的話,print 的輸出還會包含硬碟的型號資訊,以下是一個實體硬碟的輸出範例:

Model: ATA TOSHIBA MQ01ACF0 (scsi)
Disk /dev/sda: 500GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt

Number  Start   End    Size    File system     Name                          Flags
 1      1049kB  420MB  419MB   ntfs            Basic data partition          hidden, diag
 2      420MB   735MB  315MB   fat32           EFI system partition          boot
 3      735MB   869MB  134MB                   Microsoft reserved partition  msftres
 4      869MB   216GB  215GB   ntfs            Basic data partition          msftdata
 8      216GB   316GB  100GB   ext4
 5      316GB   468GB  152GB   fat32                                         msftdata
 6      468GB   470GB  1979MB  linux-swap(v1)
 7      470GB   500GB  30.5GB  ntfs            Basic data partition          hidden, diag

選擇磁碟

print 指令預設會列出系統上第一顆硬碟的分割區資訊,如果您的系統中有多顆硬碟,可以使用 select 指令來選擇要操作的硬碟,例如選擇 /dev/sdb 則執行:

(parted) select /dev/sdb

輸出為

Using /dev/sdb

接著就可以使用 print 列出 /dev/sdb 的磁碟分割區資訊。

令一個選擇硬碟的方式是在執行 parted 指令時用參數指定:

sudo parted /dev/sdb

建立磁碟分割區

Parted 可以用來建立磁碟的主要分割區與邏輯分割區,兩種分割區的建立方式是相同的,這裡示範主要分割區的建立步驟。

在建立分割區之前,請先執行 print 確認一下目前所選擇的硬碟是否正確:

(parted) print

如果是沒有任何資料的硬碟,可能會出現類似這樣的訊息:

Error: /dev/sdb: unrecognised disk label

請小心確認目前的磁碟,若則錯誤的磁碟,可能會造成磁碟中的資料完全損毀!

建立磁碟分割區之前,要先建立磁碟分割表,一般的硬碟最常使用的是 msdos

(parted) mklabel msdos

如果是大於 2TB 的硬碟,可以使用 gpt

(parted) mklabel gpt

關於 mklabel 所支援的 label 類型,可以參考 GNU Parted 的說明文件

如果硬碟中已經存在有磁碟分割表的資訊,就會出現這樣的警告:

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 繼續。

建立好磁碟分割表之後,再用 print 確認一次:

(parted) print

輸出會類似:

Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start  End  Size  File system  Name  Flags

接著建立磁碟分割區,分割區可以使用 mkpart 指令來建立:

(parted) mkpart

接著輸入一些設定參數:

Partition name?  []? my_part
File system type?  [ext2]?
Start? 1
End? 10000
  • Partition name:輸入分割區名稱。
  • File system type:檔案系統格式,使用預設即可,之後格式化的時候可在更改。
  • Start:輸入起始位置。
  • End:輸入結束位置。

如果是使用 msdos 的磁碟分割表,在建立磁碟分割區會有不同的選項:

Partition type?  primary/extended? primary
File system type?  [ext2]?
Start? 1
End? 10000

主要的差異是要選擇分割區的類型,primary 是主要分割區,而 extended 則是延伸分割區。

建立好分割區之後,使用 print 確認:

(parted) print

輸出為

Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  10.0GB  9999MB               my_part

接著離開 Parted 的操作環境。

(parted) quit

在 shell 中使用 mkfs.ext4 格式化分割區:

mkfs.ext4 /dev/sdb1

輸出為

mke2fs 1.42.9 (4-Feb-2014)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
610800 inodes, 2441216 blocks
122060 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2499805184
75 block groups
32768 blocks per group, 32768 fragments per group
8144 inodes per group
Superblock backups stored on blocks:
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

如果需要將分割區格式化成其他的檔案系統,可以使用其他的 mkfs.* 工具。

雖然 Parted 操作環境之中也有格式化分割區的功能,但是它的穩定性不如一般專門的格式化工具(如 mkfs 系列的工具),所以建議在建立好分割區之後,離開 Parted 環境再用一般的工具格式化。

這樣新的磁碟分割區就完成了,接著就可以用 mount 將分割區掛載起來使用:

sudo mkdir /mnt/my_part
sudo mount /dev/sdb1 /mnt/my_part/

df 查看一下掛載後的磁碟狀況:

sudo df -h

輸出為

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       5.8G  2.4G  3.2G  44% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            986M  4.0K  986M   1% /dev
tmpfs           201M  928K  200M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none           1001M  136K 1001M   1% /run/shm
none            100M   28K  100M   1% /run/user
/dev/sdb1       9.1G   21M  8.6G   1% /mnt/my_part

調整磁碟分割區大小

Parted 的 resizepart 指令可以用來更改 Linux 的磁碟分割區大小,在變更磁碟分割區之前,要先用 print 指令查詢分割區的編號:

(parted) print

print 的輸出中,可以查到每個磁碟分割區的編號:

Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  10.0GB  9999MB  ext4         my_part

第一個 Number 欄位就是分割區的編號,以這個 my_part 分割區而言,它的編號就是 1。接著執行 resizepart

(parted) resizepart

接著輸入編號與大小:

Partition number? 1
End?  [10.0GB]? 5G
Warning: Shrinking a partition can cause data loss, are you sure you want to continue?
Yes/No? y
  • Partition number:輸入分割區編號。
  • End:輸入分割區結束位置。
  • Shrinking a partition can cause data loss, are you sure you want to continue?:如果是縮小分割區,可能會造成資料流失,若確認要執行,則輸入 y

print 確認:

(parted) print

輸出為

Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  5000MB  4999MB  ext4         my_part

刪除 Linux 磁碟分割區

首先用 print 查詢磁碟分割區編號:

(parted) print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name      Flags
 1      1049kB  5000MB  4999MB  ext4         my_part
 2      5001MB  8000MB  2999MB               my_part2

然後使用 rm 指令加上分割區編號刪除指定的分割區:

(parted) rm 2

再用 print 確認一次:

(parted) print

輸出為

Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  5000MB  4999MB  ext4         my_part

修復磁碟分割區

Parted 的 rescue 指令提供了修復磁碟分割區的功能,它可以搜尋指定的磁碟區間,如果發現有任何遺失的分割區,就會嘗試將它們救回:

(parted) rescue

接著輸入要搜尋的磁碟區間:

Start? 1
End? 10000
Information: A ext4 primary partition was found at 1049kB -> 10.0GB.  Do you want to add it to the partition table?
Yes/No/Cancel? y
  • Start:輸入搜尋起點。
  • End:輸入搜尋終點。
  • Do you want to add it to the partition table?:若找到遺失的分割區,會詢問是否要修復,輸入 y 可以進行修復。

使用 print 查看磁碟修復後的結果:

(parted) print

輸出為:

Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  10.0GB  9999MB  ext4

設定磁碟旗標

Parted 的 set 指令可以用來設定磁碟分割區的旗標(flags),例如將編號 1 的分割區設定為可開機(boot):

(parted) set 1 boot on

然後使用 print 查看:

(parted) print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  10.0GB  9999MB  primary  ext4         boot

參考資料