LVM 基础操作:扩容

之前创建的VM只给了32GB的空间,Ubuntu Server默认创建了LVM。后来发现不够大,于是PVE上面给VM加了32GB的空间,但是VM里面还需要进行操作才能使用这部分空间。这篇日志就记录一下这个过程,顺便记录一下LVM的一些基础操作命令。

查看信息

首先扫描一下目前在使用的Logic Volume 和 Physical Volume

$ sudo lvscan
# output:
  ACTIVE            '/dev/ubuntu-vg/ubuntu-lv' [<31.00 GiB] inherit

$ sudo pvscan
# output:
  PV /dev/sda3   VG ubuntu-vg       lvm2 [<62.00 GiB / 31.00 GiB free]
  Total: 1 [<62.00 GiB] / in use: 1 [<62.00 GiB] / in no VG: 0 [0   ]

可以看到Logical Volume 只有32GB (31 actually),而Physical Volume有64GB (62 actually)(如果PV没有增大,请转去 附录2 部分)。

如果要看更多的信息,要用pvdisplaylvdisplay

$ sudo pvdisplay

# output
  --- Physical volume ---
  PV Name               /dev/sda3
  VG Name               ubuntu-vg
  PV Size               <62.00 GiB / not usable 0   
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              15871
  Free PE               7936
  Allocated PE          7935
  PV UUID               Xab6Y5-ngT4-IhWw-E1kB-GKMf-F4Uz-XXXXXX

$ sudo lvdisplay

# output
--- Logical volume ---
  LV Path                /dev/ubuntu-vg/ubuntu-lv
  LV Name                ubuntu-lv
  VG Name                ubuntu-vg
  LV UUID                1oegcQ-9kZO-sgsz-svPc-p18U-IGib-XXXXXX
  LV Write Access        read/write
  LV Creation host, time ubuntu-server, 2023-04-07 22:17:26 +0000
  LV Status              available
  # open                 1
  LV Size                <31.00 GiB
  Current LE             7935
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

别忘了LVM里面,将 logical volume 和 Physical Volume 组合起来的中间层: Volume Group

$ sudo vgdisplay

# output
  --- Volume group ---
  VG Name               ubuntu-vg
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <62.00 GiB
  PE Size               4.00 MiB
  Total PE              15871
  Alloc PE / Size       7935 / <31.00 GiB
  Free  PE / Size       7936 / 31.00 GiB
  VG UUID               iOs22a-Dh2K-zMJU-PVyI-ipsg-fCK9-OxMnXS

这里可以看到,VG实际上是直接就增大了的。

最后看下基础的 fdisk -l ,看一下当前的挂载情况

$ sudo fdisk -l

# output
...
Disk /dev/sda: 64 GiB, 68719476736 bytes, 134217728 sectors
Disk model: QEMU HARDDISK   
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: 5A6D46D9-72DA-49F5-88E0-966CEC3E22E2

Device       Start       End   Sectors Size Type
/dev/sda1     2048      4095      2048   1M BIOS boot
/dev/sda2     4096   4198399   4194304   2G Linux filesystem
/dev/sda3  4198400 134215679 130017280  62G Linux filesystem


Disk /dev/mapper/ubuntu--vg-ubuntu--lv: 31 GiB, 33281802240 bytes, 65003520 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


# Check df -h output
$ df -h

#output
Filesystem                         Size  Used Avail Use% Mounted on
tmpfs                              393M  1.7M  391M   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   31G   21G  7.9G  73% /
tmpfs                              2.0G     0  2.0G   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
/dev/sda2                          2.0G  218M  1.6G  12% /boot
tmpfs                              393M  8.0K  393M   1% /run/user/1000

结合 df -h 的输出可以看到,从fdisk看来,/dev/mapper/ubuntu--vg-ubuntu--lv 是真正被 fdisk 当作 disk partition,挂载在根目录下的。而 /dev/sda3 这个分区实际上没有直接挂载。这个分区实际上是被 LVM 当作 PV 了。

扩容

这里用到的是 lvextend命令。

$ sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv

# output
  Size of logical volume ubuntu-vg/ubuntu-lv changed from <31.00 GiB (7935 extents) to <62.00 GiB (15871 extents).
  Logical volume ubuntu-vg/ubuntu-lv successfully resized.

其中 /dev/ubuntu-vg/ubuntu-lv 是 LV的path。这个是从 lvdisplay 里面拿到的。

而直接使用 lvextend 的条件是,VG上面有多余的空间。因为是PVE环境,VM的harddisk空间直接改变了,所以同一个PV的空间直接变大了,相应的VG就变大了。如果是Bare Metal的环境,通常还需要 pvcreate 给新的磁盘创建PV,然后用 vgextend 把新创建的 PV 加入到 VG 里面。然后才能用 lvextend 使用VG里面的新空间。

到这里还没完,挂载的文件系统目前还不能使用新的空间。File system还没有扩容

  • 如果是没有使用LVM的VM,则在PVE里面的Harddisk里面给VM扩容之后,还需要用 growpart。然后就是下面这一步了。

通常扩展分区(partition),就是直接使用 resize2fs 工具

$ sudo resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv

# output:
resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/mapper/ubuntu--vg-ubuntu--lv is mounted on /; on-line resizing required
old_desc_blocks = 4, new_desc_blocks = 8
The filesystem on /dev/mapper/ubuntu--vg-ubuntu--lv is now 16251904 (4k) blocks long.

# df -h
Filesystem                         Size  Used Avail Use% Mounted on
tmpfs                              393M  1.7M  391M   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   61G   21G   38G  37% /
tmpfs                              2.0G     0  2.0G   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
/dev/sda2                          2.0G  218M  1.6G  12% /boot
tmpfs                              393M  8.0K  393M   1% /run/user/1000

附录:对于没有使用LVM的 Ext4 FS的扩容

同样是Ubuntu VM环境下:

 # Use root
 sudo -i
 
 # Check the current disk partitions and the current size
 fdisk -l
 
 # Call grow part, assume the partition to expand is /dev/sda2, make sure there is no /dev/sda3
# Note the ' ' between 'sda' and '2'.
 growpart /dev/sda 2
 
 # Then use resize2fs
 resize2fs /dev/sda2
 
 # Check the size now.
 fdisk -l

附录2:PV显示没有多余的空间

后续的一次扩容(从64GB到128GB)发现pvdisplay 没有显示多分配出来的空间。故而发现有时直接用 lvextend 肯定是不行的。(参考文章:How to Extend Linux LVM Logical Volume

  • 首先用 fdisk -l /dev/sda 检查一下,确认/dev/sda有128GB,但是 /dev/sda3 只有62GB。
  • pvdisplay 确认 PV 是用的 /dev/sda3 这个partition 做 physical volume,同样大小只有62GB。

接下来是具体步骤

  • 扩容 /dev/sda3,用 cfdisk
$ sudo cfdisk

# Then, use "resize" tool to extend the size of /dev/sda3
# First "write" then "quit"
  • pvdisplay 验证,这时实际上 PV 的大小还么有变。
  • pvresize 扩容 PV
$ sudo pvresize /dev/sda3

# Then use "pvdisplay" 验证 PV 扩容
  • 用 lvextend 扩容 LV
$ sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
  • Resize用来做FS的那个 mapper
$ sudo resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv