[TOC]

0x00 LVM快速入门

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

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

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

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

用途: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.



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.原理图


0x01 LVM操作

LVM常用操作命令一览:

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.添加的磁盘状态
$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
#建立两个主分区: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.使用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

#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 入坑

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

问题1:

#执行lvreduce缩小指定lv卷大小错误
$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卷大小可以被四整除