本文的所有操作届在Ubuntu 12.04 LTS上验证成功,其他发行版请自行查阅相关命令。

给某台服务器或者虚拟机VM进行LVM扩容的前提是,这台机器在安装创建的时候开启了LVM功能。

对于服务器来说,需要扩容时,你可能已经准备好了一个新的磁盘,系统检测到为/sdb,而对于云服务器或者虚拟机来说,可能是vm控制器已经将你的虚拟物理磁盘扩容了,只不过你的系统还没有利用到这些空间而已。比如用vmware fusion,点击扩容功能之后进入系统输入fdisk,发现磁盘分区没有变化,但是多出了一块未使用的物理空间。

首先介绍LVM的几个概念:

    1. 物理卷Physical volume (PV):可以在上面建立卷组的媒介,可以是硬盘分区,也可以是硬盘本身或者回环文件(loopback file)。物理卷包括一个特殊的header,其余部分被切割为一块块物理区域(physical extents)。 Think of physical volumes as big building blocks which can be used to build your hard drive.

    2. 卷组Volume group (VG):将一组物理卷收集为一个管理单元。Group of physical volumes that are used as storage volume (as one disk). They contain logical volumes. Think of volume groups as hard drives.

    3. 逻辑卷Logical volume (LV):虚拟分区,由物理区域(physical extents)组成。A "virtual/logical partition" that resides in a volume group and is composed of physical extents. Think of logical volumes as normal partitions.

    4. 物理区域Physical extent (PE):硬盘可供指派给逻辑卷的最小单位(通常为4MB)。A small part of a disk (usually 4MB) that can be assigned to a logical Volume. Think of physical extents as parts of disks that can be allocated to any partition.

02@02-vm:~$ sudo df

Filesystem                        1K-blocks    Used Available Use% Mounted on

/dev/mapper/02--vm--vg-root  38057472 3501084  32802424  10% /

udev                                1011124       4   1011120   1% /dev

tmpfs                                204196     500    203696   1% /run

none                                   5120       0      5120   0% /run/lock

none                                1020968       0   1020968   0% /run/shm

cgroup                              1020968       0   1020968   0% /sys/fs/cgroup

/dev/sda1                            240972   34482    194049  16% /boot

/dev/loop0                          4872572   32928   4839644   1% /srv/node/vdb

输入df可发现,/挂载点使用的设备是/dev/mapper/xxx,并不是传统的/dev/sdax。

输入lvdisplay,显示当前正在使用的logical volume(注意这里目前有两个,一个是文件系统所在的volume,另一个是swap分区使用的volume,当然,我们需要扩容的是第一个):

02@02-vm:~$ sudo lvdisplay

  --- Logical volume ---

  LV Name                /dev/02-vm-vg/root

  VG Name                02-vm-vg

  LV UUID                vC3dCP-ynJq-qwbf-ZwwX-T1ca-tOo6-5FYVNg

  LV Write Access        read/write

  LV Status              available

  # open                 1

  LV Size                19.00 GiB

  Current LE             9472

  Segments               3

  Allocation             inherit

  Read ahead sectors     auto

  - currently set to     256

  Block device           252:0

  --- Logical volume ---

  LV Name                /dev/02-vm-vg/swap_1

  VG Name                02-vm-vg

  LV UUID                PT5spg-Ll4p-WAij-g2QB-PSmu-qaIr-gxc6Nf

  LV Write Access        read/write

  LV Status              available

  # open                 2

  LV Size                2.00 GiB

  Current LE             511

  Segments               1

  Allocation             inherit

  Read ahead sectors     auto

  - currently set to     256

  Block device           252:1

输入vgdisplay,显示当前的volume group,注意VG SIZE,这里应该是你当前的可用空间大小,待扩容完毕,这里显示的应该是最终的大小。

02@02-vm:~$ sudo vgdisplay

  --- Volume group ---

  VG Name               02-vm-vg

  System ID

  Format                lvm2

  Metadata Areas        2

  Metadata Sequence No  5

  VG Access             read/write

  VG Status             resizable

  MAX LV                0

  Cur LV                2

  Open LV               2

  Max PV                0

  Cur PV                2

  Act PV                2

  VG Size               19.75 GiB

  PE Size               4.00 MiB

  Total PE              10177

  Alloc PE / Size       9983 / 39.00 GiB

  Free  PE / Size       194 / 776.00 MiB

  VG UUID               GFrHkW-EZFQ-vuCo-b4Pp-F1Lm-FV8B-NcbMmD

输入pvdisplay,显示当前的physical volume,

02@02-vm:~$ sudo pvdisplay

  --- Physical volume ---

  PV Name               /dev/sda5

  VG Name               02-vm-vg

  PV Size               19.76 GiB / not usable 2.00 MiB

  Allocatable           yes (but full)

  PE Size               4.00 MiB

  Total PE              5058

  Free PE               0

  Allocated PE          5058

  PV UUID               RsGi6C-g0lm-SzJ1-9rw4-dMEi-Q633-9wo1Gd 

现在开始进行LVM扩容:

1. 首先查看fdisk

$ sudo fdisk -l

   Device Boot      Start         End      Blocks   Id  System

/dev/sda1   *        2048      499711      248832   83  Linux

/dev/sda2          501760    41940991    20719616    5  Extended

/dev/sda5          501760    41940991    20719616   8e  Linux LVM

因为这台机器默认开启了LVM,所以目前有一个extended分区和一个LVM分区,并且他们是完全重叠的。

这是因为,LVM分区作为一个虚拟的分区,完全占用了这个extended分区,原理图见下:

磁盘 - 使用LVM进行磁盘扩容(fdisk, LVM, pvcreate, lvcreate, parted)_第1张图片

因此,现在需要做的就是将extended partition (sda2)扩展到最大,然后创建一个新的LVM logical partition (sda6),用它来填满sda2。

使用parted命令来扩展sd2:进入parted交互模式后,可以使用help xxx来提示帮助。

help resize

resize NUMBER START END                  resize partition NUMBER and its file system

这里number输入2, start和end参见fdisk的数据(不过parted已经足够智能地将start默认值设置成了sda5的结束,end默认值设置成物理磁盘的末尾)

接着,回到fdisk,使用它创建一个新的logical分区

n(new) -> l(logical);再选择t,更改这个分区的类型id,设置成8e,即LVM,默认创建的类型不是LVM;w,保存退出;重启。

这时候,再查看fdisk,发现已经多了一个sda6了,现在要做的就是将sda6作为一个pv,加入到vg里来,从而能够给lv扩容。(忘了关键词的话请查上文)

sudo pvcreate /dev/sda6

pvdisplay

# vgextend - add physical volumes to a volume group

# 将新的pv加入到原有的vg

sudo vgextend your_vg_name /dev/sda6

vgdisplay,发现free size多了一块。

# lvresize - resize a logical volume

# 扩大当前正在使用的lv,从vg中取剩余空间

最后一步,磁盘扩容完毕了,需要扩容文件系统。目前较新的内核都支持在线扩容了,不需要像以前那样mount umount来回折腾了。

resize2fs [ -fFpPM ] [ -d debug-flags ] [ -S RAID-stride ] device [ size ]

只需要输入device就行了,size参数不填的话,默认使用整个分区的size。

注意这里的device是虚拟设备lv的名称,并不是sdax这样的物理设备了,我的环境下是/dev/02-vm-vg/root

扩容完文件系统后重启,再查看df命令,发现占用量百分比降低了,新的空间生效了。

使用LVM进行磁盘扩容(fdisk, <wbr>LVM, <wbr>pvcreate, <wbr>lvcreate, <wbr>parted)