调整分区大小 fdisk 因参数无效而失败

调整分区大小 fdisk 因参数无效而失败

我最近通过主机提供商的控制面板将 VPS 从 50GB SSD 调整为 300GB SSD。我现在正尝试使用 fdisk 调整主分区的大小,以便能够使用所有新空间。但是,fdisk 在启动时向我发出警告:

GPT PMBR size mismatch (104857599 != 629145599) will be corrected by w(rite).
GPT PMBR size mismatch (104857599 != 629145599) will be corrected by w(rite).

显然,它的大小是之前大小的六倍,因为我从 50GB 增加到了 300GB。因此,我决定按照提示编写表格...

Command (m for help): w
GPT PMBR size mismatch (104857599 != 629145599) will be corrected by w(rite).
fdisk: failed to write disklabel: Invalid argument

.. 不起作用。尽管搜索了很多次,我还是找不到导致该错误的原因。我没有使用 LVM,我的分区表如下所示:

Disk /dev/vda: 300 GiB, 322122547200 bytes, 629145600 sectors
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: gpt
Disk identifier: 30D92031-0C13-42FF-AC16-D34F36DD3907

Device        Start       End  Sectors Size Type
/dev/vda1      2048     32767    30720  15M BIOS boot
/dev/vda2     32768  16809983 16777216   8G Linux swap
/dev/vda3  16809984 104857566 88047583  42G Linux filesystem

注意磁盘显示为 300GiB,因此它确实识别出大小的变化。

答案1

我设法相当简单地解决了这个问题。我安装了 parted,当我运行它时,它告诉我分区表没有覆盖整个磁盘(duh),所以它问我,Fix/Cancel我用 来响应Fix。显然,这招奏效了,因为我能够使用 将分区修改为完整大小sudo fdisk /dev/vda,但之后我确实需要运行sudo resize2fs /dev/vda3才能应用更改。

答案2

当我尝试扩大 GPT 分区时,这种方法对我很有用。与往常一样,在更改分区表时,备份至关重要,以防万一没有按计划进行。

首先,并非所有 fdisk 都是一样的。在 Ubuntu 18.04 上,这是我使用的 fdisk 版本:

$ fdisk -v
fdisk from util-linux 2.31.1

启动 fdisk。使用“p”打印分区表并验证现有分区表是否为 GPT:

Disklabel type: gpt

将分区信息复制并粘贴到另一个窗口,以便您可以重新创建具有完全相同的起始扇区的分区。

按“g”将旧的 GPT 分区表替换为新的 GPT 分区表。

再次按“p”打印出新的表格信息,以验证它现在是否显示更大的尺寸。

按“n”重新创建分区。所有分区都必须使用完全相同的起始和结束扇区进行重新创建,最后一个分区除外,该分区必须具有相同的起始扇区,但可以具有更大的结束扇区。

如果您的分区上有文件系统,您应该会看到类似以下内容:

Partition #1 contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o: N

请回答“N”,因为您想保留文件系统签名。

回到 fdisk 提示符,再次输入“p”来查看表格,确认一切正常。

输入“w”来写入(提交)更改。

从那里,退出 fdisk 并按照标准程序调整文件系统的大小(例如,e2fsck -f如果resize2fs是 ext4)。如果您正在使用原始磁盘映像文件(即 QEMU),那么您可以使用它kpartx -av disk.img来获取分区的循环设备,以便您可以在这些循环设备上e2fsck运行。resize2fs

答案3

问题在于保护性 MBR (PMBR) 太小。您可以使用以下方法更改保护性 MBR:

  1. x获得额外功能
  2. M进入保护/混合 MBR
  3. p允许显示保护性 MBR)
  4. r返回主菜单(仍处于保护 MBR 模式!)
  5. d删除大小错误的保护性 MBR 分区
  6. n创建新分区并按 4xenter接受默认设置(主分区、分区号 1 和全尺寸)
  7. t并将ee类型更改为 GPT
  8. x获得额外功能
  9. M退出保护/混合 MBR 模式
  10. r返回主菜单(现在再次处于 GPT 模式)
  11. w来写

这样我就可以修复 GPT PMBR 大小不匹配的问题。

为了修复磁盘标签问题,我不得不使用转储分区表,O并将导出脚本中的 last-lba 更改为 中报告的磁盘fdisk大小减去 34(用于辅助 GPT)。然后我使用 重新导入了脚本I

答案4

我使用 gdisk 修复了这个问题。以下是我所做的:

sudo fdisk --list

GPT PMBR size mismatch (41943039 != 62914559) will be corrected by w(rite).
Disk /dev/sda: 30 GiB, 32212254720 bytes, 62914560 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 62D6A220-B955-44BE-9730-CC89FE5CA928

# Naive fix attempt:
sudo fdisk /dev/sda
w 
# ^^ fails with:
# GPT PMBR size mismatch (62914559 != 83886079) will be corrected by w(rite).
# fdisk: failed to write disklabel: Invalid argument

# try (because it is a GPT disk?)
viradmin@instance-2:~$ sudo gdisk /dev/sda
GPT fdisk (gdisk) version 1.0.3

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): ?
b   back up GPT data to a file
c   change a partition's name
d   delete a partition
i   show detailed information on a partition
l   list known partition types
n   add a new partition
o   create a new empty GUID partition table (GPT)
p   print the partition table
q   quit without saving changes
r   recovery and transformation options (experts only)
s   sort partitions
t   change a partition's type code
v   verify disk
w   write table to disk and exit
x   extra functionality (experts only)
?   print this menu

Command (? for help): w
Warning! Secondary header is placed too early on the disk! Do you want to
correct this problem? (Y/N): y
Have moved second header and partition table to correct location.

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/sda.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot or after you
run partprobe(8) or kpartx(8)
The operation has completed successfully.

# then
sudo reboot

然后我还做了以下操作,因为这是在 Google Cloud 中的 Ubuntu 机器上(按照指南https://slacker.ro/2019/07/17/how-to-increase-google-cloud-virtual-machine-disk-size/):

sudo apt install -y cloud-guest-utils
sudo growpart /dev/sda 1
sudo resize2fs /dev/sda1


stage@instance-2:/$ df
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/root       30308240 16684136  13607720  56% /


# fixed:
sudo fdisk --list

Disk /dev/sda: 40 GiB, 42949672960 bytes, 83886080 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 62D6A220-B955-44BE-9730-CC89FE5CA928

Device      Start      End  Sectors  Size Type
/dev/sda1  227328 83886046 83658719 39.9G Linux filesystem
/dev/sda14   2048    10239     8192    4M BIOS boot
/dev/sda15  10240   227327   217088  106M EFI System

此后,磁盘和分区将正确增长到新的大小:

我希望这有帮助。

相关内容