上次我缩小分区时,只需将其删除并从相同的起始扇区重新创建即可。但这次,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
我也遇到了无法保留原始起始块的问题。我使用了cfdisk
。cfdisk
可以正确完成,而且比以前容易得多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
您可能无法获得某些中间版本所期望的行为。