百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

LVM分区管理实战:创建和扩容的完整指南

bigegpt 2024-10-05 13:45 5 浏览

在生产环境中,通常会使用LVM(Logical Volume Manager,逻辑卷管理)作为管理存储设备的工具,以便于快速灵活地进行扩容、缩容等操作。

本文将展示如何基于LVM创建分区,并对该分区扩容

首先,我们需要认识LVM中的几个基本概念:

  • 物理卷(Physical Volume,PV):存储底层的块设备,通常是物理磁盘,也可以是磁盘上的某个分区。
  • 卷组(Volume Group,VG):由一个或多个物理卷组成,为逻辑卷提供待分配的空间。
  • 逻辑卷(Logical Volume,LV):从卷组中划分的虚拟分区,是实际上用于存储文件系统的空间。
  • 物理块(Physical Extent,PE):LVM中用于分配的最小存储单元,默认为4MB,逻辑卷和物理卷都由这种单元构成,并且组成同一卷组的PE大小相同。


初始分区环境

首先看一下当前的分区情况:

我们计划在 vdb 这块磁盘上创建一个LVM分区,挂载到工作目录/tyun


创建一个基本LVM分区

刚挂载的物理磁盘需要经过 LVM 的初始化操作,才能被 LVM 管理。

具体流程如下:

1. 创建物理卷、卷组和逻辑卷

# 创建物理卷,将磁盘vdb加入lvm管理
root@ubuntu:~# pvcreate /dev/vdb
  Physical volume "/dev/vdb" successfully created.


# 创建一个卷组,命名为vg0,并将物理卷添加进去
root@ubuntu:~# vgcreate vg0 /dev/vdb
  Volume group "vg0" successfully created


# 创建逻辑卷组,-n参数指定新建逻辑卷的名称(我命名为lv0),-l 100%FREE表示添加卷组内所有剩余空间
root@ubuntu:~# lvcreate -l 100%FREE -n lv0 vg0
  Logical volume "lv0" created.

2. 查看物理卷、卷组和逻辑卷

# 查看物理卷状态,想查看详细信息可用pvdisplay
root@ubuntu:~# pvs
  PV         VG  Fmt  Attr PSize   PFree
  /dev/vdb   vg0 lvm2 a--  <30.00g    0 


# 查看卷组状态,想查看详细信息可用vgdisplay
root@ubuntu:~# vgs
  VG  #PV #LV #SN Attr   VSize   VFree
  vg0   1   1   0 wz--n- <30.00g    0 


# 查看逻辑卷状态,想查看详细信息可用lvdisplay
root@ubuntu:~# lvs
  LV   VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv0  vg0 -wi-a----- <30.00g 

因为磁盘操作涉及数据,每一步的检查都是必要的,每一步的操作都要小心谨慎。

  1. 格式化逻辑卷
# 根据相应的文件系统格式化逻辑卷,例如使用ext4文件系统
root@ubuntu:~# mkfs.ext4 /dev/vg0/lv0
mke2fs 1.44.1 (24-Mar-2018)
Creating filesystem with 7863296 4k blocks and 1966080 inodes
Filesystem UUID: 168c20f6-f93a-4f6a-9d4f-93609b53fc44
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000


Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done 

此时再次查看磁盘分区,发现 vdb 磁盘下已经有了一个 lvm 分区。

4. 挂载分区到工作目录上

# 将vdb的lvm分区挂载到/tyun工作目录上
root@ubuntu:~# mount /dev/vg0/lv0 /tyun

需要提醒的是,该命令只是临时挂载,系统重启就会取消。如果想要挂载持久化,需要编辑/etc/fstab文件,让系统启动时自动挂载。

具体操作如下:

# 用blkid命令查看逻辑磁盘lv0的uuid
root@ubuntu:~# blkid /dev/vg0/lv0
/dev/vg0/lv0: UUID="168c20f6-f93a-4f6a-9d4f-93609b53fc44" TYPE="ext4"


# 编辑/etc/fstab文件,将lv0的信息添加在新行
root@ubuntu:~# vim /etc/fstab
UUID=baf9b14e-1faf-11e9-84e3-fa9a00532b00 / ext4 defaults 0 0
UUID=168c20f6-f93a-4f6a-9d4f-93609b53fc44 /tyun ext4 defaults 0 0

查看分区,已经成功挂载。


扩容LVM分区

LVM最强大的地方就在于可以灵活地对逻辑卷进行扩容和缩容,此时我们需要对刚刚创建的/tyun分区进行扩容,添加一块磁盘 vdc 后,分区情况如下:

1. 将新添加的磁盘 vdc 初始化为物理卷

root@ubuntu:~# pvcreate /dev/vdc
  Physical volume "/dev/vdc" successfully created.


root@ubuntu:~# pvs
  PV         VG  Fmt  Attr PSize   PFree 
  /dev/vdb   vg0 lvm2 a--  <30.00g     0 
  /dev/vdc       lvm2 ---   30.00g 30.00g

2. 对现有卷组 vg0 进行扩展,把新的物理卷加入

root@ubuntu:~# vgextend vg0 /dev/vdc
  Volume group "vg0" successfully extended

查看当前卷组,确认卷组容量已扩容,确认 vdc 已加入 vg0 。

3. 对挂载工作目录/tyun的逻辑卷 lv0 进行扩容

# 新添加的磁盘有30G,本次仅扩容20G空间
# 使用 -L 选项并使用 +20G 参数扩展逻辑卷
root@ubuntu:~# lvextend -L +20G /dev/vg0/lv0
  Size of logical volume vg0/lv0 changed from <30.00 GiB (7679 extents) to <50.00 GiB (12799 extents).
  Logical volume vg0/lv0 successfully resized.

此时查看分区信息,发现逻辑卷 lv0 已经扩容到 50G,但/tyun分区还是原来的 30G。

这是因为文件系统层感知不到逻辑卷的大小变化,需要用一些工具根据实际的卷空间,重新调整文件系统的大小。

4. 调整文件系统的大小

因为是 ext4 文件系统,使用resize2fs工具在线扩容。如果是 xfs 文件系统,可使用xfs_growfs工具进行扩容。

# 使用逻辑卷的整个可用空间,以适应逻辑卷的新大小
root@ubuntu:~# resize2fs /dev/vg0/lv0
resize2fs 1.44.1 (24-Mar-2018)
Filesystem at /dev/vg0/lv0 is mounted on /tyun; on-line resizing required
old_desc_blocks = 4, new_desc_blocks = 7
The filesystem on /dev/vg0/lv0 is now 13106176 (4k) blocks long.

再次查看,已经完成扩容。


关于LVM的一些扩展

1. 磁盘空间收缩

与扩容相反,这是个不常见的操作,同样是通过分配逻辑卷空间实现,涉及到文件系统调整,且需要卸载分区,如果条件允许,操作前一定要进行备份。

# 1. 卸载分区,调整文件系统空间,例如将 50G 空间调整为 40G


root@ubuntu:~# umount /tyun   # 卸载分区


root@ubuntu:~# e2fsck -f /dev/vg0/lv0   # 检查文件系统
e2fsck 1.44.1 (24-Mar-2018)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/vg0/lv0: 11/3276800 files (0.0% non-contiguous), 251751/13106176 blocks


root@ubuntu:~# resize2fs /dev/vg0/lv0 40G   # 调整文件系统大小
resize2fs 1.44.1 (24-Mar-2018)
Resizing the filesystem on /dev/vg0/lv0 to 10485760 (4k) blocks.
The filesystem on /dev/vg0/lv0 is now 10485760 (4k) blocks long.


# 2. 调整逻辑卷大小


root@ubuntu:~# lvreduce -L -10G /dev/vg0/lv0
  WARNING: Reducing active logical volume to <40.00 GiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg0/lv0? [y/n]: y
  Size of logical volume vg0/lv0 changed from <50.00 GiB (12799 extents) to <40.00 GiB (10239 extents).
  Logical volume vg0/lv0 successfully resized.

此时查看 lv0 逻辑卷大小,已经缩容到 40G,重新挂载到工作目录即可。

再次提醒,缩小磁盘容量是一个敏感操作,可能导致数据丢失,一定要确保对重要文件做了备份,以及预留了足够的缩容空间。

  1. LVM 的快照功能

LVM的快照就是对逻辑卷拷贝一份副本,可以在进行重要操作前创建一个逻辑卷快照,防止操作意外导致的数据损失。

root@ubuntu:~# lvcreate --size 5G --snapshot --name lv0_snapshot_231225 /dev/vg0/lv0
  Using default stripesize 64.00 KiB.
  Logical volume "lv0_snapshot_231225" created.
  • --size:指定快照的大小
  • --snapshot:表示创建快照操作
  • --name:指定快照的名称
  • /dev/vg0/lv0:指定需要创建快照的逻辑卷

使用快照就是将这个快照的逻辑卷挂载到新建的某个目录上。

LVM 默认创建的快照是 COW(Copy-On-Write,写时复制)类型的,即在原始卷上写入时,在快照卷记录发生变化的数据,这种类型可以在创建快照后继续对原始卷进行写入而不影响快照一致性,一般用于测试操作前的备份。

如果在创建快照的命令中加-ro参数,可以创建一个RO(Read-Only,只读)快照,它是原始卷的静态副本,不允许在快照卷上进行写入操作,通常用于记录某个时间点的原始卷状态。


总结

LVM 作为 Linux 下的磁盘管理工具,已在各种环境和场景中得到了广泛应用,将底层的存储设备抽象成一个逻辑层,令运维人员可以灵活和高效地管理存储空间,并提供了快照等丰富功能。

掌握 LVM 如何扩容,熟悉它的功能,是系统运维人员必修的技能,但须注意:在生产环境中,任何对磁盘的操作都是高危操作,一定要小心谨慎,避免影响数据!

相关推荐

C#.NET Autofac 详解(c# autoit)

简介Autofac是一个成熟的、功能丰富的.NET依赖注入(DI)容器。相比于内置容器,它额外提供:模块化注册、装饰器(Decorator)、拦截器(Interceptor)、强o的属性/方法注...

webapi 全流程(webapi怎么部署)

C#中的WebAPIMinimalApi没有控制器,普通api有控制器,MinimalApi是直达型,精简了很多中间代码,广泛适用于微服务架构MinimalApi一切都在组控制台应用程序类【Progr...

.NET外挂系列:3. 了解 harmony 中灵活的纯手工注入方式

一:背景1.讲故事上一篇我们讲到了注解特性,harmony在内部提供了20个HarmonyPatch重载方法尽可能的让大家满足业务开发,那时候我也说了,特性虽然简单粗暴,但只能解决95%...

C# 使用SemanticKernel调用本地大模型deepseek

一、先使用ollama部署好deepseek大模型。具体部署请看前面的头条使用ollama进行本地化部署deepseek大模型二、创建一个空的控制台dotnetnewconsole//添加依赖...

C#.NET 中间件详解(.net core中间件use和run)

简介中间件(Middleware)是ASP.NETCore的核心组件,用于处理HTTP请求和响应的管道机制。它是基于管道模型的轻量级、模块化设计,允许开发者在请求处理过程中插入自定义逻辑。...

IoC 自动注入:让依赖注册不再重复劳动

在ASP.NETCore中,IoC(控制反转)功能通过依赖注入(DI)实现。ASP.NETCore有一个内置的依赖注入容器,可以自动完成依赖注入。我们可以结合反射、特性或程序集扫描来实现自动...

C#.NET 依赖注入详解(c#依赖注入的三种方式)

简介在C#.NET中,依赖注入(DependencyInjection,简称DI)是一种设计模式,用于实现控制反转(InversionofControl,IoC),以降低代码耦合、提高可...

C#从零开始实现一个特性的自动注入功能

在现代软件开发中,依赖注入(DependencyInjection,DI)是实现松耦合、模块化和可测试代码的一个重要实践。C#提供了优秀的DI容器,如ASP.NETCore中自带的Micr...

C#.NET 仓储模式详解(c#仓库货物管理系统)

简介仓储模式(RepositoryPattern)是一种数据访问抽象模式,它在领域模型和数据访问层之间创建了一个隔离层,使得领域模型无需直接与数据访问逻辑交互。仓储模式的核心思想是将数据访问逻辑封装...

C#.NET 泛型详解(c# 泛型 滥用)

简介泛型(Generics)是指在类型或方法定义时使用类型参数,以实现类型安全、可重用和高性能的数据结构与算法为什么需要泛型类型安全防止“装箱/拆箱”带来的性能损耗,并在编译时检测类型错误。可重用同一...

数据分析-相关性分析(相关性 分析)

相关性分析是一种统计方法,用于衡量两个或多个变量之间的关系强度和方向。它通过计算相关系数来量化变量间的线性关系,从而帮助理解变量之间的相互影响。相关性分析常用于数据探索和假设检验,是数据分析和统计建模...

geom_smooth()函数-R语言ggplot2快速入门18

在每节,先运行以下这几行程序。library(ggplot2)library(ggpubr)library(ggtext)#用于个性化图表library(dplyr)#用于数据处理p...

规范申报易错要素解析(规范申报易错要素解析)

为什么要规范申报?规范申报是以满足海关监管、征税、统计等工作为目的,纳税义务人及其代理人依法向海关如实申报的行为,也是海关审接单环节依法监管的重要工作。企业申报的内容须符合《中华人民共和国海关进出口货...

「Eurora」海关编码归类 全球海关编码查询 关务服务

  海关编码是什么?  海关编码即HS编码,为编码协调制度的简称。  其全称为《商品名称及编码协调制度的国际公约》(InternationalConventionforHarmonizedCo...

9月1日起,河南省税务部门对豆制品加工业试行新政7类豆制品均适用投入产出法

全媒体记者杨晓川报道9月2日,记者从税务部门获悉,为减轻纳税人税收负担,完善农产品增值税进项税额抵扣机制,根据相关规定,结合我省实际情况,经广泛调查研究和征求意见,从9月1日起,我省税务部门对豆制品...