如何在 Linux 上使用 gdisk 和 sgdisk 操作 gpt 分区表 您所在的位置:网站首页 更改磁盘分区格式的命令 如何在 Linux 上使用 gdisk 和 sgdisk 操作 gpt 分区表

如何在 Linux 上使用 gdisk 和 sgdisk 操作 gpt 分区表

2024-07-09 16:22| 来源: 网络整理| 查看: 265

如何在 Linux 上使用 gdisk 和 sgdisk 操作 gpt 分区表

GPT 是 GUID Partition Table 的缩写:它是存储设备的新标准:它是 UEFI 固件规范的一部分,也是 MBR 的后继者,它克服了 MBR 的一些限制。例如,MBR 最多允许 4 个主分区(GPT 最多支持 128 个),并且仅适用于最大 2TB 的驱动器。在 Linux 上,我们可以使用多种工具来创建和操作 GPT 分区表。在本教程中,我们重点介绍 gdisk 和 sgdisk 实用程序的使用。

在本教程中您将学习:

如何使用 gdisk 列出设备的分区表

如何创建GPT分区表

如何创建新分区

如何删除分区

如何调整分区大小

如何以非交互方式使用 sgdisk

使用的软件要求和约定Gdisk 与 sgdisk

在本教程中,我们将使用两种不同的工具:gdisk 和 sgdisk。它们让我们执行相同的操作,但有很大的不同:前者以交互方式工作,提供确认提示和基于问题的界面。只有当我们使用专用命令时,我们用它执行的更改才会写入磁盘,以尽量减少错误。

相反,后者以非交互式方式工作:它旨在在 shell 脚本内使用,或者更一般地直接从命令行使用。 Sgdisk 命令会立即应用,因此应非常小心地使用它。在本教程的第一部分中,我们重点介绍如何使用 gdisk 执行基本操作,在第二部分中,我们将了解如何使用 sgdisk 执行相同的操作。

列出设备的分区表

要开始使用 gdisk,我们所要做的就是调用程序,传递我们想要操作的设备的路径作为参数。要列出设备的分区表,我们使用 -l 选项调用该程序:

$ sudo gdisk -l /dev/sdc

以下是上述命令在完全未初始化的设备上返回的内容:

GPT fdisk (gdisk) version 1.0.8 Partition table scan: MBR: not present BSD: not present APM: not present GPT: not present Creating new GPT entries in memory. Disk /dev/sdc: 15122432 sectors, 7.2 GiB Model: SD/MMC/MS PRO Sector size (logical/physical): 512/512 bytes Disk identifier (GUID): 32A31D98-1500-4FE5-836A-69F289D048A7 Partition table holds up to 128 entries Main partition table begins at sector 2 and ends at sector 33 First usable sector is 34, last usable sector is 15122398 Partitions will be aligned on 2048-sector boundaries Total free space is 15122365 sectors (7.2 GiB) 创建新的 GPT 分区表

正如我们所看到的,我们正在使用的设备完全是空的;它不包含任何分区表。要在其上创建新的 GPT 分区表,我们在调用 gdisk 时将其作为参数传递,而不提供任何选项:

$ sudo gdisk /dev/sdc

一旦我们启动上面的命令,系统就会提示我们输入命令:

Command (? for help):

要创建新的 GPT 分区表,我们必须使用 o 命令(我们输入 o,然后按 Enter)。我们将收到警告,该操作将破坏磁盘上的所有现有分区,并且系统将提示我们确认我们的选择:

Command (? for help): o This option deletes all partitions and creates a new protective MBR. Proceed? (Y/N): Y

正如我们已经说过的,使用 gdisk 时,我们对磁盘所做的更改不会立即写入:这是一种安全措施。为了使它们有效,我们必须使用 w 命令:

Command (? for help): w Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!! Do you want to proceed? (Y/N): y OK; writing new GUID partition table (GPT) to /dev/sdc. The operation has completed successfully.

系统将提示我们提供最后的确认。在我们提供后,更改将生效,并且(希望)我们将收到操作成功的通知。

创建新分区

我们初始化了我们的设备,现在我们可以开始创建分区了;让我们看看如何做。要创建新分区,我们必须使用n命令。我们将被提示回答一系列问题;作为每个问题的答案,我们可以提供一个值,或者只需按 Enter 键接受显示的默认值 括号之间。

我们首先要决定的是分区所使用的数字,范围从1到128。这里我们通常希望使用默认值,即渐进式。

第二件事,我们应该决定分区应该从磁盘的哪个扇区开始。对于第一个分区,默认起始扇区是2048。默认值是我们在绝大多数情况下想要使用的该参数的值。

我们应该决定的下一件事是分区应在哪个扇区结束:正如您可以想象的那样,这决定了分区大小。我们可以直接提供分区大小,而不是指定扇区,用一个整数后跟可用后缀之一:K、M、G,T,P。例如,要创建大小为 500 MiB 的分区,我们将输入 +500M 作为值。

最后,系统将提示我们决定分区使用什么HEX代码。这里的默认值为8300(Linux 文件系统)。要获取所有可用代码的列表,我们所要做的就是输入L命令,然后再次按:

0700 Microsoft basic data 0701 Microsoft Storage Replica 0702 ArcaOS Type 1 0c01 Microsoft reserved 2700 Windows RE 3000 ONIE boot 3001 ONIE config 3900 Plan 9 4100 PowerPC PReP boot 4200 Windows LDM data 4201 Windows LDM metadata 4202 Windows Storage Spaces 7501 IBM GPFS 7f00 ChromeOS kernel 7f01 ChromeOS root 7f02 ChromeOS reserved 8200 Linux swap 8300 Linux filesystem 8301 Linux reserved 8302 Linux /home 8303 Linux x86 root (/) 8304 Linux x86-64 root (/) 8305 Linux ARM64 root (/) 8306 Linux /srv 8307 Linux ARM32 root (/) 8308 Linux dm-crypt 8309 Linux LUKS 830a Linux IA-64 root (/) 830b Linux x86 root verity 830c Linux x86-64 root verity 830d Linux ARM32 root verity 830e Linux ARM64 root verity 830f Linux IA-64 root verity 8310 Linux /var 8311 Linux /var/tmp 8312 Linux user's home 8313 Linux x86 /usr 8314 Linux x86-64 /usr 8315 Linux ARM32 /usr 8316 Linux ARM64 /usr 8317 Linux IA-64 /usr 8318 Linux x86 /usr verity Press the key to see more codes, q to quit:

代码不会一次全部显示。要滚动列表,我们应该按住。在我们的示例中,我们刚刚确认了分区的默认十六进制代码:

Command (? for help): n Partition number (1-128, default 1): First sector (34-15122398, default = 2048) or {+-}size{KMGTP}: Last sector (2048-15122398, default = 15122398) or {+-}size{KMGTP}:+500M Hex code or GUID (L to show codes, Enter = 8300): Changed type of partition to 'Linux filesystem'

此时,变化仅存在于内存中;我们输入 w 将它们写入磁盘。

删除分区

要使用 gdisk 删除现有分区,我们必须使用“d”命令。输入后,系统会要求我们提供要删除的分区的编号。为了本示例,我们删除设备上的第二个分区:

Command (? for help): d Partition number (1-2): 2

正如我们所知,要将更改写入磁盘,我们输入 w 命令。

调整分区大小

调整分区大小始终是一项危险的操作,应小心执行,并且可能在创建备份之后执行。使用 gdisk 执行此类操作有些违反直觉,因为该过程涉及删除当前分区(仅在内存中),并使用相同的起始扇区和新大小/结束扇区重新创建它。

扩大分区/文件系统

假设我们要扩展在本教程中创建的第二个分区,以便它使用磁盘上的所有可用空间。以下是我们将如何进行。我们首先使用 i 命令请求有关我们要操作的分区的信息:

Command (? for help): i Partition number (1-2): 2 Partition GUID code: 0FC63DAF-8483-4772-8E79-3D69D8477DE4 (Linux filesystem) Partition unique GUID: D6FF2779-6F14-4E3E-876C-83E38F3A3FD7 First sector: 1026048 (at 501.0 MiB) Last sector: 3123199 (at 1.5 GiB) Partition size: 2097152 sectors (1024.0 MiB) Attribute flags: 0000000000000000 Partition name: 'Linux filesystem'

由于我们必须在调整大小操作中删除分区,因此我们希望保留其当前信息。我们可能想做的一件事是将当前分区唯一的 GUID 应用到新创建的分区(默认情况下会生成随机的)。我们已经知道,要删除分区,我们必须使用 d 命令:

Command (? for help): d Partition number (1-2): 2

此时,我们使用 n 命令重新创建分区,使用相同的分区编号和起点(在本例中为默认分区),并提供新的大小。由于在本例中我们要使用所有可用空间,因此我们还将使用应用程序建议的默认值:

Command (? for help): n Partition number (2-128, default 2): 2 First sector (34-15122398, default = 1026048) or {+-}size{KMGTP}: Last sector (1026048-15122398, default = 15122398) or {+-}size{KMGTP}: Current type is 8300 (Linux filesystem) Hex code or GUID (L to show codes, Enter = 8300): Changed type of partition to 'Linux filesystem'

要更改新分区的唯一GUID并使用之前的分区,我们应该进入gdisk的“高级操作”菜单,使用x命令(注意提示符变化)

Command (? for help): x Expert command (? for help):

我们要使用的专家命令是c。一旦我们输入它,我们将被要求提供分区号和新的 GUID。在本例中,我们输入用于“旧”分区的分区:

Expert command (? for help): c Partition number (1-2): 2 Enter the partition's new unique GUID ('R' to randomize): D6FF2779-6F14-4E3E-876C-83E38F3A3FD7 New GUID is D6FF2779-6F14-4E3E-876C-83E38F3A3FD7

此时,我们可以使用 w 命令将更改保存到磁盘(如果由于某种原因我们想离开“专家”菜单并返回主菜单,我们可以使用 m 代替):

Expert command (? for help): w

我们现在有一个比以前大得多的分区,但如果上面有文件系统,它仍然应该扩大以覆盖所有可用空间。用于执行操作的命令因文件系统类型而异。

假设分区上有一个 ext4 文件系统,我们首先使用带有 -f 选项的 e2fsck 命令运行检查(以便即使文件系统看起来干净,也强制进行检查),然后使用 resize2fs 继续实际调整大小,当不带任何选项调用它时,会将文件系统扩展到所有可用分区空间:

$ sudo e2fsck -f /dev/sdc2 && sudo resize2fs /dev/sdc2 缩小分区

要缩小分区,我们应该以相反的顺序执行上述步骤:首先,我们将文件系统(如果有)缩小到略小于我们将用于分区的新大小的大小,或者缩小到可能的最小大小(这就是我们在下面的示例中使用 -M 选项),然后缩小 分区本身,最后我们再次扩大文件系统,以便它使用所有可用空间。

假设我们要将磁盘上的第二个分区缩小到 2 GiB,我们将运行:

$ sudo e2fsck -f /dev/sdc2 && sudo resize2fs -M /dev/sdc2

此时,我们可以启动 gdisk,并执行与上一示例中相同的步骤,这次提供一个结束扇区或小于当前扇区大小的分区。一旦更改被保存并写入磁盘,我们就会扩大文件系统,使其覆盖所有可用空间:

$ sudo e2fsck -f /dev/sdc2 && sudo resize2fs /dev/sdc2 使用 sgdisk 以非交互方式执行操作

正如我们已经说过的,gdisk 是一个交互式程序,而 sgdisk 是一个命令行实用程序,可用于非交互式地执行操作。让我们看看如何直接使用 sgdisk 执行与前面示例中执行的相同操作。

创建 GPT 分区表

要使用sgdisk创建GPT分区表,我们需要做的就是运行以下命令:

$ sudo sgdisk -o /dev/sdc

当使用 -o 选项(或 --clear)调用时,sgdisk 会清除给定设备上的任何现有分区表,并创建一个新的 GPT 分区表。同样,由于该程序旨在从脚本中使用,因此不会发出警告,也不会请求确认,因此应谨慎使用。

创建分区

要创建新分区,我们使用 -n 选项(--new 的缩写)调用 sgdisk,并使用以下语法提供分区号、分区开始和分区结束:

partition_number:partition_start:partition_end

要创建一个编号为 2 的分区,该分区使用第一个可用的起始扇区,大小为 1GiB (1024 MiB),因此我们将编写:

2::+1G

如果我们希望分区覆盖磁盘上的所有可用空间,则可以使用 0 作为分区结束值:

2::0

如果我们想为分区使用一个特定的十六进制代码,我们应该使用 -t 选项(--typecode 的缩写),语法如下:

partition_number:hexcode

因此,创建分区并向其显式分配 8300 十六进制代码的完整命令为:

$ sudo sgdisk --new 2::+1G --typecode 2:8300 /dev/sdc 删除分区

要直接从命令行删除磁盘分区,无需任何交互,我们必须使用 sgdisk 和 -d 选项 (--delete),并提供分区号作为选项参数。要删除分区号 2,我们可以这样写:

$ sudo sgdisk --delete 2 /dev/sdc 调整分区大小

使用 sgdisk 调整分区大小的过程与我们与 gdisk 交互使用的过程相同,但它是在一行中执行的,例如,要扩大磁盘的第二个分区以覆盖所有可用空间,我们将运行:

$ sudo sgdisk \ -d 2 \ -n 2:0:0 \ -u 2:D6FF2779-6F14-4E3E-876C-83E38F3A3FD7 \ /dev/sdc

在上面的示例中,我们知道 -d 选项用于删除分区,-n 用于创建一个具有相同编号和默认值的新分区对于开始和结束扇区(0,表示“使用默认值”)。

最后,-u 选项是 --partition-guid 的缩写:我们用它为新分区分配与已删除分区相同的 GUID。

要请求有关特定分区的信息,我们可以使用 -i 选项并提供分区号。例如:

$ sudo sgdisk -i 2 /dev/sdc 结论

在本教程中,我们学习了如何使用 gdisk 和 sgdisk 实用程序来操作 GPT 分区表。我们看到前者是一个旨在交互使用的程序,并提供确认提示和其他安全措施,而后者旨在直接从命令行或内部 shell 脚本使用,我们对其进行的修改是立即生效。我们了解了如何创建新的分区表以及如何使用这两种工具创建、删除分区和调整分区大小。分区操作是一项危险的活动,应小心执行。有关上述工具的更多信息,请查看其各自的手册。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有