«

Lvm

指尖二进制 • 1 年前 • 570 次点击 •


[TOC]

lvm的基本概念
问题:对于生产环境下的服务器来说,如果存储数据的分区磁盘空间不够了怎么办?
答:只能换一个更大的磁盘。如果用了一段时间后,空间又不够了,怎么办?再加一块更大的?换磁盘的过程中,还需要把数据从一个硬盘复制到另一个硬盘,过程太慢了。
解决方案:使用LVM在线动态扩容。

LVM的工作原理
LVM(Logical Volume Manager)逻辑卷管理,是在磁盘分区和文件系统之间添加的一个逻辑层,来为文件系统屏蔽下层磁盘分区布局,提供一个抽象的盘卷,在盘卷上建立文件系统。管理员利用LVM可以在磁盘不用重新分区的情况下动态调整文件系统的大小,并且利用LVM管理的文件系统可以跨越磁盘,当服务器添加了新的磁盘后,管理员不必将原有的文件移动到新的磁盘上,而是通过LVM可以直接扩展文件系统跨越磁盘。
它就是通过将底层的物理硬盘封装起来,然后以逻辑卷的方式呈现给上层应用。在LVM中,其通过对底层的硬盘进行封装,当我们对底层的物理硬盘进行操作时,其不再是针对于分区进行操作,而是通过一个叫做逻辑卷的东西来对其进行底层的磁盘管理操作。

LVM常用的术语
物理存储介质(The physical media):LVM存储介质可以是磁盘分区,整个磁盘,RAID阵列或SAN磁盘,设备必须初始化为LVM物理卷,才能与LVM结合使用。
物理卷PV(physical volume):物理卷就是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数,创建物理卷它可以用硬盘分区,也可以用硬盘本身。
卷组VG(Volume Group):一个LVM卷组由一个或多个物理卷组成。
逻辑卷LV(logical volume):LV建立在VG之上,可以在LV之上建立文件系统。
PE(physical extents):PV物理卷中可以分配的最小存储单元,PE的大小是可以指定的,默认为4MB。
LE(logical extent):LV逻辑卷中可以分配的最小存储单元,在同一个卷组中,LE的大小和PE是相同的,并且一一对应。

最小存储单位总结:
名称 最小存储单位
硬盘 扇区(512字节)
文件系统 block(1K或4K ) # mkfs.ext4 -b 2048 /dev/sdb1 #最大支持到4096
raid chunk (512K) # mdadm -C -v /dev/md5 -l 5 -n 3 -c 512 -x 1 /dev/sde{1,2,3,5}
LVM PE (4M) # vgcreate -s 4M vg1 /dev/sdb{1,2}

LVM主要元素构成:

总结:多个磁盘/分区/raid--->多个物理卷PV--->合成卷组VG--->从VG划出逻辑卷LV--->格式化LV挂载使用

LVM优点
使用卷组,使多个硬盘空间看起来像是一个大的硬盘。
使用逻辑卷,可以跨多个硬盘空间的分区 sdb1 sdb2 sdc1 sdd2 sdf。
在使用逻辑卷时,它可以在空间不足时动态调整它的大小。
在调整逻辑卷大小时,不需要考虑逻辑卷在硬盘上的位置,不用担心没有可用的连续空间。
可以在线对LV、VG进行创建,删除,调整大小等操作。LVM上的文件系统也需要重新调整大小。
允许创建快照,可以用来保存文件系统的备份。
RAID+LVM一起用:LVM是软件的卷管理方式,而RAID是磁盘管理的方法。对于重要的数据,使用RAID来保护物理的磁盘不会因为故障而中断业务,再用LVM用来实现对卷的良性的管理,更好的利用磁盘资源。

创建LVM的基本步骤
1)物理磁盘被格式化为PV,(空间被划分为一个个的PE)(PV包含PE)
2)不同的PV加入到同一个VG中,(不同PV的PE全部进入到了VG的PE池内)(VG包含PV)
3)在VG中创建LV逻辑卷,基于PE创建,(组成LV的PE可能来自不同的物理磁盘)(LV基于PE创建)
4)LV直接可以格式化后挂载使用(格式化挂载使用)
5)LV的扩充缩减实际上就是增加或减少组成该LV的PE数量,其过程不会丢失原始数据

lvm常用的命令

功能PV管理命令VG管理命令LV管理命令
scan 扫描pvscanvgscanlvscan
create 创建pvcreatevgcreatelvcreate
display显示pvdisplayvgdisplaylvdisplay
remove 移除pvremovevgremovelvremove
extend 扩展vgextendlvextend
reduce 减少vgreducelvreduce

下面的操作会用的一些查看命令

查看卷名简单对应卷信息的查看扫描相关的所有的对应卷详细对应卷信息的查看
物理卷pvspvscanpvdisplay
卷组vgsvgscanvgdisplay
逻辑卷lvslvscanlvdisplay

创建并使用LVM逻辑卷

创建PV添加一个sdb磁盘
创建4个主分区每个分区1G

[root@localhost ~]# fdisk /dev/sdb
[root@localhost ~]# ls /dev/sdb*
/dev/sdb  /dev/sdb1  /dev/sdb2  /dev/sdb3  /dev/sdb4

设定分区类型代码:fdisk /dev/sdb ---> t ---> 选择分区号 ---> 8e ---> w
注:现在系统已经很智能了, 直接使用默认的 83 Linux分区,也可以创建pv的。

创建pv

[root@localhost ~]# pvcreate /dev/sdb{1,2,3,4}
  Physical volume "/dev/sdb1" successfully created.
  Physical volume "/dev/sdb2" successfully created.
  Physical volume "/dev/sdb3" successfully created.
  Physical volume "/dev/sdb4" successfully created.

查看物理卷信息

[root@localhost ~]# pvdisplay /dev/sdb1
  "/dev/sdb1" is a new physical volume of "1.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name
  PV Size               1.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               VgSsC0-nmAj-OIxo-vAkL-a2jQ-0OU6-F4HYpc

创建vg卷组
语法:vgcreate vg名字 pv的名字 (可以跟多个pv)

[root@localhost ~]# vgcreate vg01 /dev/sdb1
  Volume group "vg01" successfully created

查看创建vg信息

[root@localhost ~]# vgs
  VG   #PV #LV #SN Attr   VSize    VFree
  vg01   1   0   0 wz--n- 1020.00m 1020.00m
[root@localhost ~]# vgdisplay vg01
  --- Volume group ---
  VG Name               vg01
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               1020.00 MiB
  PE Size               4.00 MiB
  Total PE              255
  Alloc PE / Size       0 / 0
  Free  PE / Size       255 / 1020.00 MiB
  VG UUID               q3dapQ-lUR7-zRIL-0exR-fmfx-eWWu-pMbP7E

创建LV
lvcreate -n 指定新逻辑卷的名称、-L指定lv大小的SIZE(M,G)、(-l:小l指定LE的数量)vgname

[root@localhost ~]# lvcreate -n lv01 -L 16M vg01
  Logical volume "lv01" created.
[root@localhost ~]# lvcreate -n lv02 -l 4 vg01
  Logical volume "lv02" created.
[root@localhost ~]# lvs
  LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv01 vg01 -wi-a----- 16.00m
  lv02 vg01 -wi-a----- 16.00m
[root@localhost ~]# pvdisplay /dev/sdb1
  --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               vg01
  PV Size               1.00 GiB / not usable 4.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              255
  Free PE               247
  Allocated PE          8 # Allocated['æləkeɪtɪd]分配,已经使用了8个PE
  PV UUID               VgSsC0-nmAj-OIxo-vAkL-a2jQ-0OU6-F4HYpc

[root@localhost ~]# vgdisplay vg01
  。。。。。。
  Alloc PE / Size       8 / 32.00 MiB #已经使用8个PE,32MB
  Free  PE / Size       247 / 988.00 MiB

文件系统格式与挂载

[root@localhost ~]# mkdir /lv01 #查看逻辑卷
[root@localhost ~]# ll /dev/vg01/lv0
lv01  lv02 
[root@localhost ~]# ll /dev/vg01/lv01  #其实lv01是dm-0的软链接
lrwxrwxrwx. 1 root root 7 11月  3 00:08 /dev/vg01/lv01 -> ../dm-0
[root@localhost ~]# mkfs.xfs /dev/vg01/lv01 
meta-data=/dev/vg01/lv01         isize=512    agcount=1, agsize=4096 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=4096, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=855, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@localhost ~]# mount /dev/vg01/lv01 /lv01/
[root@localhost ~]# df -Th /lv01/
文件系统              类型  容量  已用  可用 已用% 挂载点
/dev/mapper/vg01-lv01 xfs    13M  896K   12M    7% /lv01
[root@localhost ~]# echo "/dev/vg01/lv01 /lv01 xfs defaults 0 0" >> /etc/fstab 

指定PE大小用

指定PE大小用的参数:-s,如果存储的数据都是大文件,那么PE尽量调大,读取速度快

[root@localhost ~]# vgcreate -s 16M vg02 /dev/sdb2
  Volume group "vg02" successfully created

PE的大小只有为2的幂数,且最大为512M

查看vg是否使用了16M

[root@localhost ~]# vgdisplay vg02
  --- Volume group ---
  VG Name               vg02
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               1008.00 MiB
  PE Size               16.00 MiB
  Total PE              63
  Alloc PE / Size       0 / 0
  Free  PE / Size       63 / 1008.00 MiB
  VG UUID               4TTPDV-RuJQ-c2j5-Tvit-Namb-lUsX-WqAapB

LV扩容

用的命令:extend扩展 vgextend lvextend
首先,确定一下是否有可用的扩容空间,因为空间是从VG里面创建的,并且LV不能跨VG扩容

[root@localhost ~]# vgs
  VG   #PV #LV #SN Attr   VSize    VFree
  vg01   1   2   0 wz--n- 1020.00m  988.00m
  vg02   1   0   0 wz--n- 1008.00m 1008.00m

扩容逻辑卷

[root@localhost ~]# vgs
  VG   #PV #LV #SN Attr   VSize    VFree
  vg01   1   2   0 wz--n- 1020.00m  988.00m
  vg02   1   0   0 wz--n- 1008.00m 1008.00m
[root@localhost ~]# lvextend -L +30m /dev/vg01/lv01 
  Rounding size to boundary between physical extents: 32.00 MiB.
  Size of logical volume vg01/lv01 changed from 16.00 MiB (4 extents) to 48.00 MiB (12 extents).
  Logical volume vg01/lv01 successfully resized.
[root@localhost ~]# lvs
  LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv01 vg01 -wi-ao---- 48.00m   #LV已经扩容成功
  lv02 vg01 -wi-a----- 16.00m  
[root@localhost ~]# df -Th /lv01
文件系统              类型  容量  已用  可用 已用% 挂载点
/dev/mapper/vg01-lv01 xfs    13M  896K   12M    7% /lv01
注:可以看到LV虽然扩展了,但是文件系统大小还是原来的,下面开始扩容文件系统

ext4文件系统扩容使用命令语法:resize2fs 逻辑卷名称
xfs文件系统扩容使用命令语法:xfs_growfs 挂载点
resize2fs和xfs_growfs 两者的区别是传递的参数不一样的,xfs_growfs是采用的挂载点;resize2fs是逻辑卷名称,而且resize2fs命令不能对xfs类型文件系统使用

[root@localhost ~]# xfs_growfs /dev/vg01/lv01
meta-data=/dev/mapper/vg01-lv01  isize=512    agcount=1, agsize=4096 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=4096, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=855, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 4096 to 12288
[root@localhost ~]# df -Th /lv01
文件系统              类型  容量  已用  可用 已用% 挂载点
/dev/mapper/vg01-lv01 xfs    45M  960K   44M    3% /lv01

直接扩容到80M空间,一步到位,不用再扩文件系统了

[root@localhost ~]# lvextend -L 80M -r /dev/vg01/lv01
  Size of logical volume vg01/lv01 changed from 48.00 MiB (12 extents) to 80.00 MiB (20 extents).
  Logical volume vg01/lv01 successfully resized.
meta-data=/dev/mapper/vg01-lv01  isize=512    agcount=3, agsize=4096 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=12288, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=855, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 12288 to 20480
[root@localhost ~]# df -Th /lv01
文件系统              类型  容量  已用  可用 已用% 挂载点
/dev/mapper/vg01-lv01 xfs    77M  1.0M   76M    2% /lv01

VG扩容

[root@localhost ~]# vgs
  VG   #PV #LV #SN Attr   VSize    VFree
  vg01   1   2   0 wz--n- 1020.00m  924.00m
  vg02   1   0   0 wz--n- 1008.00m 1008.00m

vg扩容的场景:vg卷组中的空间不了够,需要添加新的硬盘进来

[root@localhost ~]# pvcreate /dev/sdb3  #创建pv
  Physical volume "/dev/sdb3" successfully created.
[root@localhost ~]# vgextend vg01 /dev/sdb3  #扩容成功
  Volume group "vg01" successfully extended
[root@localhost ~]# vgs
  VG   #PV #LV #SN Attr   VSize    VFree
  vg01   2   2   0 wz--n-    1.99g   <1.90g
  vg02   1   0   0 wz--n- 1008.00m 1008.00m

LVM缩小

互动:LVM可以动态增加,可以动态缩小吗?
答:LVM可以动态增加,也可以动态缩小,但是XFS不支持动态缩小,所以我们无法实现基于xfs的动态缩小。btrfs文件系统支持在线缩小。

[root@localhost ~]# lvreduce -L -20m /dev/vg01/lv01
  WARNING: Reducing active and open logical volume to 40.00 MiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg01/lv01? [y/n]: y
  Size of logical volume vg01/lv01 changed from 60.00 MiB (15 extents) to 40.00 MiB (10 extents).
  Logical volume vg01/lv01 successfully resized. #缩小成功

但是文件系统没有缩小成功:

[root@localhost ~]# df -h /lv01/
文件系统               容量  已用  可用 已用% 挂载点
/dev/mapper/vg01-lv01   77M  1.0M   76M    2% /lv01 #发现文件系统上空间没有变
[root@localhost ~]# lvextend -L 10M -r /dev/vg01/lv01 #这两个命令也是不能执行成功的
  Rounding size to boundary between physical extents: 12.00 MiB.
  New size given (3 extents) not larger than existing size (10 extents)
[root@localhost ~]# xfs_growfs /dev/vg01/lv01  #这两个命令也是不能执行成功的
meta-data=/dev/mapper/vg01-lv01  isize=512    agcount=5, agsize=4096 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=20480, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=855, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data size 10240 too small, old size is 20480
[root@localhost ~]# df -h /lv01/
文件系统               容量  已用  可用 已用% 挂载点
/dev/mapper/vg01-lv01   77M  1.0M   76M    2% /lv01

VG的缩减,要保证你的物理卷是否被使用,是因为它无法缩减一个正在使用的PV

[root@localhost ~]# vgs
  VG   #PV #LV #SN Attr   VSize    VFree
  vg01   2   2   0 wz--n-    1.99g   <1.94g
  vg02   1   0   0 wz--n- 1008.00m 1008.00m
[root@localhost ~]# pvs
  PV         VG   Fmt  Attr PSize    PFree
  /dev/sdb1  vg01 lvm2 a--  1020.00m  964.00m
  /dev/sdb2  vg02 lvm2 a--  1008.00m 1008.00m
  /dev/sdb3  vg01 lvm2 a--  1020.00m 1020.00m
  /dev/sdb4       lvm2 ---     1.00g    1.00g
[root@localhost ~]# cp -r /boot/grub /lv01/  #复制一些测试数据
[root@localhost ~]# vgreduce vg01 /dev/sdb1 #将sdb1移出失败,因sdb1正在被使用
  Physical volume "/dev/sdb1" still in use

互动:如果sdb1是一个磁盘阵列,而这个磁盘阵列使用年代太久,我们必须移出怎么办?
移动数据:

[root@localhost ~]# pvs
  PV         VG   Fmt  Attr PSize    PFree
  /dev/sdb1  vg01 lvm2 a--  1020.00m  964.00m
  /dev/sdb2  vg02 lvm2 a--  1008.00m 1008.00m
  /dev/sdb3  vg01 lvm2 a--  1020.00m 1020.00m
  /dev/sdb4       lvm2 ---     1.00g    1.00g

将sdb1上数据移到新增加sdb3 pv 上

[root@localhost ~]# pvmove /dev/sdb1 /dev/sdb3
  /dev/sdb1: Moved: 28.57%
  /dev/sdb1: Moved: 71.43%
  /dev/sdb1: Moved: 100.00%

移完数据再移出

[root@localhost ~]# vgreduce vg01 /dev/sdb1
  Removed "/dev/sdb1" from volume group "vg01"
vg01中只有sdb3了

[root@localhost ~]# pvs
  PV         VG   Fmt  Attr PSize    PFree
  /dev/sdb1       lvm2 ---     1.00g    1.00g
  /dev/sdb2  vg02 lvm2 a--  1008.00m 1008.00m
  /dev/sdb3  vg01 lvm2 a--  1020.00m  964.00m
  /dev/sdb4       lvm2 ---     1.00g    1.00g

LVM删除

创建LVM流程:
pvcreate创建pv ---> vgcreate创建卷组 ---> lvcreate创建逻辑卷 ---> mkfs.xfs lv 格式化 ---> mount挂载
删除LVM流程:
umount卸载 ---> lvremove lv移出卷组中所有逻辑卷 ---> vgremove vg移出卷组 ---> pvremove 移出pv

[root@localhost ~]# umount /lv01/
[root@localhost ~]# lvremove /dev/vg01/lv01 
Do you really want to remove active logical volume vg01/lv01? [y/n]: y
  Logical volume "lv01" successfully removed

再次查看已经看不到lv01

[root@localhost ~]# lvs
  LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv02 vg01 -wi-a----- 16.00m

直接移出卷组,如果卷组中还有lv,移出时,会提示,是否也移出,没有数据的情况下这里直接移出。

[root@localhost ~]# vgremove vg01
Do you really want to remove volume group "vg01" containing 1 logical volumes? [y/n]: y
Do you really want to remove active logical volume vg01/lv02? [y/n]: y
  Logical volume "lv02" successfully removed
  Volume group "vg01" successfully removed
[root@localhost ~]# vgs
  VG   #PV #LV #SN Attr   VSize    VFree
  vg02   1   0   0 wz--n- 1008.00m 1008.00m

移出pv

[root@localhost ~]# pvs
  PV         VG   Fmt  Attr PSize    PFree
  /dev/sdb1       lvm2 ---     1.00g    1.00g
  /dev/sdb2  vg02 lvm2 a--  1008.00m 1008.00m
  /dev/sdb3       lvm2 ---     1.00g    1.00g
  /dev/sdb4       lvm2 ---     1.00g    1.00g
[root@localhost ~]# pvremove /dev/sdb1
  Labels on physical volume "/dev/sdb1" successfully wiped.
[root@localhost ~]# pvs
  PV         VG   Fmt  Attr PSize    PFree
  /dev/sdb2  vg02 lvm2 a--  1008.00m 1008.00m
  /dev/sdb3       lvm2 ---     1.00g    1.00g
  /dev/sdb4       lvm2 ---     1.00g    1.00g
还没收到回复