分區
根據維基百科:
- 分區是在外存上創建一個或多個區域的過程,分區的目的是單獨管理各個部分。
一個硬盤可以被劃分為一個或者多個分區。一些場景需要使用多個分區,例如雙重或多重啟動、使用 Swap 分區等。此外,分區也可以從邏輯上隔離數據,例如為音頻和視頻數據創建單獨的分區。分區方案存儲於#分區表中,例如主引導記錄(MBR)或 GUID 分區表(GPT)。
可用分區工具創建和修改分區表。#分區工具中列出了在 Arch Linux 中可用的分區工具。
分區通常直接包含一個文件系統,這是在分區上直接創建的(即格式化)。或者,分區可能包含LVM(邏輯分卷管理器)、加密塊設備、RAID(獨立磁盤冗餘陣列),它們最終提供可存放文件系統的設備文件。
直接包含可掛載文件系統的塊設備(硬盤、分區、LUKS 設備、LVM 邏輯卷、RAID 陣列等)稱為卷(也有卷標、宗卷等稱謂)。
分區表[編輯 | 編輯原始碼]
分區信息被存放在分區表中。目前有兩種主流的模式:傳統的#主引導記錄(MBR)和新的#GUID 分區表(GPT)。後者功能更強大,解決了許多 MBR 的限制。第三個不常用的方式是使用無分區磁盤,後面也會介紹。
parted /dev/sda print
或 fdisk -l /dev/sda
查看當前分區信息。
/dev/sdX
是塊設備,依不同物理設備有不同的格式:
/dev/sda
是 SATA 設備/dev/nvme0n1
是 NVMe 設備/dev/mmcblk0
是 eMMC 設備
更多信息請參看塊設備名稱
主引導記錄[編輯 | 編輯原始碼]
主引導記錄(Master boot record,MBR)是存儲設備最開始的 512 字節。其包含作業系統啟動加載器和分區表,在 BIOS 系統的啟動流程中扮演重要角色。可參閱上述維基頁面了解 MBR 的結構。
MBR(引導代碼)[編輯 | 編輯原始碼]
MBR 的前 440 字節是引導(bootstrap)代碼。在 BIOS 系統上,它通常包含引導程序的第一階段。可以用 dd 備份、恢復、抹除引導代碼。
MBR(分區表)[編輯 | 編輯原始碼]
MBR 分區表(或稱為 DOS 分區表、MS-DOS 分區表)有三種分區類型:
- 主分區(Primary)
- 擴展分區(Extended)
- 邏輯分區(Logical)
主分區每個磁盤或者 RAID 卷上不能超過 4 個,可設置為可啟動狀態。如果分區方案要求使用多於 4 個的分區,就需將至少一個分區設置為擴展分區,並在上面建立邏輯分區。
擴展分區可以被看作是容納邏輯分區的容器。硬盤上最多只能有1個擴展分區。如果磁盤上有 1 個擴展分區,它也被看作是 1 個主分區。因此只能另外再建立 3 個主分區(例如 3 個主分區加 1 個擴展分區)。擴展分區內所包含的邏輯分區數量沒有限制。如果在雙重啟動中有 Windows,Windows 需要佔據一個主分區。
通常習慣是創建主分區 sda1 到 sda3,然後建立一個擴展分區 sda4。sda4 中包含的邏輯分區編號為 sda5、sda6 等。
GUID 分區表[編輯 | 編輯原始碼]
全局唯一標識分區表(GUID Partition Table,GPT)是 UEFI 標準定義的分區規範。使用通用唯一識別碼(globally unique identifier,GUID;又稱為 universally unique identifier,UUID)定義分區和分區類型。設計上是為了替換#主引導記錄。
GUID 分區表的磁盤開始位置有一個保護 MBR(protective Master Boot Record,PMBR),用以處理不支持 GPT 軟件的訪問。這段 MBR 和真正的 MBR 一樣,具備一段#引導代碼,後者可以用在支持的啟動管理器中進行 BIOS/GPT 啟動。
選擇 GPT 還是 MBR[編輯 | 編輯原始碼]
#GUID 分區表(GPT)是一種更靈活的分區方式。它正在逐步取代#主引導記錄(MBR)系統。GPT 相對於誕生於 MS-DOS 時代的 MBR 而言,有許多優點。新版的分區工具可以讓 GPT 和 MBR 都獲得不錯的可靠性和性能。
在做出選擇前,需要考慮如下內容:
- 如果使用 GRUB legacy 作為引導程序,必須使用 MBR。
- 如果使用傳統的 BIOS,並且雙啟動中包含 Windows (無論是 32位版還是 64 位版),必須使用 MBR。
- 如果使用 UEFI 而不是 BIOS,並且雙啟動中包含 Windows 64 位版,必須使用 GPT。
- 非常老的機器需要使用 MBR,因為 BIOS 可能不支持 GPT。
- 如果不屬於上述任何一種情況,可以隨意選擇使用 GPT 還是 MBR。由於 GPT 更先進,建議選擇 GPT。
- 建議在使用 UEFI 的情況下選擇 GPT,因為有些 UEFI 固件不支持從 MBR 啟動。
GPT 相對於 MBR 的一些優勢:
- 為每個磁盤和每個分區提供相應的磁盤 UUID 和分區 UUID(partuuid),這樣對分區和磁盤的命名就與其文件系統無關。UUID 同時是 systemd 的可發現分區規範的前提,可以用於啟用了 systemd 的 initramfs。
- 提供與文件系統無關的分區名(partlabel)。
- 任意多個分區(取決於為分區表本身分配的空間)使擴展分區和邏輯分區不再必要。GPT 表的默認空間可供 128 個分區使用,但若需要更多分區,也可為分區表分配更多空間。目前僅 gdisk 支持該功能。
- 使用 64 位邏輯塊地址(logical block address),可尋址的最大硬盤空間是 2 ZiB。MBR 只支持 2 TiB 的最大硬盤。
- 在磁盤末尾儲存頭部和分區表,有助於恢復分區表。
- CRC32 校驗碼可用於偵測頭部或分區表的錯誤。
#分區工具一節列出了用於創建和修改 GPT 或 MBR 表的工具。
無分區磁盤[編輯 | 編輯原始碼]
無分區磁盤,即superfloppy 是指無分區表的存儲設備,一個文件系統佔據整個存儲空間。無分區設備上的啟動扇區被稱做 volume boot record (VBR)。
Btrfs 分區[編輯 | 編輯原始碼]
Btrfs可以獨佔整個存儲設備並替代 #MBR 和 #GPT 分區方案。請參考創建 Btrfs 文件系統以獲取更多信息。
分區方案[編輯 | 編輯原始碼]
雖然有一些關於分區方案的通用建議,但沒有嚴格的準則。有許多影響分區方案的因素,例如對靈活性的期望、訪問速度、安全性以及可用磁盤空間的硬性限制。實際上就是個人取捨的問題。
如果你想雙啟動 Arch Linux 和 Windows,請參考 Dual boot with Windows。
- UEFI 系統通常需要有 EFI 系統分區。
- 在 BIOS 系統上使用 #GPT 進行分區後,安裝 GRUB 時會需要一個額外的 BIOS 啟動分區。
- 如果使用的是 Btrfs,可以用子卷模擬分區,請參考 Btrfs 子卷。
單root分區[編輯 | 編輯原始碼]
這種是最簡單,同時也能滿足大部分應用場景的方案。如果需要的話,可以建立一個交換文件。通常剛開始的時候建議一個單獨的 /
分區,然後根據應用場景的需要,例如 RAID,加密,獨立的多媒體分區等建立其他的分區。
23–32 GiB is the suggested minimum size for a single root partition. More space may be needed for user files and when using a swap file.
/boot
directory that resides in /
. That means the boot loader must have support for everything starting from the block devices, stacked block devices (LVM, RAID, dm-crypt, LUKS, etc.) and ending with the file system on which the kernel(s) and initramfs image(s) reside.A GPT partition should have the type GUID 4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709
("Linux root (x86-64)", "Linux x86-64 root (/)"). An MBR partition should have the default "Linux" type ID 83
.
多分區[編輯 | 編輯原始碼]
將某個路徑掛載為獨立分區可以使其擁有不同的文件系統和掛載參數。某些情況下(例如多媒體文件分區),可以被多個作業系統共享。
下面這些路徑可以作為獨立分區的掛載點,你也可以根據實際需要做出其他決定。file-hierarchy(7) 介紹了各個目錄的作用。
根分區[編輯 | 編輯原始碼]
根目錄是目錄樹的頂層,這裏是主文件系統掛載和其他文件系統掛靠的地方。所有文件和目錄都在根目錄 /
顯示,即使它們實際上存儲在其他的物理設備上。根文件系統中的內容必須足以啟動、恢復、修復系統。因此 /
目錄下的特定目錄是不能作為獨立分區的。
/
分區或叫根分區是最重要而且必需的,需要最先掛載,其他其他分區可以被它取代。
因為它通常包括 /usr
目錄,根據安裝的軟件數量,會產生非常明顯的增長。15-20 GiB 對於大多數用戶來說是一個比較合適的取值。如果你打算在這裏放一個交換文件或者不建立單獨的 /var,需要適當調大取值(增加休眠空間和額外的 8–12 GiB 給 /var
)。
A GPT partition should have the type GUID 4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709
("Linux root (x86-64)", "Linux x86-64 root (/)"). An MBR partition should have the default "Linux" type ID 83
.
/boot[編輯 | 編輯原始碼]
/boot
分區包含vmlinuz、 initramfs 以及引導加載程序配置文件和引導加載程序階段。它也可以存放內核在執行用戶態程序之前所使用的其他數據。/boot
在日常系統運行中並不需要,只在啟動和內核升級(重建 initial ramdisk 時)的時候用到。
- 引導加載程序需要能夠訪問到
/boot
目錄。所以引導加載程序需要視情況,支持塊設備、堆疊塊設備(如軟 RAID、加密卷或 LVM 卷)以及存放內核、initramfs 的文件系統。 - 有些文件系統能包含引導加載程序尚不支持的新特性,除非將不兼容特性禁用,否則不適於
/boot
分區。通常可以使用 FAT32 以避免此問題,因為 FAT32 包含所有需要的功能,而且不會再增加新的功能。
有關啟動加載器的需求和能力的更多信息,請參考 Arch boot process#啟動加載器。
/boot
,這樣就可以省去一個單獨的 boot 分區。In other cases, it is recommended to set the partition type to Extended Boot Loader (XBOOTLDR) Partition which is GPT partition type GUID BC13C2FF-59E6-4262-A352-B275FD6F7172
(ea00
type for gdisk) or MBR partition type ID ea
.
在兩種情況下,推薦的分區大小都是 1 GiB,這樣就可以有足夠的空間存放多個內核。如果怕不夠,可以分配 4 GiB 空間。
/home[編輯 | 編輯原始碼]
/home
目錄包含用戶定義的配置文件、緩存、應用程式數據和媒體文件。
將/home
目錄獨立使得/
分區可以單獨重新劃分。但是請注意,在 /home
沒有獨立分區的情況下,仍然可以在不修改 /home
目錄內容的情況下重裝 Arch——刪除其他頂級目錄,然後執行 pacstrap。
不能與使用其他發行版的用戶共享同一個 home 目錄,因為不同的發行版可能使用不兼容的軟件版本和補丁。可以共享媒體目錄,或至少使用 /home
分區下的不同 home 目錄。分區大小跟着存儲的內容而定。
A GPT partition should have the type GUID 933AC7E1-2EB4-4F13-B844-0E14E2AEF915
("Linux home", "Linux /home"). An MBR partition should have the default "Linux" type ID 83
.
Swap[編輯 | 編輯原始碼]
交換文件或分區提供的硬盤空間作為虛擬內存使用。它們有同樣的功能,沒有明顯的性能區別,但是後者更易於根據需要調整大小。如果沒有使用休眠特性的話,交換分區可以被多個系統共享。
以前,在擁有不足 512 MiB 內存的機器上,通常為交換分區分配兩倍內存大小的空間。如果有更大的內存(大於 1024 MiB),可以分配較少的空間,甚至不需要交換空間。推薦的默認大小是 4 GiB.
要使用休眠(掛起到硬盤)功能,最好分配與內存同樣大的交換分區。雖然內核會嘗試壓縮休眠文件到交換分區的大小,但如果交換空間過於小則不一定成功。請參見休眠。
A GPT partition should have the type GUID 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F
("Linux swap"). An MBR partition should have the type ID 82
("Linux swap").
/data[編輯 | 編輯原始碼]
可以為需要多用戶共享的文件建立一個「data」分區。也可以使用 /home
分區用於這一目的。
A GPT partition should have the default "Linux filesystem" type GUID 0FC63DAF-8483-4772-8E79-3D69D8477DE4
. An MBR partition should have the default "Linux" type ID 83
.
/var[編輯 | 編輯原始碼]
/var
目錄存儲變量數據例如 spool 目錄和文件,管理和登錄數據,pacman 的緩存,ABS 樹等等。它通常被用作緩存或者日誌記錄,因此讀寫頻繁。將它獨立出來可以避免由於大量日誌寫入造成的磁盤空間耗盡等問題。
它的存在是方便將 /usr
設置為只讀掛載。所有在作業系統運行過程(而非安裝或軟件維護)中,從前要寫入 /usr
的東西,放到 /var
下。
/var
包含許多小文件。如果將其作為獨立分區,在文件系統的選擇上需要考慮這一點。值得一提的是,/var
包含 pacman 緩存。保留緩存的包提供了軟件包降級的能力,因此非常有用。也正因為這樣,/var
的大小會隨着時間推移而增長。尤其是 pacman 緩存將會隨着新軟件的安裝、系統的升級而增長。在磁盤空間不足的時候,可以安全地清理這個目錄。
/var
分配 8~12 GiB 對於桌面系統來說是比較合適的取值,具體取值取決於安裝的軟件數量。
A GPT partition should have the type GUID 4D21B016-B534-45C2-A9FB-5C16E091FD2D
("Linux variable data", "Linux /var"). An MBR partition should have the default "Linux" type ID 83
.
佈局示例[編輯 | 編輯原始碼]
The following examples use /dev/sda
as the example disk with /dev/sda1
as the first partition. The block device naming scheme will differ if you are partitioning a NVMe disk (e.g. /dev/nvme0n1
with partitions starting from /dev/nvme0n1p1
) or an SD card or eMMC disk (e.g. /dev/mmcblk0
with partitions starting from /dev/mmcblk0p1
). See Device file#Block device names for more information.
- UEFI/GPT 並沒有真正的「boot」標誌。啟動僅依賴於設備上的相應記錄。某些 GPT 分區工具標記的「boot」僅意味着它是一個 EFI 系統分區。
- 不要求所有的分區都在同一個硬盤上。
- 不要求所有的硬盤使用相同的分區表類型。
UEFI/GPT 佈局示例[編輯 | 編輯原始碼]
掛載點 | 分區 | 分區類型 GUID | 推薦大小 |
---|---|---|---|
/boot or /efi 1
|
/dev/sda1
|
C12A7328-F81F-11D2-BA4B-00A0C93EC93B : EFI system partition
|
1 GiB |
[SWAP]
|
/dev/sda2
|
0657FD6D-A4AB-43C4-84E5-0933C84B4F4F : Linux swap
|
至少 4 GiB,使用 休眠 時等於內存大小 |
/
|
/dev/sda2
|
4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709 : Linux x86-64 root (/)
|
剩餘空間,至少 23 - 32 GiB |
MBR/BIOS 示例[編輯 | 編輯原始碼]
掛載點 | 分區類型 | 分區類型 ID | Boot flag | Suggested size |
---|---|---|---|---|
[SWAP]
|
/dev/sda1
|
82 : Linux swap
|
否 | 至少 4 GiB,使用 休眠 時等於內存大小 |
/
|
/dev/sda2
|
83 : Linux
|
是 | 剩餘空間,至少 23 - 32 GiB |
N/A | Unallocated space2 | N/A | N/A | At least 16.5 KiB at the end of the disk |
BIOS/GPT 佈局示例[編輯 | 編輯原始碼]
掛載點 | 分區 | 分區類型 GUID | 推薦大小 | |
---|---|---|---|---|
None | /dev/sda1
|
21686148-6449-6E6F-744E-656564454649 : BIOS boot partition 3
|
1 MiB | |
[SWAP]
|
/dev/sda2
|
0657FD6D-A4AB-43C4-84E5-0933C84B4F4F : Linux swap
|
至少 4 GiB,使用 休眠 時等於內存大小 | |
/
|
/dev/sda3
|
4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709 : Linux x86-64 root (/)
|
2 : Legacy BIOS bootable
|
23 - 32 GiB |
- The ESP can be mounted to
/efi
if the used boot loader is capable of accessing the file system (and everything above it) on which the kernel and initramfs images are located. See EFI system partition#Typical mount points and the warning in Arch boot process#Boot loader for details.
- An unpartitioned space of at least 33 512-byte sectors (16.5 KiB) at the end of the disk to allow converting to GPT in the future. The space will be required for the backup GPT header. The recommendation to preserve an unpartitioned space applies to all MBR partitioned disks.
- A BIOS boot partition is only required when using GRUB for BIOS booting from a GPT disk, it is not needed when using other boot loaders. The partition has nothing to do with
/boot
, and it must not be formatted with a file system or mounted.
分區工具[編輯 | 編輯原始碼]
下面表格可以幫助選擇。
! GPT
! CLI
! TUI
! Scripting utility
|-
| fdisk
| util-linux包
| data-sort-value=5 style="background: #afa; color: inherit; vertical-align: middle; text-align: center; "|是
| data-sort-value=5 style="background: #afa; color: inherit; vertical-align: middle; text-align: center; "|是
| fdisk(8)
| cfdisk(8)
| sfdisk(8)
|-
| GPT fdisk
| gptfdisk包
| data-sort-value=1 style="background: #faa; color: inherit; vertical-align: middle; text-align: center; "|否
| data-sort-value=5 style="background: #afa; color: inherit; vertical-align: middle; text-align: center; "|是
| gdisk(8)
| cgdisk(8)
| sgdisk(8)
|-
| Parted
| parted包
| data-sort-value=5 style="background: #afa; color: inherit; vertical-align: middle; text-align: center; "|是
| data-sort-value=5 style="background: #afa; color: inherit; vertical-align: middle; text-align: center; "|是
| parted(8)
| data-sort-value=1 style="background: #faa; color: inherit; vertical-align: middle; text-align: center; "|否
| parted(8)
|}
fdisk/gdisk[編輯 | 編輯原始碼]
請參考 fdisk。
- fdisk — Linux 自帶的命令行分區工具。
- cfdisk — 使用 ncurses 庫編寫的具有偽圖形界面的命令行分區工具。
- sfdisk — 支持腳本的 fdisk.
- cgdisk — GPT 版的 cfdisk。
- sgdisk — Scriptable version of gdisk.
GNU Parted[編輯 | 編輯原始碼]
下面工具在 GNU Parted 中有介紹。
- GNU Parted — 命令行分區工具。
- GParted — GTK 圖形界面的分區工具。
- GNOME Disks — GTK 寫的圖形分區工具.
- Partitionmanager — QT 圖形界面的分區工具。
備份[編輯 | 編輯原始碼]
請參閱 fdisk#Backup and restore partition table 或 gdisk#Backup and restore partition table.
恢復[編輯 | 編輯原始碼]
- TestDisk — 該工具可恢復 MBR 或 GPT 丟失分區。
分區對齊[編輯 | 編輯原始碼]
恰當的分區對齊有助於提升性能和使用壽命。這是由硬件層面和文件系統層面的每次塊 I/O 操作特性決定的。對齊的關鍵是分區大小(至少)是塊大小的倍數,塊大小取決於選用的硬件設備。如果分區沒有以塊大小的整數倍對齊,對齊文件系統就失去意義了,因為從分區的起始偏移開始就是有偏差的。
fdisk/gdisk 和 parted 會自動處理分區對齊。GNU Parted#Check alignment 介紹了如何驗證分區是否對齊。
有些硬盤使用高級格式會提供更好的讀寫效率。
GPT 內核支持[編輯 | 編輯原始碼]
Linux 內核中 CONFIG_EFI_PARTITION
選項配置是否啟用內核 GPT 支持(即使名稱為 EFI PARTITION)。此選項必須內置於內核,不能作為可加載模塊。即使 GPT 磁盤只用作數據存儲而不作為啟動盤,此選項也是必須的。在 Arch [core] 倉庫中的 linux包 和 linux-lts包 內核默認啟用此選項。如果自定內核,設置 CONFIG_EFI_PARTITION=y
啟用此選項。
Troubleshooting[編輯 | 編輯原始碼]
Tricking old BIOS into booting from GPT[編輯 | 編輯原始碼]
Some old BIOSes (from before year 2010) attempt to parse the boot sector and refuse to boot it if it does not contain a bootable MBR partition. This is a problem if one wants to use GPT on this disk, because, from the BIOS viewpoint, it contains only one, non-bootable, MBR partition of type ee
(i.e., the protective MBR partition). One can mark the protective MBR entry as bootable using fdisk -t mbr /dev/sda
, and it will work on some BIOSes. However, the UEFI specification prohibits the protective MBR partition entry from being bootable, and UEFI-based boards do care about this, even in the legacy boot mode. So, this matters if one wants to create a GPT-based USB flash drive that is supposed to boot both on modern UEFI-based boards and also on old BIOSes that insist on finding a bootable MBR partition. It is not possible to solve this problem using traditional tools such as fdisk or gdisk, but it is possible to create a fake MBR partition entry suitable for both kinds of BIOSes manually as a sequence of bytes.
The command below will overwrite the second MBR partition slot and add a bootable partition there of type 0 (i.e. unused), covering only the first sector of the device. It will not interfere with the GPT or with the first MBR partition entry which normally contains a protective MBR partition.
# printf '\200\0\0\0\0\0\0\0\0\0\0\0\001\0\0\0' | dd of=/dev/sda bs=1 seek=462
The end result will look like this:
# fdisk -t mbr -l /dev/sda
Disk /dev/sda: 232.9 GiB, 250059350016 bytes, 488397168 sectors Disk model: ST3250820AS Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x00000000 Device Boot Start End Sectors Size Id Type /dev/sda1 1 488397167 488397167 232.9G ee GPT /dev/sda2 * 0 0 1 512B 0 Empty Partition table entries are not in disk order.
Drives are not visible when firmware RAID is enabled[編輯 | 編輯原始碼]
If a SATA or NVMe drive is visible in firmware setup, but not to Linux (e.g. fdisk -l
does not list it), it is possible that the controller is in firmware RAID mode.
For NVMe, the journal should show something like:
kernel: ahci 0000:00:17.0: Found 1 remapped NVMe devices. kernel: ahci 0000:00:17.0: Switch your BIOS from RAID to AHCI mode to use them.
The solution is to enter firmware setup and disable NVMe RAID mode and change the SATA controller operation mode from RAID to AHCI. Mind that the setting may have a different name (e.g. "Intel Rapid Storage Technology", "Intel RST", "Intel VMD controller" or "VMD") and it could also be per-controller or per-port.
參考資料[編輯 | 編輯原始碼]
- Wikipedia:Disk partitioning
- Wikipedia:Binary prefix
- Understanding Disk Drive Terminology
- What is a Master Boot Record (MBR)?
- Rod Smith's page on What's a GPT? and Booting OSes from GPT
- Make the most of large drives with GPT and Linux - IBM Developer Works
- Microsoft's Windows and GPT FAQ
- Partition Alignment (with examples)