使用LVM调整硬盘中间扩展分区的大小

使用LVM调整硬盘中间扩展分区的大小

我想添加一个分区来使用 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 MiBx >= 1,则还可以将每个分区缩小 1 MiB,然后在主分区/逻辑分区之间进行转换。收缩是必要的,因为 msdos 逻辑分区信息存储在这些分区之间的间隙中。目前 sda5-sda3-sda4 之间没有这样的间隙,因此它们无法直接映射到逻辑分区。

答案2

一般情况

那是行不通的。至少在不移动数据或更改现有分区的情况下是这样。

如果您已经用完主分区(正如您所拥有的那样),那么您只能添加逻辑分区。但这些必须位于扩展分区的边界内。因此,为了使块设备末尾的新空间可用,扩展分区必须位于其末尾。然后,您可以将其高边界移动到设备的新端并创建新的逻辑分区。

理论上,可以跨主分区扩展扩展分区并创建一个假逻辑分区(绝不能用于任何用途)来“覆盖”主分区,但只要您不知道所有分区工具如何反应对此,这似乎是一场即将发生的灾难,所以我不鼓励这样做。

可能的解决方案

如果这不会导致问题,那么您可以将sda3和转换sda4为逻辑分区。我从来没有做过这样的事情。为了工作,我想你必须稍微缩小sda3sda4和 的sda5大小,因为逻辑分区之间必须有 32K 的间隙(因为它们是作为链表实现的)。

所以你必须

  • 将该分区中的文件系统缩小至少 32K
  • 将分区的高边界移动这 32K
  • 更改扩展分区和主分区条目的大小(最好一次全部更改)。

最简单的方法可能是使用转储分区表sfdisk -d /dev/sda,进行更改(sda3sda6sda4sda7)并导入此配置(sfdisk /dev/sda <modified_dump.sfdisk)。

另一种方法是删除分区(这不会影响其中的数据)并将它们创建为具有相同起始扇区但较小大小的逻辑分区(使用您选择的分区工具)。您应该从不同的介质启动才能执行任一操作。

无论如何:将原始分区表的副本​​存储在不同的驱动器上!

相关内容