首先说一下在缩小逻辑卷的时候要注意的问题:第一步使用resize2fs命令更改文件系统的容量;第二步使用lvreduce命令减小逻辑卷的容量。这两个顺序千万不要搞反了,而且要保证缩减后的逻辑卷容量大于等于实际更改后的文件系统大小,否则你的逻辑卷就不能正常使用了
LVM体系结构
LVM(逻辑卷管理器),可以将几个物理分区(或磁盘)通过软件组合成为一个看起来独立的大磁盘,并且可以灵活的调整卷的大小。LVM是由VG(卷组)、PV(物理卷)、LV(逻辑卷)和PE(物理扩展块)组成。
物理存储介质(The Physical Media)
这里指系统的存储设备,如:/dev/sda、/dev/sdb等等,是存储系统最低层的存储单元。
物理卷(PV, Physical Volume)
物理卷就是指磁盘、磁盘分区或从逻辑上和磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有和LVM相关的管理参数。
卷组(VG, Volume Group)
LVM卷组类似于非LVM系统中的物理硬盘,其由物理卷组成。能在卷组上创建一个或多个“LVM分区”(逻辑卷),LVM卷组由一个或多个物理卷组成。
逻辑卷(LV, Logical Volume)
LVM的逻辑卷类似于非LVM系统中的硬盘分区,在逻辑卷之上能建立文件系统(比如/home或/usr等)。
PE(physical extent)
每一个物理卷被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是能被LVM寻址的最小单元。PE的大小是可设置的,默认为4MB。
LE(logical extent)
逻辑卷也被划分为被称为LE(Logical Extents) 的可被寻址的基本单位。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。
创建LV有两种方式,一种是基于磁盘的,另外一种是基于分区的,如果是基于分区的就必须先通过fdisk或parted方式划分好分区,但不要格式化来进行pvcreate创建处理卷;如果基于磁盘的就不需要创建分区了,直接就可以通过pvcreate来创建物理卷。因为只有创建好了物理卷之后才能添加到卷组,并在卷组里面创建逻辑卷,后格式化才能存放数据。
这里,我以基于磁盘的方式创建LV。
创建物理卷PV
假设我们的系统已经挂载了一块尚未使用的硬盘,通过fdisk -l命令可以看到系统中所有的硬盘
Copy[root@node1 ~]# fdisk -l | grep sd
Disk /dev/sda: GB, bytes
/dev/sda1 * 1 Linux
/dev/sda2 8e Linux LVM
Disk /dev/sdb: MB, bytes
Disk /dev/sdc: MB, bytes
[root@node1 ~]#
这里可以看到我的系统中有三块硬盘sda、sdb、sdc,其中sda已经被划分成2个分区。
现在我们来利用sdb、sdc这两块盘,创建两个PV
Copy[root@node1 ~]# pvcreate /dev/sdb /dev/sdc
Physical volume "/dev/sdb" successfully created
Physical volume "/dev/sdc" successfully created
[root@node1 ~]#
[root@node1 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 vg_node1 lvm2 a-- .80g 3.14g
/dev/sdb vgtest lvm2 a-- .00m .00m
/dev/sdc lvm2 a-- 1.00g 1.00g
[root@node1 ~]# pvscan
PV /dev/sdb VG vgtest lvm2 [ MiB / MiB free]
PV /dev/sda2 VG vg_node1 lvm2 [ GiB / GiB free]
PV /dev/sdc lvm2 [ GiB]
Total: 3 [ GiB] / in use: 2 [ GiB] / in no VG: 1 [ GiB]
[root@node1 ~]#
如上所示,使用pvcreate命令创建PV,然后使用pvs或pvscan可以查看系统中已有的PV。
到这里,物理卷就创建完成了,接下来我们用这两个PV来创建一个卷组。
创建卷组VG
我们先用其中一个PV来创建VG
Copy[root@node1 ~]# vgcreate vgtest /dev/sdb
Volume group "vgtest" successfully created
[root@node1 ~]#
[root@node1 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg_node1 1 3 0 wz--n- .80g 3.14g
vgtest 1 0 0 wz--n- .00m .00m
[root@node1 ~]# vgscan
Reading all physical volumes. This may take a while...
Found volume group "vgtest" using metadata type lvm2
Found volume group "vg_node1" using metadata type lvm2
[root@node1 ~]#
这里,我们 vgcreate命令创建了一个名叫vgtest的卷组,然后使用vgs或vgscan可以查看已创建的vg。
现在我们已经成功创建了一个卷组,接下来就可以根据需要来创建逻辑卷LV了
创建逻辑卷LV
Copy[root@node1 ~]# lvcreate -L 1000M -n lvtest vgtest
Logical volume "lvtest" created
[root@node1 ~]#
这里我们使用lvcreate命令创建了一个名叫lvtest的逻辑卷,大小为1000M
简单介绍一下lvcreate命令的参数
-L:指定逻辑卷的大小,单位为“kKmMgGtT”字节
-l:指定逻辑卷的大小(LE数)
-n: 指定逻辑卷的名字
逻辑卷创建后,还需要进行格式化操作,否则不能使用,使用mkfs命令来进行格式化,如下所示,我们把这个逻辑卷格式化为ext4文件系统
Copy[root@node1 ~]# mkfs.ext4 /dev/mapper/vgtest-lvtest
mke2fs (-May-)
文件系统标签=
操作系统:Linux
块大小= (log=2)
分块大小= (log=2)
Stride=0 blocks, Stripe width=0 blocks
inodes, blocks
blocks (%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks= block groups
blocks per group, fragments per group
inodes per group
Superblock backups stored on blocks:
, , ,
正在写入inode表: 完成
Creating journal ( blocks): 完成
Writing superblocks and filesystem accounting information: 完成
This filesystem will be automatically checked every mounts or
days, whichever comes first. Use tune2fs -c or -i to override.
[root@node1 ~]#
到此为止,逻辑卷建立完成,你可以把它挂载到一个空闲目录下(注意:如果挂载的非空闲目录下,原来目录中的内容会被隐藏,不是覆盖哦,但你取消挂载后,被隐藏的内容就会再次出现)
Copy[root@node1 ~]# mkdir /test/
[root@node1 ~]# mount /dev/mapper/vgtest-lvtest /test
[root@node1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_node1-lvroot 9.7G 3.4G 5.8G % /
tmpfs 491M 72K 491M 1% /dev/shm
/dev/sda1 194M 30M 155M % /boot
/dev/mapper/vg_node1-lvhome 4.9G 153M 4.5G 4% /home
/dev/mapper/vgtest-lvtest 1000M 18M 936M 2% /test
[root@node1 ~]#
逻辑卷LV扩容
假如你的逻辑卷容量不够了,需要扩容,有两种情况:一是你的VG中还有剩余空间,那么可以直接使用VG中剩余的空间进行扩容;二是你的VG中没有空间或者是空间不足了,那你需要先扩容VG,在扩容LV。。第二种只是比第一种情况多了一步扩容VG的操作,所以这里我们以第二种情况为例进行介绍。
这里我们使用刚才未使用的另一块PV来扩容我们的卷组vgtest。
Copy[root@node1 ~]# vgextend vgtest /dev/sdc
Volume group "vgtest" successfully extended
[root@node1 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg_node1 1 3 0 wz--n- .80g 3.14g
vgtest 2 1 0 wz--n- 1.99g .00m
[root@node1 ~]#
使用vgextend命令扩容卷组,这里可以看到我们vgtest容量已经增加了一倍,接下来开始扩容逻辑卷
Copy[root@node1 ~]# lvextend -L +500M /dev/mapper/vgtest-lvtest
Extending logical volume lvtest to GiB
Logical volume lvtest successfully resized
[root@node1 ~]# df -h /test
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vgtest-lvtest 1004M 18M 936M 2% /test
[root@node1 ~]#
如上所示,我们使用lvextend命令将lvtest扩容到1.48G,但是为什么用df -h /test命令看到的lvtest空间并没有改变的,这里还需要一步操作才能使lvtest的空间改变生效
Copy[root@node1 ~]# resize2fs /dev/mapper/vgtest-lvtest
resize2fs (-May-)
Filesystem at /dev/mapper/vgtest-lvtest is mounted on /test; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/mapper/vgtest-lvtest to (4k) blocks.
The filesystem on /dev/mapper/vgtest-lvtest is now blocks long.
[root@node1 ~]#
到此,我们的LV扩容已经成功了
缩小LV容量
介绍完LV的扩容,我们再来说说如何缩小LV容量。假设我们想缩小lvtest的容量,并将/dev/sdc从vgtest中抽离出去,我们需要这样进行:
Copy#首先降低文件系统容量
[root@node1 ~]# resize2fs /dev/mapper/vgtest-lvtest 900M
resize2fs (-May-)
Filesystem at /dev/mapper/vgtest-lvtest is mounted on /test; on-line resizing required
On-line shrinking from to not supported.
#这里提示我们lvtest已经被挂载,不能在线缩小逻辑卷容量,所以要先取消挂载
[root@node1 ~]# umount /dev/mapper/vgtest-lvtest
[root@node1 ~]# resize2fs /dev/mapper/vgtest-lvtest 900M
resize2fs (-May-)
请先运行 'e2fsck -f /dev/mapper/vgtest-lvtest'.
#这里提示我们先运行e2fsck命令,按照提示操作即可
[root@node1 ~]# e2fsck -f /dev/mapper/vgtest-lvtest
e2fsck (-May-)
第一步: 检查inode,块,和大小
第二步: 检查目录结构
第3步: 检查目录连接性
Pass 4: Checking reference counts
第5步: 检查簇概要信息
/dev/mapper/vgtest-lvtest: / files (% non-contiguous), / blocks
[root@node1 ~]# resize2fs /dev/mapper/vgtest-lvtest 900M
resize2fs (-May-)
Resizing the filesystem on /dev/mapper/vgtest-lvtest to (4k) blocks.
The filesystem on /dev/mapper/vgtest-lvtest is now blocks long.
#这里可以看到文件系统已经成功缩小了,接下来缩小逻辑卷的大小,请注意一定要保证缩小后的逻辑卷空间大于或等于resize2fs命令缩小后的文件系统大小,否则该逻辑卷就出错不能正常使用了(很不幸,我就是在这里踩雷了~)。我们可以先使用pvdisplay命令查看/dev/sdc的信息
[root@node1 ~]# pvdisplay /dev/sdc
--- Physical volume ---
PV Name /dev/sdc
VG Name vgtest
PV Size GiB / not usable MiB
Allocatable yes
PE Size MiB
Total PE
Free PE
Allocated PE 0
PV UUID l4VpXe-wbwu-jSkq-jv8J-Qw8X-V5t3-1fAfBE
#可以看到PE块大小是4M,共有个PE块,所以我们可以从lvtest中减小个PE
[root@node1 ~]# lvreduce -l /dev/mapper/vgtest-lvtest
WARNING: Reducing active logical volume to MiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lvtest? [y/n]: y
Reducing logical volume lvtest to MiB
Logical volume lvtest successfully resized
#上面会有告警信息,但是我们实际的数据量(900M)比1020M小,所以按y继续吧
[root@node1 ~]# mount /dev/mapper/vgtest-lvtest /test
[root@node1 ~]# df -h /test
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vgtest-lvtest 885M 34M 806M 5% /test
#重新挂载该逻辑卷,查看其大小,
# 接下来就是移除/dev/sdc了
[root@node1 ~]# pvdisplay /dev/sdb /dev/sdc
--- Physical volume ---
PV Name /dev/sdb
VG Name vgtest
PV Size GiB / not usable MiB
Allocatable yes (but full)
PE Size MiB
Total PE
Free PE 0
Allocated PE
PV UUID RUQhfR-5XLv-Xhgg-mbFH-M2dp-Cust-myRojW
--- Physical volume ---
PV Name /dev/sdc
VG Name vgtest
PV Size GiB / not usable MiB
Allocatable yes
PE Size MiB
Total PE
Free PE
Allocated PE 0
PV UUID l4VpXe-wbwu-jSkq-jv8J-Qw8X-V5t3-1fAfBE
# 使用pvdisplay命令查看/dev/sdb /dev/sdc的信息,可以看到/dev/sdc是完全空闲的,所以可以直接移除
[root@node1 ~]# vgreduce vgtest /dev/sdc
Removed "/dev/sdc" from volume group "vgtest"
[root@node1 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 vg_node1 lvm2 a-- .80g 3.14g
/dev/sdb vgtest lvm2 a-- .00m 0
/dev/sdc lvm2 a-- 1.00g 1.00g
#可以看到/dev/sdc 已经不属于vgtest了
到此为止,lv的缩小就介绍完了,不过我们再小小的扩展一下,假设我们刚才对lvtest进行缩减后,发现/dev/sdc的PE还有被使用的,那这是就不能直接移除sdc了,需要先进行PE的转移,将/dev/sdc中的已使用PE全部转移到其他空间充足的PV中,比如说执行pvmove /dev/sdc /dev/sdb,然后就可以从vgtest中移除/dev/sdc。
注:文章有所借鉴
文章以switchchow.github.io 为主【均为个人博客】