LVM、LVM Cache、非lvm热扩容
一、原理简介
1、LVM是 Logical Volume Manager(逻辑卷管理)的简写,它由Heinz Mauelshagen在Linux 2.4内核上实现。
LVM 将一个或多个硬盘的分区在逻辑上集合,相当于一个大硬盘来使用(如果硬盘做过硬raid,就没有必要做lvm了),当硬盘的空间不够使用的时候,可以继续将其它的硬盘的分区加入其中,这样可以实现磁盘空间的动态管理,相对于普通的磁盘分区有很大的灵活性。
与传统的磁盘与分区相比,LVM为计算机提供了更高层次的磁盘存储。它使系统管理员可以更方便的为应用与用户分配存储空间。
LVM功能实际是通过内核中的dm模块(device mapper)实现,它将一个或多个底层块设备组织成一个逻辑设备的模块,在/dev/目录下以dm-#形式展现
只要是块设备都可以用于创建LVM2。注意分区时ID号要是8e
- 物理存储介质(The physical media):指系统的存储设备--硬盘,如:/dev/hda1、/dev/sda等等,是存储系统最低层的存储单元
- 物理卷PV(physical volume):物理卷就是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数
- 卷组VG(volume group):在较低的逻辑层从多个PV中抽象出来的卷组,由一个或多个物理卷组成
- PE(physical extend):每一个物理卷被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB
- 逻辑卷LV(logical volume):由多个LV“块”组成可供挂载使用的设备文件
二、使用步骤
1、安装相关软件包
1 | yum install -y lvm2 |
2、创建物理卷(pv)
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 | pvcreate /dev/sdb Physical volume "/dev/sdb" successfully created. pvdisplay --- Physical volume --- PV Name /dev/sda2 VG Name centos PV Size <99.00 GiB / not usable 3.00 MiB Allocatable yes PE Size 4.00 MiB Total PE 25343 Free PE 1 Allocated PE 25342 PV UUID R3abV4-vfQU-5x9o-w5eD-4Cbs-ZMLt-OdXJCP "/dev/sdb" is a new physical volume of "20.00 GiB" --- NEW Physical volume --- PV Name /dev/sdb VG Name PV Size 20.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID pAiVv5-vodI-H3Om-UFfl-0ggy-aikI-lnaAxE |
在pve中 通过growpart /dev/sda 2、resize2fs /dev/sda2方式扩容的硬盘大小,
pv
数量不变,大小刷新
1 | pvresize /dev/sda3 |
3、创建VG
1 2 3 4 | # vgcreate命令用法 vgcreate -s [N[mgt]] VG名称 PV名称 # -s 指定VG中的PE大小,单位:MB,GB,TB vgcreate -s 16M docker /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 | vgcreate -s 20G docker /dev/sdb Volume group "docker" successfully created vgdisplay --- Volume group --- VG Name docker System ID Format lvm2 Metadata Areas 1 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 1 Act PV 1 VG Size 0 PE Size 20.00 GiB Total PE 0 Alloc PE / Size 0 / 0 Free PE / Size 0 / 0 VG UUID UvbKm2-PQTu-8dYo-YXOB-wcMH-bXAL-TyM3Ni --- Volume group --- VG Name centos System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 4 VG Access read/write VG Status resizable MAX LV 0 Cur LV 3 Open LV 3 Max PV 0 Cur PV 1 Act PV 1 VG Size <99.00 GiB PE Size 4.00 MiB Total PE 25343 Alloc PE / Size 25342 / 98.99 GiB Free PE / Size 1 / 4.00 MiB VG UUID jqJ7de-MHEY-qkPx-6fkS-gtZZ-GWav-qf1vvN |
4、创建LV(一个pe是4M)
1 2 3 4 | #lvcreate命令参数 lvcreate -l PE个数 -n LV名称 VG名称 lvcreate -l 6399 -n docker-lib docker |
查看
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | lvdisplay --- Logical volume --- LV Path /dev/docker/docker LV Name docker VG Name docker LV UUID hlbSQl-RfGK-PpUZ-u7Vx-5t3X-WOX7-dxLomX LV Write Access read/write LV Creation host, time node7.test.openshift.com, 2018-09-07 16:11:37 +0800 LV Status available # open 1 LV Size <150.00 GiB Current LE 38399 Segments 2 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 252:0 lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert docker docker -wi-ao---- <150.00g |
5、格式化lv
1 2 | mkfs.ext4 LV_Name mkfs.xfs LV_Name |
6、挂载lv
1 2 | echo "LV_Name 挂载目录点 文件系统格式 defaults 0 0" >> /etc/fstab mount -a |
三、扩容
- VG已无PE可用
- 新增硬盘
- 在线扩容(不卸载,不重启主机)
1、创建PV
1 2 | pvcreate /dev/sdc Physical volume "/dev/sdc" successfully created. |
2、将PV添加到VG中。之后可看PE数量增加
1 2 | vgextend centos /dev/sdc Volume group "centos" successfully extended |
3、扩容LV(之后可看LV容量增加)
1 2 3 4 | lvresize -l +6399 LV_Path # 或者 lvresize -L +50G LV_Path lvresize -L +10G /dev/centos/home |
补充:
将vg卷组中的空闲空间全部加到lv中
1 2 3 | lvextend - l + 100 % FREE / dev / ubuntu - vg / ubuntu - lv resize2fs / dev / ubuntu - vg / ubuntu - lv |
加到新的分区
1 2 | lvcreate - n new - lv - L 59G ubuntu - vg mkfs.ext4 / dev / ubuntu - vg / new - lv |
4、检查修复文件系统
1 | e2fsck -f LV_Name |
5、将扩容后的LV完整地扩充到文件系统中
1 2 3 4 5 | # LV文件系统是ext4时 resize2fs LV_Path # LV文件系统是xfs时 xfs_growfs LV_Path |
报错
1 2 3 4 5 6 7 8 9 | resize2fs /dev/centos/home resize2fs 1.42.9 (28-Dec-2013) resize2fs: Bad magic number in super-block 当尝试打开 /dev/centos/home 时 找不到有效的文件系统超级块. cat /etc/fstab | grep centos-home /dev/mapper/centos-home /home xfs defaults 0 0 xfs_growfs /dev/mapper/centos-home |
6、挂载已创建的LVM磁盘
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # 查看已有硬盘 fdisk -l # 查看lvm磁盘的lv lvdisplay # 查看lv是否激活 lvscan ACTIVE '/dev/data/data' [<111.72 GiB] inherit # 激活卷组 vgchange -ay /dev/data/data # 查看lv已安装的文件系统 file -sL /dev/data/data /dev/data/data: Linux rev 1.0 ext4 filesystem data, UUID=d6c28fac-fb04-423e-bf71-3271b808681c (extents) (64bit) (large files) (huge files) |
四、之前整理的版本
1、创建物理卷(pv)
1 | pvcreate /dev/sdc3 |
2、创建卷组(vg)
1 2 | vgcreate vg3 /dev/sdc3 Volume group "vg3" successfully created |
3、创建逻辑卷(lv)
1 2 | lvcreate -L 300M -n lv3 vg3 Logical volume "lv3" created. |
4、格式化(指定文件系统)
1 2 3 4 5 6 | mkfs.ext4 /dev/vg3/lv3 mke2fs 1.42.9 (28-Dec-2013) 文件系统标签= OS type: Linux ... Writing superblocks and filesystem accounting information: 完成 |
5、挂载
1 2 | mkdir /mnt/fdiskc3 mount -t ext4 /dev/vg3/lv3 /mnt/fdiskc3 |
6、LV缩容(先卸载才能保证数据安全)
# umount /dev/vg3/lv3
# e2fsck -f /dev/vg3/lv3(检查文件系统是否正常)
e2fsck 1.42.9 (28-Dec-2013)
第1步: 检查inode,块,和大小
第2步: 检查目录结构
第3步: 检查目录连接性
第4步: Checking reference counts
第5步: 检查簇概要信息
/dev/vg3/lv3: 11/127512 files (0.0% non-contiguous), 26612/512000 blocks
# lvreduce -L 400M /dev/vg3/lv3
WARNING: Reducing active logical volume to 400.00 MiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg3/lv3? [y/n]: y
Size of logical volume vg3/lv3 changed from 500.00 MiB (125 extents) to 400.00 MiB (100 extents).
Logical volume vg3/lv3 successfully resized
# mkfs.ext4 /dev/vg3/lv3(缩小后再次指定文件系统)
mke2fs 1.42.9 (28-Dec-2013)
...
Writing superblocks and filesystem accounting information: 完成
# mount -t ext4 /dev/vg3/lv3 /mnt/fdiskc3(缩容后挂载)
七、移除逻辑卷(先卸载,从高往下移除)
# umount /dev/vg3/lv3 //卸载lv
# lvremove /dev/vg3/lv3 //移除lv逻辑卷
Do you really want to remove active logical volume vg3/lv3? [y/n]: y
Logical volume "lv3" successfully removed
# vgremove vg3 //移除卷组
Volume group "vg3" successfully removed
# pvremove /dev/sdc3 //移除物理卷
Labels on physical volume "/dev/sdc3" successfully wiped.
八、更新文件系统
resize2fs /dev/zq/mylv #更新文件系统,操作系统重新扫描,这个时候才可以使用刚才增加的空间
五、growpart工具进行磁盘热扩容(非LVM扩容方式)
1、使用场景:sda盘有200G,已经分出来的两个分区很小
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # fdisk -l GPT PMBR size mismatch (41943039 != 419430399) will be corrected by write. The backup GPT table is not on the end of the device. This problem will be corrected by write. Disk /dev/sda: 200 GiB, 214748364800 bytes, 419430400 sectors Disk model: QEMU HARDDISK Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: 3879ED83-573D-4C57-8911-02F9A84E9294 Device Start End Sectors Size Type /dev/sda1 2048 1050623 1048576 512M EFI System /dev/sda2 1050624 39942143 38891520 18.6G Linux filesystem |
2、调整分区
1 2 3 4 5 6 7 | apt- get install cloud-guest-utils apt- get install xfsprogs growpart /dev/sda 2 #扩容第二个分区系统 resize2fs /dev/sda2 ##xfs_growfs(用于XFS文件系统) |
六、LVM Cach
1、什么是LVM Cache?
LVM (Logical Volume Manager) 是一种用于在 Linux 系统上管理硬盘分区和逻辑卷的工具。LVM 允许管理员对物理硬盘进行逻辑划分,创建灵活的逻辑卷,并提供高级功能,如快照、在线容量扩展和逻辑卷的动态迁移等。
LVM Cache 是 LVM 的一个功能,它允许将高速缓存设备(如固态硬盘)与普通硬盘组合使用,以提高 I/O 性能。通过将高速缓存设备作为缓存层,LVM Cache 可以显著减少从磁盘读取数据的时间,从而加快系统的响应速度。
使用场景:固态硬盘用做普通硬盘的缓存,以提高 I/O 性能。
- 提高 I/O 性能:LVM Cache 使用高速缓存设备来存储热数据,从而加快数据的读取速度,提高系统的响应性能。
- 灵活性:LVM Cache 允许管理员根据需要动态调整缓存层和后端存储层之间的数据映射,以满足不同工作负载的要求。
- 数据保护:LVM Cache 可以提供数据的冗余性和保护。如果后端存储设备发生故障,缓存层中的数据可以作为备份,以防止数据丢失。
2、配置 LVM Cache
假设有三块盘机械盘sda、sdb、sdc,一块ssd 盘nvme0n1
1、创建 LVM 逻辑卷(Logical Volume)
格式化分区
对sdb、sdc、nvme0n1进行相同操作
1 2 3 4 5 6 7 8 9 10 11 12 | fdisk / dev / sda ### 磁盘大于2T用下面的操作 sgdisk - - zap - all / dev / sdb sgdisk - n 0 : 0 : 0 - - mbrtogpt - - / dev / sdb partprobe mkfs.xfs / dev / sdb1 mkfs.xfs / dev / sdc1 SDBUUID = $(blkid | grep - E '/dev/sdb1' | awk '{print $2}' ) SDCUUID = $(blkid | grep - E '/dev/sdc1' | awk '{print $2}' ) echo - e "${SDBUUID} /mnt/data xfs defaults 0 0" >> / etc / fstab echo - e "${SDCUUID} /mnt/ssd xfs defaults 0 0" >> / etc / fstab |
pvcreate 命令将物理卷(Physical Volume)添加到 LVM
1 | pvcreate / dev / sda1 / dev / sdb1 / dev / sdc1 / dev / nvme0n1p1 |
并使用 vgcreate 命令创建卷组(Volume Group)
1 | vgcreate vg / dev / sda1 / dev / sdb1 / dev / sdc1 / dev / nvme0n1p1 |
用 lvcreate 命令创建逻辑卷data
注意:ssd不用操作
1 | lvcreate - n data - L 200G vg / dev / sda1 / dev / sdb1 / dev / sdc1 |
2、创建逻辑卷缓存cache、逻辑卷meta(此处操作的是ssd盘分区)
1 2 3 | lvcreate - n cache - L 30G vg / dev / nvme0n1p1 lvcreate - n meta - L 6G vg / dev / nvme0n1p1 |
3、lvm cache总共包括三部分:data、cache、meta
其中meta的size需要大于千分之一的cache;data是存储数据,cache和meta共同构成缓存。
4、创建缓存池、将存储卷加入缓存池
1 2 3 | lvconvert - - type cache - pool - - poolmetadata vg / meta vg / cache lvconvert - - type cache - - cachepool vg / cache - - cachemode writeback vg / data |
cachemode有writeback和writethrough两种模式,默认为writethrough,此处测试设置为writeback。writeback的读写性能会好一些,但是在某些极端情况下会丢失数据
5、格式化与挂载
1 2 3 4 5 | mkfs.xfs / dev / vg / data mkdir / data mount / dev / vg / data / data / |
补充:
做过raid的组合盘也能做(比如4块4T的机械硬盘组raid5为一块,2块490G的ssd盘做raid1)
6、卸载lvm_cache
取消挂载文件系统:
1 | umount / dev / vg / data |
移除逻辑卷data:
1 | lvremove / dev / vg / data |
删除卷组vg:
1 | vgremove vg |
删除物理卷pv
1 | pvremove / dev / sda1 / dev / sdb1 / dev / sdc1 / dev / nvme0n1p1 |
3、操作脚本
注意⚠️:该脚本只有大致的操作逻辑,需要根据实际情况进行修改
1、比如hdd的分区操作没有
2、rota == 0时为ssd盘
3、应该添加一个交互,人工输入hdd盘和ssd(盘比较多的情况下)
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 | #!/bin/bash #set -x lsblk - d - o name,rota | sed - n - e '2,$p' | while read line; do ID = $(echo "$line" | awk - F " " '{print $2}' ) HDD = $(pvdisplay | sed - n - e '2p' | awk - F " " '{print $3}' ) diskname = $(echo "$line" | awk - F " " '{print $1}' ) if [ "$ID" = = "0" ]; then cat / proc / partitions | sed - n '3,$p' | while read SSD; do saa = $(echo "$SSD" | awk - F " " '{print $4}' ) if [ "$diskname" = "$saa" ]; then echo "我是SSD,要做缓存盘" if [ "$diskname" ! = "$HDD" ]; then echo "$diskname 不存在LVM" pvcreate "/dev/$diskname" vgcreate vg "/dev/$diskname" lvcreate - n cache - L 890G vg "/dev/$diskname" lvcreate - n meta - L 4G vg "/dev/$diskname" fi fi done else if [ "$diskname" = = "$HDD" ]; then echo "$diskname 不存在LVM" pvcreate "/dev/$diskname" vgcreate vg "/dev/$diskname" lvcreate - n data - L 10.8T vg "/dev/$diskname" fi fi done |
简单粗暴写法
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 | #!/bin/bash ## !!!请确认sdc 和 sdb 盘 # 1、分区 sgdisk - - zap - all / dev / sdb sgdisk - n 0 : 0 : 0 - - mbrtogpt - - / dev / sdb sgdisk - - zap - all / dev / sdc sgdisk - n 0 : 0 : 0 - - mbrtogpt - - / dev / sdc partprobe # 2、物理卷 pvcreate / dev / sdb1 / dev / sdc1 # 3 、 卷组 vgcreate vg / dev / sdb1 / dev / sdc1 # 4、创建逻辑卷data, sdc为hdd lvcreate - n data - L 10.9T vg / dev / sdc1 # 5、 创建逻辑卷缓存cache、逻辑卷meta lvcreate - n cache - L 890G vg / dev / sdb1 lvcreate - n meta - L 4G vg / dev / sdb1 # 6、创建缓存池 lvconvert - - type cache - pool - - poolmetadata vg / meta vg / cache lvconvert - - type cache - - cachepool vg / cache - - cachemode writeback vg / data # 7、 格式化与挂载 mkfs.xfs / dev / vg / data mkdir / data # 8、挂载 cat >> / etc / fstab <<EOF / dev / vg / data / data / xfs defaults 0 0 EOF mount - a |
LVM原理及使用 · Devops Roadmap (curiouser.top)