Linux磁盘管理和LVM详解

Linux磁盘管理和LVM详解

在 Linux 系统的世界里,磁盘不仅是存储数据的“仓库”,更是支撑服务运行、保障系统稳定的关键基础设施。无论是部署一台 Web 服务器、搭建数据库,还是管理一台个人开发机,合理高效地进行磁盘管理都是每个 Linux 用户和系统管理员必须掌握的核心技能。

基础概念

磁盘设备命名规则

Linux 将所有硬件设备抽象为文件,磁盘也不例外。它们通常位于 /dev 目录下。

  • 传统 SATA/SCSI 硬盘:使用 sd 前缀,如:
1
2
3
/dev/sda:第一块硬盘
/dev/sdb:第二块硬盘
分区则在后面加数字,如 /dev/sda1 表示 sda 的第一个分区。

你可以通过 lsblk 或 lshw -class disk 快速查看系统识别到的所有磁盘设备。

分区(Partition) & 逻辑卷(LVM)

  • 分区
    分区是将一块物理磁盘划分为多个逻辑区域的操作。传统分区方式有两种:
    MBR:最多支持 4 个主分区;单个分区最大支持 2TB;兼容性好,但功能有限
    GPT:支持最多 128 个分区(实际更多,受限于操作系统);支持超过 2TB 的磁盘;
    ==对磁盘重新分区会清除所有数据,操作前务必备份!==
  • LVM
    LVM 是一种更灵活的磁盘管理方式
1
2
3
PV:物理卷,可以是一个分区或整块磁盘(如 /dev/sdb1)
VG:卷组,由一个或多个 PV 组成,相当于一个“存储池”
LV:逻辑卷,从 VG 中划分出来,可直接格式化为文件系统

LVM 的优势:
动态扩容/缩容:无需停机即可调整分区大小
支持快照(Snapshot):用于备份或测试
跨磁盘管理:多个物理磁盘可合并为一个逻辑存储池

对于生产环境或需要灵活调整存储的场景,LVM 是更推荐的选择。

文件系统简介

分区或逻辑卷创建后,还不能直接存储文件——必须先创建文件系统。文件系统定义了数据如何组织、存储和检索。
Linux 支持多种文件系统,常见有:

文件系统 特点 适用场景
ext4 成熟稳定,兼容性好,日志型 通用场景,大多数发行版默认
XFS 高性能,支持超大文件和分区,日志型 大数据、高性能存储(如 RHEL/CentOS 默认)
Btrfs 支持快照、压缩、RAID 等高级功能 实验性或需要高级功能的场景(仍在发展中)
swap 交换分区,用于虚拟内存 内存不足时的补充

文件系统类型不影响分区本身,只影响分区“装”什么“货”。你可以用 mkfs.ext4、mkfs.xfs 等命令为同一分区创建不同文件系统。

查看磁盘与分区信息

lsblk:列出块设备
这里可以看到,当前的系统中,只有一块硬盘,被识别成了sda,是30个G,在linux系统中,磁盘的命名方式默认是从sda-sdz进行命名的,如果26位英文字母用完之后,当增加第27块的时候,命名就是以sdaa-sdaz的方式进行命名。

1
2
3
4
5
6
7
8
9
[root@localhost ~]# lsblk
# 磁盘名字 磁盘大小
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 30G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 29G 0 part
├─openeuler-root 253:0 0 26G 0 lvm /
└─openeuler-swap 253:1 0 3G 0 lvm [SWAP]
sr0 11:0 1 3.4G 0 rom

下图标红的两个分区,是在安装操作系统的时候,系统自动分好的。
在这里插入图片描述
df -h:查看挂载与磁盘大小

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# df -h
#文件系统 #容量 #已用 #可用 #已用% #挂载点
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.2G 0 1.2G 0% /dev
tmpfs 1.2G 0 1.2G 0% /dev/shm
tmpfs 481M 13M 468M 3% /run
tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
/dev/mapper/openeuler-root 26G 2.2G 23G 9% /
tmpfs 1.2G 0 1.2G 0% /tmp
/dev/sda1 974M 87M 820M 10% /boot

新增硬盘 SCSI 总线重扫

当使用过程中,当服务器的磁盘空间不够用了,就需要采购新的磁盘插入到服务器中,但是只是把磁盘插入到服务器中,服务器是无法识别到硬盘的,需要手动触发 SCSI 总线重扫,我这里使用vmware虚拟机 演示一下服务器硬盘添加的操作。
这是添加硬盘前,可以看到只有一块,sda的磁盘,接下来进行添加磁盘的操作

1
2
3
4
5
6
7
8
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 30G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 29G 0 part
├─openeuler-root 253:0 0 26G 0 lvm /
└─openeuler-swap 253:1 0 3G 0 lvm [SWAP]
sr0 11:0 1 3.4G 0 rom
  • 在虚拟机设置中,点击添加
    在这里插入图片描述
  • 选择添加硬盘并进行下一步
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    硬盘添加完毕之后,我们在使用lsbak的命令查看是否有新的硬盘,可以看到磁盘添加完毕之后,还是无法识别到新硬盘
    在这里插入图片描述
    这个时候就需要通过命令来扫描服务器硬盘接口让操作系统来识别我们添加的新硬盘。命令如下:
    echo "- - -" >> /sys/class/scsi_host/host0/scan
1
2
3
4
5
6
7
# 查看当前 SCSI 主机
[root@localhost ~]# ls /sys/class/scsi_host/host
host0/ host1/ host2/
#对每个 host 执行重扫 # 这里的host指的是服务器的硬盘接口,磁盘添加到那个口,就扫哪个口,我这里是虚拟机,一共有3个所以我需要扫描三次
[root@localhost ~]# echo "- - -" >> /sys/class/scsi_host/host0/scan
[root@localhost ~]# echo "- - -" >> /sys/class/scsi_host/host1/scan
[root@localhost ~]# echo "- - -" >> /sys/class/scsi_host/host2/scan

扫描完之后再使用lsblk 的命令在进行查看,是否一块sdb的硬盘
在这里插入图片描述

新增硬盘并使用脚本进行SCSI 总线重扫

假设在实际环境中,服务器的host接口是有几十个且,我们也不知道硬盘实际添加的是哪一个插槽,这个时候如果一条命令,一条命令的执行的话,比较影响效率,所以我们这个时候就需要使用脚本对每一个host接口进行扫描

1
2
#新建一个sh脚本文件
[root@localhost ~]# vi scan.sh

==以下为脚本内容==

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash

for HOST in `ls /sys/class/scsi_host/`;

do

{

echo "- - -" > /sys/class/scsi_host/$HOST/scan;

}&

done

wait

echo "等待所有进程执行完成"

执行脚本

1
2
3
4
5
6
#  给脚本执行权限
[root@localhost ~]# chmod +x scan.sh
[root@localhost ~]#
# 执行脚本
[root@localhost ~]# ./scan.sh
等待所有进程执行完成

等待脚本执行完成之后,就可以使用lsblk的命令查看,硬盘是否正常显示了。

磁盘分区操作

格式化并挂载分区

分区工具parted

parted是linux下大磁盘分区管理工具。
在上面我们介绍到,磁盘分区的类型一共有两个类型,MBR和GPT,鉴于GPT分区在最大支持磁盘容量和最大分区数量的优势,除非有明确限制,否则一律选择 GPT。

使用parted 对sdb硬盘进行分区
在这里插入图片描述
在这里插入图片描述
首先需要使用mklabel gpt的命令设置磁盘分区类型为gpt
在这里插入图片描述设置完分区类型之后,在parted交互中使用print free可以查看当前磁盘剩余可分区的大小在这里插入图片描述
那我们在分区的时候,也可以将一整个磁盘都划分为一个区域,使用如下命令:
mkpart 分区类型 [文件系统类型] 起始点 结束点

这里的起始点和结束点,可以复制上面使用print free查询出来的起始点和结束点,或者是写1M 100%也行。分区类型使用primary

文件类型的话,可以使用df -Th的命令查看其他分区是什么文件类型,跟他们一样即可

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
磁盘分区完成之后,退出我们在使用lsblk的命令就可以看到在sdb下面会多出来一个分区了
在这里插入图片描述

格式化文件系统类型

刚刚我们已经在sdb磁盘中创建了一个分区,如果我们要使用这个分区的话,还需要对这个分区进行格式化,格式化成我们需要的文件系统类型。

  • 使用df -Th的命令查看当前文件系统类型
    在这里插入图片描述

  • 使用 mkfs.ext4对分区进行格式化
    ==注意:这是的mkfs.后面的ext4指的是要格式化成什么样的文件类型,如果是xfs的话,就需要使用mkfs.xfs来进行格式化了。==
    在这里插入图片描述

  • 挂载使用
    将磁盘格式化完之后,我们就可以对他进行挂载使用了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建一个oracle 目录
[root@localhost ~]# mkdir /oracle
# 使用mount 命令将/dev/sdb1 挂载到/oracle
[root@localhost ~]# mount /dev/sdb1 /oracle/
# 使用df -h的命令查可以看到此时就多了一个sdb1的挂载点了。
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 1.2G 0 1.2G 0% /dev
tmpfs 1.2G 0 1.2G 0% /dev/shm
tmpfs 481M 7.0M 474M 2% /run
tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
/dev/mapper/openeuler-root 26G 2.2G 23G 9% /
tmpfs 1.2G 0 1.2G 0% /tmp
/dev/sda1 974M 87M 820M 10% /boot
/dev/sdb1 7.8G 24K 7.4G 1% /oracle
[root@localhost ~]#

删除分区

  • 取消挂载
    删除分区之前,需要对刚刚挂载的分区进行挂载使用df -h的命令可以查看刚刚的挂载点是挂载了/oracle的目录下,那在取消挂载时直接使用umount 挂载点的命令就可以取消挂载了
    在这里插入图片描述
  • 删除分区
    在这里插入图片描述
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
[root@localhost ~]# parted /dev/sdb
GNU Parted 3.4
使用 /dev/sdb
欢迎使用 GNU Parted!输入 'help' 来查看命令列表。
(parted) print free
型号:VMware, VMware Virtual S (scsi)
磁盘 /dev/sdb:8590MB
扇区大小 (逻辑/物理):512B/512B
分区表:gpt
磁盘标志:

编号 起始点 结束点 大小 文件系统 名称 标志
17.4kB 1049kB 1031kB 可用空间
1 1049kB 8589MB 8588MB ext4 primary
8589MB 8590MB 1032kB 可用空间

(parted) rm
分区编号? 1
(parted) print free
型号:VMware, VMware Virtual S (scsi)
磁盘 /dev/sdb:8590MB
扇区大小 (逻辑/物理):512B/512B
分区表:gpt
磁盘标志:

编号 起始点 结束点 大小 文件系统 名称 标志
17.4kB 8590MB 8590MB 可用空间

(parted)

一个磁盘分多个区

  • 使用parted 对磁盘进行分区
  • 创建第一个区
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
 # 使用parted进入/dev/sdb分区
[root@localhost ~]# parted /dev/sdb
GNU Parted 3.4
使用 /dev/sdb
欢迎使用 GNU Parted!输入 'help' 来查看命令列表。

#查看当前磁盘剩余可分区空间
(parted) print free
型号:VMware, VMware Virtual S (scsi)
磁盘 /dev/sdb:8590MB
扇区大小 (逻辑/物理):512B/512B
分区表:gpt
磁盘标志:

编号 起始点 结束点 大小 文件系统 名称 标志
17.4kB 8590MB 8590MB 可用空间

#使用mkpart创建第一个分区
(parted) mkpart primary ext4 1M 4G

#使用print显示分区表
(parted) print
型号:VMware, VMware Virtual S (scsi)
磁盘 /dev/sdb:8590MB
扇区大小 (逻辑/物理):512B/512B
分区表:gpt
磁盘标志:
#可以看到这就是刚刚创建的分区
编号 起始点 结束点 大小 文件系统 名称 标志
1 1049kB 4000MB 3999MB ext4 primary

#print free 可以查看当前磁盘分区的可以用空间
(parted) print free
型号:VMware, VMware Virtual S (scsi)
磁盘 /dev/sdb:8590MB
扇区大小 (逻辑/物理):512B/512B
分区表:gpt
磁盘标志:

编号 起始点 结束点 大小 文件系统 名称 标志
17.4kB 1049kB 1031kB 可用空间
1 1049kB 4000MB 3999MB ext4 primary
4000MB 8590MB 4590MB 可用空间

  • 创建第二个区
    ==注意:第一个分区是从1M到4G,那我的第二个分区应该是从4G开始分==
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
(parted) mkpart  primary ext4 4G  7G  
# 查看分区,现在已经有两个分区了
(parted) print
型号:VMware, VMware Virtual S (scsi)
磁盘 /dev/sdb:8590MB
扇区大小 (逻辑/物理):512B/512B
分区表:gpt
磁盘标志:

编号 起始点 结束点 大小 文件系统 名称 标志
1 1049kB 4000MB 3999MB ext4 primary
2 4000MB 7000MB 3000MB ext4 primary

(parted)
(parted) print free
型号:VMware, VMware Virtual S (scsi)
磁盘 /dev/sdb:8590MB
扇区大小 (逻辑/物理):512B/512B
分区表:gpt
磁盘标志:

编号 起始点 结束点 大小 文件系统 名称 标志
17.4kB 1049kB 1031kB 可用空间
1 1049kB 4000MB 3999MB ext4 primary
2 4000MB 7000MB 3000MB ext4 primary
7000MB 8590MB 1590MB 可用空间
  • 查看分区设备
    使用lsblk的命令查看当前sdb下面已经有两个分区了
1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 30G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 29G 0 part
├─openeuler-root 253:0 0 26G 0 lvm /
└─openeuler-swap 253:1 0 3G 0 lvm [SWAP]
sdb 8:16 0 8G 0 disk
├─sdb1 8:17 0 3.7G 0 part
└─sdb2 8:18 0 2.8G 0 part
sr0 11:0 1 3.4G 0 rom
[root@localhost ~]#
  • 对两个分区进行挂载使用
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
[root@localhost ~]# mkfs.ext4 /dev/sdb1
mke2fs 1.46.4 (18-Aug-2021)
创建含有 976384 个块(每块 4k)和 244320 个inode的文件系统
文件系统UUID:45c493b7-76fe-4149-9a3e-a951aec97b9f
超级块的备份存储于下列块:
32768, 98304, 163840, 229376, 294912, 819200, 884736

正在分配组表: 完成
正在写入inode表: 完成
创建日志(16384 个块)完成
写入超级块和文件系统账户统计信息: 已完成

[root@localhost ~]# mkfs.ext4 /dev/sdb2
mke2fs 1.46.4 (18-Aug-2021)
创建含有 732416 个块(每块 4k)和 183264 个inode的文件系统
文件系统UUID:1154a5ea-294a-4963-ae8f-a25e2cf22426
超级块的备份存储于下列块:
32768, 98304, 163840, 229376, 294912

正在分配组表: 完成
正在写入inode表: 完成
创建日志(16384 个块)完成
写入超级块和文件系统账户统计信息: 已完成

[root@localhost ~]# mkdir /sdb1-mout
[root@localhost ~]# mkdir /sdb2-mout
[root@localhost ~]# mount /dev/sdb1 /sdb1-mout/
[root@localhost ~]# mount /dev/sdb2 /sdb2-mout/
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 1.2G 0 1.2G 0% /dev
tmpfs 1.2G 0 1.2G 0% /dev/shm
tmpfs 481M 7.0M 474M 2% /run
tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
/dev/mapper/openeuler-root 26G 2.2G 23G 9% /
tmpfs 1.2G 0 1.2G 0% /tmp
/dev/sda1 974M 87M 820M 10% /boot
/dev/sdb1 3.6G 24K 3.4G 1% /sdb1-mout
/dev/sdb2 2.7G 24K 2.6G 1% /sdb2-mout

扩展:linux除了提供了parted的分区工具,还有一个图形化界面的分区工具cfdisk,有兴趣的小伙伴可以了解下
在这里插入图片描述
在这里插入图片描述

lvm磁盘管理

在这里插入图片描述
LVM(Logical Volume Manager,逻辑卷管理)是 Linux 系统中一种灵活的磁盘管理机制,它在物理磁盘和文件系统之间增加了一个逻辑层,使得磁盘空间的分配、扩展和缩减更加灵活

LVM 核心概念

从上图可以看出,LVM是由三个部分构成

  • PV(物理卷)
    物理磁盘或分区(如 /dev/sdb1)被初始化为 PV。
    是 LVM 的最底层存储单元。
    • VG(Volume Group,卷组)

    一个或多个 PV 组合成一个 VG。
    类似于一个“虚拟磁盘池”,可动态扩展。
    LV(Logical Volume,逻辑卷)
    从 VG 中划分出的逻辑存储空间。
    可在其上创建文件系统(如 ext4、xfs),挂载使用。

LVM 优势

  • 动态调整容量:无需停机即可扩展/缩减存储。
  • 快照功能:可创建 LV 快照用于备份。
  • 跨磁盘整合:多个磁盘合并为一个逻辑存储池。

常用查看命令

命令 说明
pvs 查看物理卷信息
vgs 查看卷组信息
lvs 查看逻辑卷信息
pvdisplay / vgdisplay / lvdisplay 详细显示对应组件的完整信息

大部分的系统在安装的时候,都会默认的创建一个或者多个LVM逻辑卷分区,默认是挂载到根目录下的
在这里插入图片描述

LVM逻辑卷扩容

如上图所示,在服务器运行过程中,当系统的opensuler-root的逻辑卷分区,空间满了的时候,这个时候需要考虑对逻辑卷分区进行扩容。
那如何判断当前lvm是否能够满足扩容的条件,通过第一张图我们可以看到,LVM逻辑卷的空间是来自于逻辑卷组(vg)的,也就是说,如果我需要对LVM(逻辑卷)进行扩容的话,那么需要保证逻辑卷组(vg)有剩余的空间。这个时候可以使用vgs查看逻辑卷组的信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost ~]# vgs

VG #PV #LV #SN Attr VSize VFree
openeuler 1 2 0 wz--n- <29.00g 0
#VG 逻辑卷组的名称
#PV 表示当前逻辑卷组中有一个物理卷
#LV 表示当前逻辑卷组是划分了两个LVM逻辑卷(可以使用后lvs的命令进行查看)
#VFree 当前逻辑卷组中的剩余空间
[root@localhost ~]#
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root openeuler -wi-ao---- 26.02g
swap openeuler -wi-ao---- 2.97g
#LV 逻辑卷的名称
# VG 当前逻辑卷是属于哪一个卷组
# LSize 当前逻辑卷的空间
[root@localhost ~]#

通过上述命令我们可以看到,当前openeur-root这个逻辑卷是属于openeuler这一个逻辑卷组,但是openeuler这个逻辑卷组的剩余空间因为为0了,所以是没有办法基于当前的逻辑卷组进行扩容的。
这个时候我们就需要想办法让openeuler这个逻辑卷组有剩余空间了,通过第一张图,我们发现逻辑卷组(VG)的空间是来自于物理卷(PV)的,逻辑卷组(VG)是有多个物理卷(PV)组成的,既然当前逻辑卷组的剩余空间为0,那我们就需要将物理卷加入到逻辑卷组中,这样的话逻辑卷组中就会剩余的空间了。而物理卷的空间是来自于物理磁盘的分区的。
在这里插入图片描述
如上图所示,我们现在已经有一个sbd的物理磁盘,并且对物理磁盘进行了分区sdb1,那我们对LVM逻辑卷在进行扩容的时候就需要以下几个步骤

  • 将分区sdb1创建为一个物理卷,可以使用pvs查看
    pvcreate [选项] 设备路径... 例如:pvcreate /dev/sdb1
  • 把物理卷添加到卷组中
    vgextend 卷组名 物理卷路径... 例如:vgextend myvg /dev/sdb1
  • 扩展逻辑卷
    lvextend [选项] -L [+大小] /dev/卷组名/逻辑卷名
    例如:
1
2
3
4
5
6
7
8
# 扩展到 20GB
lvextend -L 20G /dev/myvg/mylv

# 在当前基础上增加 5GB
lvextend -L +5G /dev/myvg/mylv

# 使用全部剩余空间
lvextend -l +100%FREE /dev/myvg/mylv

案例演示

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 30G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 29G 0 part
├─openeuler-root 253:0 0 26G 0 lvm /
└─openeuler-swap 253:1 0 3G 0 lvm [SWAP]
sdb 8:16 0 8G 0 disk
└─sdb1 8:17 0 4G 0 part
sr0 11:0 1 3.4G 0 rom
# 当前有一块sdb的磁盘并对他做了分区,是sdb1,需要将sdb1的空间扩容给openeuler-root这个逻辑卷
  • 将分区sdb1创建为一个物理卷
1
2
3
4
5
6
7
8
9
[root@localhost ~]# pvcreate  /dev/sdb1  
WARNING: ext4 signature detected on /dev/sdb1 at offset 1080. Wipe it? [y/n]: y
Wiping ext4 signature on /dev/sdb1.
Physical volume "/dev/sdb1" successfully created.
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 openeuler lvm2 a-- <29.00g 0
/dev/sdb1 lvm2 --- 4.00g 4.00g #通过pvs可以看到刚刚创建的物理卷的信息
[root@localhost ~]#
  • 把物理卷添加到卷组中
    因为我们需要对openeuler-root这个逻辑卷进行扩容,而openeuler-root逻辑卷是属于openeuler这个卷组的,所以需要将/dev/sdb1这个物理卷也添加到openeuler这个卷组,让他和openeuler-root属于同一卷组(资源池)
1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost ~]# vgextend  openeuler /dev/sdb1
Volume group "openeuler" successfully extended

#添加完之后,在使用pvs查看,/dev/sdb1这个pv已经添加到了openeuler这个VG。
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 openeuler lvm2 a-- <29.00g 0
/dev/sdb1 openeuler lvm2 a-- <4.00g <4.00g
#vgs查看,当前vg里面有两个PV,并且他现在已经有了大概4G的可用空间。
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
openeuler 2 2 0 wz--n- 32.99g <4.00g
  • 展openeuler-root逻辑卷
1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root openeuler -wi-ao---- 26.02g
swap openeuler -wi-ao---- 2.97g
[root@localhost ~]# lvextend -l +100%FREE /dev/openeuler/root
Size of logical volume openeuler/root changed from 26.02 GiB (6662 extents) to <30.02 GiB (7685 extents).
Logical volume openeuler/root successfully resized.
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root openeuler -wi-ao---- <30.02g
swap openeuler -wi-ao---- 2.97g\
  • 整理文件系统
    在扩展 LVM 逻辑卷(LV)之后,必须同步扩展文件系统,否则操作系统仍会认为磁盘空间未增加(df -h 显示的容量不会变化)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.2G 0 1.2G 0% /dev
tmpfs 1.2G 0 1.2G 0% /dev/shm
tmpfs 481M 7.0M 474M 2% /run
tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
/dev/mapper/openeuler-root 26G 2.2G 23G 9% /
tmpfs 1.2G 0 1.2G 0% /tmp
/dev/sda1 974M 87M 820M 10% /boot
[root@localhost ~]# resize2fs /dev/mapper/openeuler-root
resize2fs 1.46.4 (18-Aug-2021)
Filesystem at /dev/mapper/openeuler-root is mounted on /; on-line resizing required
old_desc_blocks = 4, new_desc_blocks = 4
The filesystem on /dev/mapper/openeuler-root is now 7869440 (4k) blocks long.

[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.2G 0 1.2G 0% /dev
tmpfs 1.2G 0 1.2G 0% /dev/shm
tmpfs 481M 7.0M 474M 2% /run
tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
/dev/mapper/openeuler-root 30G 2.2G 26G 8% /
tmpfs 1.2G 0 1.2G 0% /tmp
/dev/sda1 974M 87M 820M 10% /boot
  • 扩展后调整文件系统的命令(按类型)
    ext2 / ext3 / ext4 文件系统
    使用 resize2fs 命令:resize2fs /dev/卷组名/逻辑卷名 例如:resize2fs /dev/myvg/mylv
    XFS 文件系统
    使用 xfs_growfs 命令:xfs_growfs /挂载点 例如:xfs_growfs /mnt/data

创建新的卷组(VG)和逻辑卷

在安装好的系统上,默认只有一个卷组(VG),可以通过vgs的命令进行查看
在这里插入图片描述
在日常工作中往往有这样的需求,需要创建一个新的卷组(VG),然后在新的卷组上在创建一个新的逻辑卷(LVM),再将新的逻辑卷进行挂载,部署相关的服务。
需求:在服务器上创建一个新的卷组(VG),命名为web,在web这个卷组上创建一个新的逻辑卷(LVM),命名为lnmp。
分析:因为卷组(VG)是由物理卷(PV)构成的,所以我们在创建卷组的时候,至少要在卷组中加入一个物理卷(PV)。
使用PVS查看是否有可分配的物理卷,当前系统一共有两个物理卷,但是这两物理卷都属于openeuler的卷组。没有空闲的。所以我们就需要先创建一个物理卷(PV)。在这里插入图片描述使用lsblk查看系统是否有多余的分区,可用作创建为物理卷(PV),当前有一块sdb2的分区是没有使用的,可以将sdb2创建为一个新的物理卷(PV)。
在这里插入图片描述

  • 创建物理卷
1
2
3
4
5
6
7
8
9
[root@localhost ~]# pvcreate  /dev/sdb2
Physical volume "/dev/sdb2" successfully created.
#使用pvs在查看这个时候就有了一个空闲的物理卷,有了物理卷之后就可以创建卷组
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 openeuler lvm2 a-- <29.00g 0
/dev/sdb1 openeuler lvm2 a-- <4.00g 0
/dev/sdb2 lvm2 --- <4.00g <4.00g
[root@localhost ~]#
  • 创建卷组
    命令:vgcreate [选项] 卷组名 物理卷路径... 例如:vgcreate myvg /dev/sdb1
1
2
3
4
5
6
7
[root@localhost ~]# vgcreate  web /dev/sdb2
Volume group "web" successfully created
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
openeuler 2 2 0 wz--n- 32.99g 0
web 1 0 0 wz--n- <4.00g <4.00g
[root@localhost ~]#
  • 创建逻辑卷
    命令:lvcreate [选项] -L 大小 -n 逻辑卷名 卷组名
1
2
3
4
5
6
7
8
9
[root@localhost ~]# lvcreate -L 3G -n lnmp web
Logical volume "lnmp" created.
#使用lvs可以查看创建了一个名为lnmp的逻辑卷属于web卷组,大小为3G。
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root openeuler -wi-ao---- <30.02g
swap openeuler -wi-ao---- 2.97g
lnmp web -wi-a----- 3.00g
[root@localhost ~]#
  • 格式化卷组
    如果要对逻辑卷进行使用的话,需要对他进行格式化,并挂载
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
[root@localhost ~]# mkfs.ext4  /dev/mapper/web-lnmp
mke2fs 1.46.4 (18-Aug-2021)
创建含有 786432 个块(每块 4k)和 196608 个inode的文件系统
文件系统UUID:1688753e-8f6d-4dd7-804f-ec030a7d026d
超级块的备份存储于下列块:
32768, 98304, 163840, 229376, 294912

正在分配组表: 完成
正在写入inode表: 完成
创建日志(16384 个块)完成
写入超级块和文件系统账户统计信息: 已完成

[root@localhost ~]# mkdir /web
[root@localhost ~]# mount /dev/mapper/web-lnmp /web/
# 使用df -h可以看到新挂载的逻辑卷
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 1.2G 0 1.2G 0% /dev
tmpfs 1.2G 0 1.2G 0% /dev/shm
tmpfs 481M 7.0M 474M 2% /run
tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
/dev/mapper/openeuler-root 30G 2.2G 26G 8% /
tmpfs 1.2G 0 1.2G 0% /tmp
/dev/sda1 974M 87M 820M 10% /boot
/dev/mapper/web-lnmp 2.9G 24K 2.8G 1% /web

删除逻辑卷

删除逻辑卷之前需要查看一下该逻辑卷是否被挂载,刚刚我们创建一个名为lnmp的逻辑卷,现在需要对他删除,那就需要先试用df -h的命令查看一下是否挂载,如果是挂载状态的话,需要全取消挂载,才能进行删除的操作。具体步骤如下:

  • 取消挂载
    命令:umount 挂载点 或 设备路径
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 1.2G 0 1.2G 0% /dev
tmpfs 1.2G 0 1.2G 0% /dev/shm
tmpfs 481M 7.0M 474M 2% /run
tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
/dev/mapper/openeuler-root 30G 2.2G 26G 8% /
tmpfs 1.2G 0 1.2G 0% /tmp
/dev/sda1 974M 87M 820M 10% /boot
/dev/mapper/web-lnmp 2.9G 24K 2.8G 1% /web
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# umount /web
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 1.2G 0 1.2G 0% /dev
tmpfs 1.2G 0 1.2G 0% /dev/shm
tmpfs 481M 7.0M 474M 2% /run
tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
/dev/mapper/openeuler-root 30G 2.2G 26G 8% /
tmpfs 1.2G 0 1.2G 0% /tmp
/dev/sda1 974M 87M 820M 10% /boot
  • 删除LVM逻辑卷
    命令:lvremove /dev/卷组名/逻辑卷名 例如:lvremove /dev/myvg/mylv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root openeuler -wi-ao---- <30.02g
swap openeuler -wi-ao---- 2.97g
lnmp web -wi-a----- 3.00g
[root@localhost ~]#
# 使用-f的选项,表示强制删除
[root@localhost ~]# lvremove -f /dev/web/lnmp
Logical volume "lnmp" successfully removed.
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root openeuler -wi-ao---- <30.02g
swap openeuler -wi-ao---- 2.97g
[root@localhost ~]#
  • 删除卷组
    命令:vgremove 卷组名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
openeuler 2 2 0 wz--n- 32.99g 0
web 1 0 0 wz--n- <4.00g <4.00g
[root@localhost ~]# vgre
vgreduce vgremove vgrename
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
openeuler 2 2 0 wz--n- 32.99g 0
web 1 0 0 wz--n- <4.00g <4.00g
[root@localhost ~]# vgremove web
Volume group "web" successfully removed
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
openeuler 2 2 0 wz--n- 32.99g 0
  • 删除物理卷
    命令:pvremove 物理卷设备路径
1
2
3
4
5
6
7
8
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 openeuler lvm2 a-- <29.00g 0
/dev/sdb1 openeuler lvm2 a-- <4.00g 0
/dev/sdb2 lvm2 --- <4.00g <4.00g
[root@localhost ~]#
[root@localhost ~]# pvremove /dev/sdb2
Labels on physical volume "/dev/sdb2" successfully wiped.
  • 删除分区 (可选)
    删除分区的话可以使用parted工具进行删除,如下所示,系统的sdb中有个sdb2的分区是空闲状态,使用parted进入到sdb磁盘中,将sdb2的分区删除。
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
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 30G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 29G 0 part
├─openeuler-root 253:0 0 30G 0 lvm /
└─openeuler-swap 253:1 0 3G 0 lvm [SWAP]
sdb 8:16 0 8G 0 disk
├─sdb1 8:17 0 4G 0 part
│ └─openeuler-root 253:0 0 30G 0 lvm /
└─sdb2 8:18 0 4G 0 part
sr0 11:0 1 3.4G 0 rom
[root@localhost ~]# parted /dev/sdb
GNU Parted 3.4
使用 /dev/sdb
欢迎使用 GNU Parted!输入 'help' 来查看命令列表。
(parted) p # 显示分区表、可用设备、剩余空间、所有分区或特殊分区
型号:VMware, VMware Virtual S (scsi)
磁盘 /dev/sdb:8590MB
扇区大小 (逻辑/物理):512B/512B
分区表:gpt
磁盘标志:

编号 起始点 结束点 大小 文件系统 名称 标志
1 1049kB 4296MB 4295MB
2 4296MB 8590MB 4294MB primary

(parted) rm #删除分区
分区编号? 2 #分区的编号
(parted) q
信息: 你可能需要 /etc/fstab。

[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 30G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 29G 0 part
├─openeuler-root 253:0 0 30G 0 lvm /
└─openeuler-swap 253:1 0 3G 0 lvm [SWAP]
sdb 8:16 0 8G 0 disk
└─sdb1 8:17 0 4G 0 part
└─openeuler-root 253:0 0 30G 0 lvm /
sr0 11:0 1 3.4G 0 rom

开机自动挂载

当前系统中有一个sdb2的分区,我将这个分区挂载到了 /web目录下面。因为这个分区是在系统安装之后创建的,并不会自动挂载,也就是说当系统重启之后,这个挂载就被取消掉,那该如何实现它的开机自动挂载呢。
在这里插入图片描述
在 Linux 中,实现开机自动挂载文件系统(如磁盘分区、LVM 逻辑卷、网络存储等)的标准方法是:编辑 /etc/fstab 文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost web]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Wed Jan 7 22:40:20 2026
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/openeuler-root / ext4 defaults 1 1
UUID=ca6f7249-de46-462a-9b7e-39fb6f3c643e /boot ext4 defaults 1 2
/dev/mapper/openeuler-swap none swap defaults 0 0

在编辑/etc/fstab文件的时候,在第一列,也就是设备标识那一列,推荐填写设备的UUID,如果填写设备名的话,可能会出现,系统断电重启之后分区或者是磁盘的设备名变了,从以前的sdb2,变成了sdb3,都有可能,这个时候系统在重启的时候就会导致找不到挂载点而重启失败。UUID是不会变的,所以这里推荐优先填写UUID。

  • 查看设备的UUID
    命令:blkidlsblk -f
    在这里插入图片描述
  • 编辑/etc/fstab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#
# /etc/fstab
# Created by anaconda on Wed Jan 7 22:40:20 2026
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/openeuler-root / ext4 defaults 1 1
UUID=ca6f7249-de46-462a-9b7e-39fb6f3c643e /boot ext4 defaults 1 2
/dev/mapper/openeuler-swap none swap defaults 0 0
UUID=bc416725-ee6c-45c6-9a58-053fad5f0520 /web ext4 defaults 0 0
# 设备标识:UUID或是设备名 #挂载点 #文件系统 #挂载选项使用默认即可 #是否启用备份,一般为0,不启用,第二个0表示开机不检查文件系统
  • 测试配置文件编写是否正常
    使用mount -a 的命令会加载fstab文件,如果配置文件有问题的话,会报错。无输出,说明配置文件修改正确。
    在这里插入图片描述

swap 交换分区

在 Linux 中,swap(交换分区/交换文件) 是一种虚拟内存机制,当物理内存(RAM)不足时,系统会将部分不活跃的内存页移到 swap 空间,以防止崩溃。
查看swap分区大小:
命令:free -h
在这里插入图片描述

扩大swap交换分区

使用分区的方式扩大交换分区

使用分区的方式扩大swap分区的话,需要系统上有多余的磁盘分区。可以使用lsblk的命令进行查看。
在这里插入图片描述
当前系统中是有一个sdb2的4个G空闲分区的,那么就可以将当前分区创建为swap分区步骤如下

  • 格式化为 swap
    命令:mkswap 设备名
1
2
3
4
[root@localhost ~]# mkswap  /dev/sdb2
mkswap: /dev/sdb2:警告,将擦除旧的 ext4 签名。
正在设置交换空间版本 1,大小 = 4 GiB (4293894144 个字节)
无标签,UUID=8e9f6bec-7748-4371-b2ad-edd60705687e
  • 启用交换分区
    swap分区启用前,swap的分区大小为3G,启用之后swap分区大小就为7G了。
1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# free -h
total used free shared buff/cache available
Mem: 2.3Gi 212Mi 1.7Gi 6.0Mi 423Mi 1.8Gi
Swap: 3.0Gi 0B 3.0Gi
[root@localhost ~]#
[root@localhost ~]# swapon /dev/sdb2
[root@localhost ~]#
[root@localhost ~]# free -h
total used free shared buff/cache available
Mem: 2.3Gi 215Mi 1.7Gi 6.0Mi 423Mi 1.8Gi
Swap: 7.0Gi 0B 7.0Gi
  • 查看当前系统的swap分区
1
2
3
4
5
# 查看当前swap分区
[root@localhost ~]# cat /proc/swaps
Filename Type Size Used Priority
/dev/dm-1 partition 3117052 0 -2
/dev/sdb2 partition 4193256 0 -3

使用镜像文件的方式扩大swap交换分区

如果系统上面没有多余的分区的话,可以使用创建镜像文件的方式扩大swap交换分区

  • 创建稀疏文件
    dd基于块的复制,跟cp不一样,cp是基于文件的,基于块的比基于文件的更加彻底,它具有格式化硬盘的特点,
    raw 镜像格式裸设备,还有qcow2 支持快照,raw不支持快照。bs 一次读入读出的大小,count 是次数。
    命令:dd if=/dev/zero of=/home/swap.raw bs=2048MB count=1
1
2
3
4
5
6
[root@localhost ~]# dd if=/dev/zero of=/home/swap.raw bs=2048MB count=1
记录了1+0 的读入
记录了1+0 的写出
2048000000字节(2.0 GB,1.9 GiB)已复制,24.1051 s,85.0 MB/s
[root@localhost ~]# du -sh /home/swap.raw
2.0G /home/swap.raw
  • 将文件格式化成swap类型
1
2
3
4
[root@localhost ~]# mkswap  /home/swap.raw
mkswap: /home/swap.raw: insecure permissions 0644, fix with: chmod 0600 /home/swap.raw
正在设置交换空间版本 1,大小 = 1.9 GiB (2047995904 个字节)
无标签,UUID=90c39efd-dfa9-4607-9796-ec8dbc50d2ba
  • 启用交换分区
1
2
3
4
5
6
7
8
9
10
root@localhost ~]# swapon /home/swap.raw
swapon: /home/swap.raw:不安全的权限 0644,建议使用 0600
[root@localhost ~]# chmod 0600 /home/swap.raw
[root@localhost ~]# ll /home/swap.raw
-rw------- 1 root root 2.0G 19 20:15 /home/swap.raw
[root@localhost ~]#
[root@localhost ~]# free -h
total used free shared buff/cache available
Mem: 2.3Gi 205Mi 2.0Gi 4.0Mi 106Mi 1.9Gi
Swap: 8.9Gi 15Mi 8.9Gi
  • 关闭swap分区的命令
    如果交换机分区不想使用的话,也可以对他关闭
    swapoff 设备名swapoff -a 是关闭所有swap分区
1
2
3
4
5
6
7
8
9
10
[root@localhost ~]#
[root@localhost ~]# swapoff /dev/sdb2
[root@localhost ~]# free -h
total used free shared buff/cache available
Mem: 2.3Gi 202Mi 2.0Gi 4.0Mi 109Mi 1.9Gi
Swap: 4.9Gi 14Mi 4.9Gi
[root@localhost ~]# cat /proc/swaps
Filename Type Size Used Priority
/dev/dm-1 partition 3117052 14448 -2
/home/swap.raw file 1999996 0 -3
  • 设置开机自动启用
    如果要让该分区永久生效,可以将其写入到/etc/fstab文件中
    在这里插入图片描述
    编写完之后,mount -a检查即可

vm.swappiness

vm.swappiness 是 Linux 内核的一个 可调参数,用于控制系统 使用 swap(交换空间)的倾向程度。它的值直接影响内存管理策略,对系统性能和稳定性有重要影响。

值的含义:

行为
0 尽量不使用 swap
仅在内存完全耗尽(OOM 临界点)时才用 swap
⚠️ 注意:不是完全禁用 swap!
1~10 极低倾向使用 swap
适合数据库、高性能服务器(如 MySQL、Redis)
60(默认) 平衡策略,桌面系统常用
100 积极使用 swap
即使还有大量空闲 RAM,也会将不活跃页换出
  • 如何查看当前值
1
2
3
4
5
6
7
8
[root@localhost ~]# cat /proc/sys
sys/ sysrq-trigger sysvipc/
[root@localhost ~]# cat /proc/sys/vm/swappiness
30
[root@localhost ~]# sysctl vm.swapiness
sysctl: cannot stat /proc/sys/vm/swapiness: No such file or directory
[root@localhost ~]# sysctl vm.swappiness
vm.swappiness = 30
  • 修改值
    临时生效:sysctl vm.swappiness=10
    永久生效:
1
2
3
4
5
6
7
8
# 编辑主配置
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf

# 或创建独立配置文件(推荐)
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf

# 重载配置
sudo sysctl --system

lvm快照管理

LVM快照是 LVM 提供的一项强大功能,它可以在不中断服务的情况下,对逻辑卷(LV)创建一个时间点的只读或可写副本

LVM 快照的重要限制

限制 说明
快照大小有限 快照空间用于存储原 LV 的变更数据。若原 LV 写入量超过快照容量,快照会失效(”Invalid” 状态)
性能影响 写入原 LV 时需执行 CoW(Copy-on-Write),可能降低 I/O 性能
不跨 VG 快照必须与原 LV 在同一卷组(VG)
非增量备份 每个快照独立,不能像 ZFS/Btrfs 那样做增量快照链
XFS/ext4 支持良好 但某些文件系统(如 Btrfs)有自己的快照机制,无需 LVM

需求:
当前系统中,有一个data目录是存放数据的,data目录是使用LVM方式进行挂载的。当前需要对这个data目录进行快照。
在这里插入图片描述
分析:对data目录进行快照,首先需要看下data目录的文件系统是属于哪一个lvm逻辑卷的,其次就是需要检查,data目录那个lvm逻辑卷所在的卷组是否有足够的空间,进行快照备份。因为你对lvm逻辑卷进行快照的备份快照,他也是保存在该逻辑卷的卷组中的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 1.2G 0 1.2G 0% /dev
tmpfs 1.2G 0 1.2G 0% /dev/shm
tmpfs 481M 7.0M 474M 2% /run
tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
/dev/mapper/openeuler-root 30G 4.1G 24G 15% /
tmpfs 1.2G 0 1.2G 0% /tmp
/dev/sda1 974M 87M 820M 10% /boot
/dev/mapper/data-db--data 2.0G 28K 1.8G 1% /data
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
db-data data -wi-ao---- 2.00g
root openeuler -wi-ao---- <30.02g
swap openeuler -wi-ao---- 2.97g
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
data 1 1 0 wz--n- <6.52g <4.52g
openeuler 2 2 0 wz--n- 32.99g 0
[root@localhost ~]#

以上命令可以看到,/data这个目录是挂载到/dev/mapper/data-db–data这个lvm卷下的,而/dev/mapper/data-db–data这个lvm卷是属于date这个卷组的,当前这个data的卷组剩余空间为4.5G。

  • 创建快照
    为/dev/mapper/data-db–data 创建一个1G的快照。
    命令:lvcreate -L 1G -s -n mysql_snap /dev/data_vg/mysql_lv

参数说明
-L 1G:快照卷大小(根据预计变更量设定)
-s:表示创建快照(snapshot)
-n snap_name:快照名称

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# lvcreate  -L 1G -s -n data_snap /dev/mapper/data-db--data
Logical volume "data_snap" created.
#快照创建完成之后,可以通过lvs的命令查看,快照是否创建成功。可以看到他已经创建了一个名为data_snap的备份快照卷
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
data_snap data swi-a-s--- 1.00g db-data 0.01
db-data data owi-aos--- 2.00g
root openeuler -wi-ao---- <30.02g
swap openeuler -wi-ao---- 2.97g
[root@localhost ~]#
  • 恢复快照
    在恢复快照之前,我们可以在当前的/data目录中创建一个文件,并写入文本。验证一下,恢复快照后,是否会恢复到原来的状态。
    当前目录的文件。在这里插入图片描述
    再创建一个222.txt的文件,并写入aaa
    在这里插入图片描述
    进行恢复快照:
    注意:在恢复快照之前,需要将原卷进行卸载,卸载了之后才能恢复
    命令:lvconvert --merge lvm快照的路径
1
2
3
4
5
6
7
8
9
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
data_snap data swi-a-s--- 1.00g db-data 0.01
db-data data owi-a-s--- 2.00g
root openeuler -wi-ao---- <30.02g
swap openeuler -wi-ao---- 2.97g
[root@localhost ~]# lvconvert --merge /dev/data/data_snap
Merging of volume data/data_snap started.
data/db-data: Merged: 100.00%
  • 验证
    将原卷挂载到data目录,然后查看data目录中的文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@localhost ~]# mount /dev/data/db-data  /data
[root@localhost ~]# cd /data/
[root@localhost data]# ls
10.db 1.db 1.txt 2.db 3.db 4.db 5.db 6.db 7.db 8.db 9.db lost+found
[root@localhost data]#
[root@localhost data]# ll
总用量 20K
-rw-r--r-- 1 root root 0 110 19:28 10.db
-rw-r--r-- 1 root root 0 110 19:28 1.db
-rw-r--r-- 1 root root 15 110 19:28 1.txt
-rw-r--r-- 1 root root 0 110 19:28 2.db
-rw-r--r-- 1 root root 0 110 19:28 3.db
-rw-r--r-- 1 root root 0 110 19:28 4.db
-rw-r--r-- 1 root root 0 110 19:28 5.db
-rw-r--r-- 1 root root 0 110 19:28 6.db
-rw-r--r-- 1 root root 0 110 19:28 7.db
-rw-r--r-- 1 root root 0 110 19:28 8.db
-rw-r--r-- 1 root root 0 110 19:28 9.db
drwx------ 2 root root 16K 110 19:16 lost+found

可以看到 ,我在创建快照之后的创建的2.txt的文件,已经没有了,说明快照恢复回去了。

  • 快照在恢复之后就会自动删除,使用lvs的命令查看,快照已经没有了。
    在这里插入图片描述
    快照创建完成之后,能够进行恢复,也可以当做一个独立的文件系统使用,也就是可以将创建的快照单独挂载到一个目录进行查看。
1
2
3
4
5
6
7
8
9
10
[root@localhost data]# lvcreate  -L 1G -s -n data_snap /dev/mapper/data-db--data
Logical volume "data_snap" created.
[root@localhost data]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
data_snap data swi-a-s--- 1.00g db-data 0.01
db-data data owi-aos--- 2.00g
root openeuler -wi-ao---- <30.02g
swap openeuler -wi-ao---- 2.97g
[root@localhost data]# mkdir /data_snap
[root@localhost data]# mount /dev/data/data_snap /data_snap/

如上操作,对/data目录挂载的lvm创建了一个快照,然后又创建了一个data_snap的目录,将快照挂载到了/data_snap的目录中。对比一下/data目录和/data_snap目录他们的文件是一样的。这样一来,如果要恢复快照的话,也可以选择将快照挂载的文件,直接复制覆盖到原目录中,相对会安全一些
在这里插入图片描述

  • 删除快照
    命令:lvremove 快照名
    注意:在使用,或者挂载的快照无法删除,删除之前需要先卸载快照
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
data_snap data swi-aos--- 1.00g db-data 0.01
db-data data owi-aos--- 2.00g
root openeuler -wi-ao---- <30.02g
swap openeuler -wi-ao---- 2.97g
[root@localhost ~]#
[root@localhost ~]# umount /data_snap/
[root@localhost ~]# lvremove /dev/data/data_snap
Do you really want to remove active logical volume data/data_snap? [y/n]: y
Logical volume "data_snap" successfully removed.
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
db-data data -wi-ao---- 2.00g
root openeuler -wi-ao---- <30.02g
swap openeuler -wi-ao---- 2.97g
[root@localhost ~]#

Linux磁盘管理和LVM详解
https://www.situgou.top/2026/01/18/Linux----磁盘管理-磁盘分区&LVM/
作者
xqj_Blog
发布于
2026年1月18日
许可协议