逻辑卷管理-LVM
逻辑卷管理-LVM
1.概述
LVM (Logical Volume Manager) 即逻辑卷管理。
它是Linux环境下对磁盘分区进行管理的一种机制。 它可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区 进行扩缩空间大小,安全快捷方便管理。 LVM的工作原理通过将底层的物理硬盘抽象的封装起来,然后以逻辑卷的方式呈现给上层应用。在传统的磁盘管理机制中,我们的上层应用是直接访问文件系统,从而对底层的物理硬盘进行读取。 而在LVM中,其通过对底层的硬盘进行封装,当我们对底层的物理硬盘进行操作时,不再是针对于分区进行操作,而是通过一个叫做逻辑卷的东西来对其进行底层的磁盘管理操作。例如,增加一个物理硬盘,这个时候上层的服务是感觉不到的,因为呈现给上层服务的是以逻辑卷的方式。
1.1 特点
- 可以对磁盘进行动态管理
- 逻辑卷的大小是可以动态调整的,而且不会丢失现有的数据。
- 如果我们新增加了硬盘,也不会改变现有上层的逻辑卷。
- 作为一个动态磁盘管理机制,逻辑卷技术大大提高了磁盘管理的灵活性。
2.名词解释
2.1 PV-物理卷
Physical Volume
物理卷在逻辑卷管理中处于最底层,它可以是实际物理硬盘上的分区,也可以是整个物理硬盘,也可以是RAID,是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较却包含有与LVM相关管理参数
2.2 VG-卷组
Volume Group
卷组建立在物理卷之上,一个卷组中至少要包括一个物理卷,在卷组建立之后可动态添加物理卷到卷组中。一个逻辑卷管理系统工程中可以只有一个卷组,也可以拥有多个卷组。
2.3 LV-逻辑卷
Logical Volume
逻辑卷建立在卷组之上,卷组中的未分配空间可以用于建立新的逻辑卷,逻辑卷建立后可以动态地扩展和缩小空间。系统中的多个逻辑卷可以属于同一个卷组,也可以属于不同的多个卷组。
2.4 PE
Physical Extendt
每一个物理卷被划分为多个称为PE的基本单元,PE的大小是在创建VG过程中配置的默认为4MB
3.管理命令
物理卷 | 卷组 | 逻辑卷 | 作用 | |
---|---|---|---|---|
扫描 | pvscan | vgscan | lvscan | 扫描系统中连接的所有硬盘,列出找到的物理卷、卷组和逻辑卷列表 |
创建 | pvcreate | vgcreate | lvcreate | 创建物理卷、卷组和逻辑卷 |
查看 | pvdisplay | vgdisplay | lvdisplay | 查看物理卷、卷组和逻辑卷相关信息 |
删除 | pvremove | vgremove | lvremove | 删除物理卷、卷组和逻辑卷 |
扩容 | vgextend | lvextend | 对卷组和逻辑卷扩容 | |
缩小 | vgreduce | lvreduce | 缩小卷组和逻辑卷的容量 |
4.实战
4.1 案例01 - 创建物理卷、卷组和逻辑卷、格式化、挂载至/mnt目录
- 准备两块磁盘各20G
- 每块盘都进行分区并创建物理卷
- 创建卷组、将物理卷加入卷组
- 创建逻辑卷、将已建的卷组空间全部分给逻辑卷
- 格式化逻辑卷,并挂载到/data目录
- 实现开机自动挂载
第一步: 添加两块100MB的磁盘,需要重启才能生效
第二步:添加两块盘并进行格式化
#/dev/sdb /dev/sdc 操作是一样的 大小随意给
[root@lvm ~]# fdisk /dev/sdb
Command (m for help): n #创建
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +5G #大小
Partition 1 of type Linux and of size 5 GiB is set
Command (m for help): p #打印
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xc844b14f
Device Boot Start End Blocks Id System
/dev/sdb1 2048 10487807 5242880 83 Linux
Command (m for help): t #更改磁盘ID
Selected partition 1
Hex code (type L to list all codes): L
Hex code (type L to list all codes): 8e
Command (m for help): p
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xc844b14f
Device Boot Start End Blocks Id System
/dev/sdb1 2048 10487807 5242880 8e Linux LVM
#创建完成后查看
[root@lvm ~]# ll /dev/sdb*
brw-rw---- 1 root disk 8, 16 Oct 23 21:01 /dev/sdb
brw-rw---- 1 root disk 8, 17 Oct 23 21:14 /dev/sdb1
[root@lvm ~]# ll /dev/sdc*
brw-rw---- 1 root disk 8, 32 Oct 23 21:04 /dev/sdc
brw-rw---- 1 root disk 8, 33 Oct 23 21:14 /dev/sdc1
第三步: 对磁盘创建物理卷(PV)
[root@lvm ~]# pvcreate /dev/sdb1 /dev/sdc1
Physical volume "/dev/sdb1" successfully created.
Physical volume "/dev/sdc1" successfully created.
#已经成功创建了PV,但是可以看到VG是空的,这是因为还没有添加到卷组中
[root@lvm ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- 19.70g 0
/dev/sdb1 lvm2 --- 5.00g 5.00g
/dev/sdc1 lvm2 --- <20.00g <20.00g
[root@lvm ~]# pvdisplay
第四步:创建卷组并将物理卷加入卷组
#这里就已经把这两块盘加入到同一个卷组里面了,就代表着这两块盘公用磁盘空间
这里还可以通过-s来指定PE的大小
[root@lvm ~]# vgcreate vg0 /dev/sdb1 /dev/sdc1
Volume group "vg0" successfully created
#可以看到已经有PV了哦,但是还没有LV逻辑卷哦
[root@lvm ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg0 2 0 0 wz--n- 24.99g 24.99g
#已经加入了卷组VG
[root@lvm ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- 19.70g 0
/dev/sdb1 vg0 lvm2 a-- <5.00g <5.00g
/dev/sdc1 vg0 lvm2 a-- <20.00g <20.00g
[root@lvm ~]# vgdisplay
第五步:创建逻辑卷将卷组所有空间给逻辑卷
#-n 指定名字,给谁用就起什么名字 -L 指定大小 ,vg0是刚刚创建的卷组名字
[root@lvm ~]# lvcreate -n mysql -L 15G vg0
Logical volume "mysql" created.
#可以看到逻辑卷LV
[root@lvm ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert mysql vg0 -wi-a----- 15.00g
[root@lvm-10.0.0.101 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 300M 0 part /boot
└─sda2 8:2 0 19.7G 0 part
├─centos-root 253:0 0 19.5G 0 lvm /
└─centos-swap 253:1 0 200M 0 lvm [SWAP]
sdb 8:16 0 50G 0 disk
└─sdb1 8:17 0 50G 0 part
└─vg0-data 253:2 0 15G 0 lvm
sdc 8:32 0 50G 0 disk
sr0 11:0 1 4.4G 0 rom
#就可以完成的设备名字
[root@lvm ~]# lvdisplay
#还有一个根他一样的名字
[root@lvm-10.0.0.101 ~]# ll /dev/vg0/data
lrwxrwxrwx 1 root root 7 Apr 27 16:25 /dev/vg0/data -> ../dm-2
#同一个东西可能显示的不同
[root@lvm-10.0.0.101 ~]# ll /dev/mapper/vg0-data
lrwxrwxrwx 1 root root 7 Apr 27 16:25 /dev/mapper/vg0-data -> ../dm-2
第六步:格式化-创建文件系统挂载至/mnt目录
#这个也是软链接/dev/vg0/mysql 是软链接 /dm-2
[root@lvm ~]# mkfs.xfs /dev/vg0/mysql
meta-data=/dev/vg0/mysql isize=512 agcount=4, agsize=983040 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=3932160, 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
#为什么挂载是这个路径呢/dev/mapper/vg0-mysql 是软链接 /dm-2
[root@lvm ~]# mount /dev/mapper/vg0-mysql /mnt
[root@lvm ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 979M 0 979M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 9.6M 981M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/mapper/centos-root 20G 2.3G 18G 12% /
/dev/sda1 297M 121M 177M 41% /boot
tmpfs 199M 0 199M 0% /run/user/0
/dev/mapper/vg0-mysql 15G 33M 15G 1% /mnt
第七步:配置 /etc/fstab 文件,实现自动挂载
#本次采用UUID方式自动挂载 找到对应的UUID
[root@lvm ~]# blkid
/dev/sda1: UUID="6f2c97c4-d064-4dbe-94e4-cea9e9c3a181" TYPE="xfs"
/dev/sda2: UUID="oQtN3E-7TCs-gHT2-0wcl-YI9O-JUsF-vNprEl" TYPE="LVM2_member"
/dev/sdc1: UUID="VypPr2-rHS0-I1mb-0JeJ-36Qk-bhMF-nXfdNP" TYPE="LVM2_member"
/dev/sdb1: UUID="53zKAI-SLfw-dMf9-1Ucs-66FT-yujW-spOjPy" TYPE="LVM2_member"
/dev/sr0: UUID="2020-11-04-11-36-43-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos"
/dev/mapper/centos-root: UUID="6bc7c23f-736d-48d3-b7d6-08346a239391" TYPE="xfs"
/dev/mapper/centos-swap: UUID="cef3c017-d6bc-4b38-bc29-d5683dd056ba" TYPE="swap"
/dev/mapper/vg0-mysql: UUID="6423c711-8a63-45a1-928e-e19c609755bd" TYPE="xfs"
#要使用/dev/mapper这个路径下的UUID
[root@lvm ~]# cat /etc/fstab
# /etc/fstab
UUID="6423c711-8a63-45a1-928e-e19c609755bd /mnt xfs defaults 0 0
第八步:磁盘读写测试速度
[root@lvm ~]# dd if=/dev/zero of=/run/if bs=1M count=1024
dd: error writing ‘/run/if’: No space left on device
981+0 records in
980+0 records out
1028243456 bytes (1.0 GB) copied, 4.94903 s, 208 MB/s
[root@lvm ~]# dd if=/dev/zero of=/mnt/if bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 4.3189 s, 249 MB/s
[root@lvm ~]# dd if=/dev/zero of=/mnt/if bs=1M count=1024 conv=fdatasync
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 0.911894 s, 1.2 GB/s
[root@lvm ~]# dd if=/dev/zero of=/mnt/of bs=1M count=1024 conv=fdatasync
4.2 案例02 - /mnt目录空间不足,对其使用逻辑卷扩容
- 将另一块磁盘创建为物理卷 /dev/sdd
- 将新的物理卷加入卷组,即卷组扩容
- 给逻辑卷扩容
- 检测确认是否生效
#创建PV
[root@lvm ~]# pvcreate /dev/sdd
Physical volume "/dev/sdd" successfully created.
[root@lvm ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- 19.70g 0
/dev/sdb1 vg0 lvm2 a-- <5.00g <5.00g
/dev/sdc1 vg0 lvm2 a-- <20.00g <5.00g
/dev/sdd lvm2 --- 20.00g 20.00g
#对卷组扩容
[root@lvm ~]# vgextend vg0 /dev/sdd
Volume group "vg0" successfully extended
[root@lvm ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- 19.70g 0
vg0 3 1 0 wz--n- <44.99g <29.99g
[root@lvm ~]# vgdisplay
--- Volume group ---
VG Name vg0
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 0
Max PV 0
Cur PV 3
Act PV 3
VG Size <44.99 GiB
PE Size 4.00 MiB
Total PE 11517
Alloc PE / Size 3840 / 15.00 GiB
Free PE / Size 7677 / <29.99 GiB
VG UUID FhO3rh-08qt-kkGP-ufWN-dh1x-wH1Q-PvPr1B
#对逻辑卷扩容 这个是不精确扩容,在扩容的时候可以加-r就直接加文件系统里面了
[root@lvm ~]# lvextend -L +20G /dev/vg0/mysql
Size of logical volume vg0/mysql changed from 15.00 GiB (3840 extents) to 35.00 GiB (8960 extents).
Logical volume vg0/mysql successfully resized.
#指定PE数扩容(也就是使用全部容量)
[root@lvm ~]# lvextend -l (pe数) /dev/vg0/mysql
#还有别的方式
[root@lvm ~]# lvextend -l +100%free /dev/vg0/mysql
#如果你现在df -h 发现挂载点并没有扩容你需要下面的命令
#xfs系统解决办法
[root@lvm-10.0.0.101 ~]# mount | grep root
/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,noquota)
[root@lvm-10.0.0.101 ~]# xfs_growfs /dev/mapper/vg0-data
#如果你现在df -h 发现挂载点并没有扩容你需要下面的命令
#ext文件系统解决办法
[root@lvm ~]# e2fsck -f /dev/mapper/vg0-mysql
e2fsck 1.42.9 (28-Dec-2013)
/dev/mapper/vg0-mysql is mounted.
e2fsck: Cannot continue, aborting.
[root@lvm ~]# resize2fs /dev/mapper/vg0-mysql
resize2fs 1.42.9 (28-Dec-2013)
resize2fs: Bad magic number in super-block while trying to open /dev/mapper/vg0-mysql
Couldn't find valid filesystem superblock.
#使用xfs_growfs命令增加 XFS 文件系统的大小。必须挂载 XFS 文件系统,并且底层设备上必须有可用空间
[root@lvm ~]# xfs_growfs /dev/mapper/vg0-mysql
meta-data=/dev/mapper/vg0-mysql isize=512 agcount=4, agsize=983040 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=3932160, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 3932160 to 9175040
#查看已经扩容了
[root@lvm ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 979M 0 979M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 9.6M 981M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/mapper/centos-root 20G 2.3G 18G 12% /
/dev/sda1 297M 121M 177M 41% /boot
tmpfs 199M 0 199M 0% /run/user/0
/dev/mapper/vg0-mysql 35G 2.1G 33G 6% /mnt
4.3 删除逻辑卷、卷组和物理卷
# 第一步:取消挂载
[root@lvm ~]# umount /mnt
[root@lvm ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 979M 0 979M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 9.6M 981M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/mapper/centos-root 20G 2.3G 18G 12% /
/dev/sda1 297M 121M 177M 41% /boot
tmpfs 199M 0 199M 0% /run/user/0
# 第二步:移除逻辑卷
[root@lvm ~]# lvremove /dev/vg0/mysql
Do you really want to remove active logical volume vg0/mysql? [y/n]: y
Logical volume "mysql" successfully removed
[root@lvm ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- <19.51g
swap centos -wi-ao---- 200.00m
# 第三步:移除卷组
[root@lvm ~]# vgremove vg0
Volume group "vg0" successfully removed
[root@lvm ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- 19.70g 0
#第四步:移除物理卷 这里不能补全只能自己添加
[root@lvm ~]# pvremove /dev/sdd /dev/sdb1 /dev/sdc1
Labels on physical volume "/dev/sdd" successfully wiped.
Labels on physical volume "/dev/sdb1" successfully wiped.
Labels on physical volume "/dev/sdc1" successfully wiped.
[root@lvm ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- 19.70g 0
===================温馨提示:减少逻辑卷大小容器导致数据丢失========================
ext4缩容
umount /mnt
e2fsck -f /dev/vg0/binlog 10G
resize2fs /dev/vg0/binlog 10G
lvreduce -L 10G /dev/vg0/binlog
mount /dev/vg0/binlog /mnt
xfs系统不能缩容
xfs文件系统使用快照
创建快照、快照需要备份的目录在同一个卷组中,快照是一个逻辑卷
#-s 是设置模式为快照
[root@lvm-10.0.0.101 mnt]# lvcreate -n data_snapshot -s -L 10G /dev/vg0/data
Logical volume "data_snapshot" created.
#创建一个快照的目录
[root@lvm-10.0.0.101 mnt]# mkdir /mnt/snap
#问题:文件系统类型是xfs是不能同时挂载的
#解决:使用-o nouuid即可解决,不检查uuid
[root@lvm-10.0.0.101 mnt]# mount -o nouuid /dev/vg0/data_snapshot /mnt/snap/
#回滚
先取消挂载,如果取消不了,查一下是谁在占用这个进程,-v是列出进程详细信息,-k杀掉访问文件的进程(类似 kill -9)
[root@lvm-10.0.0.101 ~]# fuser /mnt
[root@lvm-10.0.0.101 ~]# fuser /mnt -v
USER PID ACCESS COMMAND
/mnt: root kernel mount /mnt
[root@lvm-10.0.0.101 ~]# fuser /mnt -k
[root@lvm-10.0.0.101 ~]# umount /mnt/snap
[root@lvm-10.0.0.101 ~]# umount /mnt/
--merge 合并就是恢复,恢复之后快照就不见了,是一次性的
[root@lvm-10.0.0.101 ~]# lvconvert --merge /dev/vg0/data_snapshot2
Merging of volume vg0/data_snapshot2 started.
vg0/data: Merged: 100.00%
[root@lvm-10.0.0.101 ~]#
ext4文件系统使用快照
#先准备好一个ext4的文件系统
[root@lvm-10.0.0.101 ~]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 979M 0 979M 0% /dev
tmpfs tmpfs 991M 0 991M 0% /dev/shm
tmpfs tmpfs 991M 9.6M 981M 1% /run
tmpfs tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 20G 2.4G 18G 12% /
/dev/sda1 xfs 297M 121M 177M 41% /boot
tmpfs tmpfs 199M 0 199M 0% /run/user/0
/dev/mapper/vg0-data xfs 20G 1.1G 19G 6% /mnt
/dev/mapper/vg0-mysql ext4 9.8G 37M 9.2G 1% /mysql
#先准备一些做数据文件
[root@lvm-10.0.0.101 ~]# cp /etc/fstab /mysql/f1
[root@lvm-10.0.0.101 ~]# cp /etc/issue /mysql/f2
[root@lvm-10.0.0.101 ~]# cp /etc/passwd /mysql/f3
[root@lvm-10.0.0.101 ~]# ll /mysql/
total 28
-rw-r--r-- 1 root root 530 Apr 28 17:15 f1
-rw-r--r-- 1 root root 23 Apr 28 17:15 f2
-rw-r--r-- 1 root root 1013 Apr 28 17:16 f3
drwx------ 2 root root 16384 Apr 28 16:46 lost+found
#创建快照目录对比数据
[root@lvm-10.0.0.101 ~]# mkdir /mysql/snap
#创建快照
[root@lvm-10.0.0.101 ~]# lvcreate -n binlog_snapshot -s -p r -L 1G /dev/vg0/mysql
Logical volume "binlog_snapshot" created.
#挂载,ext4文件系统可以直接挂载只读模式的,xfs不行
[root@lvm-10.0.0.101 ~]# mount /dev/vg0/binlog_snapshot /mysql/snap
mount: /dev/mapper/vg0-binlog_snapshot is write-protected, mounting read-only
#挂载情况
[root@lvm-10.0.0.101 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 979M 0 979M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 9.6M 981M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/mapper/centos-root 20G 2.4G 18G 12% /
/dev/sda1 297M 121M 177M 41% /boot
tmpfs 199M 0 199M 0% /run/user/0
/dev/mapper/vg0-data 20G 1.1G 19G 6% /mnt
/dev/mapper/vg0-mysql 9.8G 37M 9.2G 1% /mysql
/dev/mapper/vg0-binlog_snapshot 9.8G 37M 9.2G 1% /mysql/snap
#删除一些数据看看效果
[root@lvm-10.0.0.101 mysql]# pwd
/mysql
[root@lvm-10.0.0.101 mysql]# rm -f f1
[root@lvm-10.0.0.101 mysql]# echo > f2
#回滚
[root@lvm-10.0.0.101 /]# umount /mysql/snap
[root@lvm-10.0.0.101 /]# umount /mysql
[root@lvm-10.0.0.101 /]# lvconvert --merge /dev/vg0/mysql_snapshot
...
就OK了