[TOC]

0x00 LVM快速入门

描述:LVM——Logical Volume Manager就是动态卷管理在Linux2.4内核以上实现的磁盘管理技术,它可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。

LVM的工作原理: 通过将底层的物理硬盘抽象的封装起来,然后以逻辑卷的方式呈现给上层应用;

  • 在传统的磁盘管理机制中,我们的上层应用是直接访问文件系统,从而对底层的物理硬盘进行读取,
  • 在LVM中,其通过对底层的硬盘进行封装,当我们对底层的物理硬盘进行操作时,其不再是针对于分区进行操作,而是通过一个叫做逻辑卷的东西来对其进行底层的磁盘管理操作

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

基本概念:

  • 1、 物理卷—–PV(Physical Volume)
    • 物理卷在逻辑卷管理中处于最底层,它可以是实际物理硬盘上的分区,也可以是整个物理硬盘。
  • 2、 卷组——–VG(Volumne Group)

    • 卷组建立在物理卷之上,一个卷组中至少要包括一个物理卷,在卷组建立之后可动态添加物理卷到卷组中。一个逻辑卷管理系统工程中可以只有一个卷组,也可以拥有多个卷组。
  • 3、 逻辑卷—–LV(Logical Volume)

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

  • 4、 物理区域–PE(Physical Extent)

    • 物理区域是物理卷中可用于分配的最小存储单元,物理区域的大小可根据实际情况在建立物理卷时指定。物理区域大小一旦确定将不能更改,同一卷组中的所有物理卷的物理区域大小需要一致。
  • 5、 逻辑区域―LE(Logical Extent)

    • 逻辑区域是逻辑卷中可用于分配的最小存储单元,逻辑区域的大小取决于逻辑卷所在卷组中的物理区域的大小。
  • 6、 卷组描述区域—–(Volume Group Descriptor Area)

    • 卷组描述区域存在于每个物理卷中,用于描述物理卷本身、物理卷所属卷组、卷组中的逻辑卷及逻辑卷中物理区域的分配等所有信息,卷组描述区域是在使用pvcreate建立物理卷时建立的。

用途:LVM就是Linux下专门针对我们数据的不断的扩大,在原有动态磁盘的基础上动态的调整磁盘的大小,LVM动态卷管理,一张图片让你深入了解lvm的使用。
四个概念:

  • ②PV(Physical Volume) 物理卷: 处于LVM最底层,可以是物理硬盘或者分区。
  • ①PE(Physical Extend) 物理拓展: PV中可以用于分配的最小存储单元,可以在创建PV的时候制定(默认为4MB*n)
  • ③VG(Volume Group) 卷组 : 建立在PV之上,可以含有一个到多个PV
  • ④LV(Logical Volume) 逻辑卷: 建立在VG之上,相当于原来分区的概念,不过大小可以动态改变
WeiyiGeek.

WeiyiGeek.



LVM的优点:

  • 在系统运行状态下动态扩展文件系统的大小
  • 文件系统可以跨多个磁盘,因此文件系统大小不会受物理磁盘的限制
  • 可以增加新的磁盘到LVM的存储池中
  • 可以以镜像的方式冗余重要的数据到多个物理磁盘
  • 可以方便的导出整个卷组到另外一台机器



LVM的缺点:

  • ①.在从卷组中移除一个磁盘的时候必须使用reducevg命令(这个命令要求root权限,并且不允许在快照卷组中使用)。
  • ②.当卷组中的一个磁盘损坏时,整个卷组都会受到影响。
  • ③.因为加入了额外的操作,存贮性能受到影响。

工作原理:

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

WeiyiGeek.原理图


0x01 LVM操作

LVM常用操作命令一览:

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
1) 查看物理卷/卷组/逻辑卷
pvs / pvdisplay #查看物理卷
pes / pedisplay #查看pe的大小(pes==pescan)
vgs / vgdisplay #查看卷组
lvs / lvdisplay #查看逻辑卷
fdisk -l #查看磁盘分区


2) 创建pv/vg/lv
pvcreate 设备路径 创建物理卷
vgcreate 名字 pv路径 创建卷组
lvcreate -n 名字 -L 大小 vg名 创建逻辑卷
格式化:mkfs.ext4 lv完整路径 格式化逻辑卷(mkfs.文件系统格式或-t 文件系统格式)
挂载:mount lv完整路径 挂载点 挂载使用(可以使用/etc/fstab或autofs)


3) 逻辑卷删除:
1.卸载:umount
2.删lv:lvremove lv完整路径
3.删vg:vgremove vg名
4.删PV:pvremove 设备完整路径 去硬盘


4) 逻辑卷扩展:
1.扩展pv:相当于创建pv
2.扩展vg: vgextend vg名 新增pv路径
3.扩展lv: lvextend -L +扩展量 lv完整名 -r #加-r不用刷新系统
4.刷新文件系统:resize2fs lv完整路径
注意:灵活运用,看实际情况,注意顺序 (支持在线操作)


5) 逻辑卷的缩小: #减小需谨慎,文件系统的减小后大小一定要和lv卷最终大小相等
1.首先进行卸载 umount 检查文件系统:e2fsck -f lv完整路径
2.减少文件系统:resize2fs lv完整路径 减少到的大小
3.减少lv卷大小:lvreduce -L -减少量的大小 lv的完整路径
4.挂载使用

0x02 LVM实战

测试环境:CentOS release 6.10 (Final) 2.6.32-754.12.1.el6.i686
使用VirtualBOX来模拟我添加了一块1G的磁盘;
1) LVS创建

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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#1.添加的磁盘状态
$fdisk -l /dev/sdb

Disk /dev/sdb: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 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: 0x00000000


#2.在上面创建了两个分区sdb1和sdb2各500M。
$fdisk /dev/sdb
Command (m for help): u
Changing display/entry units to sectors

Command (m for help): m
Command (m for help): u
#建立两个主分区:p 分别500MB

Command (m for help): p
Disk identifier: 0x91982288
Device Boot Start End Blocks Id System
/dev/sdb1 2048 1026047 512000 83 Linux
/dev/sdb2 1026048 2050047 512000 83 Linux

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


#3.用pvcreate命令在新建的分区上创建PV
$pvcreate /dev/sdb1 /dev/sdb2
Physical volume "/dev/sdb1" successfully created
Physical volume "/dev/sdb2" successfully created
#(创建完后我们可以用pvs查看或者pvdisplay查看详细信息)
$pvs
PV VG Fmt Attr(注意属性) PSize PFree
/dev/sda2 vg_weiyigeek lvm2 a--u 19.51g 0
/dev/sdb1 lvm2 ---- 500.00m 500.00m
/dev/sdb2 lvm2 ---- 500.00m 500.00m

$pvdisplay
--- Physical volume ---
PV Name /dev/sda2
VG Name vg_weiyigeek
PV Size 19.51 GiB / not usable 3.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 4994
Free PE 0
Allocated PE 4994
PV UUID svdPF0-R72a-NU6n-qrZV-jUwP-cOEz-b9OXnm

"/dev/sdb1" is a new physical volume of "500.00 MiB"
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name #VG那一栏是所属的VG组,因为我们还没有划分VG组,所以这一栏也是空。
PV Size 500.00 MiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID M5biUE-eaM1-8U6X-gOpd-31iW-cgNC-m1sIG1


#4. 使用vgcreate命令创建一个VG组,并将我们创建的两个PV加入VG组
$vgcreate vgdemo1 /dev/sdb1 /dev/sdb2
Volume group "vgdemo1" successfully created
#(用vgs和vgdisplay命令查看卷组信息及详细信息)
$vgs
VG #PV #LV #SN Attr VSize VFree
vg_weiyigeek 1 2 0 wz--n- 19.51g 0
vgdemo1 2 0 0 wz--n- 992.00m 992.00m #建立的VG组,可以看到他的大小

$vgdisplay vgdemo1
--- Volume group ---
VG Name vgdemo1
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 992.00 MiB #关键点:后面的LV分配大小不能藏此大小
PE Size 4.00 MiB #PE是卷组的最小储存单位默认是4MB,创建的时候我们也可以用-s参数来修改,
#一旦卷组创建成功是没法再去修改PE大小的。
Total PE 248
Alloc PE / Size 0 / 0
Free PE / Size 248 / 992.00 MiB
VG UUID AdWgG1-DkWu-3OrA-skAW-ad3i-n2V9-pTHYWF


#5. 使用lvcreate命令从VG中创建一个逻辑卷
$lvcreate -L 200M -n lv_disk1 vgdemo1
Logical volume "lv_disk1" created.
#-L参数后跟的是你要设定的逻辑卷大小,这个大小必须是你设定的PE值的整数倍,常用(弊端就是有可能用不完vg里面的空间)
#-l参数后跟的是数量,那划分的逻辑卷大小就为 4xn 你划分的数量MiB。-l 127 个PE弊端是需要计算,比如一个PE 4M 127x4M=508M 但是不会出现用不完vg的空间的情况
#-n参数后跟逻辑卷名字,是对创建的卷组命名,最后跟的是卷组名。
#(逻辑卷的查看命令也是lvs和lvsdisplay)
$lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv_root vg_weiyigeek -wi-ao---- 17.54g
lv_swap vg_weiyigeek -wi-ao---- 1.97g
lv_disk1 vgdemo1 -wi-a----- 200.00m

$lvdisplay vgdemo1 #lvdisplay后跟卷组是查看这个卷组的详细信息,只输入lvdisplay是显示所有逻辑卷的详细信息
--- Logical volume ---
LV Path /dev/vgdemo1/lv_disk1
LV Name lv_disk1
VG Name vgdemo1
LV UUID ohx66h-l1kU-qnTR-bZQH-eWb5-tVhS-3B03Rq
LV Write Access read/write
LV Creation host, time Master-data2, 2019-05-26 13:05:28 +0800
LV Status available
# open 0
LV Size 200.00 MiB
Current LE 50
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:2


#6.使用mkfs命令对创建的卷组进行格式化并挂载
$mkfs.ext4 /dev/vgdemo1/lv_disk1
mke2fs 1.41.12 (17-May-2010)
#Linux下的文件系统需要被挂载后才能使用,建立一个空目录进行挂载
$mkdir /lvsdisk
#进行挂载,如果要想实现开机自动挂载可以写在fstab表里
$mount /dev/vgdemo1/lv_disk1 /lvsdisk/
$df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vgdemo1-lv_disk1 190M 1.6M 179M 1% /lvsdisk


2) LV的扩容与缩小
LVM的强大之处不只是它可以扩容压缩,更重要的是它可以支持在线扩容,但我们首先要保证VG中有足够的空闲空间。

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
#1.使用lvextend命令来对逻辑卷进行扩容
$vgs
VG PV LV SN Attr VSize VFree
vg_weiyigeek 1 2 0 wz--n- 19.51g 0
vgdemo1 2 1 0 wz--n- 992.00m 792.00m #必须要用可用的空间

$lvextend -L +100M /dev/vgdemo1/lv_disk1 #扩展lvs动态卷的大小 +100M是增加100M空间
Size of logical volume vgdemo1/lv_disk1 changed from 200.00 MiB (50 extents) to 300.00 MiB (75 extents).
Logical volume lv_disk1 successfully resized.

#2.lvs卷扫描查看分配后的大小
$lvscan
ACTIVE '/dev/vgdemo1/lv_disk1' [300.00 MiB] inherit
ACTIVE '/dev/vg_weiyigeek/lv_root' [17.54 GiB] inherit
ACTIVE '/dev/vg_weiyigeek/lv_swap' [1.97 GiB] inherit


#3.但这个时候我们用df-h命令查看一下发现挂载的文件系统并没有增大,这就需要我们使用resize2fs命令手动同步一下文件系统
#lvextend -L +100M /dev/vgdemo1/lv_disk1 -r #加上-r参数就此步可用忽略
$resize2fs -f /dev/vgdemo1/lv_disk1
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/vgdemo1/lv_disk1 to 307200 (1k) blocks.
The filesystem on /dev/vgdemo1/lv_disk1 is now 307200 blocks long.

$df -h /lvsdisk #挂载完成并查看空间大小
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vgdemo1-lv_disk1
287M 2.1M 270M 1% /lvsdisk

############## LVS缩小 ##############
#我们要先缩小文件系统,再去缩小逻辑卷

#逻辑卷扩容可以在线操作但是缩减必须是离线执行,需要先卸载已挂载的逻辑卷。
$umount /lvsdisk #取消挂载

#缩小文件系统前我们要先对文件系统做个扫描检测,如果我们直接使用resize2fs系统会提示让你先对文件系统进行检测,
#这是为了保护缩减文件系统时不对数据损害。
$e2fsck -f /dev/vgdemo1/lv_disk1
e2fsck 1.41.12 (17-May-2010)
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
/dev/vgdemo1/lv_disk1: 11/14112 files (9.1% non-contiguous), 6921/53248 blocks

#设置减小后的动态卷大小
$resize2fs /dev/vgdemo1/lv_disk1 200

$lvreduce -L 200M /dev/vgdemo1/lv_disk1 -r #将lv_disk1卷组缩小200MB (非常注意缩小后的空间必须是可以整除4的)与下面的参数无关了
$lvscan
ACTIVE '/dev/vgdemo1/lv_disk1' [52.00 MiB] inherit
$mount /dev/vgdemo1/lv_disk1 /lvsdisk/ #分区挂载
$df -h #查看缩小后的空间大小
/dev/mapper/vgdemo1-lv_disk1
47M 1.1M 43M 3% /lvsdisk

注意:

  • 文件系统大小和逻辑卷大小一定要保持一致才行。
  • 如果逻辑卷大于文件系统,由于部分区域未格式化成文件系统会造成空间的浪费。


3)VG卷组的扩容与缩小
添加一块新的硬盘,通常我们是需要重启机器的;

WeiyiGeek.disk

WeiyiGeek.disk


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
#1.使用命令让系统重新扫描SCSI总线来添加设备,因为添加的是SCSI磁盘,所以扫描的是SCSI总线
echo "- - -" > /sys/class/scsi_host/host0/scan

#2.查看磁盘以及分区使用状态
$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
├─vg_weiyigeek-lv_root (dm-0) 253:0 0 17.6G 0 lvm /
└─vg_weiyigeek-lv_swap (dm-1) 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 1G 0 disk
├─sdb1 8:17 0 500M 0 part
│ └─vgdemo1-lv_disk1 (dm-2) 253:2 0 52M 0 lvm /lvsdisk
└─sdb2 8:18 0 500M 0 part
sdc 8:32 0 1G 0 disk #我们新添加的磁盘


#3.首先将要添加的硬盘格式化为PV,再将新的PV添加到指定的卷组中去
$pvcreate /dev/sdc
Physical volume "/dev/sdc" successfully created
$vgextend vgdemo1 /dev/sdc #将新建立PV扩展到vgdemo1中
Volume group "vgdemo1" successfully extended
$vgs
VG #PV #LV #SN Attr VSize VFree
vg_weiyigeek 1 2 0 wz--n- 19.51g 0
vgdemo1 3 1 0 wz--n- 1.96g 1.91g #扩展pV后的卷大小


########## 缩小卷组的缩减 ##########
$vgreduce vgdemo1 /dev/sdc #用vgreduce去缩小VG卷组的大小
Removed "/dev/sdc" from volume group "vgdemo1"
#缩小VG卷组也就是把一个PV从卷组中移除,但我们要先肯定PV中没有数据,不然就会造成数据的丢失
#然后使用pvremove命令移除PV,这样就让分区又重新变成了普通分区。
$pvremove /dev/sdc
Labels on physical volume "/dev/sdc" successfully wiped


0x03 实际实践

(0) .LVM应用之逻辑卷创建与挂载(基础)

操作步骤:

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
# 1) 初始化为物理卷:
$ pvcreate /dev/vdb1
Physical volume "/dev/vdb1" successfully created

# 2) 创建卷组:
$ vgcreate -s 16M datastore /dev/vdb1
Volume group "datastore" successfully created

# 3) 创建逻辑卷:
$ lvcreate -L 10G datastore -n web_data
Logical volume "web_data" created.

# 4) 格式化为XFS格式:
mkfs.xfs /dev/datastore/web_data
# meta-data=/dev/datastore/web_data isize=256 agcount=4, agsize=655360 blks
# = sectsz=512 attr=2, projid32bit=1
# = crc=0 finobt=0
# data = bsize=4096 blocks=2621440, imaxpct=25
# = sunit=0 swidth=0 blks
# naming =version 2 bsize=4096 ascii-ci=0 ftype=0
# 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


# 5) 查看UUID:
$ blkid |grep web
/dev/mapper/datastore-web_data: UUID="7a6e09bf-8fe7-4f66-86f6-5cdd82ffb380" TYPE="xfs"


# 6) 方式1.自动挂载
$ vim /etc/fstab
# /etc/fstab
# Created by anaconda on Thu Sep 22 17:50:17 2016
# 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
# 方式1
/dev/mapper/centos-root / xfs defaults 0 0
UUID=41f7a291-c7de-4694-a5ee-1e6313ff9f44 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
UUID=7a6e09bf-8fe7-4f66-86f6-5cdd82ffb380 /data/web_data xfs defaults 0 0
# 方式2
# / was on /dev/ubuntu-vg/lv-0 during curtin installation
/dev/disk/by-id/dm-uuid-LVM-cwiz8LJ0JAPp64DmkjU71YpKu235eWQv7GwryDiVe7e1Hvfg8yzYcFs53sWsHfFi / ext4 defaults 0 0


# 6) 方式2.手动创建挂载目录并挂载
[[email protected] ~]# mkdir -p /data/web_data
[[email protected] ~]# mount /dev/mapper/datastore-web_data /data/web_data/
[[email protected] ~]# mount | grep web
/dev/mapper/datastore-web_data on /data/web_data type xfs (rw,relatime,attr2,inode64,noquota)


1.LVM应用之扩容根分区与挂载磁盘

描述: 由于系统安装的时候一共分了50G系统经过一段时间后发现磁盘资源不足,此时需要通过LVM进行对centos-root进行扩容;

环境准备: 在ESXI主机中找到指定的虚拟机,添加一块磁盘为150G即系统后面识别的/dev/sdb

基础流程:

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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# 1.查看系统当前磁盘情况
[[email protected] ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 150G 0 disk
sr0 11:0 1 1024M 0 rom
sda 8:0 0 50G 0 disk
├─sda2 8:2 0 49G 0 part
│ ├─centos-swap 253:1 0 3.9G 0 lvm
│ └─centos-root 253:0 0 45.1G 0 lvm /
└─sda1 8:1 0 1G 0 part /boot

# 2.进行磁盘分区将分成两个主分区一个50G和一个100G
[[email protected] ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
... #默认即可
Last 扇区, +扇区 or +size{K,M,G} (2048-314572799,默认为 314572799):+50G
分区 1 已设置为 Linux 类型,大小设为 50 GiB
命令(输入 m 获取帮助):n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): p
... #默认即可
Last 扇区, +扇区 or +size{K,M,G} (104859648-314572799,默认为 314572799):
将使用默认值 314572799
分区 2 已设置为 Linux 类型,大小设为 100 GiB
命令(输入 m 获取帮助):w # 写入到磁盘中
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。

# 3.查看分区信息
[[email protected] ~]# fdisk -l
磁盘 /dev/sda:53.7 GB, 53687091200 字节,104857600 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000e9e57
设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 104857599 51379200 8e Linux LVM
[[email protected] ~]# lsblk | grep "sdb"
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 150G 0 disk
├─sdb2 8:18 0 100G 0 part
└─sdb1 8:17 0 50G 0 part


# 4.查看系统中pv设备
[[email protected] ~]# pvscan
PV /dev/sda2 VG centos lvm2 [<49.00 GiB / 4.00 MiB free]
Total: 1 [<49.00 GiB] / in use: 1 [<49.00 GiB] / in no VG: 0 [0 ]

# 5.创建一个物理卷PV并且查看PV卷
[[email protected] ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.
[[email protected] ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <49.00g 4.00m
/dev/sdb1 lvm2 --- 50.00g 50.00g

# 6.将创建的PV卷加入到已存在的centos VG卷之中
[[email protected] ~]# vgextend centos /dev/sdb1
Volume group "centos" successfully extended

# 7.查看PV卷已经分配给Centos VG然后也可以通过vgs查看
[[email protected] ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <49.00g 4.00m
/dev/sdb1 centos lvm2 a-- <50.00g <50.00g
[[email protected] ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 2 2 0 wz--n- 98.99g 50.00g


# 8.进行lv卷扩容50G采用lvscan命令查看扩容前后的比对;
[[email protected] ~]# lvscan
ACTIVE '/dev/centos/swap' [<3.88 GiB] inherit
ACTIVE '/dev/centos/root' [<45.12 GiB] inherit
[[email protected] ~]# lvextend -L +50G /dev/centos/root
Size of logical volume centos/root changed from <45.12 GiB (11550 extents) to <95.12 GiB (24350 extents).
Logical volume centos/root successfully resized.
[[email protected] ~]# lvscan
ACTIVE '/dev/centos/swap' [<3.88 GiB] inherit
ACTIVE '/dev/centos/root' [<95.12 GiB] inherit

# 9.此时您会发现lv其大小已经发生改变但是采用 df -h / 其大小并没有增加
[[email protected] ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 150G 0 disk
├─sdb2 8:18 0 100G 0 part
└─sdb1 8:17 0 50G 0 part
└─centos-root 253:0 0 95.1G 0 lvm /
sda 8:0 0 50G 0 disk
├─sda2 8:2 0 49G 0 part
│ ├─centos-swap 253:1 0 3.9G 0 lvm
│ └─centos-root 253:0 0 95.1G 0 lvm /
└─sda1 8:1 0 1G 0 part /boot

[[email protected] ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 46G 2.4G 43G 6% /

[[email protected] ~]# fdisk -l
磁盘 /dev/sda:53.7 GB, 53687091200 字节,104857600 个扇区
...
磁盘 /dev/sdb:161.1 GB, 161061273600 字节,314572800 个扇区
...
磁盘 /dev/mapper/centos-root:102.1 GB, 102131302400 字节,199475200 个扇区 #此处也显示扩容到100G


# 10.然后要解决上面df -h命令查看一下发现根挂载的文件系统并没有增大上,此时采用下面的命令进行更新同步文件系统
# 非常注意不同系统以及分区类型处理方式不同
$ df -Th
# Filesystem Type Size Used Avail Use% Mounted on
# /dev/mapper/centos-root xfs 96G 6.8G 89G 8% /
# /dev/mapper/ubuntu--vg-ubuntu--lv ext4 4.2G 3.7G 269M 94% /

# CentOS
[[email protected] ~]# xfs_growfs /dev/mapper/centos-root
meta-data=/dev/mapper/centos-root isize=512 agcount=4, agsize=2956800 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=11827200, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=5775, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
# ubuntu / general
# resize2fs -p -F /dev/mapper/ubuntu--vg-ubuntu--lv
# resize2fs 1.45.5 (07-Jan-2020)
# Filesystem at /dev/mapper/ubuntu--vg-ubuntu--lv is mounted on /; on-line resizing required
# old_desc_blocks = 1, new_desc_blocks = 10
# The filesystem on /dev/mapper/ubuntu--vg-ubuntu--lv is now 19398656 (4k) blocks long.

# - CentOS
[[email protected] ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 96G 2.4G 93G 3% / # 文件系统也显示成功扩容
# - Ubuntu
# [[email protected] ~]$ df -hT
# Filesystem Type Size Used Avail Use% Mounted on
# udev devtmpfs 1.9G 0 1.9G 0% /dev
# tmpfs tmpfs 394M 1.2M 393M 1% /run
# /dev/mapper/ubuntu--vg-ubuntu--lv ext4 73G 3.7G 67G 6% /


# 11.将磁盘的另外一个分区挂载到/data目录
[[email protected] ~]# mkfs.xfs /dev/sdb2 #推荐采用XFS格式的分区
meta-data=/dev/sdb2 isize=512 agcount=4, agsize=6553536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=26214144, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=12799, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[[email protected] ~]# mkdir /data/
[[email protected] ~]# mkfs.ext4 /dev/sdb2
# mke2fs 1.42.9 (28-Dec-2013)
# 文件系统标签=
# OS type: Linux
# 块大小=4096 (log=2)
# 分块大小=4096 (log=2)
# Stride=0 blocks, Stripe width=0 blocks
# 6553600 inodes, 26214144 blocks
# 1310707 blocks (5.00%) reserved for the super user
# 第一个数据块=0
# Maximum filesystem blocks=2174746624
# 800 block groups
# 32768 blocks per group, 32768 fragments per group
# 8192 inodes per group
# Superblock backups stored on blocks:
# 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
# 4096000, 7962624, 11239424, 20480000, 23887872
# Allocating group tables: 完成
# 正在写入inode表: 完成
# Creating journal (32768 blocks): 完成
# Writing superblocks and filesystem accounting information: 完成

# 12.将格式后的磁盘分区进行挂载到/data目录下,并写入/etc/fstab中永久生效
[[email protected] ~]# mount /dev/sdb2 /data
[[email protected] ~]# echo "/dev/sdb2 /data xfs defaults 0 0" >> /etc/fstab
[[email protected] ~]# mount -l|grep "/dev/sdb2"



0x04 入坑解决

PS:我们实际生产操作中很少用到逻辑卷的缩减,因为缩减很容易就会造成数据损坏,这是得不偿失的,所以我们不推荐对逻辑卷进行缩减。

问题1:执行lvreduce缩小指定lv卷大小错误(尽量不要进行缩小)
1
2
3
4
5
6
7
8
9
10
11
$lvreduce -L 52M /dev/vgdemo1/lv_disk1 -r
fsck from util-linux-ng 2.17.2
/dev/mapper/vgdemo1-lv_disk1: The filesystem size (according to the superblock) is 307200 blocks
The physical size of the device is 258048 blocks
Either the superblock or the partition table is likely to be corrupt!
/dev/mapper/vgdemo1-lv_disk1: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.
(i.e., without -a or -p options)

#原因:由于减小的lv卷区大小不能整除4导致
#解决办法:
mkfs.ext4 /dev/vgdemo1/lv_disk1 #格式化分区后重新设置大小lv卷大小可以被四整除
问题2.Ubuntu LVM扩容后df -h显示未更新

问题原因:由于文件系统(df -h 所看见的)未及时更新导致,所以更新一哈就可以;
解决办法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$resize2fs -p -F  /dev/mapper/ubuntu--vg-ubuntu--lv
resize2fs 1.45.5 (07-Jan-2020)
Filesystem at /dev/mapper/ubuntu--vg-ubuntu--lv is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 25
The filesystem on /dev/mapper/ubuntu--vg-ubuntu--lv is now 52164608 (4k) blocks long.

[email protected]:~# df -h
Filesystem Size Used Avail Use% Mounted on
udev 1.9G 0 1.9G 0% /dev
tmpfs 394M 1.2M 393M 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 196G 3.5G 185G 2% / # 已更新
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup