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 ~] NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8 :0 0 30 G 0 disk ├─sda1 8 :1 0 1 G 0 part /boot └─sda2 8 :2 0 29 G 0 part ├─openeuler-root 253 :0 0 26 G 0 lvm / └─openeuler-swap 253 :1 0 3 G 0 lvm [SWAP ] sr0 11 :0 1 3.4 G 0 rom
下图标红的两个分区,是在安装操作系统的时候,系统自动分好的。df -h:查看挂载与磁盘大小
1 2 3 4 5 6 7 8 9 10 [root @localhost ~] Filesystem Size Used Avail Use% Mounted on devtmpfs 1.2 G 0 1.2 G 0 % /dev tmpfs 1.2 G 0 1.2 G 0 % /dev/shm tmpfs 481 M 13 M 468 M 3 % /run tmpfs 4.0 M 0 4.0 M 0 % /sys/fs/cgroup /dev/mapper/openeuler-root 26 G 2.2 G 23 G 9 % / tmpfs 1.2 G 0 1.2 G 0 % /tmp /dev/sda1 974 M 87 M 820 M 10 % /boot
新增硬盘 SCSI 总线重扫 当使用过程中,当服务器的磁盘空间不够用了,就需要采购新的磁盘插入到服务器中,但是只是把磁盘插入到服务器中,服务器是无法识别到硬盘的,需要手动触发 SCSI 总线重扫,我这里使用vmware虚拟机 演示一下服务器硬盘添加的操作。 这是添加硬盘前,可以看到只有一块,sda的磁盘,接下来进行添加磁盘的操作
1 2 3 4 5 6 7 8 [root @localhost ~] NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8 :0 0 30 G 0 disk ├─sda1 8 :1 0 1 G 0 part /boot └─sda2 8 :2 0 29 G 0 part ├─openeuler-root 253 :0 0 26 G 0 lvm / └─openeuler-swap 253 :1 0 3 G 0 lvm [SWAP ] sr0 11 :0 1 3.4 G 0 rom
在虚拟机设置中,点击添加
选择添加硬盘并进行下一步 硬盘添加完毕之后,我们在使用lsbak的命令查看是否有新的硬盘,可以看到磁盘添加完毕之后,还是无法识别到新硬盘 这个时候就需要通过命令来扫描服务器硬盘接口让操作系统来识别我们添加的新硬盘。命令如下:echo "- - -" >> /sys/class/scsi_host/host0/scan
1 2 3 4 5 6 7 [root @localhost ~] host0/ host1/ host2/ [root @localhost ~] [root @localhost ~] [root @localhost ~]
扫描完之后再使用lsblk 的命令在进行查看,是否一块sdb的硬盘
新增硬盘并使用脚本进行SCSI 总线重扫 假设在实际环境中,服务器的host接口是有几十个且,我们也不知道硬盘实际添加的是哪一个插槽,这个时候如果一条命令,一条命令的执行的话,比较影响效率,所以我们这个时候就需要使用脚本对每一个host接口进行扫描
==以下为脚本内容==
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 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 ~] [root @localhost ~] [root @localhost ~] 等待所有进程执行完成
等待脚本执行完成之后,就可以使用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磁盘中创建了一个分区,如果我们要使用这个分区的话,还需要对这个分区进行格式化,格式化成我们需要的文件系统类型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root @localhost ~] [root @localhost ~] [root @localhost ~] 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 1.2 G 0 1.2 G 0 % /dev tmpfs 1.2 G 0 1.2 G 0 % /dev/shm tmpfs 481 M 7.0 M 474 M 2 % /run tmpfs 4.0 M 0 4.0 M 0 % /sys/fs/cgroup /dev/mapper/openeuler-root 26 G 2.2 G 23 G 9 % / tmpfs 1.2 G 0 1.2 G 0 % /tmp /dev/sda1 974 M 87 M 820 M 10 % /boot /dev/sdb1 7.8 G 24 K 7.4 G 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 ~] GNU Parted 3.4 使用 /dev/sdb 欢迎使用 GNU Parted!输入 'help' 来查看命令列表。 (parted) print free 型号:VMware, VMware Virtual S (scsi) 磁盘 /dev/sdb:8590 MB 扇区大小 (逻辑/物理):512 B/512 B 分区表:gpt 磁盘标志: 编号 起始点 结束点 大小 文件系统 名称 标志 17.4 kB 1049 kB 1031 kB 可用空间 1 1049 kB 8589 MB 8588 MB ext4 primary 8589 MB 8590 MB 1032 kB 可用空间 (parted) rm 分区编号? 1 (parted) print free 型号:VMware, VMware Virtual S (scsi) 磁盘 /dev/sdb:8590 MB 扇区大小 (逻辑/物理):512 B/512 B 分区表:gpt 磁盘标志: 编号 起始点 结束点 大小 文件系统 名称 标志 17.4 kB 8590 MB 8590 MB 可用空间 (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 [root @localhost ~] GNU Parted 3.4 使用 /dev/sdb 欢迎使用 GNU Parted!输入 'help' 来查看命令列表。 (parted) print free 型号:VMware, VMware Virtual S (scsi) 磁盘 /dev/sdb:8590 MB 扇区大小 (逻辑/物理):512 B/512 B 分区表:gpt 磁盘标志: 编号 起始点 结束点 大小 文件系统 名称 标志 17.4 kB 8590 MB 8590 MB 可用空间 (parted) mkpart primary ext4 1 M 4 G (parted) print 型号:VMware, VMware Virtual S (scsi) 磁盘 /dev/sdb:8590 MB 扇区大小 (逻辑/物理):512 B/512 B 分区表:gpt 磁盘标志: 编号 起始点 结束点 大小 文件系统 名称 标志 1 1049 kB 4000 MB 3999 MB ext4 primary (parted) print free 型号:VMware, VMware Virtual S (scsi) 磁盘 /dev/sdb:8590 MB 扇区大小 (逻辑/物理):512 B/512 B 分区表:gpt 磁盘标志: 编号 起始点 结束点 大小 文件系统 名称 标志 17.4 kB 1049 kB 1031 kB 可用空间 1 1049 kB 4000 MB 3999 MB ext4 primary 4000 MB 8590 MB 4590 MB 可用空间
创建第二个区 ==注意:第一个分区是从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 4 G 7 G (parted) print 型号:VMware, VMware Virtual S (scsi) 磁盘 /dev/sdb:8590 MB 扇区大小 (逻辑/物理):512 B/512 B 分区表:gpt 磁盘标志: 编号 起始点 结束点 大小 文件系统 名称 标志 1 1049 kB 4000 MB 3999 MB ext4 primary 2 4000 MB 7000 MB 3000 MB ext4 primary (parted) (parted) print free 型号:VMware, VMware Virtual S (scsi) 磁盘 /dev/sdb:8590 MB 扇区大小 (逻辑/物理):512 B/512 B 分区表:gpt 磁盘标志: 编号 起始点 结束点 大小 文件系统 名称 标志 17.4 kB 1049 kB 1031 kB 可用空间 1 1049 kB 4000 MB 3999 MB ext4 primary 2 4000 MB 7000 MB 3000 MB ext4 primary 7000 MB 8590 MB 1590 MB 可用空间
查看分区设备使用lsblk的命令查看当前sdb下面已经有两个分区了
1 2 3 4 5 6 7 8 9 10 11 12 [root @localhost ~] NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8 :0 0 30 G 0 disk ├─sda1 8 :1 0 1 G 0 part /boot └─sda2 8 :2 0 29 G 0 part ├─openeuler-root 253 :0 0 26 G 0 lvm / └─openeuler-swap 253 :1 0 3 G 0 lvm [SWAP ] sdb 8 :16 0 8 G 0 disk ├─sdb1 8 :17 0 3.7 G 0 part └─sdb2 8 :18 0 2.8 G 0 part sr0 11 :0 1 3.4 G 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 ~] mke2fs 1.46 .4 (18 -Aug-2021 ) 创建含有 976384 个块(每块 4 k)和 244320 个inode的文件系统 文件系统UUID:45 c493b7-76fe-4149-9a3e-a951aec97b9f 超级块的备份存储于下列块: 32768 , 98304 , 163840 , 229376 , 294912 , 819200 , 884736 正在分配组表: 完成 正在写入inode表: 完成 创建日志(16384 个块)完成 写入超级块和文件系统账户统计信息: 已完成 [root @localhost ~] mke2fs 1.46 .4 (18 -Aug-2021 ) 创建含有 732416 个块(每块 4 k)和 183264 个inode的文件系统 文件系统UUID:1154 a5ea-294a-4963-ae8f-a25e2cf22426 超级块的备份存储于下列块: 32768 , 98304 , 163840 , 229376 , 294912 正在分配组表: 完成 正在写入inode表: 完成 创建日志(16384 个块)完成 写入超级块和文件系统账户统计信息: 已完成 [root @localhost ~] [root @localhost ~] [root @localhost ~] [root @localhost ~] [root @localhost ~] 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 1.2 G 0 1.2 G 0 % /dev tmpfs 1.2 G 0 1.2 G 0 % /dev/shm tmpfs 481 M 7.0 M 474 M 2 % /run tmpfs 4.0 M 0 4.0 M 0 % /sys/fs/cgroup /dev/mapper/openeuler-root 26 G 2.2 G 23 G 9 % / tmpfs 1.2 G 0 1.2 G 0 % /tmp /dev/sda1 974 M 87 M 820 M 10 % /boot /dev/sdb1 3.6 G 24 K 3.4 G 1 % /sdb1-mout /dev/sdb2 2.7 G 24 K 2.6 G 1 % /sdb2-mout
扩展:linux除了提供了parted的分区工具,还有一个图形化界面的分区工具cfdisk,有兴趣的小伙伴可以了解下
lvm磁盘管理 LVM(Logical Volume Manager,逻辑卷管理)是 Linux 系统中一种灵活的磁盘管理机制,它在物理磁盘和文件系统之间增加了一个逻辑层,使得磁盘空间的分配、扩展和缩减更加灵活
LVM 核心概念 从上图可以看出,LVM是由三个部分构成
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 ~] VG openeuler 1 2 0 wz--n- <29.00 g 0 [root @localhost ~] [root @localhost ~] LV VG Attr LSize Pool Origin Data % Meta% Move Log Cpy%Sync Convert root openeuler -wi-ao---- 26.02 g swap openeuler -wi-ao---- 2.97 g [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 lvextend -L 20 G /dev/myvg/mylv lvextend -L +5 G /dev/myvg/mylv lvextend -l +100 %FREE /dev/myvg/mylv
案例演示 1 2 3 4 5 6 7 8 9 10 11 [root @localhost ~] NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8 :0 0 30 G 0 disk ├─sda1 8 :1 0 1 G 0 part /boot └─sda2 8 :2 0 29 G 0 part ├─openeuler-root 253 :0 0 26 G 0 lvm / └─openeuler-swap 253 :1 0 3 G 0 lvm [SWAP ] sdb 8 :16 0 8 G 0 disk └─sdb1 8 :17 0 4 G 0 part sr0 11 :0 1 3.4 G 0 rom
1 2 3 4 5 6 7 8 9 [root @localhost ~] 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 ~] PV VG Fmt Attr PSize PFree /dev/sda2 openeuler lvm2 a-- <29.00 g 0 /dev/sdb1 lvm2 --- 4.00 g 4.00 g [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 ~] Volume group "openeuler" successfully extended [root @localhost ~] PV VG Fmt Attr PSize PFree /dev/sda2 openeuler lvm2 a-- <29.00 g 0 /dev/sdb1 openeuler lvm2 a-- <4.00 g <4.00 g [root @localhost ~] VG openeuler 2 2 0 wz--n- 32.99 g <4.00 g
1 2 3 4 5 6 7 8 9 10 11 [root @localhost ~] LV VG Attr LSize Pool Origin Data % Meta% Move Log Cpy%Sync Convert root openeuler -wi-ao---- 26.02 g swap openeuler -wi-ao---- 2.97 g [root @localhost ~] 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 ~] LV VG Attr LSize Pool Origin Data % Meta% Move Log Cpy%Sync Convert root openeuler -wi-ao---- <30.02 g swap openeuler -wi-ao---- 2.97 g\
整理文件系统 在扩展 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 ~] Filesystem Size Used Avail Use% Mounted on devtmpfs 1.2 G 0 1.2 G 0 % /dev tmpfs 1.2 G 0 1.2 G 0 % /dev/shm tmpfs 481 M 7.0 M 474 M 2 % /run tmpfs 4.0 M 0 4.0 M 0 % /sys/fs/cgroup /dev/mapper/openeuler-root 26 G 2.2 G 23 G 9 % / tmpfs 1.2 G 0 1.2 G 0 % /tmp /dev/sda1 974 M 87 M 820 M 10 % /boot [root @localhost ~] 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 (4 k) blocks long. [root @localhost ~] Filesystem Size Used Avail Use% Mounted on devtmpfs 1.2 G 0 1.2 G 0 % /dev tmpfs 1.2 G 0 1.2 G 0 % /dev/shm tmpfs 481 M 7.0 M 474 M 2 % /run tmpfs 4.0 M 0 4.0 M 0 % /sys/fs/cgroup /dev/mapper/openeuler-root 30 G 2.2 G 26 G 8 % / tmpfs 1.2 G 0 1.2 G 0 % /tmp /dev/sda1 974 M 87 M 820 M 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 ~] Physical volume "/dev/sdb2" successfully created. [root @localhost ~] PV VG Fmt Attr PSize PFree /dev/sda2 openeuler lvm2 a-- <29.00 g 0 /dev/sdb1 openeuler lvm2 a-- <4.00 g 0 /dev/sdb2 lvm2 --- <4.00 g <4.00 g [root @localhost ~]
创建卷组 命令:vgcreate [选项] 卷组名 物理卷路径... 例如:vgcreate myvg /dev/sdb1
1 2 3 4 5 6 7 [root @localhost ~] Volume group "web" successfully created [root @localhost ~] VG openeuler 2 2 0 wz--n- 32.99 g 0 web 1 0 0 wz--n- <4.00 g <4.00 g [root @localhost ~]
创建逻辑卷 命令:lvcreate [选项] -L 大小 -n 逻辑卷名 卷组名
1 2 3 4 5 6 7 8 9 [root @localhost ~] Logical volume "lnmp" created. [root @localhost ~] LV VG Attr LSize Pool Origin Data % Meta% Move Log Cpy%Sync Convert root openeuler -wi-ao---- <30.02 g swap openeuler -wi-ao---- 2.97 g lnmp web -wi-a----- 3.00 g [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 ~] mke2fs 1.46 .4 (18 -Aug-2021 ) 创建含有 786432 个块(每块 4 k)和 196608 个inode的文件系统 文件系统UUID:1688753 e-8f6d-4dd7-804f-ec030a7d026d 超级块的备份存储于下列块: 32768 , 98304 , 163840 , 229376 , 294912 正在分配组表: 完成 正在写入inode表: 完成 创建日志(16384 个块)完成 写入超级块和文件系统账户统计信息: 已完成 [root @localhost ~] [root @localhost ~] [root @localhost ~] 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 1.2 G 0 1.2 G 0 % /dev tmpfs 1.2 G 0 1.2 G 0 % /dev/shm tmpfs 481 M 7.0 M 474 M 2 % /run tmpfs 4.0 M 0 4.0 M 0 % /sys/fs/cgroup /dev/mapper/openeuler-root 30 G 2.2 G 26 G 8 % / tmpfs 1.2 G 0 1.2 G 0 % /tmp /dev/sda1 974 M 87 M 820 M 10 % /boot /dev/mapper/web-lnmp 2.9 G 24 K 2.8 G 1 % /web
删除逻辑卷 删除逻辑卷之前需要查看一下该逻辑卷是否被挂载,刚刚我们创建一个名为lnmp的逻辑卷,现在需要对他删除,那就需要先试用df -h的命令查看一下是否挂载,如果是挂载状态的话,需要全取消挂载,才能进行删除的操作。具体步骤如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 [root @localhost ~] 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 1.2 G 0 1.2 G 0 % /dev tmpfs 1.2 G 0 1.2 G 0 % /dev/shm tmpfs 481 M 7.0 M 474 M 2 % /run tmpfs 4.0 M 0 4.0 M 0 % /sys/fs/cgroup /dev/mapper/openeuler-root 30 G 2.2 G 26 G 8 % / tmpfs 1.2 G 0 1.2 G 0 % /tmp /dev/sda1 974 M 87 M 820 M 10 % /boot /dev/mapper/web-lnmp 2.9 G 24 K 2.8 G 1 % /web [root @localhost ~] [root @localhost ~] [root @localhost ~] [root @localhost ~] 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 1.2 G 0 1.2 G 0 % /dev tmpfs 1.2 G 0 1.2 G 0 % /dev/shm tmpfs 481 M 7.0 M 474 M 2 % /run tmpfs 4.0 M 0 4.0 M 0 % /sys/fs/cgroup /dev/mapper/openeuler-root 30 G 2.2 G 26 G 8 % / tmpfs 1.2 G 0 1.2 G 0 % /tmp /dev/sda1 974 M 87 M 820 M 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 ~] LV VG Attr LSize Pool Origin Data % Meta% Move Log Cpy%Sync Convert root openeuler -wi-ao---- <30.02 g swap openeuler -wi-ao---- 2.97 g lnmp web -wi-a----- 3.00 g [root @localhost ~] [root @localhost ~] Logical volume "lnmp" successfully removed. [root @localhost ~] LV VG Attr LSize Pool Origin Data % Meta% Move Log Cpy%Sync Convert root openeuler -wi-ao---- <30.02 g swap openeuler -wi-ao---- 2.97 g [root @localhost ~]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root @localhost ~] VG openeuler 2 2 0 wz--n- 32.99 g 0 web 1 0 0 wz--n- <4.00 g <4.00 g [root @localhost ~] vgreduce vgremove vgrename [root @localhost ~] VG openeuler 2 2 0 wz--n- 32.99 g 0 web 1 0 0 wz--n- <4.00 g <4.00 g [root @localhost ~] Volume group "web" successfully removed [root @localhost ~] VG openeuler 2 2 0 wz--n- 32.99 g 0
1 2 3 4 5 6 7 8 [root @localhost ~] PV VG Fmt Attr PSize PFree /dev/sda2 openeuler lvm2 a-- <29.00 g 0 /dev/sdb1 openeuler lvm2 a-- <4.00 g 0 /dev/sdb2 lvm2 --- <4.00 g <4.00 g [root @localhost ~] [root @localhost ~] 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 ~] NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8 :0 0 30 G 0 disk ├─sda1 8 :1 0 1 G 0 part /boot └─sda2 8 :2 0 29 G 0 part ├─openeuler-root 253 :0 0 30 G 0 lvm / └─openeuler-swap 253 :1 0 3 G 0 lvm [SWAP ] sdb 8 :16 0 8 G 0 disk ├─sdb1 8 :17 0 4 G 0 part │ └─openeuler-root 253 :0 0 30 G 0 lvm / └─sdb2 8 :18 0 4 G 0 part sr0 11 :0 1 3.4 G 0 rom [root @localhost ~] GNU Parted 3.4 使用 /dev/sdb 欢迎使用 GNU Parted!输入 'help' 来查看命令列表。 (parted) p 型号:VMware, VMware Virtual S (scsi) 磁盘 /dev/sdb:8590 MB 扇区大小 (逻辑/物理):512 B/512 B 分区表:gpt 磁盘标志: 编号 起始点 结束点 大小 文件系统 名称 标志 1 1049 kB 4296 MB 4295 MB 2 4296 MB 8590 MB 4294 MB primary (parted) rm 分区编号? 2 (parted) q 信息: 你可能需要 /etc/fstab。 [root @localhost ~] NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8 :0 0 30 G 0 disk ├─sda1 8 :1 0 1 G 0 part /boot └─sda2 8 :2 0 29 G 0 part ├─openeuler-root 253 :0 0 30 G 0 lvm / └─openeuler-swap 253 :1 0 3 G 0 lvm [SWAP ] sdb 8 :16 0 8 G 0 disk └─sdb1 8 :17 0 4 G 0 part └─openeuler-root 253 :0 0 30 G 0 lvm / sr0 11 :0 1 3.4 G 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 ] /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 命令:blkid或lsblk -f
编辑/etc/fstab
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 /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
测试配置文件编写是否正常 使用mount -a 的命令会加载fstab文件,如果配置文件有问题的话,会报错。无输出,说明配置文件修改正确。
swap 交换分区 在 Linux 中,swap(交换分区/交换文件) 是一种虚拟内存机制,当物理内存(RAM)不足时,系统会将部分不活跃的内存页移到 swap 空间,以防止崩溃。 查看swap分区大小: 命令:free -h
扩大swap交换分区 使用分区的方式扩大交换分区 使用分区的方式扩大swap分区的话,需要系统上有多余的磁盘分区。可以使用lsblk的命令进行查看。 当前系统中是有一个sdb2的4个G空闲分区的,那么就可以将当前分区创建为swap分区步骤如下
1 2 3 4 [root @localhost ~] mkswap: /dev/sdb2:警告,将擦除旧的 ext4 签名。 正在设置交换空间版本 1 ,大小 = 4 GiB (4293894144 个字节) 无标签,UUID=8 e9f6bec-7748-4371-b2ad-edd60705687e
启用交换分区 swap分区启用前,swap的分区大小为3G,启用之后swap分区大小就为7G了。
1 2 3 4 5 6 7 8 9 10 11 [root @localhost ~] total used free shared buff/cache available Mem: 2.3 Gi 212 Mi 1.7 Gi 6.0 Mi 423 Mi 1.8 Gi Swap: 3.0 Gi 0 B 3.0 Gi [root @localhost ~] [root @localhost ~] [root @localhost ~] [root @localhost ~] total used free shared buff/cache available Mem: 2.3 Gi 215 Mi 1.7 Gi 6.0 Mi 423 Mi 1.8 Gi Swap: 7.0 Gi 0 B 7.0 Gi
1 2 3 4 5 [root @localhost ~] 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 ~] 记录了1 +0 的读入 记录了1 +0 的写出2048000000 字节(2.0 GB,1.9 GiB)已复制,24.1051 s,85.0 MB/s [root @localhost ~]2.0 G /home/swap.raw
1 2 3 4 [root @localhost ~] mkswap: /home/swap.raw: insecure permissions 0644 , fix with: chmod 0600 /home/swap.raw 正在设置交换空间版本 1 ,大小 = 1.9 GiB (2047995904 个字节) 无标签,UUID=90 c39efd-dfa9-4607-9796-ec8dbc50d2ba
1 2 3 4 5 6 7 8 9 10 root@localhost ~] swapon: /home/swap.raw:不安全的权限 0644 ,建议使用 0600 。 [root @localhost ~] [root @localhost ~]-rw------- 1 root root 2.0 G 1 月 9 20 :15 /home/swap.raw [root @localhost ~] [root @localhost ~] total used free shared buff/cache available Mem: 2.3 Gi 205 Mi 2.0 Gi 4.0 Mi 106 Mi 1.9 Gi Swap: 8.9 Gi 15 Mi 8.9 Gi
关闭swap分区的命令 如果交换机分区不想使用的话,也可以对他关闭swapoff 设备名,swapoff -a 是关闭所有swap分区
1 2 3 4 5 6 7 8 9 10 [root @localhost ~] [root @localhost ~] [root @localhost ~] total used free shared buff/cache available Mem: 2.3 Gi 202 Mi 2.0 Gi 4.0 Mi 109 Mi 1.9 Gi Swap: 4.9 Gi 14 Mi 4.9 Gi [root @localhost ~] 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 ~] sys/ sysrq-trigger sysvipc/ [root @localhost ~]30 [root @localhost ~] sysctl: cannot stat /proc/sys/vm/swapiness: No such file or directory [root @localhost ~] vm.swappiness = 30
修改值 临时生效:sysctl vm.swappiness=10 永久生效:
1 2 3 4 5 6 7 8 echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.confecho '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 ~] 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 1.2 G 0 1.2 G 0 % /dev tmpfs 1.2 G 0 1.2 G 0 % /dev/shm tmpfs 481 M 7.0 M 474 M 2 % /run tmpfs 4.0 M 0 4.0 M 0 % /sys/fs/cgroup /dev/mapper/openeuler-root 30 G 4.1 G 24 G 15 % / tmpfs 1.2 G 0 1.2 G 0 % /tmp /dev/sda1 974 M 87 M 820 M 10 % /boot /dev/mapper/data -db--data 2.0 G 28 K 1.8 G 1 % /data [root @localhost ~] [root @localhost ~] [root @localhost ~] LV VG Attr LSize Pool Origin Data % Meta% Move Log Cpy%Sync Convert db-data data -wi-ao---- 2.00 g root openeuler -wi-ao---- <30.02 g swap openeuler -wi-ao---- 2.97 g [root @localhost ~] VG data 1 1 0 wz--n- <6.52 g <4.52 g openeuler 2 2 0 wz--n- 32.99 g 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 ~] Logical volume "data_snap" created. [root @localhost ~] LV VG Attr LSize Pool Origin Data % Meta% Move Log Cpy%Sync Convert data_snap data swi-a-s--- 1.00 g db-data 0.01 db-data data owi-aos--- 2.00 g root openeuler -wi-ao---- <30.02 g swap openeuler -wi-ao---- 2.97 g [root @localhost ~]
恢复快照 在恢复快照之前,我们可以在当前的/data目录中创建一个文件,并写入文本。验证一下,恢复快照后,是否会恢复到原来的状态。 当前目录的文件。 再创建一个222.txt的文件,并写入aaa 进行恢复快照: 注意:在恢复快照之前,需要将原卷进行卸载,卸载了之后才能恢复 命令:lvconvert --merge lvm快照的路径
1 2 3 4 5 6 7 8 9 [root @localhost ~] LV VG Attr LSize Pool Origin Data % Meta% Move Log Cpy%Sync Convert data_snap data swi-a-s--- 1.00 g db-data 0.01 db-data data owi-a-s--- 2.00 g root openeuler -wi-ao---- <30.02 g swap openeuler -wi-ao---- 2.97 g [root @localhost ~] 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 ~] [root @localhost ~] [root @localhost data ]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 ] 总用量 20 K-rw-r--r-- 1 root root 0 1 月 10 19 :28 10 .db-rw-r--r-- 1 root root 0 1 月 10 19 :28 1 .db-rw-r--r-- 1 root root 15 1 月 10 19 :28 1 .txt-rw-r--r-- 1 root root 0 1 月 10 19 :28 2 .db-rw-r--r-- 1 root root 0 1 月 10 19 :28 3 .db-rw-r--r-- 1 root root 0 1 月 10 19 :28 4 .db-rw-r--r-- 1 root root 0 1 月 10 19 :28 5 .db-rw-r--r-- 1 root root 0 1 月 10 19 :28 6 .db-rw-r--r-- 1 root root 0 1 月 10 19 :28 7 .db-rw-r--r-- 1 root root 0 1 月 10 19 :28 8 .db-rw-r--r-- 1 root root 0 1 月 10 19 :28 9 .db drwx------ 2 root root 16 K 1 月 10 19 :16 lost+found
可以看到 ,我在创建快照之后的创建的2.txt的文件,已经没有了,说明快照恢复回去了。
快照在恢复之后就会自动删除,使用lvs的命令查看,快照已经没有了。 快照创建完成之后,能够进行恢复,也可以当做一个独立的文件系统使用,也就是可以将创建的快照单独挂载到一个目录进行查看。
1 2 3 4 5 6 7 8 9 10 [root @localhost data ] Logical volume "data_snap" created. [root @localhost data ] LV VG Attr LSize Pool Origin Data % Meta% Move Log Cpy%Sync Convert data_snap data swi-a-s--- 1.00 g db-data 0.01 db-data data owi-aos--- 2.00 g root openeuler -wi-ao---- <30.02 g swap openeuler -wi-ao---- 2.97 g [root @localhost data ] [root @localhost data ]
如上操作,对/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 ~] LV VG Attr LSize Pool Origin Data % Meta% Move Log Cpy%Sync Convert data_snap data swi-aos--- 1.00 g db-data 0.01 db-data data owi-aos--- 2.00 g root openeuler -wi-ao---- <30.02 g swap openeuler -wi-ao---- 2.97 g [root @localhost ~] [root @localhost ~] [root @localhost ~]Do you really want to remove active logical volume data /data_snap? [y /n ]: y Logical volume "data_snap" successfully removed. [root @localhost ~] LV VG Attr LSize Pool Origin Data % Meta% Move Log Cpy%Sync Convert db-data data -wi-ao---- 2.00 g root openeuler -wi-ao---- <30.02 g swap openeuler -wi-ao---- 2.97 g [root @localhost ~]