kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp
sar -n DEV 1

LVM 逻辑卷管理

显示PE到LE的映射, 即PE的使用情况

1
pvdisplay -m /dev/sdd1

https://www.cnblogs.com/cloudos/p/9348315.html

一、LVM概念

LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。

LVM的工作原理其实很简单,它就是通过将底层的物理硬盘抽象的封装起来,然后以逻辑卷的方式呈现给上层应用。在传统的磁盘管理机制中,我们的上层应用是直接访问文件系统,从而对底层的物理硬盘进行读取,而在LVM中,其通过对底层的硬盘进行封装,当我们对底层的物理硬盘进行操作时,其不再是针对于分区进行操作,而是通过一个叫做逻辑卷的东西来对其进行底层的磁盘管理操作。比如说我增加一个物理硬盘,这个时候上层的服务是感觉不到的,因为呈现给上层服务的是以逻辑卷的方式。

LVM最大的特点就是可以对磁盘进行动态管理。因为逻辑卷的大小是可以动态调整的,而且不会丢失现有的数据。如果我们新增加了硬盘,其也不会改变现有上层的逻辑卷。作为一个动态磁盘管理机制,逻辑卷技术大大提高了磁盘管理的灵活性。

二、LVM术语

PV(Physical Volume)- 物理卷

物理卷在逻辑卷管理中处于最底层,它可以是实际物理硬盘上的分区,也可以是整个物理硬盘。

VG(Volumne Group)-卷组

卷组建立在物理卷之上,一个卷组中至少要包括一个物理卷,在卷组建立之后可动态添加物理卷到卷组中。一个逻辑卷管理系统工程中可以只有一个卷组,也可以拥有多个卷组。

LV(Logical Volume)- 逻辑卷

逻辑卷建立在卷组之上,卷组中的未分配空间可以用于建立新的逻辑卷,逻辑卷建立后可以动态地扩展和缩小空间。系统中的多个逻辑卷可以属于同一个卷组,也可以属于不同的多个卷组

PE(Physical Extent):每一个物理卷被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。

LE(Logical Extent):逻辑卷也被划分为被称为LE(Logical Extents) 的可被寻址的基本单位。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。

如下图所示PV、VG、LV三者关系:

三、常用命令

PV:Physical(物理卷)

1
pvcreate、pvs 、pvdisplay 、pvremove、pvmove、pvscan

VG:Volume Group(卷组)

1
vgcreate、vgs、vgdisplay、vgremove、vgrename、vgreduce、vgextent、vgscan

LV:logical Volume(逻辑卷)

1
 lvcreate、lvs、lvdisplay、lvremove、lvextend、lvresize、lvscan、lvrename

四、环境准备

1、虚拟机新增两块磁盘

ESXI线添加虚拟磁盘,fdisk -l没发现,一般情况下重启服务器就可以。但是不能影响业务,为什么新增磁盘或磁盘扩容后,Linux系统识别不到呢?因为连接存储设备的SCSI总线需要重新扫描,才能识别到这些新的存储设备

1
2
3
4
5
6
7
8
9
10
[root@Node1 ~]# ls /sys/class/scsi_host/          //确定主机总线SCSI总线号    
host0  host1  host2
[root@Node1 ~]#  echo "- - -" > /sys/class/scsi_host/host0/scan   //重新扫描 SCSI总线添加磁盘
[root@Node1 ~]#  echo "- - -" > /sys/class/scsi_host/host1/scan
[root@Node1 ~]#  echo "- - -" > /sys/class/scsi_host/host2/scan
[root@Node1 ~]# fdisk -l | grep "^Disk /dev"     //检查硬盘是否在线
Disk /dev/sda: 53.7 GB, 53687091200 bytes, 104857600 sectors
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Disk /dev/sdc: 32.2 GB, 32212254720 bytes, 62914560 sectors
[root@Node1 ~]# 

2、用fidsk分别对/dev/sdb与/dev/sdc进行分区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
[root@Node1 ~]# fdisk  /dev/sdb   //对/dev/sdb进行分区
Welcome to fdisk (util-linux 2.23.2)

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xafcc8a41.

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p //主分区
Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +10G  
Partition 1 of type Linux and of size 10 GiB is set

Command (m for help): t   
Selected partition 1
Hex code (type L to list all codes): 8e    
Changed type of partition 'Linux' to 'Linux LVM'

Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
Partition number (2-4, default 2): 2
First sector (20973568-41943039, default 20973568): 
Using default value 20973568
Last sector, +sectors or +size{K,M,G} (20973568-41943039, default 41943039): 
Using default value 41943039
Partition 2 of type Linux and of size 10 GiB is set

Command (m for help): t
Partition number (1,2, default 2): 2
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

3、partprobe让内核重新识别分区表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@Node1 ~]#partprobe /dev/sd{b,c}
[root@Node1 ~]# partx -a /dev/sdc
[root@Node1 ~]# partx -s /dev/sdc
[root@Node1 ~]# cat /proc/partitions   //查看分区信息表
major minor  #blocks  name

   8        0   52428800 sda
   8        1     204800 sda1
   8        2   20971520 sda2
   8        3   20971520 sda3
   8        4          0 sda4
   8        5    5242880 sda5
   8        6    2097152 sda6
   8        7    2936832 sda7
   8       16   20971520 sdb
   8       17   10485760 sdb1
   8       18   10484736 sdb2
   8       32   31457280 sdc
   8       33          1 sdc1
   8       37   20971520 sdc5
   8       38   10482688 sdc6
  11        0    4415488 sr0
[root@Node1 ~]# ls /dev/sdb*     //查看/dev/sdb分区情况
/dev/sdb  /dev/sdb1  /dev/sdb2
[root@Node1 ~]# ls /dev/sdc*     //查看/dev/sdc分区情况
/dev/sdc  /dev/sdc1  /dev/sdc5  /dev/sdc6

4、验证磁盘分区结果

1
2
3
4
5
[root@Node1 ~]# fdisk -l | grep "LVM$"
/dev/sdb1            2048    20973567    10485760   8e  Linux LVM
/dev/sdb2        20973568    41943039    10484736   8e  Linux LVM
/dev/sdc5            4096    41947135    20971520   8e  Linux LVM
/dev/sdc6        41949184    62914559    10482688   8e  Linux LVM 

四、LVM常用操作命令

1、安装LVM

1
2
3
4
5
6
7
[root@Node1 ~]# cat /etc/system-release     //查看系统版本
CentOS Linux release 7.6.1810 (Core)
[root@Node1 ~]# yum -y install lvm2         //安装LVM包
[root@Node1 ~]# rpm -qa | grep lvm
llvm-private-6.0.1-2.el7.x86_64
lvm2-2.02.180-10.el7_6.8.x86_64
lvm2-libs-2.02.180-10.el7_6.8.x86_64

2、PV物理卷常用操作

1
2
3
4
5
pvcreate /dev/DEVICE: 创建PV
pvs:简要PV信息显示
pvdisplay:显示PV的详细信息
pvremove  /dev/DEVICE: 移除PV
pvscan: 扫描系统中连接的所有硬盘,列出找到的物理卷列表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@Node1 ~]# pvcreate /dev/sdb{1,2}       //创建2个物理卷pv
  Physical volume "/dev/sdb1" successfully created.
  Physical volume "/dev/sdb2" successfully created.
[root@Node1 ~]# pvs                         //查看物理卷摘要信息
  PV         VG Fmt  Attr PSize   PFree  
  /dev/sdb1     lvm2 ---   10.00g  10.00g
  /dev/sdb2     lvm2 ---  <10.00g <10.00g
[root@Node1 ~]# pvscan                     //搜索已存在的物理卷
  PV /dev/sdb2                      lvm2 [<10.00 GiB]
  PV /dev/sdb1                      lvm2 [10.00 GiB]
  Total: 2 [<20.00 GiB] / in use: 0 [0   ] / in no VG: 2 [<20.00 GiB]
[root@Node1 ~]# pvremove  /dev/sdb2         //移除/dev/sdb2
  Labels on physical volume "/dev/sdb2" successfully wiped.
[root@Node1 ~]# pvdisplay  /dev/sdb1       //显示详细的物理卷信息
  "/dev/sdb1" is a new physical volume of "10.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name               
  PV Size               10.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               k6YMJN-BfTI-DL8G-qjEr-onjT-CmDK-IzC9vB
[root@Node1 ~]# pvcreate /dev/sdb2        // 将/dev/sdb2加入物理卷
  Physical volume "/dev/sdb2" successfully created.  
[root@Node1 ~]# pvs -o +pv_uuid
  PV         VG     Fmt  Attr PSize   PFree   PV UUID                               
  /dev/sdb1  datavg lvm2 a--  <10.00g <10.00g GX3Clm-pGDv-4xtw-VIr3-x00m-vIlD-zPOooJ
  /dev/sdb2  datavg lvm2 a--  <10.00g <10.00g zuMtAt-6S6z-3vDa-xnj2-WADw-hk0s-H9V1Wi
  /dev/sdc5  datavg lvm2 a--  <10.00g <10.00g orxgvl-GKbn-LMN0-YOUY-mIGA-TqJp-g1V8iv  
[root@Node1 ~]# pvs -v

3、VG常用操作

1
2
3
4
5
6
7
vgcreate vgname /dev/DEVICE1 /dev/DEVICE2 ...  创建VG卷组
vgs: 简要VG信息显示
vgextend:动态扩展LVM卷组,它通过向卷组中添加物理卷来增加卷组的容量
vgreduce:通过删除LVM卷组中的物理卷来减少卷组容量,不能删除LVM卷组中剩余的最后一个物理卷
vgdisplay:显示VG的详细信息
vgscan:查找系统中存在的LVM卷组,并显示找到的卷组列表
vgremove:删除卷组,其上的逻辑卷必须处于离线状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
[root@Node1 ~]# vgcreate datavg /dev/sdb{1,2}     //创建datavg卷组  
  Volume group "datavg" successfully created
[root@Node1 ~]# vgdisplay datavg           //显示datavg详细信息,也可以使用vgdisplay -vv或vgdisplay -vvv命令       --- Volume group ---
  VG Name               datavg
  System ID             
  Format                lvm2
  Metadata Areas        2
  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                2
  Act PV                2
  VG Size               19.99 GiB
  PE Size               4.00 MiB
  Total PE              5118
  Alloc PE / Size       0 / 0   
  Free  PE / Size       5118 / 19.99 GiB
  VG UUID               thDWMH-ZXq6-zJP5-LtTn-xmQh-OpG5-b3qrUu
   
[root@Node1 ~]# vgs       //显示VG的简要信息
  VG     #PV #LV #SN Attr   VSize  VFree 
  datavg   2   0   0 wz--n- 19.99g 19.99g
[root@Node1 ~]# vgextend datavg  /dev/sdc5    //向datavg卷组中添加物理卷
  Physical volume "/dev/sdc5" successfully created.
  Volume group "datavg" successfully extended
[root@Node1 ~]# pvs
  PV         VG     Fmt  Attr PSize   PFree  
  /dev/sdb1  datavg lvm2 a--  <10.00g <10.00g
  /dev/sdb2  datavg lvm2 a--  <10.00g <10.00g
  /dev/sdc5  datavg lvm2 a--  <10.00g <10.00g
[root@Node1 ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree  
  datavg   3   0   0 wz--n- <29.99g <29.99g
[root@Node1 ~]# vgreduce datavg /dev/sdc5  //从datavg卷组中移除物理卷
  Removed "/dev/sdc5" from volume group "datavg"
[root@Node1 ~]# vgs
  VG     #PV #LV #SN Attr   VSize  VFree 
  datavg   2   0   0 wz--n- 19.99g 19.99g
[root@Node1 ~]# pvs
  PV         VG     Fmt  Attr PSize   PFree  
  /dev/sdb1  datavg lvm2 a--  <10.00g <10.00g
  /dev/sdb2  datavg lvm2 a--  <10.00g <10.00g
  /dev/sdc5         lvm2 ---   20.00g  20.00g
[root@Node1 ~]# vgremove datavg       //移除datavg
  Volume group "datavg" successfully removed.
[root@Node1 ~]# vgs
[root@Node1 ~]# vgcreate datavg /dev/sdb{1,2}
  Volume group "datavg" successfully created
[root@Node1 ~]# vgdisplay datavg 
  --- Volume group ---
  VG Name               datavg
  System ID             
  Format                lvm2
  Metadata Areas        2
  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                2
  Act PV                2
  VG Size               19.99 GiB
  PE Size               4.00 MiB
  Total PE              5118
  Alloc PE / Size       0 / 0   
  Free  PE / Size       5118 / 19.99 GiB
  VG UUID               T8c1W9-xpJF-vvnS-bm5y-gqmY-5RBK-wRkD9Y
   
[root@Node1 ~]# vgs
  VG     #PV #LV #SN Attr   VSize  VFree 
  datavg   2   0   0 wz--n- 19.99g 19.99g
[root@Node1 ~]# vgextend datavg  /dev/sdc5
  Volume group "datavg" successfully extended
[root@Node1 ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree  
  datavg   3   0   0 wz--n- <29.99g <29.99g
[root@Node1 ~]# pvs
  PV         VG     Fmt  Attr PSize   PFree  
  /dev/sdb1  datavg lvm2 a--  <10.00g <10.00g
  /dev/sdb2  datavg lvm2 a--  <10.00g <10.00g
  /dev/sdc5  datavg lvm2 a--  <10.00g <10.00g
[root@Node1 ~]# pvscan   //扫描系统中连接的所有硬盘,列出找到的物理卷列表
  PV /dev/sdb1   VG datavg          lvm2 [<10.00 GiB / <10.00 GiB free]
  PV /dev/sdb2   VG datavg          lvm2 [<10.00 GiB / <10.00 GiB free]
  PV /dev/sdc5   VG datavg          lvm2 [<10.00 GiB / <10.00 GiB free]
  Total: 3 [<29.99 GiB] / in use: 3 [<29.99 GiB] / in no VG: 0 [0   ]
[root@Node1 ~]# vgscan     //显示系统中所有卷组
  Reading volume groups from cache.
  Found volume group "datavg" using metadata type lvm2
[root@Node1 ~]# vgs -o +pv_name
  VG     #PV #LV #SN Attr   VSize   VFree   PV        
  datavg   3   0   0 wz--n- <29.99g <29.99g /dev/sdb1 
  datavg   3   0   0 wz--n- <29.99g <29.99g /dev/sdb2 
  datavg   3   0   0 wz--n- <29.99g <29.99g /dev/sdc5 
[root@Node1 ~]# vgs -v
  VG     Attr   Ext   #PV #LV #SN VSize   VFree   VG UUID                                VProfile
  datavg wz--n- 4.00m   3   0   0 <29.99g <29.99g 2b9qgs-mCb0-Isc2-Af74-5uWo-Yf8Q-4KOmns  

4、LV常用操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
lvcreate : 用来创建LVM的逻辑卷
       lvcreate -L #[mMgGtT] -n NAME VolumeGroup
      用法:lvcreate [选项] [参数]
    选项:
       -L:指定大小
       -l:指定大小(LE数)
       -n:指定名称
       -s:创建快照
   -p r:设置为只读(该选项一般用于创建快照中
lvs : 显示逻辑卷信息
lvscan:扫描当前系统中的所有逻辑卷,及其对应的设备文件
lvdisplay:显示逻辑卷属性
lvextend:可在线扩展逻辑卷空间
lvreduce:缩减逻辑卷空间,一般离线使用
lvremove:删除逻辑卷,需要处于离线(卸载)状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
[root@Node1 ~]# lvcreate -L 5G -n datalv datavg    //创建datalv逻辑卷
  Logical volume "datalv" created.
[root@Node1 ~]# ls /dev/mapper/
control  datavg-datalv
[root@Node1 ~]# mkfs.xfs -L Backup /dev/datavg/datalv   //格式化逻辑卷
meta-data=/dev/datavg/datalv     isize=512    agcount=4, agsize=327680 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=1310720, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@Node1 ~]#  mkdir /dbbackup
[root@Node1 ~]#  mount /dev/mapper/datavg-datalv /dbbackup/   //挂载至/dbbackup目录
[root@Node1 ~]#  df -hT | grep datalv  //查询datalv的挂载情况
/dev/mapper/datavg-datalv xfs       5G   33M  5G   1% /dbbackup
[root@Node1 ~]# lvs  //显示逻辑卷信息
  LV     VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  datalv datavg -wi-ao---- 5.00g                                                    
[root@Node1 ~]# lvscan  //扫描系统中的逻辑卷
  ACTIVE            '/dev/datavg/datalv' [5.00 GiB] inherit
[root@Node1 ~]# lvdisplay  //显示逻辑卷详细信息
  --- Logical volume ---
  LV Path                /dev/datavg/datalv
  LV Name                datalv
  VG Name                datavg
  LV UUID                Y1P5zJ-Wy1Q-kERv-VUtC-4vAm-NsMb-3aCy1y
  LV Write Access        read/write
  LV Creation host, time Node1.contoso.com, 2019-09-18 06:31:59 +0800
  LV Status              available
  # open                 1
  LV Size                5.00 GiB
  Current LE             3840
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0
[root@Node1 ~]# lvcreate -L 3G -n weblv datavg   //创建weblv逻辑卷
[root@Node1 ~]# mkfs.ext4 -L webapp /dev/datavg/weblv
[root@Node1 ~]# mkdir /webapp
[root@Node1 ~]# mount /dev/mapper/datavg-weblv /webapp/
[root@Node1 ~]# df -hT | grep mapper
/dev/mapper/datavg-datalv xfs        5G   33M   5G   1% /dbbackup
/dev/mapper/datavg-weblv  ext4      2.9G  9.0M  2.8G   1% /webapp
[root@Node1 ~]# lvs
  LV     VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  datalv datavg -wi-ao----  5.00g                                                    
  weblv  datavg -wi-ao----  3.00g                                                    
[root@Node1 ~]# lvscan
  ACTIVE            '/dev/datavg/datalv' [5.00 GiB] inherit
  ACTIVE            '/dev/datavg/weblv' [3.00 GiB] inherit

5、LVM逻辑卷的扩充与缩小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   lvextend:扩展逻辑卷空间
     lvextend -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME
   lvreduce:缩减逻辑卷空间
  缩减逻辑卷:
    1、先确定缩减后的目标大小;并确保对应的目标逻辑卷大小中有足够的空间可容纳原有所有数据;
    2、先卸载文件系统,并要执行强制检测  e2fsck -f
    3、缩减逻辑边界 resize2fs DEVICE
    4、缩减物理边界 lvreduce
    5、新挂载 mount
PS:缩减很危险,要离线操作

   lvresize:扩展或缩小逻辑卷空间
   resize2fs: 针对的是ext2、ext3、ext4文件系统
              调整ext2\ext3\ext4文件系统的大小,它可以放大或者缩小没有挂载的文件系统的大小。如果文件系统已经挂载,它可以扩大文件系统的大小,前提是内核支持在线调整大小。
   xfs_growfs: 针对的是xfs文件系统
1)ext2/ext3/ext4文件系统的调整命令是resize2fs(增大和减小都支持)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[root@Node1 ~]# lvextend -L 5G /dev/mapper/datavg-weblv    
//
增大至5G

[root@Node1 ~]# lvextend -L +2G /dev/mapper/datavg-weblv   
//
增加2G

[root@Node1 ~]# resize2fs /dev/mapper/datavg-weblv      //调整逻辑大小
[root@Node1 ~]# df -hT | grep weblv                     //由3G增大至5,又增加2G,目前7G
/dev/mapper/datavg-weblv  ext4      6.9G   14M  6.5G   1% /webapp     
[root@Node1 webapp]# cp /etc/fstab .  //复制fstab命令至当前目录
[root@Node1 webapp]# ls
fstab  lost+found
[root@Node1 ~]# umount -f /dev/mapper/datavg-weblv  //卸载/dev/mapper/datavg-weblv逻辑卷
[root@Node1 ~]# e2fsck -f /dev/datavg/weblv   //检查ext2、ext3、ext4文件系统,如果系统已经挂载了,那么不建议去检查,因为这样是不安全的
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
webapp: 12/458752 files (0.0% non-contiguous), 48640/1835008 blocks
[root@Node1 ~]# resize2fs /dev/datavg/weblv 5G  //调整至5G空间大小的逻辑卷
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/datavg/weblv to 1310720 (4k) blocks.
The filesystem on /dev/datavg/weblv is now 1310720 blocks long.

[root@Node1 ~]# lvreduce -L 5G /dev/datavg/weblv  //缩减至5G空间大小的逻辑卷
  WARNING: Reducing active logical volume to 5.00 GiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce datavg/weblv? [y/n]: y
  Size of logical volume datavg/weblv changed from 7.00 GiB (1792 extents) to 5.00 GiB (1280 extents).
  Logical volume datavg/weblv successfully resized.
[root@Node1 ~]# mount /dev/mapper/datavg-weblv /webapp/  //重新挂载
[root@Node1 ~]# df -hT | grep weblv/dev/mapper/datavg-weblv  ext4      4.9G   12M  4.7G   1% /webapp
[root@Node1 ~]# ls /webapp/      //查看fstab文件还在
fstab  lost+found
2)xfs文件系统的调整命令是xfs_growfs(只支持增大)
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@Node1 ~]# lvextend -L 8G /dev/mapper/datavg-datalv   //增大至8G
[root@Node1 ~]# lvextend -L +2G /dev/mapper/datavg-datalv  //增加2G
[root@Node1 ~]# xfs_growfs /dev/mapper/datavg-datalv     //扩容xfs逻辑卷
[root@Node1 ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree 
  datavg   3   2   0 wz--n- <29.99g <9.99g
[root@Node1 ~]# lvs
  LV     VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  datalv datavg -wi-ao---- 15.00g                                                    
  weblv  datavg -wi-ao----  5.00g                                                    
[root@Node1 ~]# lvscan
  ACTIVE            '/dev/datavg/datalv' [15.00 GiB] inherit
  ACTIVE            '/dev/datavg/weblv' [5.00 GiB] inherit

PS:xfs文件系统只支持增大分区空间的情况,不支持减小的情况,硬要减小的话,只能在减小后将逻辑分区重新通过mkfs.xfs命令重新格式化才能挂载上,这样的话这个逻辑分区上原来的数据就丢失了

6、逻辑卷快照

snapshot是像照相一样将当前的系统信息保存下来。

当创建一个snapshot的时候,仅拷贝原始卷里数据的元数据(meta-data)。创建的时候,并不会有数据的物理拷贝,因此snapshot的创建几乎是实时的,当原始卷上有写操作执行时,snapshot跟踪原始卷块的改变,这个时候原始卷上将要改变的数据在改变之前被拷贝到snapshot预留的空间里,因此这个原理的实现叫做写时复制(copy-on-write)。

在写操作写入块之前,原始数据被移动到 snapshot空间里,这样就保证了所有的数据在snapshot创建时保持一致。而对于snapshot的读操作,如果是没有修改过的块,那么会将读操作直接重定向到原始卷上,如果是已经修改过的块,那么就读取拷贝到snapshot中的块。

注:创建快照前需将针对的逻辑卷临时改为只读,创建完毕后再改为读写,例如

  • 创建快照前:mount -o remount,ro /dev/datavg/weblv /webapp

  • 创建快照后:mount -o remount,rw /dev/datavg/weblv /webapp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
[root@Node1 webapp]# df -h | grep datavg
/dev/mapper/datavg-weblv   4.9G   13M  4.7G   1% /webapp
/dev/mapper/datavg-datalv   15G   33M   15G   1% /dbbackup
[root@Node1 ~]# cd /webapp/
[root@Node1 webapp]# cp /etc/passwd /etc/fstab /etc/redhat-release .    //复制一些文件到当前目录
[root@Node1 webapp]# ls
fstab  lost+found  passwd  redhat-release
[root@Node1 webapp]# mount -o remount,ro /dev/datavg/weblv /webap  //先改成只读挂载
[root@Node1 webapp]# lvcreate -s -L 2G -n weblvsnap -p r /dev/datavg/weblv  //对weblv做快照为weblvsnap 大小为2G,设为只读
  Logical volume "weblvsnap" created.
[root@Node1 webapp]# mount -o remount,rw /dev/datavg/weblv /webapp  //快照完,改为读写挂载
[root@Node1 webapp]# mdir /mnt/web
[root@Node1 webapp]# mount /dev/datavg/weblvsnap /mnt/web/    //挂载快照
mount: /dev/mapper/datavg-weblvsnap is write-protected, mounting read-only
[root@Node1 webapp]# df -hT | grep weblv
/dev/mapper/datavg-weblv     ext4      4.9G   13M  4.7G   1% /webapp
/dev/mapper/datavg-weblvsnap ext4      4.9G   13M  4.7G   1% /mnt/web
[root@Node1 webapp]# ls
fstab  lost+found  passwd  redhat-release
[root@Node1 webapp]# rm -rf fstab && echo data > data.txt
[root@Node1 webapp]# ls
data.txt  lost+found  passwd  redhat-release
[root@Node1 webapp]# ls /mnt/web/
fstab  lost+found  passwd  redhat-release
[root@Node1 webapp]# ls
data.txt  lost+found  passwd  redhat-release
[root@Node1 webapp]# ls /mnt/web/
fstab  lost+found  passwd  redhat-release
[root@Node1 webapp]# cd /mnt/web/
[root@Node1 web]# ls
fstab  lost+found  passwd  redhat-release
[root@Node1 web]# rm -rf fstab   //挂载为只读模式,无法删除该目录下的文件
rm: cannot remove ‘fstab’: Read-only 
[root@Node1 web]# lvs
  LV        VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  datalv    datavg -wi-ao---- 15.00g                                                    
  weblv     datavg owi-aos---  5.00g                                                    
  weblvsnap datavg sri-aos---  2.00g      weblv  0.01                                   
[root@Node1 web]# lvscan
  ACTIVE            '/dev/datavg/datalv' [15.00 GiB] inherit
  ACTIVE   Original '/dev/datavg/weblv' [5.00 GiB] inherit
  ACTIVE   Snapshot '/dev/datavg/weblvsnap' [2.00 GiB] inherit
[root@Node1 web]# lvdisplay /dev/datavg/weblvsnap 
  --- Logical volume ---
  LV Path                /dev/datavg/weblvsnap
  LV Name                weblvsnap
  VG Name                datavg
  LV UUID                pf2jl8-21kq-kCKf-PymV-Vqvn-a5nm-q2tp0s
  LV Write Access        read only
  LV Creation host, time Node1.contoso.com, 2019-09-19 05:31:23 +0800
  LV snapshot status     active destination for weblv
  LV Status              available
  # open                 1
  LV Size                5.00 GiB
  Current LE             1280
  COW-table size         2.00 GiB
  COW-table LE           512
  Allocated to snapshot  0.01%
  Snapshot chunk size    4.00 KiB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:4

7、删除LVM流程

卸载 => lvremove => vgremove => pvremove

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@Node1 ~]# umount /dev/mapper/datavg-weblvsnap
[root@Node1 ~]# umount /dev/mapper/datavg-weblv
[root@Node1 ~]# umount /dev/mapper/datavg-datalv
[root@Node1 ~]# lvremove /dev/mapper/datavg-weblvsnap   //删除逻辑卷,需要处于离线(卸载)状态
Do you really want to remove active logical volume datavg/weblvsnap? [y/n]: y
  Logical volume "weblvsnap" successfully removed
[root@Node1 ~]# lvs
  LV     VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  datalv datavg -wi-ao---- 15.00g                                                    
  weblv  datavg -wi-ao----  5.00g  
[root@Node1 ~]# vgremove datavg   //删除卷组
Do you really want to remove volume group "datavg" containing 1 logical volumes? [y/n]: y
Do you really want to remove active logical volume datavg/weblv? [y/n]: y
  Logical volume "weblv" successfully removed
  Volume group "datavg" successfully removed
[root@Node1 ~]# pvremove /dev/sdc5  //移除物理卷
  Labels on physical volume "/dev/sdc5" successfully wiped.

五、LVM的优缺点

优点:

  1. 文件系统可以跨多个磁盘,因此文件系统大小不会受物理磁盘的限制。

  2. 可以在系统运行的状态下动态的扩展文件系统的大小

  3. 可以增加新的磁盘到LVM的存储池中。

  4. 可以以镜像的方式冗余重要的数据到多个物理磁盘。

  5. 可以方便的导出整个卷组到另外一台机器。

缺点:

  1. 在从卷组中移除一个磁盘的时候必须使用reducevg命令(这个命令要求root权限,并且不允许在快照卷组中使用)。

  2. 当卷组中的一个磁盘损坏时,整个卷组都会受到影响。

  3. 因为加入了额外的操作,存储性能受到影响

  4. 不能减小文件系统大小(受文件系统类型限制)

使用 LVM 将获得更好的可扩展性和可操作性,但却损失了可靠性和存储性能,总的说来就是在这两者间选择。

LVM 输出更多信息

显示PE到LE的映射, 即PE的使用情况

1
pvdisplay -m /dev/sdd1

https://www.cnblogs.com/useradd/p/10005211.html

显示LVM信息常用 pvs,lvs,vgs 命令,如果想显示详细信息可以使用 pvdisplay ,vgdisplay ,lvdisplay,其中前面命令仅用于简单输出 lvm 对象相关信息,可以格式化输出;第二种命令会详细显示 lvm 对像信息,但不易于格式化输出。

1
2
3
pvs  # 显示物理卷(pv)信息
vgs   # 显示逻辑卷组(vg)信息
lvs   # 显示逻辑卷(lv)信息

显示额外信息

1
2
3
pvs -v
vgs -v
lvs -v

只显示 pv_name,dev_size 字段

1
2
3
4
[root@redhat6 lvm]# pvs -o pv_name,dev_size
  PV         DevSize
  /dev/sda2   14.51g
  /dev/sdb     4.00g

增加 -o 参数,指定需要输出的字段。

在pvs 默认输出上,增加字段

1
2
3
4
[root@redhat6 lvm]# pvs -o +pv_uuid
  PV         VG         Fmt  Attr PSize  PFree PV UUID                              
  /dev/sda2  vg_redhat6 lvm2 a--  14.51g    0  dpTW84-DHRy-PIA9-u1tY-YUH4-XQKw-8Hy2Zm
  /dev/sdb   vg_redhat6 lvm2 a--   4.00g 2.81g YKIQwX-zc6H-TZ65-P3qr-sRfk-LX0p-T18vdG

如果想在默认输出的前提下增加字段,可以使用 -o + 字段名。

vgs 显示卷组成员

1
2
3
4
5
[root@redhat6 lvm]# vgs -o +lv_name
  VG         #PV #LV #SN Attr   VSize  VFree LV
  vg_redhat6   2   3   0 wz--n- 18.50g 2.81g lv_root
  vg_redhat6   2   3   0 wz--n- 18.50g 2.81g lv_swap
  vg_redhat6   2   3   0 wz--n- 18.50g 2.81g lv_pgdata_01

字段排序

根据 lv_size 字段排序

1
2
3
4
5
[root@redhat6 lvm]# lvs -O lv_size
  LV           VG         Attr   LSize   Origin Snap%  Move Log Copy%  Convert
  lv_pgdata_01 vg_redhat6 -wi-ao 700.00m
  lv_swap      vg_redhat6 -wi-ao   1.91g
  lv_root      vg_redhat6 -wi-ao  13.10g

如果想根据输出字段排序,可以使用 -O 字段名 选项。

附 lvs,vgs,pvs 字段

4.1 lvs 字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
lv_all               - All fields in this section.
lv_uuid              - Unique identifier.
lv_name              - Name.  LVs created for internal use are enclosed in brackets.
lv_path              - Full pathname for LV.
lv_attr              - Various attributes - see man page.
lv_major             - Persistent major number or -1 if not persistent.
lv_minor             - Persistent minor number or -1 if not persistent.
lv_read_ahead        - Read ahead setting in current units.
lv_kernel_major      - Currently assigned major number or -1 if LV is not active.
lv_kernel_minor      - Currently assigned minor number or -1 if LV is not active.
lv_kernel_read_ahead - Currently-in-use read ahead setting in current units.
lv_size              - Size of LV in current units.
seg_count            - Number of segments in LV.
origin               - For snapshots, the origin device of this LV.
origin_size          - For snapshots, the size of the origin device of this LV.
snap_percent         - For snapshots, the percentage full if LV is active.
copy_percent         - For mirrors and pvmove, current percentage in-sync.
move_pv              - For pvmove, Source PV of temporary LV created by pvmove.
convert_lv           - For lvconvert, Name of temporary LV created by lvconvert.
lv_tags              - Tags, if any.
mirror_log           - For mirrors, the LV holding the synchronisation log.
modules              - Kernel device-mapper modules required for this LV.

4.2 pvs 字段

1
2
3
4
5
6
7
8
9
10
11
pv_all               - All fields in this section.
pe_start             - Offset to the start of data on the underlying device.
pv_size              - Size of PV in current units.
pv_free              - Total amount of unallocated space in current units.
pv_used              - Total amount of allocated space in current units.
pv_attr              - Various attributes - see man page.
pv_pe_count          - Total number of Physical Extents.
pv_pe_alloc_count    - Total number of allocated Physical Extents.
pv_tags              - Tags, if any.
pv_mda_count         - Number of metadata areas on this device.
pv_mda_used_count    - Number of metadata areas in use on this device.

4.3 vgs 字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
vg_all               - All fields in this section.
vg_fmt               - Type of metadata.
vg_uuid              - Unique identifier.
vg_name              - Name.
vg_attr              - Various attributes - see man page.
vg_size              - Total size of VG in current units.
vg_free              - Total amount of free space in current units.
vg_sysid             - System ID indicating when and where it was created.
vg_extent_size       - Size of Physical Extents in current units.
vg_extent_count      - Total number of Physical Extents.
vg_free_count        - Total number of unallocated Physical Extents.
max_lv               - Maximum number of LVs allowed in VG or 0 if unlimited.
max_pv               - Maximum number of PVs allowed in VG or 0 if unlimited.
pv_count             - Number of PVs.
lv_count             - Number of LVs.
snap_count           - Number of snapshots.
vg_seqno             - Revision number of internal metadata.  Incremented whenever it changes.
vg_tags              - Tags, if any.
vg_mda_count         - Number of metadata areas on this VG.
vg_mda_used_count    - Number of metadata areas in use on this VG.
vg_mda_free          - Free metadata area space for this VG in current units.
vg_mda_size          - Size of smallest metadata area for this VG in current units.
vg_mda_copies        - Target number of in use metadata areas in the VG.

LVM 缩减 VG 大小 ( pvmove )

显示PE到LE的映射, 即PE的使用情况

1
pvdisplay -m /dev/sdd1

https://www.systutorials.com/docs/linux/man/8-pvmove/

https://www.linuxcool.com/pvmove

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Move all physical extents that are used by simple LVs on the specified PV to free physical extents elsewhere in the VG.
pvmove /dev/sdb1

Use a specific destination PV when moving physical extents.
pvmove /dev/sdb1 /dev/sdc1

Move extents belonging to a single LV.
pvmove -n lvol1 /dev/sdb1 /dev/sdc1

Rather than moving the contents of an entire device, it is possible to move a range of physical extents, for example numbers 1000 to 1999 inclusive on the specified PV.
pvmove /dev/sdb1:1000-1999

A range of physical extents to move can be specified as start+length. For example, starting from PE 1000. (Counting starts from 0, so this refers to the 1001st to the 2000th PE inclusive.)
pvmove /dev/sdb1:1000+1000

Move a range of physical extents to a specific PV (which must have sufficient free extents).
pvmove /dev/sdb1:1000-1999 /dev/sdc1

Move a range of physical extents to specific new extents on a new PV.
pvmove /dev/sdb1:1000-1999 /dev/sdc1:0-999

If the source and destination are on the same disk, the anywhere allocation policy is needed.
pvmove --alloc anywhere /dev/sdb1:1000-1999 /dev/sdb1:0-999

The part of a specific LV present within in a range of physical extents can also be picked out and moved.
pvmove -n lvol1 /dev/sdb1:1000-1999 /dev/sdc1

https://www.cnblogs.com/useradd/p/10005212.html

pvmove 命令用来将一块盘上的数据移到另一块盘,可以移动整块盘的数据,也可以移动指定 extent 范围的数据, 接下来演示 pvmove 的一个例子,下面这个例子的 VG 由三个 PV 组成,我们想将其中一个 PV 的数据移动其它 PV中,空闲的PV 可以用来创建新的 VG。

1 显示 pv 使用信息

1
2
3
4
5
 [root@redhat6 ~]# pvs -o+pv_used
  PV         VG         Fmt  Attr PSize  PFree Used  
  /dev/sda2  vg_redhat6 lvm2 a--  14.51g    0   14.51g
  /dev/sdb   vg_redhat6 lvm2 a--   4.00g 2.62g   1.38g
  /dev/sdc   vg_redhat6 lvm2 a--   6.00g 5.60g 404.00m

从上面看出,有三块 pv

2 移动 /dev/sdb 数据到 /dev/sdc 盘上

1
2
3
4
5
6
7
8
[root@redhat6 ~]# pvmove /dev/sdb /dev/sdc
  /dev/sdb: Moved: 0.8%
  /dev/sdb: Moved: 28.3%
  /dev/sdb: Moved: 42.5%
  /dev/sdb: Moved: 57.2%
  /dev/sdb: Moved: 72.8%
  /dev/sdb: Moved: 92.6%
  /dev/sdb: Moved: 100.0%

上述命令将 /dev/sdb 文件移动 /dev/sdc 上。

3 再次查看 pv 信息

1
2
3
4
5
[root@redhat6 ~]# pvs -o+pv_used
  PV         VG         Fmt  Attr PSize  PFree Used 
  /dev/sda2  vg_redhat6 lvm2 a--  14.51g    0  14.51g
  /dev/sdb   vg_redhat6 lvm2 a--   4.00g 4.00g     0
  /dev/sdc   vg_redhat6 lvm2 a--   6.00g 4.22g  1.77g

从上面看出 /dev/sdb 盘使用空间为 0,说明空间被腾出。

4 将 /dev/sdb 从 VG vg_redhat6 中移出

1
2
3
4
5
6
7
8
[root@redhat6 ~]# vgreduce /dev/vg_redhat6 /dev/sdb 
  Removed "/dev/sdb" from volume group "vg_redhat6" 

[root@redhat6 ~]# pvs
  PV         VG         Fmt  Attr PSize  PFree
  /dev/sda2  vg_redhat6 lvm2 a--  14.51g    0
  /dev/sdb              lvm2 a--   4.00g 4.00g
  /dev/sdc   vg_redhat6 lvm2 a--   6.00g 4.22g 

根据pvs 信息, /dev/sdb 已经不是 VG vg_redhat6 的成员了。 那么 /dev/sdb 盘可以移除,或者它用。

5 在 /dev/sdb 上创建新的 VG

1
2
3
4
5
6
[root@redhat6 ~]# vgcreate vg_pgroot  /dev/sdb
  Volume group "vg_pgroot" successfully created
[root@redhat6 ~]# vgs
  VG         #PV #LV #SN Attr   VSize  VFree
  vg_pgroot    1   0   0 wz--n-  4.00g 4.00g
  vg_redhat6   2   4   0 wz--n- 20.50g 4.22g

6 再次查看 PV /dev/sdb 信息

1
2
3
4
5
[root@redhat6 ~]# pvs
  PV         VG         Fmt  Attr PSize  PFree
  /dev/sda2  vg_redhat6 lvm2 a--  14.51g    0
  /dev/sdb   vg_pgroot  lvm2 a--   4.00g 4.00g
  /dev/sdc   vg_redhat6 lvm2 a--   6.00g 4.22g

/dev/sdb 已经是 VG vg_pgroot 的成员了。