缩小 ext4 分区:fdisk 不允许在同一起始块重新创建分区

缩小 ext4 分区:fdisk 不允许在同一起始块重新创建分区

上次我缩小分区时,只需将其删除并从相同的起始扇区重新创建即可。但这次,fdisk 不允许从扇区 63 重新创建分区,它强制将 2048 作为最小值。

请注意,我正在无头服务器上工作,并且 gparted 不是一个选项,因为它是一个 GUI。

  • 为什么 fdisk 会出现这种行为?
  • 使用 2048 会导致数据丢失吗?
  • 有什么解决方法或解决方案可以缩小分区吗?

root@ubuntulive:~# fdisk -u=sectors /dev/sda

Command (m for help): p

Disk /dev/sda: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders, total 312581808 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
Disk identifier: 0x0ab2afe6

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *          63   104872319    52436128+  83  Linux
/dev/sda2       104872320   113274314     4200997+  83  Linux
/dev/sda3       113274315   312576704    99651195   83  Linux

Command (m for help): d
Partition number (1-4): 1

Command (m for help): n
Partition type:
   p   primary (2 primary, 0 extended, 2 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-312581807, default 2048): 63
Value out of range.
First sector (2048-312581807, default 2048):  
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-104872319, default 104872319): 52436159

Command (m for help): p

Disk /dev/sda: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders, total 312581808 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
Disk identifier: 0x0ab2afe6

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048    52436159    26217056   83  Linux
/dev/sda2       104872320   113274314     4200997+  83  Linux
/dev/sda3       113274315   312576704    99651195   83  Linux

答案1

为什么 fdisk 会出现这种行为?

某些硬盘型号的性能

使用 2048 会导致数据丢失吗?

如果它是根分区无论如何都无法启动

有没有什么解决方法或解决方案可以缩小分区?

使用 parted 而不是 fdisk。请注意,与 fdisk 不同,parted 动态写入更改

(parted) p                                                                
Model: ATA Hitachi HTS72501 (scsi)
Disk /dev/sda: 160041885696B
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start         End            Size           Type     File system     Flags
 1      32256B        53694627839B   53694595584B   primary  ext4            boot
 2      53694627840B  57996449279B   4301821440B    primary  linux-swap(v1)
 3      57996449280B  160039272959B  102042823680B  primary  xfs

(parted) rm 1
(parted) mkpart primary 32256B 28998224639B                               
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? Ignore                                                     
(parted) p                                                                
Model: ATA Hitachi HTS72501 (scsi)
Disk /dev/sda: 160041885696B
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start         End            Size           Type     File system     Flags
 1      32256B        28998224895B   28998192640B   primary  ext4
 2      53694627840B  57996449279B   4301821440B    primary  linux-swap(v1)
 3      57996449280B  160039272959B  102042823680B  primary  xfs

警告 !!

我认为 ext4 不会产生那么多碎片(实际上它只有 0.1% 的非连续块)所以我没有运行 resize2fs。

一开始我这么做了,但无法再次挂载 /dev/sda1。(大笑之后)我以初始大小重新创建了分区,运行了 e2fsck,并决定在再次尝试 parted 之前运行 resize2fs,然后成功了。

请记住,我们只是使用 parted/fdisk 编辑分区表,而不是更改任何物理数据。

这是一台无头服务器,重启后无法 ping 通。我决定不再重启进入救援模式,因为这可能会中断启动时 fsck,所以我去睡觉了。第二天早上我发现服务器恢复了。

答案2

我也遇到了无法保留原始起始块的问题。我使用了cfdiskcfdisk可以正确完成,而且比以前容易得多fdisk!只需选择“调整大小”并输入磁盘空间量。当您对配置满意时,选择“写入”。就是这样!正如您所见,它没有即时写入的缺点。

答案3

有没有什么解决方案可以缩小分区?

使用默认起始扇区 ( ) 和正确的结束扇区重新创建分区2048。请记住,此更改在写入分区表之前处于待定状态,因此尚未写入分区表也没关系。接下来,输入以下63命令x

x   extra functionality (experts only)

现在m打印(除其他外):

b   move beginning of data in a partition

使用b,您将被允许输入63。使用 返回主菜单r。此时p应该显示63为起始扇区。如果一切正常,使用 将更改写入磁盘w

答案4

您可以使用 GParted 同时调整文件系统和分区的大小。在我看来,这通常是最好的解决方案,因为它可以减少人为错误的发生。但请注意,如果您在 GParted 中使用 MiB 对齐(即使您不使用),它也可能尝试将分区的起始位置移至扇区 2048。这将导致大量额外的数据移动,这既耗时又有风险。另一方面,如果它是启动盘并且您想要安装较新版本的 GRUB,这可能是可取的——某些版本现在需要 MBR 后的空间比您现在拥有的 62 个扇区更多。(不过,您可以继续在当前磁盘上使用较旧的 GRUB 或 LILO。)

如果您必须使用 执行此操作fdisk,请尝试使用较旧的发行版(或至少是 的较旧版本fdisk)。 的较新版本fdisk似乎没有提供指定您想要使用的最小起始扇区的方法,尽管这是完全合法的,并且直到最近(对于 Linux 是 2-3 年前;对于 Windows 是 Windows XP 之前)都是标准。不过,请注意单位—— 的较旧版本fdisk默认使用虚构的“圆柱体”值。这些值不精确,并且 的逐个更改意味着fdisk您可能无法获得某些中间版本所期望的行为。

相关内容