这篇文章上次修改于 407 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

介绍

  • LVM是Linux操作系统的逻辑卷管理器。 现在有两个Linux版本的LVM,分别是 LVM1,LVM2。LVM1是一种已经被认为稳定了几年的成熟产品,LVM2 是最新最好的LVM版本
  • 逻辑卷管理提供了比传统的磁盘和分区视图更高级别的计算机系统上磁盘存储的视图。 这使得系统管理员可以更灵活地将存储分配给应用程序和用户。
  • 最主要的优点是在磁盘空间不足的情况下,使用新增的磁盘,在不格式化分区的情况下对现有分区进行动态扩容

基本概念

物理卷(Physical Volume,PV):

  • 说明: 物理卷是指实际的物理存储设备,如硬盘或分区。LVM 将一个或多个物理卷合并成一个卷组(Volume Group)。
  • 命令: pvcreate 用于创建物理卷。

卷组(Volume Group,VG):

  • 说明: 卷组是由一个或多个物理卷组成的逻辑单位。它提供了一个池,所有卷组中的物理卷的存储空间汇聚在一起。
  • 命令: vgcreate 用于创建卷组。

逻辑卷(Logical Volume,LV):

  • 说明: 逻辑卷是卷组中的一个逻辑分区,它可以被用作文件系统的挂载点。逻辑卷的大小和数量可以动态调整,而不影响数据。
  • 命令: lvcreate 用于创建逻辑卷。

物理区(Physical Extent,PE):

  • 说明: 物理区是物理卷上的最小存储单元。卷组中的逻辑卷和物理卷都以物理区为基本单位。
  • 命令: pvdisplay 可以显示物理卷中的物理区的信息。

逻辑区(Logical Extent,LE):

  • 说明: 逻辑区是逻辑卷上的最小存储单元。它与物理区的概念相似,但在逻辑卷的上下文中使用。
  • 命令: lvdisplay 可以显示逻辑卷中的逻辑区的信息。

文件系统:

  • 说明: 逻辑卷可以用来创建文件系统,从而作为数据的存储和管理单元。
  • 命令: 根据所选择的文件系统类型,可以使用 mkfs 命令来创建文件系统。

使用lvm 创建逻辑分区

  • 第一步: 使用fdisk命令,设置硬盘分区,并把分区类型更改为LVM 类型,标识为 8e

[root@k8s-master ~]# fdisk /dev/sdb 欢迎使用 fdisk (util-linux 2.23.2)。 更改将停留在内存中,直到您决定将更改写入磁盘。 使用写入命令前请三思。 Device does not contain a recognized partition table 使用磁盘标识符 0x30354c86 创建新的 DOS 磁盘标签。 命令(输入 m 获取帮助):n //输入n增加分区 Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p //输入p,设置增加的分区是主分区 分区号 (1-4,默认 1):1 //分区号设置为1 起始 扇区 (2048-204799,默认为 2048): 将使用默认值 2048 Last 扇区, +扇区 or +size{K,M,G} (2048-204799,默认为 204799): 将使用默认值 204799 分区 1 已设置为 Linux 类型,大小设为 99 MiB 命令(输入 m 获取帮助):t //输入t修改分区类型id 已选择分区 1 Hex 代码(输入 L 列出所有代码):8e //输入 8e ,代表把分区类型改为LVM类型 已将分区“Linux”的类型更改为“Linux LVM” 命令(输入 m 获取帮助):w //输入w 保存更改并退出 fdisk The partition table has been altered! Calling ioctl() to re-read partition table. 正在同步磁盘。 [root@k8s-master ~]#
  • 第二步,使用pvcreate 创建物理卷
# 创建
[root@k8s-master ~]# pvcreate /dev/sdb1 /dev/sdc1
  Physical volume "/dev/sdb1" successfully created.
  Physical volume "/dev/sdc1" successfully created.

# 使用 pvdisplay 或者 pvs 命令查看
[root@k8s-master ~]# pvdisplay | grep sd[b-c]
  "/dev/sdc1" is a new physical volume of "99.00 MiB"
  PV Name               /dev/sdc1
  "/dev/sdb1" is a new physical volume of "99.00 MiB"
  PV Name               /dev/sdb1

[root@k8s-master ~]# pvdisplay /dev/sdb1 /dev/sdc1 
  --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               vgdata
  PV Size               99.00 MiB / not usable 3.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              24
  Free PE               24
  Allocated PE          0
  PV UUID               TNcnHc-YCrf-2goB-JGeR-sto4-8rAb-MWhV0N

  --- Physical volume ---
  PV Name               /dev/sdc1
  VG Name               vgdata
  PV Size               99.00 MiB / not usable 3.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              24
  Free PE               24
  Allocated PE          0
  PV UUID               kmRlxp-QSjo-xl3B-DIyN-zzFm-NyOi-cGRsnJ
  • 第三步 使用vgcreate 创建一个VG卷组
# 说明: vgdata  是VG卷组名称
[root@k8s-master ~]# vgcreate vgdata /dev/sdb1 /dev/sdc1
  Volume group "vgdata" successfully created
# 使用vgs 命令查看刚创建的VG
[root@k8s-master ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree  
  centos   1   2   0 wz--n- <19.00g      0 
  vgdata   2   0   0 wz--n- 192.00m 192.00m

# 使用vgdisplay  命令查看制定VG卷组信息
[root@k8s-master ~]# vgdisplay vgdata
  --- Volume group ---
  VG Name               vgdata
  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               192.00 MiB
  PE Size               4.00 MiB
  Total PE              48
  Alloc PE / Size       0 / 0   
  Free  PE / Size       48 / 192.00 MiB
  VG UUID               JPgdSn-OUGM-aUpW-HyK8-m1Zv-JV3Z-e83m9t

  • 第四步 创建LV
# 创建一个大小是100M的LV逻辑卷 , LV名称是 lv1
[root@k8s-master ~]# lvcreate -n lv1 -L +100M vgdata
  Logical volume "lv1" created.

- 查看一下创建的lv1信息
[root@k8s-master ~]# lvdisplay vgdata
  --- Logical volume ---
  LV Path                /dev/vgdata/lv1
  LV Name                lv1
  VG Name                vgdata
  LV UUID                CutiKD-GkCV-4xU3-mYL3-2soU-fNWn-NGGxNq
  LV Write Access        read/write
  LV Creation host, time k8s-master, 2023-12-13 21:10:12 +0800
  LV Status              available
  # open                 0
  LV Size                100.00 MiB
  Current LE             25
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2

[root@k8s-master ~]# lvs
  LV   VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root centos -wi-ao---- <17.00g                                                    
  swap centos -wi-a-----   2.00g                                                    
  lv1  vgdata -wi-a----- 100.00m 


  • 第五步 格式化创建的lv1 逻辑卷
[root@k8s-master ~]# mkfs.xfs /dev/vgdata/lv1 
meta-data=/dev/vgdata/lv1        isize=512    agcount=4, agsize=6400 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=25600, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=855, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@k8s-master ~]# lsblk -f
NAME            FSTYPE      LABEL          UUID                                   MOUNTPOINT
sda                                                                               
├─sda1          xfs                        f52dcde1-aa78-42cc-83e1-3fc217d6f4e8   /boot
└─sda2          LVM2_member                2LTInU-3JqW-8hXD-IL2C-S9Rj-nVWB-l8t5Nn 
  ├─centos-root xfs                        65054278-6847-47c7-92fa-5e82971d7d51   /
  └─centos-swap swap                       30ee098a-20e2-4ab3-b202-348c24e29a83   
sdb                                                                               
└─sdb1          LVM2_member                TNcnHc-YCrf-2goB-JGeR-sto4-8rAb-MWhV0N 
  └─vgdata-lv1  xfs                        af1abf15-f089-414b-b2dd-ab974d1b003f   
sdc                                                                               
└─sdc1          LVM2_member                kmRlxp-QSjo-xl3B-DIyN-zzFm-NyOi-cGRsnJ 
  └─vgdata-lv1  xfs                        af1abf15-f089-414b-b2dd-ab974d1b003f   
sdd                                                                               
└─sdd1                                                                            
sr0             iso9660     VBox_GAs_7.0.8 2023-04-17-17-27-11-59


  • 第六步 进行文件挂载

[root@k8s-master ~]# mkdir -p /vgdata/lv1 [root@k8s-master ~]# mount /dev/vgdata/lv1 /vgdata/lv1/ # 查看磁盘信息 [root@k8s-master ~]# df -Th | grep lv1 /dev/mapper/vgdata-lv1 xfs 97M 5.3M 92M 6% /vgdata/lv1 # 测试创建一个文件 [root@k8s-master lv1]# echo {1..1000} > text.txt

扩容VG


[root@k8s-master ~]# pvcreate /dev/sdd1 Physical volume "/dev/sdd1" successfully created. [root@k8s-master ~]# pvs PV VG Fmt Attr PSize PFree /dev/sda2 centos lvm2 a-- <19.00g 0 /dev/sdb1 vgdata lvm2 a-- 96.00m 96.00m /dev/sdc1 vgdata lvm2 a-- 96.00m 96.00m /dev/sdd1 lvm2 --- 99.00m 99.00m [root@k8s-master ~]# vgextend vgdata /dev/sdd1 Volume group "vgdata" successfully extended [root@k8s-master ~]# pvs PV VG Fmt Attr PSize PFree /dev/sda2 centos lvm2 a-- <19.00g 0 /dev/sdb1 vgdata lvm2 a-- 96.00m 96.00m /dev/sdc1 vgdata lvm2 a-- 96.00m 96.00m /dev/sdd1 vgdata lvm2 a-- 96.00m 96.00m # 如果需要移除 使用vgreduce 命令 [root@k8s-master ~]# vgreduce vgdata /dev/sdd1 Removed "/dev/sdd1" from volume group "vgdata" # 使用pvremove 删除pv物理卷 [root@k8s-master ~]# pvremove /dev/sdd1 Labels on physical volume "/dev/sdd1" successfully wiped.

扩容lv逻辑卷


# 先卸载lv设备 [root@k8s-master /]# umount /vgdata/lv1 #扩容50M [root@k8s-master /]# lvextend -L +50M /dev/vgdata/lv1 Rounding size to boundary between physical extents: 52.00 MiB. Size of logical volume vgdata/lv1 changed from 100.00 MiB (25 extents) to 152.00 MiB (38 extents). Logical volume vgdata/lv1 successfully resized. # 重新进行挂载 [root@k8s-master /]# mount /dev/vgdata/lv1 /vgdata/lv1/ # 查看磁盘信息 [root@k8s-master /]# df -Th | grep lv1 /dev/mapper/vgdata-lv1 xfs 97M 5.3M 92M 6% /vgdata/lv1 # 上面查看磁盘信息, 发现/vgdata/lv1还是100M # 需要调整xfs文件系统的大小,才能让扩容生效 [root@k8s-master /]# xfs_growfs /dev/vgdata/lv1 meta-data=/dev/mapper/vgdata-lv1 isize=512 agcount=4, agsize=6400 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0 spinodes=0 data = bsize=4096 blocks=25600, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=855, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 data blocks changed from 25600 to 38912 [root@k8s-master /]# df -Th | grep lv1 /dev/mapper/vgdata-lv1 xfs 149M 5.4M 144M 4% /vgdata/lv1 # 发现扩容生效了