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
