Linux 磁盘挂载、分区与 LVM 分卷实战
欢迎你来读这篇博客,这篇博客主要是关于 Linux 磁盘挂载、分区、分卷和 LVM 管理。
在服务器运维、Docker 数据目录迁移、数据库磁盘扩容、日志盘挂载、云服务器数据盘初始化这些场景里,磁盘管理都是绕不开的基础能力。
这块知识看起来命令很多:mount、fdisk、parted、mkfs、blkid、lsblk、fstab、pvcreate、vgcreate、lvcreate、lvextend……
但只要把它们放到一条主线里,其实很清晰:
磁盘来了,先识别;
要用它,先分区;
要存文件,建文件系统;
要访问它,挂载到目录;
要开机还在,写入 fstab;
要灵活扩容,交给 LVM。
序言
Linux 里有一句非常经典的话:
Everything is a file.
磁盘也不例外。
我们平时看到的 /dev/sda、/dev/vda、/dev/nvme0n1、/dev/sdb1,本质上都是块设备文件。
但是,磁盘并不是插上去就能直接优雅使用。一个完整的磁盘使用链路通常是这样的:
flowchart LR
A[物理磁盘 /dev/sdb] --> B[分区表 GPT/MBR]
B --> C[分区 /dev/sdb1]
C --> D[文件系统 ext4/xfs]
D --> E[挂载点 /data]
E --> F[业务读写文件]
如果使用 LVM,链路会变成这样:
flowchart LR
A[物理磁盘 /dev/sdb] --> B[分区 /dev/sdb1]
B --> C[PV 物理卷]
C --> D[VG 卷组]
D --> E[LV 逻辑卷]
E --> F[文件系统 ext4/xfs]
F --> G[挂载点 /data]
这篇文章会围绕以下几个核心工具展开:
| 工具 | 作用 |
|---|---|
lsblk |
查看块设备结构 |
blkid |
查看文件系统 UUID、类型 |
df |
查看已挂载文件系统空间 |
findmnt |
查看挂载关系 |
fdisk |
交互式分区工具,常用于普通磁盘分区 |
parted |
分区工具,适合 GPT、大磁盘、脚本化、调整分区 |
mkfs |
创建文件系统 |
mount |
临时挂载文件系统 |
umount |
卸载文件系统 |
/etc/fstab |
配置开机自动挂载 |
pvcreate |
创建 LVM 物理卷 |
vgcreate |
创建 LVM 卷组 |
lvcreate |
创建 LVM 逻辑卷 |
lvextend |
扩容 LVM 逻辑卷 |
pvresize |
调整 LVM 物理卷大小 |
正文
一、先理解 Linux 磁盘命名
Linux 中常见磁盘命名如下:
| 设备名 | 常见场景 |
|---|---|
/dev/sda |
SATA、SCSI、传统虚拟磁盘 |
/dev/sdb |
第二块 SATA/SCSI 磁盘 |
/dev/vda |
KVM、VirtIO 虚拟磁盘 |
/dev/xvda |
Xen 虚拟化环境 |
/dev/nvme0n1 |
NVMe SSD |
/dev/sda1 |
/dev/sda 的第一个分区 |
/dev/nvme0n1p1 |
NVMe 磁盘的第一个分区 |
普通磁盘分区命名一般是:
1 | |
NVMe 磁盘命名一般是:
1 | |
这里要注意一个细节:
/dev/sdb是整块磁盘,/dev/sdb1是这块磁盘上的第一个分区。
千万不要看到一个设备名就直接 mkfs,不然你可能一键把生产环境打成“考古现场”。命令不背锅,手才背锅。
二、磁盘管理的基本流程
一般新增一块磁盘后,标准流程如下:
flowchart TD
A[新增磁盘] --> B[lsblk 查看磁盘]
B --> C[fdisk/parted 创建分区]
C --> D[partprobe 重新读取分区表]
D --> E[mkfs 创建文件系统]
E --> F[mkdir 创建挂载点]
F --> G[mount 临时挂载]
G --> H[blkid 获取 UUID]
H --> I[写入 /etc/fstab]
I --> J[mount -a 测试开机挂载配置]
对应命令大致如下:
1 | |
三、查看磁盘信息
1. lsblk:查看块设备结构
lsblk 是最常用的磁盘查看命令。
1 | |
输出示例:
1 | |
更推荐使用详细格式:
1 | |
或者:
1 | |
示例:
1 | |
如果看到 sdb 没有分区、没有文件系统、没有挂载点,就说明它大概率是一块新盘。
2. fdisk -l:查看分区表
1 | |
查看指定磁盘:
1 | |
示例:
1 | |
重点看:
| 字段 | 含义 |
|---|---|
Disk |
磁盘名称和大小 |
Disklabel type |
分区表类型,如 dos 或 gpt |
Device |
分区名称 |
Size |
分区大小 |
Type |
分区类型 |
3. blkid:查看 UUID 和文件系统类型
1 | |
查看指定分区:
1 | |
输出示例:
1 | |
UUID 非常重要,因为后面写 /etc/fstab 时,推荐使用 UUID,而不是 /dev/sdb1。
原因是:
/dev/sdb1这种设备名可能会因为磁盘识别顺序变化而改变,但 UUID 基本稳定。
4. df:查看文件系统空间
1 | |
带文件系统类型:
1 | |
输出示例:
1 | |
df 看的是“已经挂载的文件系统”,不是所有磁盘。
所以新磁盘如果还没挂载,df -h 里是看不到的。
5. findmnt:查看挂载关系
1 | |
查看指定目录:
1 | |
输出示例:
1 | |
findmnt 比 mount 命令输出更清晰,非常适合排查挂载问题。
四、分区表:MBR 与 GPT
在给磁盘分区之前,先要理解分区表。
常见分区表有两种:
| 分区表 | 说明 |
|---|---|
| MBR / DOS | 老式分区表,兼容性好,但限制较多 |
| GPT | 新式分区表,适合大磁盘和现代系统 |
1. MBR
MBR 也叫 DOS 分区表。
特点:
| 特点 | 说明 |
|---|---|
| 兼容性 | 很好 |
| 最大磁盘支持 | 通常不适合超过 2TB 的磁盘 |
| 主分区数量 | 最多 4 个主分区 |
| 扩展分区 | 可以通过扩展分区绕过主分区数量限制 |
2. GPT
GPT 是现代 Linux 服务器更推荐的分区表。
特点:
| 特点 | 说明 |
|---|---|
| 支持大磁盘 | 适合 TB 级、PB 级磁盘 |
| 分区数量多 | 不再受 MBR 4 个主分区的传统限制 |
| 可靠性更好 | 分区表有主备结构 |
| 现代系统推荐 | 云服务器、NVMe、大容量数据盘更适合 GPT |
一般建议:
| 场景 | 推荐 |
|---|---|
| 新数据盘 | GPT |
| 大于 2TB 的磁盘 | GPT |
| 老系统兼容 | MBR |
| 生产服务器 | GPT |
| 自动化脚本 | parted + GPT |
五、fdisk 分区实战
fdisk 是一个交互式分区工具,适合手动创建和修改分区。
假设现在新增一块磁盘 /dev/sdb,我们要把它分成一个完整的数据分区并挂载到 /data。
1. 查看磁盘
1 | |
确认 /dev/sdb 是新磁盘:
1 | |
2. 进入 fdisk
1 | |
进入后输入 m 可以查看帮助:
1 | |
常用命令:
| 命令 | 作用 |
|---|---|
m |
查看帮助 |
p |
打印当前分区表 |
g |
创建 GPT 分区表 |
o |
创建 MBR/DOS 分区表 |
n |
新建分区 |
d |
删除分区 |
t |
修改分区类型 |
w |
保存并退出 |
q |
不保存退出 |
3. 创建 GPT 分区表
1 | |
提示:
1 | |
4. 新建分区
1 | |
一路回车,使用默认值,表示创建一个占满整块磁盘的分区。
如果只想创建 100G 分区,可以在 Last sector 的地方输入:
1 | |
5. 查看分区
1 | |
示例:
1 | |
6. 保存分区表
1 | |
注意:
fdisk在输入w之前通常不会真正写入分区表。
但一旦w写入,就不是“试试看”了,而是“真动刀”了。
7. 重新读取分区表
1 | |
或者:
1 | |
再查看:
1 | |
应该能看到:
1 | |
六、parted 分区实战
parted 也是分区工具,相比 fdisk,它更适合:
| 场景 | 是否推荐 parted |
|---|---|
| 大于 2TB 的磁盘 | 推荐 |
| GPT 分区 | 推荐 |
| 脚本化创建分区 | 推荐 |
| 调整分区大小 | 推荐 |
| 临时手动分一个小盘 | fdisk 也可以 |
1. 交互式使用 parted
1 | |
查看当前信息:
1 | |
创建 GPT 分区表:
1 | |
创建分区:
1 | |
退出:
1 | |
注意:
parted的很多操作是立即生效的,不像fdisk那样最后输入w才统一写入。
所以使用parted前一定要确认磁盘名,别拿生产盘练手。
2. parted 脚本化分区
创建一整块数据盘分区:
1 | |
解释一下:
| 参数 | 含义 |
|---|---|
-s |
script 模式,不进入交互 |
mklabel gpt |
创建 GPT 分区表 |
-a optimal |
使用最优对齐 |
mkpart primary xfs 1MiB 100% |
创建从 1MiB 到磁盘末尾的分区 |
3. parted 查看分区
1 | |
输出示例:
1 | |
这里有个细节:
parted mkpart只是创建分区,不会创建文件系统。
文件系统需要用mkfs.ext4或mkfs.xfs单独创建。
七、创建文件系统:mkfs
分区完成之后,磁盘还不能直接存文件。
还需要创建文件系统。
常见文件系统:
| 文件系统 | 特点 |
|---|---|
| ext4 | 通用、稳定、兼容性好、支持缩容 |
| xfs | 高性能,适合大文件、大容量场景,但不支持缩容 |
| btrfs | 支持快照、压缩等高级特性 |
| swap | 交换分区,不是普通文件系统 |
1. 创建 XFS 文件系统
1 | |
如果磁盘上已有文件系统,需要强制格式化:
1 | |
慎用 -f。
它的意思不是“放心”,而是“我知道我在毁灭什么”。
2. 创建 ext4 文件系统
1 | |
指定 Label:
1 | |
3. 查看文件系统
1 | |
输出示例:
1 | |
八、mount 挂载实战
Linux 不是像 Windows 那样通过 C 盘、D 盘访问磁盘。
Linux 是把文件系统挂载到某个目录上。
例如:
1 | |
访问 /data,实际就是访问 /dev/sdb1 这个分区里的文件系统。
1. 创建挂载点
1 | |
2. 临时挂载
1 | |
查看:
1 | |
或者:
1 | |
3. 指定文件系统类型挂载
1 | |
一般情况下,系统可以自动识别文件系统类型,不写 -t 也可以。
4. 只读挂载
1 | |
适合数据恢复、排查问题时避免误写。
5. 重新挂载
1 | |
或者:
1 | |
6. bind mount
bind mount 可以把一个目录挂载到另一个目录。
1 | |
查看:
1 | |
这种方式在容器、chroot、目录隔离、日志目录映射中很常见。
7. tmpfs 挂载
tmpfs 是内存文件系统,适合临时缓存。
1 | |
查看:
1 | |
注意:
tmpfs 数据在重启后会消失,不要把数据库放进去。
除非你想体验一次“缓存即人生,重启即空”。
九、umount 卸载文件系统
卸载命令是 umount,不是 unmount。
1 | |
或者:
1 | |
1. device is busy 问题
如果提示:
1 | |
说明有进程正在使用这个目录。
查看占用进程:
1 | |
或者:
1 | |
示例:
1 | |
如果是自己 shell 当前就在 /data 目录下,也会导致卸载失败。
解决:
1 | |
强制杀进程要非常谨慎:
1 | |
生产环境不要随手用这个命令。
它很有效,也很“缺德”。
2. 懒卸载
1 | |
-l 表示 lazy unmount。
它会先从目录树中解除挂载关系,等设备不再忙时再清理。
这个命令适合某些卡住的场景,但不要把它当常规手段。
十、/etc/fstab:开机自动挂载
mount 命令只是临时挂载。
重启之后,挂载关系会消失。
如果想开机自动挂载,需要写入:
1 | |
1. fstab 格式
/etc/fstab 每一行格式如下:
1 | |
示例:
1 | |
字段解释:
| 字段 | 说明 |
|---|---|
UUID=... |
要挂载的设备 |
/data |
挂载点 |
xfs |
文件系统类型 |
defaults,nofail |
挂载参数 |
0 |
dump 备份标记,通常为 0 |
0 |
fsck 检查顺序,根分区通常为 1,普通分区可为 2 或 0 |
2. 为什么推荐 UUID
不推荐这样写:
1 | |
更推荐这样写:
1 | |
原因是:
/dev/sdb1可能因为磁盘识别顺序变化变成/dev/sdc1,但 UUID 不会轻易变化。
获取 UUID:
1 | |
3. 常用挂载参数
| 参数 | 作用 |
|---|---|
defaults |
默认参数 |
rw |
可读写 |
ro |
只读 |
nofail |
挂载失败不阻塞启动 |
noatime |
不更新访问时间,减少写入 |
relatime |
相对访问时间,常见默认值 |
nodev |
不解析设备文件 |
nosuid |
禁用 suid |
noexec |
禁止执行二进制文件 |
x-systemd.automount |
systemd 自动挂载 |
x-systemd.device-timeout=10s |
设备等待超时时间 |
普通数据盘示例:
1 | |
日志盘示例:
1 | |
更安全的临时上传目录:
1 | |
4. 修改 fstab 后一定要测试
修改 /etc/fstab 后,千万不要直接重启。
先执行:
1 | |
如果没有报错,再检查:
1 | |
也可以使用:
1 | |
如果 fstab 写错,服务器可能启动时卡住。
所以改 fstab 的原则是:
写完不测试,重启两行泪。
十一、fdisk + mount 完整案例:挂载一块普通数据盘
目标:
| 项目 | 值 |
|---|---|
| 新磁盘 | /dev/sdb |
| 分区 | /dev/sdb1 |
| 文件系统 | xfs |
| 挂载点 | /data |
| 开机自动挂载 | 是 |
1. 查看磁盘
1 | |
确认 /dev/sdb 是新盘。
2. 分区
1 | |
交互流程:
1 | |
3. 重新读取分区
1 | |
4. 创建文件系统
1 | |
5. 创建挂载点
1 | |
6. 临时挂载
1 | |
7. 查看结果
1 | |
8. 获取 UUID
1 | |
示例:
1 | |
9. 写入 fstab
1 | |
追加:
1 | |
10. 测试
1 | |
完成。
十二、parted 完整案例:脚本化初始化数据盘
目标:
| 项目 | 值 |
|---|---|
| 新磁盘 | /dev/sdb |
| 分区表 | GPT |
| 分区大小 | 使用整块磁盘 |
| 文件系统 | ext4 |
| 挂载点 | /data |
脚本如下:
1 | |
保存为:
1 | |
执行:
1 | |
注意:
这个脚本会清空目标磁盘分区表,只适合新盘初始化。
不要对已有数据盘直接执行。
十三、LVM 是什么?
LVM 全称是 Logical Volume Manager,逻辑卷管理器。
普通分区模式是:
flowchart LR
A[磁盘] --> B[分区]
B --> C[文件系统]
C --> D[挂载点]
LVM 模式是:
flowchart LR
A[磁盘1] --> C[PV]
B[磁盘2] --> D[PV]
C --> E[VG 卷组]
D --> E
E --> F[LV 逻辑卷1]
E --> G[LV 逻辑卷2]
F --> H[文件系统]
H --> I[挂载点 /data]
LVM 的核心价值是:
把底层物理磁盘抽象成资源池,然后从资源池里切逻辑卷使用。
这就像你不再直接拿一块块砖头盖房子,而是先把砖头、钢筋、水泥都放进一个材料仓库,然后按需要建卧室、厨房、车库。
当然,前提是你别把厨房建在数据库日志盘上,生活已经够难了。
十四、LVM 三层模型:PV、VG、LV
LVM 主要有三层:
| 层级 | 全称 | 作用 |
|---|---|---|
| PV | Physical Volume | 物理卷,由磁盘或分区初始化而来 |
| VG | Volume Group | 卷组,把多个 PV 聚合成一个存储池 |
| LV | Logical Volume | 逻辑卷,从 VG 中划分出来给文件系统使用 |
关系如下:
flowchart TD
A['/dev/sdb1'] --> B[PV]
C['/dev/sdc1'] --> D[PV]
B --> E[VG: vg_data]
D --> E
E --> F[LV: lv_app]
E --> G[LV: lv_log]
F --> H['/app']
G --> I['/log']
简单理解:
| 概念 | 类比 |
|---|---|
| PV | 一块原材料 |
| VG | 一个资源池 |
| LV | 从资源池切出来的虚拟磁盘 |
| 文件系统 | 给虚拟磁盘铺格式 |
| 挂载点 | 对外使用入口 |
十五、LVM 常用命令
1. 查看命令
1 | |
2. 创建命令
1 | |
3. 扩容命令
1 | |
4. 文件系统扩容
XFS:
1 | |
ext4:
1 | |
也可以使用:
1 | |
-r 表示扩容 LV 后同时尝试扩容文件系统。
十六、LVM 完整案例:创建逻辑卷并挂载
目标:
| 项目 | 值 |
|---|---|
| 磁盘 | /dev/sdb |
| 分区 | /dev/sdb1 |
| PV | /dev/sdb1 |
| VG | vg_data |
| LV | lv_app |
| 文件系统 | xfs |
| 挂载点 | /data |
1. 创建分区
1 | |
2. 创建 PV
1 | |
查看:
1 | |
输出示例:
1 | |
3. 创建 VG
1 | |
查看:
1 | |
输出示例:
1 | |
4. 创建 LV
创建 100G 逻辑卷:
1 | |
如果要使用全部空间:
1 | |
查看:
1 | |
输出示例:
1 | |
逻辑卷路径通常是:
1 | |
或者:
1 | |
5. 创建文件系统
1 | |
6. 创建挂载点并挂载
1 | |
7. 写入 fstab
获取 UUID:
1 | |
追加到 /etc/fstab:
1 | |
测试:
1 | |
十七、LVM 扩容场景一:新增一块磁盘扩容
这是生产环境非常常见的场景。
当前:
1 | |
新增一块 /dev/sdc,想扩容到 /data。
1. 给新磁盘分区
1 | |
2. 创建 PV
1 | |
3. 加入已有 VG
1 | |
查看 VG 空间:
1 | |
4. 扩展 LV
把所有空闲空间都给 /data:
1 | |
也可以只增加 100G:
1 | |
5. 扩展文件系统
如果是 XFS:
1 | |
如果是 ext4:
1 | |
6. 查看结果
1 | |
完整流程:
flowchart TD
A[新增磁盘 /dev/sdc] --> B[创建分区 /dev/sdc1]
B --> C[pvcreate /dev/sdc1]
C --> D[vgextend vg_data /dev/sdc1]
D --> E[lvextend lv_app]
E --> F[xfs_growfs 或 resize2fs]
F --> G[/data 容量变大]
十八、LVM 扩容场景二:云盘本身扩容
云服务器里还有一种常见情况:
不是新增一块磁盘,而是在云控制台把原来的磁盘从 100G 扩到了 200G。
比如:
1 | |
这时系统里可能看到磁盘变大了,但分区、PV、LV、文件系统还没变大。
整体流程:
flowchart TD
A[云控制台扩容磁盘] --> B[系统识别磁盘变大]
B --> C[扩展分区]
C --> D[pvresize 扩展 PV]
D --> E[lvextend 扩展 LV]
E --> F[扩展文件系统]
1. 查看磁盘
1 | |
假设看到:
1 | |
说明磁盘已经是 200G,但分区还是 100G。
2. 扩展分区
使用 parted:
1 | |
进入后:
1 | |
重新读取分区表:
1 | |
再次查看:
1 | |
应该变成:
1 | |
3. 扩展 PV
1 | |
查看:
1 | |
4. 扩展 LV
1 | |
5. 扩展文件系统
XFS:
1 | |
ext4:
1 | |
6. 验证
1 | |
十九、LVM 缩容要非常谨慎
扩容一般比较安全,缩容就危险得多。
尤其是 XFS:
XFS 不支持缩容。
ext4 支持缩容,但流程也比较危险,通常需要:
- 备份数据
- 卸载文件系统
- 检查文件系统
- 先缩文件系统
- 再缩 LV
- 重新挂载
大致流程:
1 | |
更稳妥的方式是:
1 | |
但是,即使用 --resizefs,也不代表可以不备份。
缩容原则:
先缩文件系统,再缩块设备。
顺序反了,数据就没了。
数据没了,人也安静了。
生产环境里,如果不是非常必要,尽量不要缩容。
更推荐新建小卷、迁移数据、验证后切换。
二十、普通分区和 LVM 怎么选?
| 场景 | 推荐方案 |
|---|---|
| 临时测试机 | 普通分区 |
| 简单数据盘 | 普通分区 |
| Docker 数据目录 | LVM 或独立数据盘 |
| 数据库数据盘 | LVM,或者云盘直接管理 |
| 日志盘 | LVM |
| 经常扩容 | LVM |
| 多块盘合并管理 | LVM |
| 要做快照 | LVM 或云盘快照 |
| 对运维能力要求低 | 普通分区 |
| 追求长期灵活性 | LVM |
我的建议:
单机简单业务,普通分区够用。
生产环境长期跑服务,尤其是数据目录、日志目录、数据库目录,优先考虑 LVM 或云厂商块存储方案。
二十一、文件系统选择:ext4 还是 xfs?
1. ext4
优点:
| 优点 | 说明 |
|---|---|
| 稳定成熟 | 使用广泛 |
| 兼容性好 | 各类发行版支持好 |
| 支持缩容 | 相比 XFS 更灵活 |
| 适合普通场景 | 中小型数据盘非常合适 |
2. xfs
优点:
| 优点 | 说明 |
|---|---|
| 大文件性能好 | 适合大容量、大文件 |
| 扩容方便 | 在线扩容体验好 |
| 适合日志/数据盘 | 生产环境常见 |
| 元数据性能好 | 大目录、大文件场景表现不错 |
缺点:
| 缺点 | 说明 |
|---|---|
| 不支持缩容 | 一旦建大了,不能直接缩小 |
选择建议:
| 场景 | 推荐 |
|---|---|
| 普通 Web 服务数据盘 | ext4 / xfs 都可以 |
| 大日志目录 | xfs |
| 数据库数据盘 | xfs 常见 |
| 需要可能缩容 | ext4 |
| RHEL/CentOS 系 | xfs 很常见 |
| Debian/Ubuntu 普通场景 | ext4 很常见 |
二十二、挂载 Docker 数据目录案例
Docker 默认数据目录通常是:
1 | |
如果根分区空间不大,Docker 镜像、容器、日志很容易把 / 撑爆。
可以把新盘挂载到 /var/lib/docker。
1. 停止 Docker
1 | |
2. 准备新磁盘并挂载到临时目录
假设新盘已经格式化为 /dev/sdb1。
1 | |
3. 迁移原数据
1 | |
4. 备份旧目录
1 | |
5. 卸载临时目录并挂载到正式目录
1 | |
6. 写入 fstab
获取 UUID:
1 | |
写入:
1 | |
7. 测试并启动 Docker
1 | |
确认:
1 | |
8. 验证没有问题后删除备份
1 | |
注意:
删除备份前一定要确认容器、镜像、数据卷都正常。
不要为了省几 GB,省出一个通宵事故。
二十三、挂载数据库数据盘案例
以 MySQL 为例,假设要把数据目录放到 /data/mysql。
1. 创建挂载点
1 | |
2. 挂载数据盘
1 | |
3. 创建 MySQL 数据目录
1 | |
4. 修改 MySQL 配置
1 | |
5. fstab 示例
1 | |
数据库目录建议:
| 项目 | 建议 |
|---|---|
| 独立磁盘 | 推荐 |
| 独立挂载点 | 推荐 |
| 使用 UUID | 推荐 |
| noatime | 可以考虑 |
| 随便迁移 | 不推荐 |
| 没备份就操作 | 强烈不推荐 |
二十四、swap 分区和 swap 文件
除了普通数据盘,Linux 还可以配置 swap。
1. 创建 swap 分区
假设 /dev/sdb2 是 swap 分区:
1 | |
查看:
1 | |
写入 /etc/fstab:
1 | |
2. 创建 swap 文件
1 | |
写入 /etc/fstab:
1 | |
查看:
1 | |
注意:
swap 不是内存平替。
它是兜底,不是性能加速器。
真缺内存,最终还是要加内存或者优化程序。
二十五、常见故障排查
1. df 看不到新磁盘
原因:
df 只显示已挂载文件系统。
排查:
1 | |
如果 lsblk 能看到新盘,但 df 看不到,说明还没挂载。
2. mount 报错 unknown filesystem type
示例:
1 | |
可能原因:
- 系统缺少对应文件系统工具包
- 文件系统类型写错
- 分区还没格式化
- 分区损坏
排查:
1 | |
安装工具:
1 | |
3. mount 报错 already mounted
查看挂载关系:
1 | |
如果已经挂载,不要重复挂载。
4. umount 报错 target is busy
查看占用:
1 | |
常见原因:
- 当前 shell 在
/data目录下 - 应用进程正在读写
- Docker 容器占用
- NFS 或其他服务占用
5. fstab 写错导致启动失败
解决思路:
- 进入救援模式
- 重新挂载根分区为读写
- 修改
/etc/fstab - 注释错误挂载项
- 重启
所以修改后一定要测试:
1 | |
6. 挂载到非空目录后文件“不见了”
比如 /data 里原来有文件:
1 | |
然后你执行:
1 | |
这时 /data/a.txt 看起来“不见了”。
其实不是删除了,而是被新挂载的文件系统遮住了。
卸载后又会出现:
1 | |
所以挂载点最好使用空目录。
7. 删除分区后空间没变化
你可能只是删了分区表,文件系统和挂载关系还在内核中。
排查:
1 | |
必要时:
1 | |
或者重启。
8. LVM 扩容后 df 没变
可能你只扩了 LV,没有扩文件系统。
查看:
1 | |
如果 lvs 变大了,但 df 没变,说明文件系统还没扩。
XFS:
1 | |
ext4:
1 | |
二十六、生产环境操作建议
1. 操作前先确认磁盘
至少执行:
1 | |
确认:
- 哪块是系统盘
- 哪块是新盘
- 有没有文件系统
- 有没有挂载点
- 有没有业务数据
2. 危险命令前先停一下
危险命令包括:
1 | |
这些命令执行前都要确认:
1 | |
3. 生产环境优先使用 UUID
/etc/fstab 推荐:
1 | |
不推荐:
1 | |
4. 修改 fstab 后必须测试
1 | |
5. 数据盘建议独立挂载
常见目录:
| 目录 | 说明 |
|---|---|
/data |
通用数据目录 |
/var/lib/docker |
Docker 数据目录 |
/var/lib/mysql |
MySQL 数据目录 |
/data/mysql |
自定义 MySQL 数据目录 |
/data/postgresql |
PostgreSQL 数据目录 |
/data/redis |
Redis 持久化目录 |
/var/log |
日志目录 |
/backup |
备份目录 |
6. 数据库和日志尽量不要挤在根分区
根分区爆了,系统会出现很多奇怪问题:
- SSH 登录异常
- 日志写不进去
- 服务无法启动
- 数据库无法写入
- Docker 无法创建容器
- 包管理器无法安装软件
根分区爆满不是“小问题”,它是很多事故的“起手式”。
二十七、常用命令速查表
1. 查看类
1 | |
2. 分区类
1 | |
3. 文件系统类
1 | |
4. 挂载类
1 | |
5. LVM 类
1 | |
二十八、完整推荐流程
场景一:普通数据盘
1 | |
场景二:大磁盘或脚本化
1 | |
场景三:LVM 数据盘
1 | |
场景四:LVM 新增磁盘扩容
1 | |
场景五:云盘原盘扩容
1 | |
二十九、启示录
Linux 磁盘管理看起来命令很多,但真正核心的就两条线。
第一条是普通分区线:
1 | |
第二条是 LVM 线:
1 | |
如果只是临时挂一块小数据盘,fdisk + mkfs + mount + fstab 就够了。
如果是生产服务器,尤其是数据库、Docker、日志、备份目录,建议认真考虑 LVM,因为后续扩容会舒服很多。
最后记住几个原则:
- 操作前先
lsblk - 格式化前先
blkid - 挂载后用
df -hT和findmnt验证 - 开机挂载用 UUID
- 改完
/etc/fstab必须mount -a - XFS 可以在线扩容,但不能缩容
- LVM 扩容容易,缩容危险
- 生产环境动磁盘前必须备份
磁盘管理不是炫技,它是服务器稳定性的地基。
地基打好了,上层服务才不会一边跑业务,一边表演“根分区爆满行为艺术”。
富贵岂由人,时会高志须酬。
能成功于千载者,必以近察远。