Linux 存储管理完全指南
存储管理是 Linux 运维最核心的技能之一。从一块新硬盘到可用的存储空间,需要经过分区、格式化、挂载等一系列操作;而面对复杂的生产环境,还需要掌握 LVM 逻辑卷管理和 Swap 交换分区等技术。
很多初学者觉得存储管理复杂,是因为没有建立起”物理磁盘 → 分区 → 文件系统 → 挂载点”之间的清晰关联。本文将通过层层拆解的方式,从最基础的磁盘结构讲起,逐步演示 fdisk、mkfs、mount、LVM、Swap 等工具的实战用法,帮你构建完整的 Linux 存储知识体系。
磁盘基础概念
磁盘/硬盘/disk是同一个东西,不同于内存的是容量比较大。
磁盘类型
机械
机械硬盘即是传统普通硬盘,主要由:盘片,磁头,盘片转轴及控制电机,磁头控制器,数据转换器,接口,缓存等几个部分组成。
固态
固态驱动器(Solid State Disk或Solid State Drive,简称SSD),俗称固态硬盘,固态硬盘是用固态电子存储芯片阵列而制成的硬盘
图示

磁盘的物理结构
核心术语详解
机械硬盘的物理结构遵循从整体到局部的层级划分,以下是核心概念的精确定义:
盘片与盘面
硬盘内部由多个同轴重叠的磁性盘片组成,每个盘片拥有上下两个独立的盘面(Side)。所有数据最终都存储在这些盘面的磁性涂层上。
磁道(Track)
盘面被划分为若干个宽度相同的同心圆,这些同心圆就是磁道。磁道从外向内依次编号(最外侧为 0 磁道),0 磁道存储着硬盘分区表等关键系统信息,一旦损坏硬盘将无法正常使用。
扇区(Sector)
将盘面沿径向划分为若干个内角相同的扇形区域,每个磁道因此被分割为若干段圆弧,每段圆弧就是一个扇区。
- 扇区是磁盘最小的物理读写单位,数据只能以扇区为单位整体读取或写入
- 传统硬盘扇区大小为 512 字节,现代硬盘普遍采用 4KB(4096 字节)的高级格式化扇区
- 硬盘的第一个扇区称为引导扇区,存放操作系统启动的核心代码
柱面(Cylinder)
所有盘面上同一编号的磁道共同构成一个圆柱,称为柱面。磁盘读写优先在同一柱面内进行,因为此时磁头无需径向移动,读写速度最快。
簇(Cluster)
操作系统层面的最小文件存储单位,由若干个连续的扇区组成。即使文件大小小于一个簇,也会占用整个簇的存储空间,这也是小文件会浪费磁盘空间的原因。

常见机械硬盘关键参数
| 参数类别 | 主流规格 |
|---|---|
| 物理尺寸 | 3.5 英寸(台式机)、2.5 英寸(笔记本)、1.8 英寸(便携设备) |
| 接口类型 | 早期 IDE 接口 → 主流 SATA I/II/III 接口 |
| 主轴转速 | 5400rpm、7200rpm(消费级)、10000rpm、15000rpm(企业级) |
| 主流厂商 | 西部数据、希捷、三星、日立、金士顿 |
核心读写部件
!!!内部运作时很类似于这种唱片机!!!

机械硬盘读写依赖三个运动部件的精密协同:
主轴电机:带动盘片高速旋转(如 7200 转 / 分钟)
磁头臂 + 步进电机:带动所有磁头同步径向移动,定位到目标磁道
磁头:每个盘面对应一个磁头,悬浮在盘片上方(距离仅 0.1-0.3 微米),负责读写数据
⚠️ 硬盘极度怕震动,震动会导致磁头撞击盘片,造成永久性物理坏道。
硬盘命名规则
Linux 内核(kernel)对不同接口的硬盘有不同的命名方式:
| 接口类型 | 命名前缀 | 示例 | 说明 |
|---|---|---|---|
| IDE(并口) | /dev/hd | /dev/hda、/dev/hdb | 老式硬盘接口,现在较少使用 |
| SATA(串口) | /dev/sd | /dev/sda、/dev/sdb | 现代硬盘通用接口 |
命名拆解说明:
以 /dev/sda 为例:
| 部分 | 含义 |
|---|---|
/dev | 设备文件目录 |
s | 代表 SATA 串口硬盘 |
d | 代表 disk(磁盘) |
a | 代表第一块硬盘(b 为第二块,c 为第三块…) |
问题:第五块硬盘的全名是什么?
答案:
/dev/sde(a→第一块,b→第二块,c→第三块,d→第四块,e→第五块)
分区方式
Linux 支持两种主要的分区表格式:
| 特性 | MBR | GPT |
|---|---|---|
| 全称 | Master Boot Record(主引导记录) | GUID Partition Table(全局唯一标识分区表) |
| 最大支持容量 | < 2TB | > 2TB(理论上可达 9.4ZB) |
| 分区数量限制 | 最多 4 个主分区 | 最多 128 个分区 |
| 突破分区限制 | 需使用扩展分区 + 逻辑分区 | 无需扩展分区 |
| 使用场景 | 传统 BIOS + 小容量硬盘 | UEFI + 大容量硬盘 |
MBR 分区说明:
- MBR 是位于磁盘最前边的一段引导代码
- 设计时只分配了 4 个分区槽位
- 如果需要超过 4 个分区,需放弃一个主分区,改为创建扩展分区,再在扩展分区内创建逻辑分区
磁盘管理流程
添加新磁盘
在 VMware 虚拟机中添加磁盘的步骤:
- 先关闭虚拟机电源
- 编辑虚拟机设置 → 添加硬盘
- 按照向导完成添加






管理磁盘流程三部曲
新硬盘投入使用需要三个步骤,可以用”装修房子”来理解:
新磁盘(毛坯房)
↓
1. 分区(MBR 或 GPT) → 隔间(划分卧室、客厅)
↓
2. 格式化/文件系统 → 装修放家具/打造格子柜
↓
3. 挂载(mount) → 加个门/目录(设置访问入口)
步骤一:查看磁盘信息
方法 1:查看设备文件
[root@localhost ~]# ll /dev/sd*
brw-rw----. 1 root disk 8, 0 5月 13 15:27 /dev/sda
brw-rw----. 1 root disk 8, 1 5月 13 15:27 /dev/sda1
brw-rw----. 1 root disk 8, 2 5月 13 15:27 /dev/sda2
brw-rw----. 1 root disk 8, 16 5月 13 15:27 /dev/sdb
brw-rw----. 1 root disk 8, 32 5月 13 15:27 /dev/sdc
brw-rw----. 1 root disk 8, 48 5月 13 15:27 /dev/sdd
brw-rw----. 1 root disk 8, 64 5月 13 15:27 /dev/sde
brw-rw----. 1 root disk 8, 80 5月 13 15:27 /dev/sdf
brw-rw----. 1 root disk 8, 96 5月 13 15:27 /dev/sdg
分析:
/dev/sd*中*代表的意思是以sd开头命名的所有目录/文件/dev/sda是系统盘(已有分区 sda1、sda2)/dev/sdb、/dev/sdc、/dev/sdd等没有分区号,相当于新购买的磁盘
方法 2:使用 lsblk 查看(推荐)
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
sdc 8:32 0 20G 0 disk
sdd 8:48 0 20G 0 disk
sde 8:64 0 20G 0 disk
sdf 8:80 0 20G 0 disk
sdg 8:96 0 20G 0 disk
sr0 11:0 1 4.3G 0 rom /run/media/root/CentOS 7 x86_64
| 字段名 | 全称 | 含义 |
|---|---|---|
| NAME | Name | 设备的系统名称,即我们操作磁盘时使用的标识符 |
| MAJ:MIN | Major:Minor | 主设备号:次设备号,内核用来唯一标识一个块设备 |
| RM | Removable | 是否为可移动设备(1 = 是,0 = 否) |
| SIZE | Size | 设备的总容量 |
| RO | Read Only | 是否为只读设备(1 = 是,0 = 否) |
| TYPE | Type | 设备类型 |
| MOUNTPOINT | Mount Point | 设备的挂载点(文件系统在系统中的访问路径) |
步骤二:创建分区(MBR)
打个比方:分区就像把一个大房子划分成卧室、客厅、厨房。
启动 fdisk 分区工具
[root@localhost ~]# fdisk /dev/sdb
进入 fdisk 后的交互界面:
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0xa9c32dd1 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):
常用操作指令
| 指令 | 功能 | 说明 |
|---|---|---|
n | 新建分区(New) | 创建新分区 |
p | 打印分区表(Print) | 查看当前分区情况 |
d | 删除分区(Delete) | 删除已有分区 |
l | 列出分区类型 | 查看所有分区类型代码 |
t | 更改分区类型 | 修改分区类型(如改为 Swap 类型 82) |
w | 写入并退出(Write) | 保存分区信息 |
q | 不保存退出 | 放弃修改并退出 |
创建主分区完整流程
1. 输入 n 新建分区:
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
p代表主分区(primary),括号内表示当前磁盘 0 个主分区、0 个扩展分区,剩余 4 个主分区可用(MBR 分区表最多支持 4 个主分区)e代表扩展分区(extended),用于突破主分区数量限制,可在其内部创建多个逻辑分区Select (default p):表示默认选择主分区,直接回车即可确认;如需创建扩展分区,输入e后回车
2. 选择分区类型,输入 p 创建主分区:
Select (default p): p
3. 选择分区号(1-4),输入 1:
分区号 (1-4,默认 1):1
4. 选择起始扇区,直接回车使用默认值:
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
- 提示选择分区的起始扇区位置,括号内
2048-41943039是当前磁盘剩余空间的可用扇区范围,默认为2048是系统推荐的最优值(满足 4K 扇区对齐,大幅提升磁盘读写性能) - 这里直接回车确认,系统将自动使用推荐的默认起始扇区
2048创建分区
5. 指定分区大小,输入 +2G:
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+2G
分区 1 已设置为 Linux 类型,大小设为 2 GiB
- 提示选择分区的结束位置,支持三种输入格式:直接输入结束扇区号、输入
+扇区数、输入+大小{K,M,G}(最常用) - 括号内
2048-41943039是当前剩余空间的可用扇区范围,默认为41943039表示默认直接分配全部剩余空间 +2G表示手动指定该分区大小为 2GB,是最直观易用的分区大小指定方式- 系统反馈:1 号分区创建成功,默认设置为 Linux 文件系统类型,实际分配大小为 2 GiB
提示:实际环境中根据磁盘大小划分,如 4TB 磁盘可以 500GB 一个分区。
6. 输入 w 保存分区信息:
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@localhost ~]#
这里竟然自己退出了,我印象里是输入q才退出,可能是我记错了。 一般来说,我们在w保存前会先使用p看一下分区是否正确,然后才决定是保存还是重新分配。
命令(输入 m 获取帮助):p
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xa9c32dd1
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 4196351 2097152 83 Linux
命令(输入 m 获取帮助):
刷新分区表
[root@localhost ~]# partprobe /dev/sdb
partprobe是 Linux 系统中强制刷新内核磁盘分区表的专用命令/dev/sdb指定要刷新分区表的目标磁盘,对应我们刚才新建分区的第二块磁盘- 执行后无任何输出即表示成功,系统会立即识别出 fdisk 刚创建的新分区(如
/dev/sdb1) - 这是 fdisk 分区完成后的必备步骤,省略会导致内核仍使用旧分区表,新分区无法被识别、无法格式化和挂载
查看分区结果
方法 1:使用 fdisk -l
[root@localhost ~]# fdisk -l /dev/sdb
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xa9c32dd1
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 4196351 2097152 83 Linux
方法 2:使用 lsblk
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 2G 0 part
结论:说明划分磁盘完毕,成功创建
/dev/sdb1分区,大小为2G。
步骤三:创建文件系统(格式化)
打个比方:文件系统就像房子里的格子柜,让数据有规律地存放。
[root@localhost ~]# mkfs.ext4 /dev/sdb1
输出示例:
[root@localhost ~]# mkfs.ext4 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131072 inodes, 524288 blocks
26214 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (16384 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
注意:新创建的每个分区(如 sdb2、sdb3)都需要执行格式化操作。
常见文件系统类型
| 文件系统 | 命令 | 特点 |
|---|---|---|
| ext4 | mkfs.ext4 | 经典文件系统,稳定可靠 |
| xfs | mkfs.xfs | CentOS 7+ 默认,支持大容量 |
| vfat | mkfs.vfat | 兼容 Windows 的 FAT32 |
步骤四:挂载 mount
手动挂载
1. 创建挂载点(一个分区对应一个挂载点):
[root@localhost ~]# mkdir /mnt/disk1
2. 执行挂载:
[root@localhost ~]# mount -t ext4 /dev/sdb1 /mnt/disk1
参数说明:
-t ext4指定文件系统类型,通常可以省略,系统会自动识别。
步骤五:查看挂载信息
方法 1:使用 df -hT(推荐)
[root@localhost ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 17G 3.6G 14G 21% /
devtmpfs devtmpfs 470M 0 470M 0% /dev
tmpfs tmpfs 487M 0 487M 0% /dev/shm
tmpfs tmpfs 487M 8.6M 478M 2% /run
tmpfs tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 166M 849M 17% /boot
tmpfs tmpfs 98M 4.0K 98M 1% /run/user/42
tmpfs tmpfs 98M 24K 98M 1% /run/user/0
/dev/sr0 iso9660 4.3G 4.3G 0 100% /run/media/root/CentOS 7 x86_64
/dev/sdb1 ext4 2.0G 6.0M 1.8G 1% /mnt/disk1
| 字段(中文) | 字段(英文) | 说明 |
|---|---|---|
| 文件系统 | Filesystem | 分区设备名 |
| 类型 | Type | 文件系统类型 |
| 容量 | Size | 分区总大小 |
| 已用 | Used | 已使用空间 |
| 可用 | Avail | 可用空间 |
| 已用% | Use% | 使用百分比 |
| 挂载点 | Mounted on | 挂载点 |
方法 2:使用 mount 命令
[root@localhost ~]# mount
/dev/sdb1 on /mnt/disk1 type ext4 (rw,relatime,seclabel,data=ordered)
mount命令可以查看磁盘的特殊挂载属性,具体属性在后续讲解。
永久挂载(重启后不失效)
手动挂载的分区在系统重启后会失效。有两种方式实现永久挂载:
方法一:写入 /etc/fstab(推荐)
[root@localhost ~]# vim /etc/fstab
添加以下内容:
/dev/sdb1 /mnt/disk1 ext4 defaults 0 0

字段说明:
| 字段顺序 | 示例值 | 说明 |
|---|---|---|
| 设备 | /dev/sdb1 | 要挂载的分区 |
| 挂载点 | /mnt/disk1 | 挂载目录 |
| 文件系统类型 | ext4 | 分区格式 |
| 挂载选项 | defaults | 使用默认选项(rw, suid, dev, exec, auto, nouser, async) |
| dump 备份 | 0 | 是否备份(0=不备份,1=每天备份) |
| fsck 检查顺序 | 0 | 开机检查顺序(0=不检查,1=最先检查,2=稍后检查) |
使配置立即生效:
[root@localhost ~]# mount -a
mount -a会读取/etc/fstab并挂载所有未挂载的条目。这是检验 fstab 配置是否正确的好方法。
方法二:写入自启动文件(不推荐)
[root@localhost ~]# vim /root/.bashrc
在文件末尾追加:
mount -t ext4 /dev/sdb1 /mnt/disk1
注意:这种方法会在用户登录时执行这条命令挂载,不够优雅,且不要影响文件原有的内容。
扩展分区与逻辑分区
问题:磁盘分区数量可以超过 4 个吗?
MBR 分区表最多支持 4 个主分区。如果需要更多分区,需要放弃一个主分区,改为扩展分区,然后在扩展分区内创建逻辑分区。
操作步骤
前提:sdb这块磁盘被我分了四个主分区,且各个分区已在使用,详细信息如下图

1. 删除主分区:
先卸载
[root@localhost ~]# umount /dev/sdb4
[root@localhost ~]# fdisk /dev/sdb
命令(输入 m 获取帮助):d # 删除分区
分区号 (1-4):4 # 删除第四个分区
命令(输入 m 获取帮助):p # 打印分区列表,确认删除成功
2. 创建扩展分区:
命令(输入 m 获取帮助):n # 新建分区
Partition type:
p primary
e extended
Select (default p):e # 选择扩展分区
分区号 (1-4):回车 # 使用默认
起始 扇区:回车 # 使用默认
Last 扇区:回车 # 使用磁盘剩余全部空间
3. 在扩展分区内创建逻辑分区:
命令(输入 m 获取帮助):n # 新建分区
Select (default l):l # 选择逻辑分区,如果已经创建三个主分区,则直接默认创建逻辑分区
起始 扇区:回车 # 使用默认
Last 扇区, +size{K,M,G}:+200M # 指定大小
命令(输入 m 获取帮助):p # 查看结果
逻辑分区命名:逻辑分区从
/dev/sdb5开始编号(sdb1-sdb4 保留给主分区和扩展分区)。后续的刷新分区,创建文件系统,挂载同上
逻辑卷管理 LVM
前言:基本磁盘的局限性
尝试用以下命令写满一个磁盘:
dd if=/dev/zero of=/mnt/disk2/1.txt bs=1M count=10000
dd是 Linux 系统中底层字节级数据复制工具,俗称 “磁盘手术刀”(也被称为 “磁盘毁灭者”,操作失误会导致数据永久丢失)if=/dev/zero指定输入源为系统特殊设备 /dev/zero,该设备会无限输出空字节(0x00),所以我们看1.txt这个文件时并没有内容of=/mnt/disk2/1.txt指定输出目标为 /mnt/disk2 挂载点下的 1.txt 文件bs=1M指定每次读写操作的块大小为 1MB(1024×1024 字节),是经过验证的高效块大小count=1000指定总共复制 10000 个这样的块- 执行后会生成精确大小为 10000MB(约 10GB)的文件,文件内容全部为 0 字节,且会真实占用磁盘 10GB 空间
[root@localhost ~]# dd if=/dev/zero of=/mnt/disk2/1.txt bs=1M count=10000
dd: 写入"/mnt/disk2/1.txt" 出错: 设备上没有空间
记录了3872+0 的读入
记录了3871+0 的写出
4059779072字节(4.1 GB)已复制,1.7465 秒,2.3 GB/秒
[root@localhost ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 17G 3.6G 14G 21% /
devtmpfs devtmpfs 470M 0 470M 0% /dev
tmpfs tmpfs 487M 0 487M 0% /dev/shm
tmpfs tmpfs 487M 8.4M 478M 2% /run
tmpfs tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 166M 849M 17% /boot
/dev/sdb1 ext4 2.0G 6.0M 1.8G 1% /mnt/disk1
tmpfs tmpfs 98M 12K 98M 1% /run/user/42
tmpfs tmpfs 98M 0 98M 0% /run/user/0
/dev/sdb2 ext4 3.9G 3.8G 0 100% /mnt/disk2
基本磁盘的最大缺点:无法灵活调整大小!
当分区满了之后,只能重新划分分区、备份数据、格式化、恢复数据,操作繁琐且风险高。
LVM 的目的
LVM(Logical Volume Manager,逻辑卷管理)是 Linux 管理磁盘的一种高级方式。它的性质与基本磁盘无异,但最大特点是可以随意扩张大小。
LVM 核心术语
| 术语 | 缩写 | 说明 |
|---|---|---|
| 物理卷 | PV(Physical Volume) | 一块或多块物理硬盘 |
| 卷组 | VG(Volume Group) | 多个 PV 聚合成的存储池 |
| 逻辑卷 | LV(Logical Volume) | 从 VG 中划分出的逻辑分区 |
| 物理扩展块 | PE(Physical Extent) | VG 中的最小分配单元 |

第一层:物理存储层(最底层)
对应图中:磁盘 / 分区
- 本质:服务器上真实存在的硬件,就是你插在机器里的一块块硬盘,或者一块硬盘上划分出来的多个分区。
- 特点:每个硬盘 / 分区都是独立的 “孤岛”,容量从出厂就固定了,互相之间不能借用空间。
- 传统痛点:如果 1TB 的硬盘装满了,哪怕旁边 2TB 的硬盘还剩 1.5TB 空着,你也没法把数据存过去,只能手动迁移。
举例:你有一台服务器,插了 3 块空硬盘,分别是 1TB、2TB、3TB。在传统模式下,它们就是 3 个独立的水桶,各自装各自的水,互不连通。
第二层:PV(物理卷)
对应图中:PV1-PV5
- 本质:LVM 对物理硬盘的第一步标准化改造。
- 核心动作:LVM 会把每一块物理硬盘,都切分成无数个大小完全相等的最小存储单元(叫做 PE,物理扩展块,默认大小是 4MB)。
- 作用:改造之后,硬盘就不再是一个完整的 “水桶” 了,变成了一堆可以自由移动、自由组合的 “小水滴”。所有硬盘都被统一成了相同的基本单位,为后续的整合打下基础。
举例:
- 1TB 的硬盘会被切成约 26 万个 4MB 的小水滴
- 2TB 的硬盘会被切成约 52 万个 4MB 的小水滴
- 3TB 的硬盘会被切成约 78 万个 4MB 的小水滴
现在这 3 块硬盘,已经变成了三堆一模一样的小水滴,再也没有 “1TB 硬盘” 和 “2TB 硬盘” 的区别了。
第三层:VG(卷组)
对应图中:中间的大 VG 层
本质:LVM 的核心存储资源池,也是整个架构最精妙的设计。
核心动作:把所有 PV 里的 “小水滴”,全部倒进同一个大池子里,完全混合在一起。
核心特点:
- 这个池子的总容量,就是所有加入进来的物理硬盘的容量总和
- 你可以随时把新的硬盘改造成 PV,然后倒进这个池子里,池子的总容量会立刻变大
- 你也可以把某个旧硬盘里的所有小水滴,全部移到其他硬盘上,然后把旧硬盘拿走,池子的总容量会相应变小
- 池子里的所有小水滴都是完全等价的,再也分不清哪个水滴来自原来的哪块硬盘
举例:把刚才 3 块硬盘的小水滴全部倒进一个池子,你就得到了一个总容量 6TB的统一存储池,里面一共有约 157 万个小水滴可以自由分配。
第四层:LV(逻辑卷)
对应图中:最上层的 LV1-LVn
本质:从 VG 这个大池子里,按需舀出来的一瓢水,也就是用户最终实际使用的 “逻辑硬盘”。
核心特点:
- 你可以创建任意多个 LV,每个 LV 的大小可以是任意的(只要不超过池子的总容量)
- LV 可以像普通硬盘分区一样使用,你可以格式化它、在上面创建文件夹、存放任何数据
- 最关键的优势:LV 的大小可以随时动态调整,完全不用停机,也不会影响上面已经存有的数据
- 如果 LV 快满了,你只需要从池子里再舀一些小水滴加进去,它就立刻变大了
- 如果 LV 太大用不完,你也可以把多余的小水滴倒回池子里,它就立刻变小了
一、创建 LVM
环境准备:准备物理磁盘
[root@localhost ~]# ll /dev/sd*
brw-rw----. 1 root disk 8, 32 5月 15 14:12 /dev/sdc
brw-rw----. 1 root disk 8, 48 5月 15 14:12 /dev/sdd
brw-rw----. 1 root disk 8, 64 5月 15 14:12 /dev/sde
步骤 1:创建物理卷(PV)
将物理磁盘转换成物理卷:
[root@localhost ~]# pvcreate /dev/sdc
Physical volume "/dev/sdc" successfully created.
查看 PV 信息的三种方式:
# 方式一:简要扫描
[root@localhost ~]# pvscan
PV /dev/sda2 VG centos lvm2 [<19.00 GiB / 0 free]
PV /dev/sdc lvm2 [20.00 GiB]
Total: 2 [<39.00 GiB] / in use: 1 [<19.00 GiB] / in no VG: 1 [20.00 GiB]
# 方式二:摘要信息
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdc lvm2 --- 20.00g 20.00g
# 方式三:详细信息
[root@localhost ~]# pvdisplay
--- Physical volume ---
PV Name /dev/sda2
VG Name centos
PV Size <19.00 GiB / not usable 3.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 4863
Free PE 0
Allocated PE 4863
PV UUID EhMPvf-eM0X-lNwi-GaU7-Jsrg-tCqA-8FzTl9
"/dev/sdc" is a new physical volume of "20.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdc
VG Name
PV Size 20.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID V5CPYe-osIK-Emf4-nT7a-Q9oH-xA2K-cLGDgE
步骤 2:创建卷组(VG)
[root@localhost ~]# vgcreate vg1 /dev/sdc
Volume group "vg1" successfully created
查看 VG 信息:
# 方式一:摘要信息
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <19.00g 0
vg1 1 0 0 wz--n- <20.00g <20.00g
# 方式二:扫描卷组
[root@localhost ~]# vgscan
Reading volume groups from cache.
Found volume group "vg1" using metadata type lvm2
Found volume group "centos" using metadata type lvm2
# 方式三:详细信息
[root@localhost ~]# vgdisplay
--- Volume group ---
VG Name vg1
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 <20.00 GiB # 重点观察:卷组总大小
PE Size 4.00 MiB # 重点观察:物理扩展块大小
Total PE 5119 # 重点观察:总 PE 数量
Alloc PE / Size 0 / 0
Free PE / Size 5119 / <20.00 GiB
VG UUID SvUbjH-WGtq-49ZK-RmwO-jsep-1r8n-QKowhE
步骤 3:创建逻辑卷(LV)
[root@localhost ~]# lvcreate -L 200M -n lv1 vg1
Logical volume "lv1" created.
| 参数 | 说明 |
|---|---|
-L | 指定大小(单位 M 或 G) |
-n | 指定逻辑卷名称 |
vg1 | 从哪个卷组中划分 |
查看 LV 信息:
[root@localhost ~]# lvscan
ACTIVE '/dev/vg1/lv1' [200.00 MiB] inherit
ACTIVE '/dev/centos/swap' [2.00 GiB] inherit
ACTIVE '/dev/centos/root' [<17.00 GiB] inherit
# 其他查看方式与之前类似 lvs , lvdisplay
步骤 4:创建文件系统并挂载
# 创建文件系统
[root@localhost ~]# mkfs.ext4 /dev/vg1/lv1
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=1024 (log=0)
分块大小=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
51200 inodes, 204800 blocks
10240 blocks (5.00%) reserved for the super user
第一个数据块=1
Maximum filesystem blocks=33816576
25 block groups
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (4096 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
# 创建挂载点
[root@localhost ~]# mkdir /mnt/lv1
# 挂载
[root@localhost ~]# mount /dev/vg1/lv1 /mnt/lv1
查看挂载结果:
[root@localhost ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sdb2 ext4 3.9G 3.8G 0 100% /mnt/disk2
/dev/mapper/vg1-lv1 ext4 190M 1.6M 175M 1% /mnt/lv1
逻辑卷管理完毕!现在可以向挂载点
/mnt/lv1正常写入数据了。
二、VG 管理(扩大卷组)
场景:将 VG 容量从 20G 扩容到 40G
步骤 1:创建新的 PV
[root@localhost ~]# pvcreate /dev/sdd
Physical volume "/dev/sdd" successfully created.
步骤 2:扩展 VG
[root@localhost ~]# vgextend vg1 /dev/sdd
Volume group "vg1" successfully extended
查看扩容后的 VG:
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <19.00g 0
vg1 2 1 0 wz--n- 39.99g <39.80g
卷组从 1 块磁盘扩展为 2 块,总容量增加。
三、LV 扩容(扩大逻辑卷)
步骤 1:扩容 LV
首先查看 VG 是否有剩余空间:
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <19.00g 0
vg1 2 1 0 wz--n- 39.99g <39.80g
确认有空闲空间后,扩容 LV:
[root@localhost ~]# lvextend -L +15G /dev/vg1/lv1
Size of logical volume vg1/lv1 changed from 200.00 MiB (50 extents) to <15.20 GiB (3890 extents).
Logical volume vg1/lv1 successfully resized.
-L +15G表示增加 15G。如果是-L 500M则表示扩容 500M空间。
步骤 2:扩容文件系统(FS)
扩容 LV 后,还需要让文件系统识别新增的空间。
先观察扩容前的容量:
[root@localhost ~]# df -hT /dev/vg1/lv1
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/vg1-lv1 ext4 190M 1.6M 175M 1% /mnt/lv1
[root@localhost ~]#
执行文件系统扩容:
[root@localhost ~]# resize2fs /dev/vg1/lv1
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/vg1/lv1 is mounted on /mnt/lv1; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 122
The filesystem on /dev/vg1/lv1 is now 15933440 blocks long.
再次查看,大小已改变:
[root@localhost ~]# df -hT /dev/vg1/lv1
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/vg1-lv1 ext4 15G 2.1M 15G 1% /mnt/lv1
[root@localhost ~]#
注意:
ext4文件系统使用resize2fs命令xfs文件系统使用xfs_growfs命令- XFS 文件系统只能扩容,不能缩容
四、LVM 命令汇总
| 操作 | PV 命令 | VG 命令 | LV 命令 |
|---|---|---|---|
| 创建 | pvcreate | vgcreate | lvcreate |
| 查看 | pvs / pvscan / pvdisplay | vgs / vgscan / vgdisplay | lvs / lvscan / lvdisplay |
| 扩容 | – | vgextend | lvextend |
| 缩容 | – | vgreduce | lvreduce |
| 删除 | pvremove | vgremove | lvremove |

交换分区管理 Swap
简介
Swap(交换分区)的作用:当物理内存不足时,将部分不常用的数据从内存转移到硬盘上的 Swap 空间,从而”提升”可用内存容量,防止系统发生 OOM(Out Of Memory)。
Swap(交换分区)的核心作用
Swap 是 Linux 系统在磁盘上划分的一块特殊空间(可以是分区也可以是文件),本质是**物理内存的 “磁盘备份与安全垫”**。它的核心作用不是 “扩展内存”,而是保障系统稳定运行和优化内存使用效率。
三大核心作用
防止系统因内存耗尽崩溃(最主要作用)
当物理内存被占满时,系统不会直接杀死进程(OOM)或死机,而是会把长时间不活跃、闲置的进程数据从内存 “换出” 到 Swap,腾出宝贵的物理内存给正在运行的重要程序。
这是生产服务器必须保留 Swap 的核心原因:它能在突发流量高峰或内存泄漏时,给你留出处理问题的时间。
支持系统休眠功能
系统休眠(Suspend to Disk)的原理就是把当前物理内存中的所有数据完整写入 Swap,然后关机。下次开机时,系统会直接从 Swap 把数据读回内存,瞬间恢复到休眠前的状态。
⚠️ 注意:如果需要使用休眠功能,Swap 大小必须大于等于物理内存大小。
优化系统整体内存效率
Linux 内核会主动将一些长期闲置的进程(比如后台挂了几天的终端、很少访问的服务)换出到 Swap,把物理内存留给更需要的磁盘缓存和活跃进程,从而提升系统的整体响应速度。
现代系统中 Swap 的角色变化
- 十几年前内存昂贵且容量小(几百 MB):Swap 是主要的内存扩展手段。
- 现在内存动辄几十 GB:Swap 已经从 “内存扩展” 变成了 **”安全垫” 和 “辅助优化工具”**。
- 误区纠正:Swap 被使用≠内存不足。系统主动换出闲置进程是正常的优化行为,只有当 Swap 被大量、频繁使用(使用率 > 50% 且系统明显卡顿),才说明真的内存不够用了。
Swap 大小推荐值
| 场景 | 推荐大小 |
|---|---|
| 内存 4GB ~ 16GB | 至少 4GB Swap |
| 内存 16GB ~ 64GB | 至少 8GB Swap |
| 内存 64GB ~ 256GB | 至少 16GB Swap |
一、查看当前 Swap 状态
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 972 381 80 14 510 375
Swap: 2047 0 2047
| 字段 | 说明 | 通俗解释 |
|---|---|---|
total | 总大小(单位:MB) | 系统总共拥有的物理内存 / 交换分区容量 |
used | 已使用大小 | 已经被程序实际占用的内存,不包括缓存和缓冲区 |
free | 空闲大小 | 完全没有被使用的内存,是真正 “空着” 的内存 |
shared | 共享内存大小 | 多个进程之间可以共享使用的内存,主要用于进程间通信 |
buff/cache | 缓冲区 + 缓存大小 | 系统为了提高性能而使用的内存,用来缓存磁盘数据和文件系统元数据 |
available | 可用内存大小 | 系统真正可以分配给新程序的内存总量,是最有参考价值的指标 |
二、增加 Swap 分区
步骤 1:准备分区
以将 /dev/sde 磁盘划分为 1GB 分区为例:
[root@localhost ~]# fdisk /dev/sde
分区过程(略)
这里划分了两个主分区,sde1(1G)和sde2(剩余所有空间),这里把sde1设为swap分区
可选操作:划分分区后,将分区类型设置为 82(Linux Swap):
命令(输入 m 获取帮助):p
磁盘 /dev/sde:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xdf003306
设备 Boot Start End Blocks Id System
/dev/sde1 2048 2099199 1048576 0 Empty
/dev/sde2 2099200 41943039 19921920 83 Linux
命令(输入 m 获取帮助):t
分区号 (1,2,默认 2):1
Hex 代码(输入 L 列出所有代码):82
已将分区“Empty”的类型更改为“Linux swap / Solaris”
命令(输入 m 获取帮助):p
磁盘 /dev/sde:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xdf003306
设备 Boot Start End Blocks Id System
/dev/sde1 2048 2099199 1048576 82 Linux swap / Solaris
/dev/sde2 2099200 41943039 19921920 83 Linux
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
刷新分区表:
[root@localhost ~]# partprobe /dev/sde
[root@localhost ~]# ll /dev/sde*
brw-rw----. 1 root disk 8, 64 5月 15 15:48 /dev/sde
brw-rw----. 1 root disk 8, 65 5月 15 15:48 /dev/sde1
brw-rw----. 1 root disk 8, 66 5月 15 15:48 /dev/sde2
[root@localhost ~]#
步骤 2:格式化为 Swap
[root@localhost ~]# mkswap /dev/sde1
正在设置交换空间版本 1,大小 = 1048572 KiB
无标签,UUID=d58082bb-f4d3-4ab3-a5f1-c7fc25e32041
步骤 3:挂载启用 Swap
[root@localhost ~]# swapon /dev/sde1
步骤 4:验证
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 972 423 70 14 478 319
Swap: 3071 0 3071
Swap 从 2047MB 增加到 3071MB,增加了约 1GB!
永久生效
将 Swap 写入 /etc/fstab 实现开机自动启用:
/dev/sde1 swap swap defaults 0 0
补充:使用文件创建 Swap(无需额外分区)
如果磁盘没有空闲空间创建新分区,可以用文件代替:
# 1. 创建 1GB 的空文件
[root@localhost ~]# dd if=/dev/zero of=/swapfile bs=1M count=1024
# 2. 设置权限
[root@localhost ~]# chmod 600 /swapfile
# 3. 格式化为 Swap
[root@localhost ~]# mkswap /swapfile
# 4. 启用 Swap
[root@localhost ~]# swapon /swapfile
# 5. 永久生效
[root@localhost ~]# echo '/swapfile swap swap defaults 0 0' >> /etc/fstab
常见问题
Q1:mount -a 报语法错误怎么办?
/etc/fstab 格式非常严格,字段之间用空格或制表符分隔。检查:
- 文件系统类型是否正确(ext4、xfs 等)
- 设备路径是否正确
- 不要有多余的字符
Q2:如何查看磁盘的 UUID?
[root@localhost ~]# blkid
/dev/sr0: UUID="2018-11-25-23-54-16-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos"
/dev/sda1: UUID="da4c4904-e35a-4183-bcae-1401931f0eb0" TYPE="xfs"
/dev/sda2: UUID="EhMPvf-eM0X-lNwi-GaU7-Jsrg-tCqA-8FzTl9" TYPE="LVM2_member"
/dev/sdb1: UUID="9de06345-873e-4284-a2ac-ad1f6466f659" TYPE="ext4"
/dev/sdb2: UUID="41b8a9d8-87fd-4c35-8b10-b0fba792fb6e" TYPE="ext4"
/dev/sdb3: UUID="cf826307-c9e2-4aa7-b7d8-2ddf9ee5d6d7" TYPE="ext4"
/dev/sdb4: UUID="c73034bf-83bb-46c4-b965-f0dee09ad9f1" TYPE="ext4"
/dev/sdd: UUID="8COQ1V-wap7-Z8OC-HRyn-PWsL-nAlf-ZNUmhL" TYPE="LVM2_member"
/dev/sde1: UUID="d58082bb-f4d3-4ab3-a5f1-c7fc25e32041" TYPE="swap"
/dev/mapper/vg1-lv1: UUID="3bc6e6c1-176a-46e7-9e31-d4acbe2fd6d1" TYPE="ext4"
在生产环境中,建议使用 UUID 而非设备名(
/dev/sdb1)来挂载磁盘,因为设备名可能因硬件变动而改变:UUID=xxxx-xxxx /mnt/disk1 ext4 defaults 0 0
Q3:如何安全卸载分区?
# 1. 确保没有进程在使用该分区
[root@localhost ~]# lsof /mnt/disk1
# 2. 卸载
[root@localhost ~]# umount /mnt/disk1
# 3. 如果提示"设备忙",可以强制卸载
[root@localhost ~]# umount -l /mnt/disk1
Q4:LV 扩容后忘记执行 resize2fs 会怎样?
LV 的底层空间会增大,但文件系统不知道底层变化,df 显示的大小不会改变。务必在 lvextend 后执行文件系统扩容命令。
快捷方式:可以直接使用
lvextend -r参数,自动完成文件系统扩容:[root@localhost ~]# lvextend -r -L +200M /dev/vg1/lv1
最佳实践
分区前先规划好大小
- 使用
fdisk -l确认磁盘总容量 - 根据业务需求合理划分分区
- 使用
LVM 是生产环境首选
- LVM 提供灵活的扩容和缩容能力
- 建议所有数据盘都使用 LVM 管理
永久挂载使用 UUID
- 设备名
/dev/sdb1可能变化 - UUID 是唯一标识,更可靠
- 设备名
修改 fstab 前先测试
- 先用
mount -a测试 fstab 是否正确 - 错误的 fstab 配置可能导致系统无法启动
- 先用
合理配置 Swap
- 内存充足时 Swap 使用率应接近 0
- 可以通过
vm.swappiness调整系统使用 Swap 的倾向:# 查看当前值(默认 30)
cat /proc/sys/vm/swappiness
# 临时修改
sysctl vm.swappiness=10
# 永久修改
echo 'vm.swappiness=10' >> /etc/sysctl.conf
总结
通过本章节的学习,你应该掌握了:
- 理解磁盘的物理结构(盘面、磁道、扇区、柱面)
- 掌握 MBR 和 GPT 两种分区方式的区别
- 使用
fdisk创建和管理分区(主分区、扩展分区、逻辑分区) - 使用
mkfs格式化分区创建文件系统 - 使用
mount挂载分区到目录 - 通过
/etc/fstab实现永久挂载 - 使用 LVM 管理逻辑卷(PV → VG → LV)
- 灵活扩容 VG 和 LV
- 创建和管理 Swap 交换分区
学习建议:存储管理是 Linux 运维的基石。建议在虚拟机中添加多块磁盘,反复练习分区、LVM 创建、扩容等操作流程。实际操作一遍,胜过阅读十遍文档!