本节大纲:

20.1.什么是逻辑卷

20.2.逻辑卷的结构

20.3.逻辑卷的管理

20.4.迁移逻辑卷到新的系统

20.5.删除逻辑卷

20.6.逻辑卷快照

20.1.什么是逻辑卷

1)为什么要使用逻辑卷

逻辑卷:

优点:在于灵活管理

1、动态扩容

2、在线扩容

3、离线裁剪

4、数据条带化

5、数据镜像

2)什么是逻辑卷

逻辑卷管理(LVM)(Logical VolumeManager)它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2.4内核上实现。LVM将一个或多个硬盘的分区在逻辑上进行组合,做为一个大的硬盘空间来使用,当硬盘的剩余空间不够的时候,可以将其它的硬盘加入到分区当中,这样可以实现磁盘空间的动态管理。

3)lvm基本术语

物理卷(physical volume,pv):

物理卷就是指硬盘分区,也可以是整个硬盘或已创建的RAID ,是LVM的基本存储设备,与普通物理存储介质的区别是该设备包含有LVM相关的管理参数。

卷组(volume group,vg):

卷组是建立在物理卷之上,它是由一个或者多个物理卷组成的存储池。即将很多个物理卷融合在一起来提供容量。在卷组上能创建一个或多个“LVM分区”(逻辑卷)

逻辑卷(logical volume,lv):逻辑卷是建立在卷组之上,类似于非LVM系统中的硬盘分区,它是从卷组中“切”出来一块空间来让用户使用,是一个标准的块设备,在逻辑卷之上可以建立文件系统。

物理区域(physical extent,PE):物理卷以大小相等的物理块为存储的基本单位,每一个物理卷被划分成称为PE的最小单位。默认是4M,寻址的最小单元。

逻辑区域(logical extent,LE):逻辑卷以大小相等的逻辑块为存储的基本单位,在同一个卷组中,LE的大小和PE是相等的,并且一一对应。

总结:

真实的物理设备——>逻辑上做成物理卷(pv)——>卷组(vg)——>逻辑卷(lv)

20.2.逻辑卷的结构

假如有物理磁盘三个,一个200g,一个100g,一个80g,怎么做分出一个300g独立文件系统的分区,这就要逻辑卷来解决了

物理磁盘到逻辑的映射

spacer.gif

 spacer.gif

 spacer.gif

 #采用文件夹的形式模式LVM

[root@localhost test]# tree

.

├── VG0

│   ├── LV0

│   ├── LV1

│   └── LV2

└── VG1

    ├── LV0

    └── LV1


 20.3.逻辑卷的管理

1)通过lvm分区方式安装centos

选择安装类型,选择最后一个复选框,即创建自定义布局。

spacer.gif

 对应英文界面spacer.gif

 首先划分/boot分区,/boot分区建议使用物理分区

 spacer.gif

将剩余空间划分为一个物理卷(PV)

spacer.gif

 创建一个卷组(VG)。默认卷组名为VolGroup00,修改卷组名为vg51cto_lv。

spacer.gif

 在VG上面创建逻辑卷(LV)。逻辑卷默认为LogVol00,LogVol01……末两位由00开始依次递增。

spacer.gif

 LVM分区完成。

spacer.gif

 

[root@localhost ~]# df -h  #查看磁盘空间
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg51cto_lv-LogVol01
                      9.5G  915M  8.2G  10% /
tmpfs                491M    0  491M  0% /dev/shm
/dev/sda1            190M  27M  154M  15% /boot
/dev/mapper/vg51cto_lv-LogVol04
                      2.9G  4.5M  2.7G  1% /data
/dev/mapper/vg51cto_lv-LogVol02
                      4.0G  8.3M  3.8G  1% /home
/dev/mapper/vg51cto_lv-LogVol03
                      969M  1.4M  917M  1% /usr/local

20.3.逻辑卷的管理

通过实例来说明

dmoe1:创建一个普通的逻辑卷,大小是1G,挂载使用。

 

1)拿一块硬盘

2)将硬盘分区(根据实际情况)
sdb      8:16  0  20G  0 disk
├─sdb1  8:17  0    2G  0 part
├─sdb2  8:18  0    2G  0 part
├─sdb3  8:19  0    6G  0 part
└─sdb4  8:20  0  10G  0 part

3)将设备做成物理卷
# pvcreate /dev/sdb1
查看:
pvs 简单查看
pvdisplay 详细查看

4)创建卷组,将物理卷加入到卷组
# vgcreate vg01 /dev/sdb1
  Volume group "vg01" successfully created
-l: 卷组上允许创建的最大逻辑卷数
-s:卷组上的物理卷的PE大小
-p:卷组中允许添加的最大物理卷数
查看:
vgscan  #查看卷组名
vgs
vgdisplay

5)创建逻辑卷,大小1G
# lvcreate -n lv01 -L 1G vg01
-L:指定最终大小
-l:指定pe的个数或者卷组剩余空间的百分比

# lvcreate -n lv02 -l 50 vg01
# lvcreate -n lv03 -l 50%free vg01
查看:
lvs
lvdisplay

6)将逻辑卷格式化
创建好的逻辑卷会映射到以下两个地方:
# ll /dev/mapper/vg01-lv01
lrwxrwxrwx. 1 root root 7 Apr  8 10:42 /dev/mapper/vg01-lv01 -> ../dm-2
# ll /dev/vg01/lv01
lrwxrwxrwx. 1 root root 7 Apr  8 10:42 /dev/vg01/lv01 -> ../dm-2

mkfs -t ext4 /dev/mapper/vg01-lv01
或者
mkfs.ext4 /dev/vg01/lv01

7)挂载使用
mount /dev/vg01/lv01 /u01

8)修改卷组名
#把现有的卷组名更改
[root@localhost ~]# vgrename vg51cto_lv vg51cto
  Volume group "vg51cto_lv" successfully renamed to "vg51cto"
#修改/etc/fstab配置文件,把vg51cto_lv修改成vg51cto
[root@localhost ~]# vim /etc/fstab
# /etc/fstab
# Created by anaconda on Thu Sep 28 19:09:08 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/vg51cto-LogVol01 /                      ext4    defaults        1 1
UUID=cb3a3439-01cd-44f8-b435-81a072a03c28 /boot                  ext4    defaults        1 2
/dev/mapper/vg51cto-LogVol04 /data                  ext4    defaults        1 2
/dev/mapper/vg51cto-LogVol02 /home                  ext4    defaults        1 2
/dev/mapper/vg51cto-LogVol03 /usr/local              ext4    defaults        1 2
/dev/mapper/vg51cto-LogVol00 swap                    swap    defaults        0 0
tmpfs                  /dev/shm                tmpfs  defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                  /sys                    sysfs  defaults        0 0
proc                    /proc                  proc    defaults        0 0
#修改grub.conf配置文件,把vg51cto_lv修改成vg51cto
[root@localhost ~]# vim /etc/grub.conf
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-504.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=/dev/mapper/vg51cto-LogVol01 rd_NO_LUKS rd_LVM_LV=vg51cto/LogVol01 rd_LVM_LV=vg51cto/LogVol00 rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /initramfs-2.6.32-504.el6.x86_64.img
#reboot重启后用df -h查看
[root@localhost ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg51cto-LogVol01
                      9.5G  1.1G  8.0G  12% /
tmpfs                491M    0  491M  0% /dev/shm
/dev/sda1            190M  27M  154M  15% /boot
/dev/mapper/vg51cto-LogVol04
                      2.9G  4.5M  2.7G  1% /data
/dev/mapper/vg51cto-LogVol02
                      4.0G  8.3M  3.8G  1% /home
/dev/mapper/vg51cto-LogVol03
                      969M  1.4M  917M  1% /usr/local

demo2:在线扩容逻辑卷

 

情况1:当卷组剩余空间不够
1)扩容卷组
# vgextend vg01 /dev/sdb3
  No physical volume label read from /dev/sdb3
  Physical volume /dev/sdb3 not found
  Physical volume "/dev/sdb3" successfully created
  Volume group "vg01" successfully extended
说明:
卷组是由物理卷组成的,如果直接将设备加入卷组,那么系统会自动先将设备做成pv,然后在加入。
2)扩容逻辑卷
# lvextend -L +2G /dev/vg01/lv01  在原来的基础上增加2G空间
3)同步文件系统
# resize2fs /dev/vg01/lv01

情况2:当前卷组剩余空间足够
1)扩容逻辑卷
# lvextend -L 3G /dev/vg01/lv01  将原来的逻辑卷扩大到3G
2)同步文件系统
# resize2fs /dev/vg01/lv01

实例:动态扩容根文件系统

demo3:离线裁剪逻辑卷

 

1)卸载逻辑卷
umount /dev/vg01/lv01
2)裁剪文件系统
# e2fsck -f /dev/mapper/vg01-lv01
# resize2fs /dev/mapper/vg01-lv01 2G

3)裁剪逻辑卷
# lvreduce -L 2G /dev/mapper/vg01-lv01
# e2fsck -f /dev/mapper/vg01-lv01
4)挂载使用
# mount /dev/mapper/vg01-lv01 /u01

注意:
1、离线裁剪之前最好将数据备份
2、裁剪后的空间大小一定要大于数据大小

demo4:总结逻辑卷相关的命令

 

创建物理卷
pvcreate /dev/sdb /dev/sdc[1-3]
创建卷组
vgcreate vg01 /dev/sdb
创建逻辑卷
lvcreate -n lv01 -L 2G vg01
lvcreate -n lv02 -l 50 vg02
lvcreate -n lv03 -l 50%free vg03
扩容卷组
vgextend vg01 /dev/sdc[1-3]
扩容逻辑卷
lvextend -L +1G /dev/vg01/lv01
删除逻辑卷
# lvremove /dev/mapper/vg01-lv03
删除卷组
# vgremove vg01
删除物理卷
# pvremove /dev/sdb /dev/sdc[1-3]
将一个物理卷从卷组里移除
# vgreduce vg01 /dev/sdb2
注意:
该物理卷没有被使用才能够移除

demo5:逻辑卷实现条带化

条带化:

把保存在逻辑卷上的数据分成n等分,分别同时写入到不同的物理卷中,可以提高数据的读写速率;如果任何一个涉及到物理卷损坏,数据都会无法恢复。

 

创建前:
# pvs
  PV        VG      Fmt  Attr PSize  PFree
  /dev/sda2  vg_node1 lvm2 a--  19.51g    0
  /dev/sdb1  vg01    lvm2 a--  2.00g 2.00g
  /dev/sdb2  vg01    lvm2 a--  2.00g 2.00g
创建条带化的逻辑卷:
# lvcreate -n lv01 -L 1G -i 2 vg01 /dev/sdb[12]

-i:指定条带化的个数

创建后:
# pvs
  PV        VG      Fmt  Attr PSize  PFree
  /dev/sda2  vg_node1 lvm2 a--  19.51g    0
  /dev/sdb1  vg01    lvm2 a--  2.00g 1.50g
  /dev/sdb2  vg01    lvm2 a--  2.00g 1.50g

格式化文件系统:
mkfs.ext4 /dev/vg01/lv01
挂载使用
mount /dev/vg01/lv01 /u01
测试验证:
# iostat -d -m /dev/sdb[12] 2

demo6:逻辑卷实现镜像

镜像:对某个逻辑卷做数据镜像,实现数据备份作用。

 

创建前:
# pvs
  PV        VG      Fmt  Attr PSize  PFree
  /dev/sda2  vg_node1 lvm2 a--  19.51g    0
  /dev/sdb1  vg01    lvm2 a--  2.00g 1.50g
  /dev/sdb2  vg01    lvm2 a--  2.00g 1.50g
  /dev/sdb3  vg02    lvm2 a--  2.00g 2.00g
  /dev/sdb4  vg02    lvm2 a--  2.00g 2.00g

创建一个互为镜像的逻辑卷:
# lvcreate -n lv02 -L 1G -m 1 vg02 /dev/sdb[34]
-m:指定镜像的个数
# lvs
  LV      VG      Attr      LSize  Pool Origin Data%  Move Log      Cpy%Sync Convert
  lv01    vg01    -wi-ao----  1.00g
  lv02    vg02    mwi-a-m---  1.00g                        lv02_mlog  100.00  数据同步100%完成
创建后:
# pvs
  PV        VG      Fmt  Attr PSize  PFree
  /dev/sda2  vg_node1 lvm2 a--  19.51g    0
  /dev/sdb1  vg01    lvm2 a--  2.00g 1.50g
  /dev/sdb2  vg01    lvm2 a--  2.00g 1.50g
  /dev/sdb3  vg02    lvm2 a--  2.00g 1.00g
  /dev/sdb4  vg02    lvm2 a--  2.00g 1.00g

格式化文件系统并且挂载使用

# mkfs.ext4 /dev/vg02/lv02
# mkdir /u02
# mount /dev/mapper/vg02-lv02 /u02

测试验证:
# dd if=/dev/zero of=/dev/sdb3 bs=1M count=300

# vgreduce --removemissing -f vg02  强制从卷组中移除损坏的盘
再次将逻辑卷挂载使用,我们需要将坏的盘修好换成健康的盘让其再次互为镜像:
# lvconvert -m 1 /dev/vg02/lv02 /dev/sdb[34]

demo7:修改逻辑卷名

 

#查看逻辑卷名
默认的卷组名为VolGroup00,卷组内的逻辑卷为LogVol00,LogVol01……末两位由00开始依次递增
[root@localhost ~]# lvscan
  ACTIVE            '/dev/vg51cto/LogVol04' [2.93 GiB] inherit
  ACTIVE            '/dev/vg51cto/LogVol01' [9.77 GiB] inherit
  ACTIVE            '/dev/vg51cto/LogVol00' [2.00 GiB] inherit
  ACTIVE            '/dev/vg51cto/LogVol03' [1000.00 MiB] inherit
  ACTIVE            '/dev/vg51cto/LogVol02' [4.13 GiB] inherit
#修改逻辑卷名
[root@localhost ~]# lvrename /dev/vg51cto/LogVol00 /dev/vg51cto/lv_swp
  Renamed "LogVol00" to "lv_swp" in volume group "vg51cto"
[root@localhost ~]# lvrename /dev/vg51cto/LogVol01 /dev/vg51cto/lv_root
  Renamed "LogVol01" to "lv_root" in volume group "vg51cto"
[root@localhost ~]# lvrename /dev/vg51cto/LogVol02 /dev/vg51cto/lv_home
  Renamed "LogVol02" to "lv_home" in volume group "vg51cto"
[root@localhost ~]# lvrename /dev/vg51cto/LogVol03 /dev/vg51cto/lv_usr
  Renamed "LogVol03" to "lv_usr" in volume group "vg51cto"
[root@localhost ~]# lvrename /dev/vg51cto/LogVol04 /dev/vg51cto/lv_data
  Renamed "LogVol04" to "lv_data" in volume group "vg51cto"
#修改/etc/fstab配置文件
[root@localhost ~]# vim /etc/fstab
# /etc/fstab
# Created by anaconda on Thu Sep 28 19:09:08 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/vg51cto-lv_root /                      ext4    defaults        1 1
UUID=cb3a3439-01cd-44f8-b435-81a072a03c28 /boot                  ext4    defaults        1 2
/dev/mapper/vg51cto-lv_data /data                  ext4    defaults        1 2
/dev/mapper/vg51cto-lv_home /home                  ext4    defaults        1 2
/dev/mapper/vg51cto-lv_usr /usr/local              ext4    defaults        1 2
/dev/mapper/vg51cto-lv_swap swap                    swap    defaults        0 0
tmpfs                  /dev/shm                tmpfs  defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                  /sys                    sysfs  defaults        0 0
proc                    /proc                  proc    defaults        0 0
#修改grub.conf配置文件
root@localhost ~]# vim /etc/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/mapper/vg51cto-LogVol01
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-504.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=/dev/mapper/vg51cto-lv_root rd_NO_LUKS rd_LVM_LV=vg51cto/lv_root rd_LVM_LV=vg51cto/lv_swap rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /initramfs-2.6.32-504.el6.x86_64.img

20.4.迁移逻辑卷到新的系统

 

 我首先在另外一个虚拟机中创建一个逻辑卷,并在里面存入相应的数据,然后来模拟我们的迁移逻辑卷的实验。在另外一个虚拟机中创建LV0逻辑卷的操作,如下图所示。

此时该系统中块设备列表如下所示。 LV0。就是我们刚刚创建的逻辑卷。

[root@centos6 lv0]#lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0              11:0    1  3.7G  0 rom  /media/CentOS_6.9_Final
sda                8:0    0  200G  0 disk
├─sda1            8:1    0 1000M  0 part /boot
├─sda2            8:2    0 53.7G  0 part /
├─sda3            8:3    0 48.8G  0 part /app
├─sda4            8:4    0    1K  0 part
└─sda5            8:5    0    2G  0 part [SWAP]
sdb                8:16  0  20G  0 disk
└─VG0-LV0 (dm-0) 253:0    0  10G  0 lvm  /mnt/lv0

现在我们要将刚刚创建的这个逻辑卷迁移到一个新的系统中,而且我们要保证,数据不能丢失。同时,我们考虑一下,万一我们要迁移到的新的文件系统中有跟我们新创建的逻辑卷同名的逻辑卷该如何处理,比方说像,下面这样。 注意,两个系统不一样,但是逻辑卷的名字一致。

#CentOS6 中的逻辑卷,即将被迁移到CentOS7中
[root@centos6 ~]#lvs
  LV  VG  Attr      LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  LV0  VG0  -wi-ao---- 10.00g

#CentOS 7 中的逻辑卷,即将迁移到这里。
[root@localhost ~]#lvs
  LV  VG  Attr      LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  LV0  VG0 -wi-ao---- 300.00g
  LV1  VG0 -wi-ao----  50.00g

总结一下迁移过程中的重要步骤,一共有如下几步。 在源主机上

将旧的逻辑卷解除挂载 umount /mnt/lv0
修改旧的卷组名称 vgrename VG0 NEWVG0
修改旧的逻辑卷的名称 lvrename /dev/NEWVG0/LV0 NEWLV0
将旧的卷组设置为非活动状态 vgchange -an NEWVG0
将旧的卷组导出 vgexport NEWVG0
将硬盘拆下 安装到新的主机上
相关的操作如下所示,操作成功之后,将硬盘文件拆下,接到新的主机上。

[root@centos6 ~]#umount /mnt/lv0

[root@centos6 ~]#vgrename VG0 NEWVG0
  Volume group "VG0" successfully renamed to "NEWVG0"

[root@centos6 ~]#lvrename /dev/NEWVG0/LV0 NEWLV0
  Renamed "LV0" to "NEWLV0" in volume group "NEWVG0"

[root@centos6 ~]#vgchange -an NEWVG0
  0 logical volume(s) in volume group "NEWVG0" now active

[root@centos6 ~]#vgexport NEWVG0
  Volume group "NEWVG0" successfully exported


在目标主机上

在新的系统中安装硬盘,并将其导入文件系统。 vgimport NEWVG0
激活新的卷组 vgchange -ay NEWVG0
重新挂载 mount /dev/NEWVG0/NEWLV0 /mnt/newlv0
在加装了新的硬盘之后,我们可以看到系统中已经添加了一块新的硬盘。

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  55G  0 part /
├─sda3            8:3    0  50G  0 part /app
├─sda4            8:4    0    1K  0 part
└─sda5            8:5    0    2G  0 part [SWAP]
sdb              8:16  0  200G  0 disk
├─sdb1            8:17  0  100G  0 part
│ └─VG0-LV0    253:0    0  300G  0 lvm  /mnt/lv0
└─sdb2            8:18  0  100G  0 part
  └─VG0-LV0    253:0    0  300G  0 lvm  /mnt/lv0
sdc              8:32  0  100G  0 disk
└─VG0-LV0      253:0    0  300G  0 lvm  /mnt/lv0
sdd              8:48  0  80G  0 disk
├─VG0-LV0      253:0    0  300G  0 lvm  /mnt/lv0
└─VG0-LV1      253:1    0  50G  0 lvm  /mnt/lv1
sde              8:64  0  20G  0 disk
└─NEWVG0-NEWLV0 253:2    0  10G  0 lvm
使用pvscan 命令可以查看到系统中已经有一个处于 exported 状态的 设备,及其详细的信息。

[root@localhost ~]#pvscan
  PV /dev/sdb1  VG VG0            lvm2 [100.00 GiB / 0    free]
  PV /dev/sdb2  VG VG0            lvm2 [100.00 GiB / 0    free]
  PV /dev/sdc    VG VG0            lvm2 [100.00 GiB / 0    free]
  PV /dev/sdd    VG VG0            lvm2 [80.00 GiB / 29.98 GiB free]
  PV /dev/sde    is in exported VG NEWVG0 [20.00 GiB / 10.00 GiB free]
  Total: 5 [399.98 GiB] / in use: 5 [399.98 GiB] / in no VG: 0 [0  ]

接下来我们将新的NEWVG0 导入到系统中。

#导入新的卷组
[root@localhost ~]#vgimport NEWVG0
  Volume group "NEWVG0" successfully imported

#将新的卷组激活
[root@localhost ~]#vgchange -ay NEWVG0
  1 logical volume(s) in volume group "NEWVG0" now active

此时我们再使用pvscan 来查看的话,状态应该与之前已经不一样了。

# 状态已经发生了相应的变化
[root@localhost ~]#pvscan
  PV /dev/sdb1  VG VG0            lvm2 [100.00 GiB / 0    free]
  PV /dev/sdb2  VG VG0            lvm2 [100.00 GiB / 0    free]
  PV /dev/sdc    VG VG0            lvm2 [100.00 GiB / 0    free]
  PV /dev/sdd    VG VG0            lvm2 [80.00 GiB / 29.98 GiB free]
  PV /dev/sde    VG NEWVG0          lvm2 [20.00 GiB / 10.00 GiB free]
  Total: 5 [399.98 GiB] / in use: 5 [399.98 GiB] / in no VG: 0 [0  ]

将已经添加好的逻辑卷重新挂载就可以继续使用了。

20.5.删除逻辑卷

 

在完成了上面的大部分操作之后,我们又有了一个新的想法,如果我想将某个分区,从卷组中去掉该怎样做?
实际中,我们可能面临众多的困难,比方说,该分区中已经存储了很多的数据,这样的话,我们是不能直接删除的。假设我们有下面这样的一组逻辑卷(只是假设,为了用来佐证)
[root@localhost ~]#pvs
  PV        VG    Fmt  Attr PSize  PFree
  /dev/sdb1  VG0    lvm2 a--  100.00g    0
  /dev/sdb2  VG0    lvm2 a--  100.00g    0
  /dev/sdc  VG0    lvm2 a--  10.00g  89.98g
  /dev/sdd  VG0    lvm2 a--  80.00g 29.98g

如果我们要将/dev/sdd 这个分区删除掉,那么我们首先就要在同一个卷组(VG0)中找到与/dev/sdd 已经使用掉的空间同样大小的空间,来做迁移。然后将/dev/sdd 的空间 移动到 /dev/sdc中,此时就可以进行删除了。
这样,我们就详细的介绍了逻辑卷的详细使用,以及在使用过程中需要注意的相关内容。实际上,逻辑卷还有快照,关于快照的内容在逻辑卷中也是很重要的一部分内容,实际使用中也是非常重要的,以后有机会会详细地介绍。如若本片文章中有描述不合理的地方,敬请留言,我会及时改正。


[root@localhost ~]#mkdir /mnt/newlv0
[root@localhost ~]#mount /dev/NEWVG0/NEWLV0 /mnt/newlv0
[root@localhost ~]#cd /mnt/newlv0
[root@localhost newlv0]#ls
acpid            iptables.old    readahead
atd              irqbalance      readonly-root
auditd            kdump            rngd
authconfig        kernel          rsyslog
................

[root@localhost ~]#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  55G  0 part /
├─sda3        8:3    0  50G  0 part /app
├─sda4        8:4    0  512B  0 part
└─sda5        8:5    0    2G  0 part [SWAP]
sdb          8:16  0  200G  0 disk
├─sdb1        8:17  0  100G  0 part
│ └─VG0-LV0 253:0    0  300G  0 lvm  /mnt/lv0
└─sdb2        8:18  0  100G  0 part
  └─VG0-LV0 253:0    0  300G  0 lvm  /mnt/lv0
sdc          8:32  0  100G  0 disk
└─VG0-LV0  253:0    0  300G  0 lvm  /mnt/lv0
sdd          8:48  0  80G  0 disk
├─VG0-LV0  253:0    0  300G  0 lvm  /mnt/lv0
└─VG0-LV1  253:1    0  50G  0 lvm  /mnt/lv1

在这一步中,一共有三个步骤。准备步骤:强制性检查文件系统。然后:先缩减文件系统大小。接着:缩减逻辑卷。 这三步,缺一不可。
[root@localhost ~]#umount /mnt/lv1

卷组VG0的所有空间都被使用了。接下来我们就可以进行缩减逻辑卷的实验。
从整个扩展的过程中,我们看出,只要LV0的空间不足,我们就可以很灵活的给LV0扩展存储空间。如果VG0的空间不足够使用了,那我们就可以重新加入一个物理磁盘,并按照此过程将物理卷添加到VG0中,只要使用vgextend命令就可以。
创建了文件系统之后,将LV0挂载到 /app 目录下,就可以正常访问 LV0了,当然挂载的方式有临时挂载和永久挂载两种方式,永久挂载就是将挂载选项写到 /etc/fstab 文件中,我们这里不再详细介绍。
[root@localhost ~]#lvdisplay
  --- Logical volume ---
  LV Path                /dev/VG0/LV0    #已经生成了设备名称
  LV Name                LV0
  VG Name                VG0
  LV UUID                D3dpT9-EYFP-ieGm-DiYm-Ey4P-O5JM-EMtrOh
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2017-08-15 21:51:32 +0800
  LV Status              available
  # open                0
  LV Size                250.00 GiB        #逻辑卷的大小
  Current LE            64000            #当前一共有多少LE 逻辑区块
  Segments              3
  Allocation            inherit
  Read ahead sectors    auto
  - currently set to    8192
  Block device          253:0


[root@localhost ~]#vgdisplay
  --- Volume group ---
  VG Name              VG0                        #卷组名称
  System ID
  Format                lvm2                    #Format版本
  Metadata Areas        4
  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                4
  Act PV                4
  VG Size              379.98 GiB                #卷组的大小
  PE Size              4.00 MiB                #默认区块的大小
  Total PE              97276
  Alloc PE / Size      0 / 0
  Free  PE / Size      97276 / 379.98 GiB
  VG UUID              rrI0HJ-JPwB-CWtU-ddM0-kvJ5-7Beo-uV5qEy

从上面的详细信息中可以看到 VG Name 还没有值, PE Size 也没有值, 那么接下来,我们就要创建卷组,创建了卷组之后,我们再回过头查看以下这些物理卷的详细信息,就会发生很大的变化 。
[root@localhost ~]#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  55G  0 part /
├─sda3  8:3    0  50G  0 part /app
├─sda4  8:4    0  512B  0 part
└─sda5  8:5    0    2G  0 part [SWAP]
sdb      8:16  0  200G  0 disk
├─sdb1  8:17  0  100G  0 part
└─sdb2  8:18  0  100G  0 part
sdc      8:32  0  100G  0 disk
sdd      8:48  0  80G  0 disk

注意名称的格式标准:/dev/{vg_name}/{lv_name} -> /dev/mapper/{vg_name}{lv_name}

这里有一点需要注意。物理区段的分配并非是连续的,也就是说,属于LV0的逻辑区段,他们所对应的物理区段有可能来自不同的物理设备。这也再一次证实了,卷组在对应物理卷到逻辑卷的映射上起到了关键性的作用。

LVM 的组成一共包含三种元素,卷(Volume,物理和逻辑卷,卷组),区段(物理和逻辑区段),设备映射器 。 接下来,我们分别介绍这三种元素各代表什么意思。

如图所示,我们从逻辑上实现了 创建了一个大于300G的文件系统,而且在用户看来,根本不清楚底层一共有多少个硬盘,只知道有一个文件系统可以用来存储数据。当然,这对用户来说就足够了。具体的实验将在稍后的内容中实现。

20.6.逻辑卷快照

 

#首先,使用‘vgs’命令检查卷组中的空闲空间以创建新的快照
[root@localhost ~]# vgs
  VG      #PV #LV #SN Attr  VSize  VFree
  vg51cto  2  5  0 wz--n- 39.80g 20.00g
[root@localhost ~]# lvs
  LV      VG      Attr      LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv_data vg51cto -wi-ao----    2.93g
  lv_home vg51cto -wi-ao----    4.13g
  lv_root vg51cto -wi-ao----    9.77g
  lv_swp  vg51cto -wi-ao----    2.00g
  lv_usr  vg51cto -wi-ao---- 1000.00m
#创建1GB的快照卷
[root@localhost ~]# lvcreate -L 1GB -s -n  home_bak /dev/mapper/vg51cto-lv_home
  Logical volume "home_bak" created
#选项
-s – 创建快照
-n – 为快照命名

创建LVM快照

此处,是对上面高亮要点的说明。

1.我在此创建的快照的大小。

2.创建快照。

3.创建快照名。

4.新的快照名。

5.要创建快照的卷

 

#如果你想要移除快照,可以使用‘lvremove’命令
[root@localhost ~]# lvremove /dev/mapper/vg51cto-home_bak
#列出新创建的快照
[root@localhost ~]# lvs
  LV      VG      Attr      LSize    Pool Origin  Data%  Meta%  Move Log Cpy%Sync Convert
  home_bak vg51cto swi-a-s---    1.00g      lv_home 0.00
  lv_data  vg51cto -wi-ao----    2.93g
  lv_home  vg51cto owi-aos---    4.13g
  lv_root  vg51cto -wi-ao----    9.77g
  lv_swp  vg51cto -wi-ao----    2.00g
  lv_usr  vg51cto -wi-ao---- 1000.00m
#往home里写500m的文件,看看快照有什么变化
 [root@localhost ~]# dd if=/dev/zero of=/home/123 bs=500M count=1
[root@localhost ~]# lvs
  LV      VG      Attr      LSize    Pool Origin  Data%  Meta%  Move Log Cpy%Sync Convert
  home_bak vg51cto swi-a-s---    1.00g      lv_home 49.03
  lv_data  vg51cto -wi-ao----    2.93g
  lv_home  vg51cto owi-aos---    4.13g
  lv_root  vg51cto -wi-ao----    9.77g
  lv_swp  vg51cto -wi-ao----    2.00g
  lv_usr  vg51cto -wi-ao---- 1000.00m
数据已经占用了49%

查看快照信息

再来对上面图片中高亮的要点作个清楚的说明。

快照逻辑卷名称。

当前使用的卷组名。

读写模式下的快照卷,我们甚至可以挂载并使用该卷。

快照创建时间。这个很重要,因为快照将跟踪此时间之后的每个改变。

该快照属于tecmint_datas逻辑卷。

逻辑卷在线并可用。

我们录制快照的源卷大小。

写时复制表大小,Cow = copy on Write,这是说对tecmint_data卷所作的任何改变都会写入此快照。

当前使用的快照大小,我们的tecmintdata有10GB,而我们的快照大小是1GB,这就意味着我们的数据大概有650MB。所以,如果tecmintdatas中的文件增长到2GB,现在的51%中的内容将增加到超过所分配的快照的大小,当然,我们在创建快照时会出现问题。这就意味着我们需要扩展逻辑卷大小(快照逻辑卷)

给出快照组块的大小。

如果该逻辑卷满了,它就会自动丢失新的数据,我们就不能再使用了,就算我们去扩展快照卷的大小也不行。最好的方法就是在创建快照时,创建一个和源一样大小的快照卷。tecmint_datas的大小是10GB,如果我们创建一个10GB大小的快照,它就永远都不会像上面那样超载,因为它有足够的空间来录制你的逻辑卷的快照。

#扩展快照

[root@localhost ~]# lvextend -L +1G /dev/mapper/vg51cto-home_bak

  Size of logical volume vg51cto/home_bak changed from 1.00 GiB (256 extents) to 2.00 GiB (512 extents).

  Logical volume home_bak successfully resized

[root@localhost ~]# lvs

  LV       VG      Attr       LSize    Pool Origin  Data%  Meta%  Move Log Cpy%Sync Convert

  home_bak vg51cto swi-a-s---    2.00g      lv_home 24.52                                 

  lv_data  vg51cto -wi-ao----    2.93g              

现在空间大小总计2G

#恢复快照或合并      

[root@localhost ~]# umount /dev/mapper/vg51cto-lv_home

#检查是否卸载成功

df -h

#恢复快照

[root@localhost ~]# lvconvert --merge /dev/mapper/vg51cto-home_bak

在合并完成后,快照卷将被自动移除。现在我们可以使用df命令来查看分区大小。

重要:要自动扩展快照,我们可以通过修改配置文件来进行。对于手动扩展,我们可以使用lvextend。

#打开lvm的配置文件

[root@localhost ~]# vim /etc/lvm/lvm.conf

#搜索单词autoextend

spacer.gif

 

https://linux.die.net/man/8/lvm Linux LVM2工具手册

修改此处的100为75,这样自动扩展的起始点就是75,而自动扩展百分比为20,它将自动扩容百分之20。

如果快照卷达到75%,它会自动为快照卷扩容20%。这样,我们可以自动扩容了。使用wq!来保存并退出。

这将把快照从超载导致下线事故中拯救出来,这也会帮助你节省更多时间。

 

练习:

1、添加一块新的10g硬盘到你的linux系统中,并将其分为2个分区(大小自己决定),如sdb1和sdb2

 

[root@localhost ~]# lsblk
NAME                        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0                          11:0    1 1024M  0 rom
sda                           8:0    0   20G  0 disk
├─sda1                        8:1    0  500M  0 part /boot
└─sda2                        8:2    0 19.5G  0 part
  ├─VolGroup-lv_root (dm-0) 253:0    0 17.6G  0 lvm  /
  └─VolGroup-lv_swap (dm-1) 253:1    0    2G  0 lvm  [SWAP]
sdb                           8:16   0   10G  0 disk
└─VolGroup-lv01 (dm-2)      253:2    0    5G  0 lvm  /data
sdc                           8:32   0   10G  0 disk
[root@localhost ~]# fdisk /dev/sdc
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x989783d7.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
 
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
 
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').
 
Command (m for help): m
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)
 
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1305, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-1305, default 1305): +5G
 
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (655-1305, default 655):
Using default value 655
Last cylinder, +cylinders or +size{K,M,G} (655-1305, default 1305): 1305
 
Command (m for help): p
 
Disk /dev/sdc: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x989783d7
 
   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1         654     5253223+  83  Linux
/dev/sdc2             655        1305     5229157+  83  Linux

Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.

2、创建大小为2G的逻辑卷lv01挂载到系统中的/u01目录下面,并且在/u01目录下面创建file1~file5 5个文件。

 

[root@localhost ~]# mkdir /u01
[root@localhost ~]# pvcreate /dev/sdc1
  Physical volume "/dev/sdc1" successfully created
[root@localhost ~]# pvcreate /dev/sdc2
  Physical volume "/dev/sdc2" successfully created
[root@localhost ~]# vgextend  VolGroup /dev/sdc[1-2]
  Volume group "VolGroup" successfully extended

[root@localhost ~]# lvcreate -n lv02 -L 2G VolGroup
  Logical volume "lv02" created
[root@localhost ~]# mkfs -t ext4 /dev/mapper/VolGroup-lv02
[root@localhost ~]# mount /dev/mapper/VolGroup-lv02 /u01
[root@localhost ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                       18G   14G  3.0G  82% /
tmpfs                 491M     0  491M   0% /dev/shm
/dev/sda1             477M   28M  425M   6% /boot
/dev/mapper/VolGroup-lv01
                      4.8G   19M  4.6G   1% /data
/dev/mapper/VolGroup-lv02
                      2.0G  3.0M  1.9G   1% /u01
[root@localhost ~]# touch /u01/file{1..5}
[root@localhost ~]# ls /u01
file1  file2  file3  file4  file5  lost+found

3、假设sdb1分区有坏块,现在需要将sdb1分区上的数据快速移动到另外的硬盘sdb2上,怎么做?

首先,先在sdb2新建一个逻辑卷,然后挂载,把sdb1分区上的数据拷贝到sdb2

4、由于业务需要,/u01目录需要扩大到9G,怎么做?

 

[root@localhost ~]# lvextend -L +7G /dev/mapper/VolGroup-lv02
[root@localhost ~]# resize2fs /dev/mapper/VolGroup-lv02

5、新建一个卷组vg02,PEsize为8M,在卷组中创建一个名为lv02的逻辑卷,大小为50个pe,格式化成ext3的文件系统挂载使用,要求开机自动挂载

 

vgcreate -s 8M vg02 /dev/sda3
lvcreate -n lv02 -l 50 vg02
mkfs.ext3 /dev/mapper/vg02-lv02

扩展:

1、测试验证已有逻辑卷的硬盘,从一台服务器换到另一台服务器上是否可以正常读取到原来的数据?需要怎么做?

不能正常读取原来数据,已经有分区表,可以挂载读到原来的数据,重要的是原服务器必须关机,要不加不了

正常的步骤是添加进去先要激活vg,然后才可以挂载使用

vgchange -a y lvm_list激活卷组

2、测试验证已有互为镜像的逻辑卷的硬盘,从一台服务器换到另一台服务器上是否可以正常读取数据?怎么做?

原来服务器关掉,现有服务器也关掉,然后把原服务器互为镜像的逻辑硬盘加到现在服务器,可以读取数据,需要正常挂载

lvmdiskcan扫描块设备,看看那些是逻辑卷

 

逻辑卷迁移:
源端:
1)将源文件系统umount
 umount /test
2)将lv和lv inactive
lvchange -an /dev/vg_test/lv_test
vgchange -an vg_test
3)导出vg
vgexport vg_test
目标端:
1)永kudzu检测新的盘
2)导入vg
vgimport vg_test
3)激活vg
vgchange -ay vg_test
3)mount文件系统