kk Blog —— 通用基础


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

PHP ZipArchive::setCompressionName压缩质量

在添加文件之前,我们可以通过设置ZipArchive类的属性setCompressionName来设置文件的压缩质量。

压缩质量有几个选项可供选择,包括

ZipArchive::CM_STORE表示不进行压缩,

ZipArchive::CM_DEFLATE表示使用DEFLATE算法进行压缩。

默认情况下,压缩质量是ZipArchive::CM_STORE,即不进行压缩。

https://www.php.net/manual/en/ziparchive.setcompressionname.php

1
2
3
4
5
6
7
8
9
10
public ZipArchive::setCompressionName(string $name, int $method, int $compflags = 0): bool

name
	Name of the entry.
method
	The compression method, one of the ZipArchive::CM_* constants.
compflags
	Compression level.

Returns true on success or false on failure. 

The compression level (compflags) option is, generally speaking, an integer value between 0 and 9. The behavior of the system depends on the selected method and the value of compflags and can sometimes be not you expected.

The result below is from PHP 8.1 on Windows platform and may possibly be different on other systems or versions:

  • for the CM_DEFAULT method, always CM_DEFLATE is used with level 9, regardless of what you put as compflags,

  • for the CM_STORE method, for compflags 0-9 you get the same result, which is obvious because the method itself means “no compression at all”. However, for compflags>9, surprisingly the CM_DEFLATE method is used instead with compression level 9.

  • for CM_DEFLATE method, 1 means the fastest and weakest compression, while 9 - the slowest and strongest one. compflags=0 and compflags>9 works as it if were with compflags=9,

  • for CM_BZIP2 method, 1 means the fastest and weakest compression, while 9 - the slowest and strongest one. compflags=0 works like compflag=9, and if you use compflags>9, the method will surprisingly switch to CM_DEFLATE level 9,

  • for CM_XZ method, 0 means the fastest and weakest compression, while 9 - the slowest and strongest one. For compflags>9 the method surprisingly switch to CM_DEFLATE level 9.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$zip = new ZipArchive;
$res = $zip->open('test.zip', ZipArchive::CREATE);
if ($res === TRUE) {
	$zip->addFromString('foo', 'Some text');
	$zip->addFromString('bar', 'Some other text');
	$zip->addFromString('baa', 'Some other text2');
	$zip->setCompressionName('foo', ZipArchive::CM_STORE);

	$zip->setCompressionName('bar', ZipArchive::CM_DEFLATE);
	$zip->setCompressionName('baa', ZipArchive::CM_DEFLATE, 1);

	$zip->close();
	echo 'ok';
} else {
	echo 'failed';
}
?>

https://www.php.cn/faq/581904.html

1
2
$zip->addFile('path/to/file.txt', 'file.txt');
$zip->setCompressionName('file.txt', ZipArchive::CM_DEFLATE);

除了设置整个压缩文件的压缩质量,我们还可以为单独的文件设置压缩质量,代码示例如下:

1
$zip->setCompressionIndex(0, ZipArchive::CM_DEFLATE);

最后,我们需要关闭ZipArchive对象以完成整个压缩过程:

1
$zip->close();

https://www.cnblogs.com/aipiaoborensheng/p/6362858.html

https://vimsky.com/examples/detail/php-ex---ZipArchive-setCompressionName.html

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.