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、安装相关软件包
yum install -y lvm2
2、创建物理卷(pv)
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
数量不变,大小刷新
pvresize /dev/sda3
3、创建VG
# vgcreate命令用法 vgcreate -s [N[mgt]] VG名称 PV名称 # -s 指定VG中的PE大小,单位:MB,GB,TB vgcreate -s 16M docker /dev/sdc
查看
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)
#lvcreate命令参数 lvcreate -l PE个数 -n LV名称 VG名称 lvcreate -l 6399 -n docker-lib docker
查看
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
mkfs.ext4 LV_Name mkfs.xfs LV_Name
6、挂载lv
echo "LV_Name 挂载目录点 文件系统格式 defaults 0 0" >> /etc/fstab mount -a
三、扩容
- VG已无PE可用
- 新增硬盘
- 在线扩容(不卸载,不重启主机)
1、创建PV
pvcreate /dev/sdc Physical volume "/dev/sdc" successfully created.
2、将PV添加到VG中。之后可看PE数量增加
vgextend centos /dev/sdc Volume group "centos" successfully extended
3、扩容LV(之后可看LV容量增加)
lvresize -l +6399 LV_Path # 或者 lvresize -L +50G LV_Path lvresize -L +10G /dev/centos/home
4、检查修复文件系统
e2fsck -f LV_Name
5、将扩容后的LV完整地扩充到文件系统中
# LV文件系统是ext4时 resize2fs LV_Path # LV文件系统是xfs时 xfs_growfs LV_Path
报错
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磁盘
# 查看已有硬盘 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)
pvcreate /dev/sdc3
2、创建卷组(vg)
vgcreate vg3 /dev/sdc3 Volume group "vg3" successfully created
3、创建逻辑卷(lv)
lvcreate -L 300M -n lv3 vg3 Logical volume "lv3" created.
4、格式化(指定文件系统)
mkfs.ext4 /dev/vg3/lv3 mke2fs 1.42.9 (28-Dec-2013) 文件系统标签= OS type: Linux ... Writing superblocks and filesystem accounting information: 完成
5、挂载
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,已经分出来的两个分区很小
# 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、调整分区
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进行相同操作
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
pvcreate /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/nvme0n1p1
并使用 vgcreate 命令创建卷组(Volume Group)
vgcreate vg /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/nvme0n1p1
用 lvcreate 命令创建逻辑卷data
注意:ssd不用操作
lvcreate -n data -L 200G vg /dev/sda1 /dev/sdb1 /dev/sdc1
2、创建逻辑卷缓存cache、逻辑卷meta(此处操作的是ssd盘分区)
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、创建缓存池、将存储卷加入缓存池
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、格式化与挂载
mkfs.xfs /dev/vg/data mkdir /data mount /dev/vg/data /data/
补充:
做过raid的组合盘也能做(比如4块4T的机械硬盘组raid5为一块,2块490G的ssd盘做raid1)
6、卸载lvm_cache
取消挂载文件系统:
umount /dev/vg/data
移除逻辑卷data:
lvremove /dev/vg/data
删除卷组vg:
vgremove vg
删除物理卷pv
pvremove /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/nvme0n1p1
3、操作脚本
注意⚠️:该脚本只有大致的操作逻辑,需要根据实际情况进行修改
1、比如hdd的分区操作没有
2、rota == 0时为ssd盘
3、应该添加一个交互,人工输入hdd盘和ssd(盘比较多的情况下)
#!/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
简单粗暴写法
#!/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)