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)

 

posted @ 2019-07-25 21:05  凡人半睁眼  阅读(584)  评论(0编辑  收藏  举报