我想添加一个分区来使用 LVM 的可用空间 (50GB)。磁盘已经放大了好几倍,就造成了这个分区的混乱。我怎样才能将其恢复正常并使用可用空间?
# cfdisk /dev/sda
Disk: /dev/sda
Size: 200 GiB, 214748364800 bytes, 419430400 sectors
Label: dos, identifier: 0x000cc491
Device Boot Start End Sectors Size Id Type
>> /dev/sda1 * 2048 499711 497664 243M 83 Linux
/dev/sda2 501758 167770111 167268354 79.8G 5 Extended
└─/dev/sda5 501760 167770111 167268352 79.8G 8e Linux LVM
/dev/sda3 167770112 209715199 41945088 20G 83 Linux
/dev/sda4 209715200 314572799 104857600 50G 83 Linux
Free space 314572800 419430399 104857600 50G
我尝试先调整扩展分区的大小,以便之后添加逻辑分区。但这不起作用:
(parted) print
Model: VMware Virtual disk (scsi)
Disk /dev/sda: 215GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 256MB 255MB primary ext2 boot
2 257MB 85.9GB 85.6GB extended
5 257MB 85.9GB 85.6GB logical lvm
3 85.9GB 107GB 21.5GB primary
4 107GB 161GB 53.7GB primary
(parted) resizepart
Partition number? 2
End? [85.9GB]? 135.6
Error: Can't have the end before the start! (start sector=501758 length=-236914)
更多信息:
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda3 root lvm2 a-- 20.00g 0
/dev/sda4 root lvm2 a-- 50.00g 0
/dev/sda5 root lvm2 a-- 79.76g 0
# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root root -wi-ao---- 146.48g
swap_1 root -wi-ao---- 3.28g
# vgs
VG #PV #LV #SN Attr VSize VFree
root 3 2 0 wz--n- 149.75g 0
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/dm-0 145G 129G 8.6G 94% /
udev 10M 0 10M 0% /dev
tmpfs 1.6G 9.2M 1.6G 1% /run
tmpfs 4.0G 0 4.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 4.0G 0 4.0G 0% /sys/fs/cgroup
/dev/sda1 228M 53M 164M 25% /boot
tmpfs 801M 0 801M 0% /run/user/1000
答案1
为什么不增加现有分区而不是添加新分区?
您的所有分区都已经是单个 LVM 卷组的一部分,无需添加更多分区,只需扩展现有分区即可。
parted /dev/sda -- resizepart 4 100%
pvresize /dev/sda4
这应该是迄今为止解决这个问题最简单的方法。
解决现有的分区顺序有点复杂。解决此问题的最简单、最安全的方法是附加新磁盘并迁移。
可以对数据进行适当的洗牌,我之前已经在将PV1的LVM移动到PV2。但由于分区问题,您无法直接应用此解决方案,并且映射未分区的空间losetup --offset
是有风险的,因为您可能会得到错误的偏移量,并且它无法在重新启动后幸存。
另一种选择是转换为 GPT 分区,其中主分区与逻辑分区之间没有区别,因此您可以创建任意数量的分区。但是,这样做会导致系统无法启动,直到您重新安装引导加载程序。如果是 Grub,您还必须创建一个 bios_grub 分区,该分区可以放置在 64 秒到 2047 秒之间(在第一个分区之前,忽略对齐)。
如果pvdisplay
显示not usable x.y MiB
为x >= 1
,则还可以将每个分区缩小 1 MiB,然后在主分区/逻辑分区之间进行转换。收缩是必要的,因为 msdos 逻辑分区信息存储在这些分区之间的间隙中。目前 sda5-sda3-sda4 之间没有这样的间隙,因此它们无法直接映射到逻辑分区。
答案2
一般情况
那是行不通的。至少在不移动数据或更改现有分区的情况下是这样。
如果您已经用完主分区(正如您所拥有的那样),那么您只能添加逻辑分区。但这些必须位于扩展分区的边界内。因此,为了使块设备末尾的新空间可用,扩展分区必须位于其末尾。然后,您可以将其高边界移动到设备的新端并创建新的逻辑分区。
理论上,可以跨主分区扩展扩展分区并创建一个假逻辑分区(绝不能用于任何用途)来“覆盖”主分区,但只要您不知道所有分区工具如何反应对此,这似乎是一场即将发生的灾难,所以我不鼓励这样做。
可能的解决方案
如果这不会导致问题,那么您可以将sda3
和转换sda4
为逻辑分区。我从来没有做过这样的事情。为了工作,我想你必须稍微缩小sda3
、sda4
和 的sda5
大小,因为逻辑分区之间必须有 32K 的间隙(因为它们是作为链表实现的)。
所以你必须
- 将该分区中的文件系统缩小至少 32K
- 将分区的高边界移动这 32K
- 更改扩展分区和主分区条目的大小(最好一次全部更改)。
最简单的方法可能是使用转储分区表sfdisk -d /dev/sda
,进行更改(sda3
到sda6
,sda4
到sda7
)并导入此配置(sfdisk /dev/sda <modified_dump.sfdisk
)。
另一种方法是删除分区(这不会影响其中的数据)并将它们创建为具有相同起始扇区但较小大小的逻辑分区(使用您选择的分区工具)。您应该从不同的介质启动才能执行任一操作。
无论如何:将原始分区表的副本存储在不同的驱动器上!