LVM

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LVM相关的知识,希望对你有一定的参考价值。

LVM

创建逻辑卷,逻辑卷扩容,vg扩容,vg中移除pv,缩容,vg,lv重命名,xfs与ext4快照还原

一、LVM相关概念和机制:

? LVM(Logical Volume Manager)可以让分区变得弹性,可以随时随地地扩大和缩小分区,前提是该分区是LVM格式的

? LVM需要软件包LVM2,一般CentOS发行版都预装了

  • PV(Physical Volume)即物理卷

? 硬盘分区后(还未格式化为文件系统)使用pvcreate可以将分区创建为pv,要求分区的system ID为8e,即为LVM格式的系统标识符

  • VG(Volume Group)即卷组

? 将多个PVz组合起来,使用vgcreate创建成卷组,这样卷组包含了多个PV就比较大了,相当于重新整合了多个分区后得到的磁盘。虽然VG是整合多个PV的,但是创建VG时会将VG所有的空间根据指定PE大小划分为多个PE,在LVM模式下的存储都以PE为单元,类似于文件系统的block。

  • PE(Physical Extend)

? PE是VG中的存储单元。但实际存储的数据都存储在里面

  • LV(Logical Volume)

? VG相当于整合过的磁盘,那么LV就相当于分区,只不过该分区是通过VG来划分的。VG中有很多PE单元,可以指定多少个PE划分给一个LV,也可以指定大小(如多少兆)来划分。划分LV后就相当于划分了分区,只需再对LV格式化即可变为普通的文件系统。

? 通俗地讲,非LVM管理的分区步骤是将硬盘分区,然后将分区格式化为文件系统。而使用LVM,则是在硬盘分区为特定的LVM标识的分区后将其z转变为LVM可管理的PV,其实PV仍然类似于分区,然后再将几个PV整合为类似于磁盘的VG,最后VG划分为LV,此时LV就变成了LVM可以管理的分区,再对其格式化即可成为文件系统。

  • LE(Logical Extend)

? PE是物理存储单元,而LE则是逻辑存储单元,即lv中的存储单元,和PE的大小是一样的。从vg中划分lv,实际是从vg中划分vg中的pe,只不过划分lv后不再称为pe,而称为le

? LVM之所以能够伸缩容量,其实现方法就是j将LV里空闲的PE移出,或向LV中添加空闲的PE

二、LVM写入机制

? 线性模式:先写完来自同一个PV的PE,再写来自下一个PV的PE

? 条带模式:一份数据拆成多份,分别写入该LV对应的每个PV中,所以读写性能较好,类似于RAID 0

默认为线性模式,也推荐此模式,LVM的重点在于弹性容量而不是性能

三、创建逻辑卷

实验采用两块硬盘进行操作

3.1、VMware开机状态下插入两块硬盘

3.2、触发硬盘扫描机制

[root@c7 ~]# for i in `seq 0 2`;do echo ‘- - -‘ > /sys/class/scsi_host/host$i/scan;done

3.3 lsblk查看

[root@c7 ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0  200G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0  199G  0 part 
  ├─centos-root 253:0    0   50G  0 lvm  /
  ├─centos-swap 253:1    0    2G  0 lvm  [SWAP]
  └─centos-home 253:2    0  147G  0 lvm  /home
sdb               8:16   0   10G  0 disk 
sdc               8:32   0   10G  0 disk 
sr0              11:0    1  918M  0 rom 

3.4、pvcreate创建pv 使用pvs简单查看

[root@c7 ~]# pvcreate /dev/sdb,c
  Physical volume "/dev/sdb" successfully created.
  Physical volume "/dev/sdc" successfully created.
[root@c7 ~]# pvs
  PV         VG     Fmt  Attr PSize    PFree 
  /dev/sda2  centos lvm2 a--  <199.00g  4.00m
  /dev/sdb          lvm2 ---    10.00g 10.00g
  /dev/sdc          lvm2 ---    10.00g 10.00g

3.5、vgcreate创建vg 使用vgs简单查看,vg是有名字的

vgcreate可以使用-s指定pe大小,可以姑且认为pe就是block

[root@c7 ~]# vgcreate -s 16M vg_mysql /dev/sdb,c
  Volume group "vg_mysql" successfully created
[root@c7 ~]# vgs
  VG       #PV #LV #SN Attr   VSize    VFree  
  centos     1   3   0 wz--n- <199.00g   4.00m
  vg_mysql   2   0   0 wz--n-  <19.97g <19.97g

3.6、lvcreate创建lv

lvcreate可以使用-L 5G指定lv为5g;或者-l 20指定20个pe,一个pe是16m,20个就是320M

# 创建一个5g的lv
[root@c7 ~]# lvcreate  -L 5G -n lv_mysqldata vg_mysql
  Logical volume "lv_mysqldata" created.
# 使用20个pe创建一个lv
[root@c7 ~]# lvcreate  -l 20 -n lv_mysqllog vg_mysql
  Logical volume "lv_mysqllog" created.
# lvs查看所有lv
[root@c7 ~]# lvs
  LV           VG       Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home         centos   -wi-ao---- 146.99g                                                    
  root         centos   -wi-ao----  50.00g                                                    
  swap         centos   -wi-ao----   2.00g                                                    
  lv_mysqldata vg_mysql -wi-a-----   5.00g                                                    
  lv_mysqllog  vg_mysql -wi-a----- 320.00m     
# vgs查看剩余空间
[root@c7 ~]# vgs
  VG       #PV #LV #SN Attr   VSize    VFree  
  centos     1   3   0 wz--n- <199.00g   4.00m
  vg_mysql   2   2   0 wz--n-  <19.97g <14.66g 
# lsblk查看
[root@c7 ~]# lsblk
NAME                    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                       8:0    0  200G  0 disk 
├─sda1                    8:1    0    1G  0 part /boot
└─sda2                    8:2    0  199G  0 part 
  ├─centos-root         253:0    0   50G  0 lvm  /
  ├─centos-swap         253:1    0    2G  0 lvm  [SWAP]
  └─centos-home         253:2    0  147G  0 lvm  /home
sdb                       8:16   0   10G  0 disk 
├─vg_mysql-lv_mysqldata 253:3    0    5G  0 lvm  
└─vg_mysql-lv_mysqllog  253:4    0  320M  0 lvm  
sdc                       8:32   0   10G  0 disk 

3.7、格式化lv为文件系统

[root@c7 ~]# mkfs.ext4 /dev/vg_mysql/lv_mysqllog
[root@c7 ~]# mkfs.ext4 /dev/vg_mysql/lv_mysqldata 

3.8、挂载

[root@c7 ~]# mkdir /data/mysql/data,log -p
[root@c7 ~]# lsblk -f | grep mysql
├─vg_mysql-lv_mysqldata ext4                        8c5f9d7f-9297-466b-9b81-b27b2729db27   
└─vg_mysql-lv_mysqllog  ext4                        790b2e35-ea53-46cc-a806-9c1265eea58b 
[root@c7 ~]# cat >> /etc/fstab <<EOF
UUID=8c5f9d7f-9297-466b-9b81-b27b2729db27 /data/mysql/data/ ext4 defaults 0 0
UUID=790b2e35-ea53-46cc-a806-9c1265eea58b /data/mysql/log/  ext4 defaults 0 0
EOF
[root@c7 ~]# mount -a
[root@c7 ~]# df -Th | grep mysql
/dev/mapper/vg_mysql-lv_mysqldata ext4      4.8G   20M  4.6G   1% /data/mysql/data
/dev/mapper/vg_mysql-lv_mysqllog  ext4      302M  2.1M  280M   1% /data/mysql/log

四、逻辑卷的扩容:

逻辑卷一般格式化为ext4格式,如果格式化为xfs,个别步骤会有一点小区别

下面扩容lv_mysqldata从5G到6G

4.1、首先查看下vg还有没有空间

# vgs查看vg有没有空间,还有14.66G
[root@c7 ~]# vgs
  VG       #PV #LV #SN Attr   VSize    VFree  
  centos     1   3   0 wz--n- <199.00g   4.00m
  vg_mysql   2   2   0 wz--n-  <19.97g <14.66g
# lvs查看下lv_mysqldata在哪个vg里面
[root@c7 ~]# lvs
  LV           VG       Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home         centos   -wi-ao---- 146.99g                                                    
  root         centos   -wi-ao----  50.00g                                                    
  swap         centos   -wi-ao----   2.00g                                                    
  lv_mysqldata vg_mysql -wi-ao----   5.00g                                                    
  lv_mysqllog  vg_mysql -wi-ao---- 320.00m     

4.2、lvextend扩容

-r选项有点意思,-r表示resizefs,扩容完了直接同步文件系统,免去手动执行resize2fs

xfs文件系统和ext4系统的区别就在同步文件系统:xfs文件系统要使用xfs_growfs命令。

[root@c7 ~]# lvextend -L +1G -r /dev/vg_mysql/lv_mysqldata 
  Size of logical volume vg_mysql/lv_mysqldata changed from 5.00 GiB (320 extents) to 6.00 GiB (384 extents).
  Logical volume vg_mysql/lv_mysqldata successfully resized.
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/mapper/vg_mysql-lv_mysqldata is mounted on /data/mysql/data; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/mapper/vg_mysql-lv_mysqldata is now 1572864 blocks long.
# 已经变成了6G
[root@c7 ~]# df -Th | grep mysqldata
/dev/mapper/vg_mysql-lv_mysqldata ext4      5.8G   20M  5.5G   1% /data/mysql/data

不想使用-r就得手动执行resize2fs

[root@c7 ~]# lvextend -l +20 /dev/vg_mysql/lv_mysqllog 
  Size of logical volume vg_mysql/lv_mysqllog changed from 320.00 MiB (20 extents) to 640.00 MiB (40 extents).
  Logical volume vg_mysql/lv_mysqllog successfully resized.
# 此时lv大小还没变,因为文件系统还没同步
[root@c7 ~]# df -Th | grep mysqllog
/dev/mapper/vg_mysql-lv_mysqllog  ext4      302M  2.1M  280M   1% /data/mysql/log
# 使用resize2fs
[root@c7 ~]# resize2fs /dev/vg_mysql/lv_mysqllog 
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/vg_mysql/lv_mysqllog is mounted on /data/mysql/log; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 5
The filesystem on /dev/vg_mysql/lv_mysqllog is now 655360 blocks long.
# 然后就有了
[root@c7 ~]# df -Th | grep mysqllog
/dev/mapper/vg_mysql-lv_mysqllog  ext4      612M  2.3M  577M   1% /data/mysql/log

另外:lvresize也可以实现,和lvextend一样,如下

[root@c7 ~]# lvresize -l +20 -r /dev/vg_mysql/lv_mysqllog
[root@c7 ~]# lvresize -L +1G -r /dev/vg_mysql/lv_mysqldata

五、逻辑卷中加入新硬盘(vg的扩容)

4.1、VMware开机状态下插入新硬盘

4.2、手动触发磁盘扫描

[root@c7 ~]# for i in `seq 0 2`;do echo ‘- - -‘ > /sys/class/scsi_host/host$i/scan;done

4.3、lsblk查看

sdd

[root@c7 ~]# lsblk 
NAME                    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                       8:0    0  200G  0 disk 
├─sda1                    8:1    0    1G  0 part /boot
└─sda2                    8:2    0  199G  0 part 
  ├─centos-root         253:0    0   50G  0 lvm  /
  ├─centos-swap         253:1    0    2G  0 lvm  [SWAP]
  └─centos-home         253:2    0  147G  0 lvm  /home
sdb                       8:16   0   10G  0 disk 
├─vg_mysql-lv_mysqldata 253:3    0    7G  0 lvm  /data/mysql/data
└─vg_mysql-lv_mysqllog  253:4    0  960M  0 lvm  /data/mysql/log
sdc                       8:32   0   10G  0 disk 
sdd                       8:48   0   20G  0 disk

4.4、将sdd创建为pv 并用pvs查看

[root@c7 ~]# pvcreate /dev/sdd
  Physical volume "/dev/sdd" successfully created.
[root@c7 ~]# pvs
  PV         VG       Fmt  Attr PSize    PFree 
  /dev/sda2  centos   lvm2 a--  <199.00g  4.00m
  /dev/sdb   vg_mysql lvm2 a--     9.98g <2.05g
  /dev/sdc   vg_mysql lvm2 a--     9.98g  9.98g
  /dev/sdd            lvm2 ---    20.00g 20.00g

4.5、此时可以创建新的vg,也可以将sdd加入已有的vg

将sdd加入vg_mysql

[root@c7 ~]# vgextend vg_mysql /dev/sdd
  Volume group "vg_mysql" successfully extended
# vgs查看当前vg情况
[root@c7 ~]# vgs
  VG       #PV #LV #SN Attr   VSize    VFree  
  centos     1   3   0 wz--n- <199.00g   4.00m
  vg_mysql   3   2   0 wz--n-   39.95g <32.02g
# pvs查看pv使用情况
[root@c7 ~]# pvs
  PV         VG       Fmt  Attr PSize    PFree 
  /dev/sda2  centos   lvm2 a--  <199.00g  4.00m
  /dev/sdb   vg_mysql lvm2 a--     9.98g <2.05g
  /dev/sdc   vg_mysql lvm2 a--     9.98g  9.98g
  /dev/sdd   vg_mysql lvm2 a--    19.98g 19.98g

六、删除PV(vg中移除pv等)

从vg中移出某块磁盘

6.1、pvs查看pv详情

sdb,sdc,sdd三块硬盘都在vg_mysql上,sdd显示PFree为19.88,没有使用,可以直接移除

[root@c7 ~]# pvs
  PV         VG       Fmt  Attr PSize    PFree 
  /dev/sda2  centos   lvm2 a--  <199.00g  4.00m
  /dev/sdb   vg_mysql lvm2 a--     9.98g <2.05g
  /dev/sdc   vg_mysql lvm2 a--     9.98g  9.98g
  /dev/sdd   vg_mysql lvm2 a--    19.98g 19.98g

6.2、先从vg_mysql中移出sdd

[root@c7 ~]# vgreduce vg_mysql /dev/sdd
  Removed "/dev/sdd" from volume group "vg_mysql"
# vgs看一下,vg_mysql变小了
[root@c7 ~]# vgs
  VG       #PV #LV #SN Attr   VSize    VFree 
  centos     1   3   0 wz--n- <199.00g  4.00m
  vg_mysql   2   2   0 wz--n-  <19.97g 12.03g
# pvs看一下,sdd不在vg中了
[root@c7 ~]# pvs
  PV         VG       Fmt  Attr PSize    PFree 
  /dev/sda2  centos   lvm2 a--  <199.00g  4.00m
  /dev/sdb   vg_mysql lvm2 a--     9.98g <2.05g
  /dev/sdc   vg_mysql lvm2 a--     9.98g  9.98g
  /dev/sdd            lvm2 ---    20.00g 20.00g

6.3、移出pv

[root@c7 ~]# pvremove /dev/sdd
  Labels on physical volume "/dev/sdd" successfully wiped.
# pvs看一下,sdd不见了
[root@c7 ~]# pvs
  PV         VG       Fmt  Attr PSize    PFree 
  /dev/sda2  centos   lvm2 a--  <199.00g  4.00m
  /dev/sdb   vg_mysql lvm2 a--     9.98g <2.05g
  /dev/sdc   vg_mysql lvm2 a--     9.98g  9.98g

6.4、拔出硬盘

七、缩容逻辑卷

一般比较少用,操作前要备份数据

注意:xfs文件系统不支持缩容

7.1、备份数据

7.2、查看lv_mysql-lv_mysqldata当前总大小以及剩余空间

# 目前lv_mysql-lv_mysqldata总大小为7G
[root@c7 ~]# lvs
  LV           VG       Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home         centos   -wi-ao---- 146.99g                                                    
  root         centos   -wi-ao----  50.00g                                                    
  swap         centos   -wi-ao----   2.00g                                                    
  lv_mysqldata vg_mysql -wi-a-----   7.00g                                                    
  lv_mysqllog  vg_mysql -wi-ao---- 960.00m
# df查看使用了多少 ,使用了1%
[root@c7 ~]# df -Th | grep mysqldata
/dev/mapper/vg_mysql-lv_mysqldata ext4      6.8G   23M  6.4G    1% /data/mysql/data

所以打算收缩2G,目标5G

7.3、先卸载相应的lv

[root@c7 ~]# df -Th | grep mysql
/dev/mapper/vg_mysql-lv_mysqldata ext4      6.8G   23M  6.4G    1% /data/mysql/data
/dev/mapper/vg_mysql-lv_mysqllog  ext4      922M  2.5M  874M    1% /data/mysql/log
[root@c7 ~]# umount /dev/mapper/vg_mysql-lv_mysqldata

7.4、首先卸载设备并使用resize2fs收缩文件系统的容量为目标大小

[root@c7 ~]# resize2fs /dev/vg_mysql/lv_mysqldata 5G
resize2fs 1.42.9 (28-Dec-2013)
请先运行 ‘e2fsck -f /dev/vg_mysql/lv_mysqldata‘.

按照提示,先运行e2fsck,主要是为了检查是否修改后的大小会影响数据

[root@c7 ~]# e2fsck -f /dev/vg_mysql/lv_mysqldata
e2fsck 1.42.9 (28-Dec-2013)
第一步: 检查inode,块,和大小
第二步: 检查目录结构
第3步: 检查目录连接性
Pass 4: Checking reference counts
第5步: 检查簇概要信息
/dev/vg_mysql/lv_mysqldata: 11/458752 files (0.0% non-contiguous), 67327/1835008 blocks

然后再执行resize2fs

[root@c7 ~]# resize2fs /dev/vg_mysql/lv_mysqldata 5G
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/vg_mysql/lv_mysqldata to 1310720 (4k) blocks.
The filesystem on /dev/vg_mysql/lv_mysqldata is now 1310720 blocks long.

7.5、再收缩lv,可以-L指定收缩容量或者-l指定收缩PE数量

[root@c7 ~]# resize2fs /dev/vg_mysql/lv_mysqldata 5G
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/vg_mysql/lv_mysqldata to 1310720 (4k) blocks.
The filesystem on /dev/vg_mysql/lv_mysqldata is now 1310720 blocks long.

[root@c7 ~]# lvreduce -L -2G /dev/vg_mysql/lv_mysqldata 
  WARNING: Reducing active logical volume to 5.00 GiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg_mysql/lv_mysqldata? [y/n]: y   # 确认
  Size of logical volume vg_mysql/lv_mysqldata changed from 7.00 GiB (448 extents) to 5.00 GiB (320 extents).
  Logical volume vg_mysql/lv_mysqldata successfully resized.

7.5、此时重新挂载即可

[root@c7 ~]# mount -a
[root@c7 ~]# df -Th | grep mysqldata
/dev/mapper/vg_mysql-lv_mysqldata ext4      4.8G   20M  4.6G    1% /data/mysql/data

八、vg和lv重命名

lvrename  vg0 mysql mysql2 
vgrename  vg0 vg1

九、xfs与ext4逻辑卷的快照与还原

touch /data/mysql/f1,2,3
lvcreate  -s -n mysql2_snapshot -L 100m /dev/vg1/mysql2 
mkdir /mnt/snap
mount /dev/vg1/mysql2_snapshot /mnt/snap
mount -o nouuid,ro /dev/vg1/mysql2_snapshot /mnt/snap
中间修改数据
还原过程
umount /mnt/snap/
umount /data/mysql/
lvconvert --merge  /dev/vg1/mysql2_snapshot 
mount -a

实验:ext4 逻辑卷的快照及还原
lvcreate  -s -n binlog-snapshot -p r -L 100m  /dev/vg1/binlog
mount  /dev/vg1/mysql2_snapshot /mnt/snap

以上是关于LVM的主要内容,如果未能解决你的问题,请参考以下文章

LVM磁盘管理

什么是逻辑卷管理器lvm?lvm设备的管理

LVM逻辑卷:创建LVM分区实例

LVM卷管理

Linux里面lvm是啥?

linux lvm扩容