本文的所有操作届在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分区,原理图见下:
因此,现在需要做的就是将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命令,发现占用量百分比降低了,新的空间生效了。