Linux磁盘分区与Swap和磁盘故障查询
Linux 磁盘分区 GPT、swap 与磁盘故障排查总结
一、磁盘分区实操:GPT
GPT,全称是GUID Partition Table,中文一般叫“全局唯一标识分区表”。
如果说 MBR 是老式分区表,那么 GPT 就是现在新服务器、大容量磁盘更常见的分区方式。尤其是磁盘容量超过 2TB,或者服务器使用 UEFI 引导时,GPT 基本就是优先选择。
1. MBR 和 GPT 的区别
MBR 和 GPT 都是分区表,作用都是记录“磁盘被怎么分区了”。区别在于:MBR 设计比较早,结构简单,兼容老系统;GPT 设计更现代,支持更大的磁盘、更多分区,并且有校验和备份机制。
分区表结构
MBR:
- MBR 分区表位于磁盘的第 0 磁道、第 0 柱面、第 1 扇区,也就是通常说的磁盘第一个扇区。
- MBR 分区表大小为 512 字节,其中包含:
- 446 字节引导代码
- 64 字节分区表
- 2 字节结束标志
55AA
- MBR 最多支持 4 个主分区,或者 3 个主分区加 1 个扩展分区。
- 分区表信息在固定位置,一旦损坏,恢复成本比较高。
GPT:
- GPT 分区表位于磁盘的开头和结尾,结尾处有冗余备份。
- GPT 使用 GUID 标识分区,分区信息更完整。
- GPT 通常支持最多 128 个主分区。
- GPT 分区表包含分区类型、分区名称、分区大小等更多信息。
分区大小限制
MBR:
- MBR 使用 32 位 LBA 表示分区起始和结束位置。
- 常见最大分区大小为 2TB。
- 如果磁盘使用 4KB 扇区,在特定系统支持下可以突破到更大,但兼容性不如 GPT。
GPT:
- GPT 使用 64 位 LBA。
- 理论最大分区大小可达到 9.4ZB。
- 更适合现代大容量磁盘。
数据完整性
MBR:
- 分区表固定放在磁盘开头。
- 没有内置校验机制。
- 如果 MBR 损坏,可能导致系统无法启动或分区信息丢失。
GPT:
- 磁盘开头和结尾都有分区表信息。
- 使用 CRC32 校验分区表完整性。
- 主分区表损坏时,可以尝试从备份分区表恢复。
应用场景
MBR 适合:
- 老系统
- 老硬件
- 小于 2TB 的磁盘
- BIOS 引导环境
GPT 适合:
- 新服务器
- 大容量磁盘
- UEFI 引导环境
- 对分区数量和数据完整性要求更高的场景
综合比较
| 特性 | MBR | GPT |
|---|---|---|
| 分区表位置 | 磁盘的第 1 扇区 | 磁盘的开头和结尾 |
| 最大分区数量 | 4 个主分区,或 3 个主分区 + 1 个扩展分区 | 128 个主分区 |
| 最大分区大小 | 2TB,或 16TB,取决于扇区大小 | 9.4ZB |
| 引导方式 | BIOS | UEFI |
| 数据完整性 | 无冗余备份,无校验机制 | 冗余备份,CRC32 校验 |
| 兼容性 | 广泛支持旧系统和硬件 | 主要支持现代系统和硬件 |
| 分区类型和名称 | 分区类型代码,无分区名称 | GUID 分区类型,支持分区名称 |
| 适用场景 | 旧系统、小型磁盘 | 现代系统、大容量磁盘 |
简单总结:新服务器、大容量磁盘,优先考虑 GPT;老系统兼容场景,再考虑 MBR。
2. parted 命令
parted是一个功能比较强的磁盘分区工具,可以创建、修改和管理磁盘分区。
和传统的fdisk相比,parted对 GPT 支持更好,也更适合处理大于 2TB 的磁盘。
常用操作
| 操作 | 说明 |
|---|---|
parted /dev/sdc | 进入指定磁盘的 parted 交互环境 |
print | 查看当前磁盘分区信息 |
help | 查看 parted 帮助信息 |
mklabel gpt | 创建 GPT 分区表 |
mktable gpt | 创建 GPT 分区表,和mklabel gpt类似 |
mkpart primary start end | 创建分区,指定分区类型、起始位置和结束位置 |
rm 分区号 | 删除指定编号的分区 |
q | 退出 parted,操作会自动生效 |
注意:如果要创建 MBR 分区表,在parted中一般使用mklabel msdos,不是写mbr。
操作示例:给/dev/sdc创建 10MB GPT 分区
先进入目标磁盘:
parted/dev/sdc在parted交互界面中查看当前分区:
print创建 GPT 分区表:
mklabel gpt创建一个 10MB 的主分区:
mkpart primary010MB查看创建结果:
print退出:
q回到系统后,可以通过lsblk查看分区是否已经生成:
lsblk如果后续要正常存放文件,还需要给分区创建文件系统并挂载,例如:
mkfs.xfs /dev/sdc1mkdir-p/datamount/dev/sdc1 /datadf-h操作磁盘前一定要确认设备名。比如/dev/sdb、/dev/sdc看起来只差一个字母,但如果选错盘,分区表可能直接被覆盖。
二、swap 分区实操
swap 是 Linux 的交换空间,可以理解为“磁盘上临时借给内存用的一块空间”。
当物理内存 RAM 不够时,Linux 内核会把一部分暂时不活跃的内存页换出到 swap 中,从而释放 RAM 给更活跃的进程使用。
1. swap 分区的作用
swap 主要有两个作用。
扩展可用内存:
当物理内存不足时,系统可以将不常用的数据移动到 swap,避免进程因为内存不足直接被系统杀掉。
提高系统稳定性:
swap 相当于一个缓冲区。它不能让系统变快,但能在内存紧张时给系统一点缓冲空间,避免瞬间崩掉。
2. swap 分区的缺点
swap 的缺点也很明显。
性能比内存低很多:
swap 位于磁盘上,磁盘读写速度远低于内存。如果系统频繁使用 swap,常见现象就是机器变慢、命令卡顿、服务响应变慢。
增加磁盘读写压力:
频繁使用 swap 会增加磁盘 I/O。对于 SSD 来说,长期大量 swap 还可能增加写入损耗。
所以 swap 的定位要明确:它是兜底缓冲,不是性能优化手段。应用长期吃满内存时,根因通常还是要优化程序或增加内存。
3. 创建 swap
假设系统中某个应用程序,比如 Java 程序占用大量内存,已经开始使用 swap。为了保证应用先正常运行,可以适当增加 swap 空间。
创建 swap 的步骤如下:
- 创建指定大小的文件
- 将文件格式化为 swap
- 启用 swap
- 配置永久启用
- 按需关闭 swap
第一步:创建文件
这里使用/dev/zero创建一个约 1GB 的文件:
[root@atguigu ~]# dd if=/dev/zero of=/tmp/swap_1g bs=1M count=1000记录了1000+0 的读入 记录了1000+0 的写出1048576000字节(1.0GB)已复制,33.1107 秒,31.7 MB/秒[root@atguigu ~]# ll /tmp/swap_1g-rw-r--r--1root root10485760006月3009:18 /tmp/swap_1g参数说明:
| 参数 | 说明 |
|---|---|
if=/dev/zero | 输入文件为/dev/zero,持续输出 0 |
of=/tmp/swap_1g | 输出文件路径 |
bs=1M | 每次写入 1MB |
count=1000 | 写入 1000 次,约 1GB |
第二步:格式化
使用mkswap将普通文件转换为 swap 文件:
[root@atguigu ~]# mkswap /tmp/swap_1g正在设置交换空间版本1,大小=1023996KiB 无标签,UUID=687d8ad0-5261-44e7-bf13-fd0a6f6149d8查看文件类型:
[root@atguigu ~]# file /tmp/swap_1g/tmp/swap_1g: Linux/i386 swapfile(new style), version1(4K pages), size255999pages, no label,UUID=687d8ad0-5261-44e7-bf13-fd0a6f6149d8第三步:启用
启用前先看当前内存和 swap:
[root@atguigu ~]# free -htotal usedfreeshared buff/cache available Mem:1.9G 223M 431M9.5M1.3G1.5G Swap:2.0G 0B2.0G修改 swap 文件权限:
[root@atguigu ~]# chmod 600 /tmp/swap_1g启用 swap:
[root@atguigu ~]# swapon /tmp/swap_1g再次查看:
[root@atguigu ~]# free -htotal usedfreeshared buff/cache available Mem:1.9G 224M 431M9.5M1.3G1.5G Swap:3.0G 0B3.0G可以看到 swap 从 2GB 增加到了 3GB。
第四步:永久启用
临时启用的 swap,重启后会失效。如果需要永久生效,可以写入/etc/fstab。
编辑配置文件:
vim/etc/fstab添加一行:
/tmp/swap_1g swap swap defaults00也可以把swapon /tmp/swap_1g写入rc.local,但更推荐使用/etc/fstab管理。
第五步:关闭 swap
查看当前 swap:
[root@atguigu ~]# free -htotal usedfreeshared buff/cache available Mem:1.9G 224M 430M9.5M1.3G1.5G Swap:3.0G 0B3.0G关闭指定 swap 文件:
[root@atguigu ~]# swapoff /tmp/swap_1g再次查看:
[root@atguigu ~]# free -htotal usedfreeshared buff/cache available Mem:1.9G 223M 431M9.5M1.3G1.5G Swap:2.0G 0B2.0G关闭所有 swap:
swapoff-a启用/etc/fstab中配置的所有 swap:
swapon-a三、企业分区方案
安装 Linux 时可以自动分区,也可以根据业务需要手动分区。
企业环境更推荐提前规划,因为分区方式会影响后续扩容、重装系统、数据保留和故障恢复。
1. 服务器数据不重要
这种场景常见于测试机、临时环境、可随时重建的服务器。
| 分区 | 作用与大小 | 补充 |
|---|---|---|
/boot引导分区 | 存放系统启动文件和内核镜像,推荐 1GB | |
swap | 内存大于 8GB,swap 配 8GB 即可;内存低于 8GB,可按 1.5 倍或 2 倍配置,最大 8GB | 公有云可以不配置;Java 服务建议配置一些 |
/根分区 | 所有剩余空间给根分区 | 简单省事 |
这种方式维护简单,但缺点是系统和数据混在一起。重装系统时,如果没有提前备份,数据容易一起丢。
2. 服务器存放重要数据
这种场景更接近生产环境。核心思路是:系统和业务数据分开。
| 分区 | 作用与大小 | 补充 |
|---|---|---|
/boot引导分区 | 存放系统启动文件和内核镜像,推荐 1GB | |
swap | 内存大于 8GB,swap 配 8GB 即可;内存低于 8GB,可按 1.5 倍或 2 倍配置,最大 8GB | 公有云可以不配置;Java 服务建议配置一些 |
/根分区 | 40GB 到 200GB,主要安装系统和软件 | 重要数据不要直接堆在根分区 |
/data | 剩余所有空间 | 重装系统时可以保留该分区,业务数据不受影响 |
比如数据库文件、业务上传文件、备份文件、应用日志等,都可以规划到/data或/data/mysql、/data/app这样的目录。
3. 不确定数据是否重要
如果前期业务还没有完全定型,可以预留空间。
| 分区 | 作用与大小 | 补充 |
|---|---|---|
/boot引导分区 | 存放系统启动文件和内核镜像,推荐 1GB | |
swap | 内存大于 8GB,swap 配 8GB 即可;内存低于 8GB,可按 1.5 倍或 2 倍配置,最大 8GB | 公有云可以不配置;Java 服务建议配置一些 |
/根分区 | 40GB 到 200GB | 安装系统和软件 |
| 剩余空间不划分 | 后续谁使用谁划分 | 方便后面按业务扩展 |
公有云上很多厂商默认不配置 swap,这是因为云服务器一般希望减少磁盘 I/O,提高整体性能。是否需要 swap,要结合服务类型判断。
四、企业故障案例:磁盘空间不足
Linux 系统磁盘不足时,经常会看到类似报错:
No space left on device生产环境中,磁盘使用率通常到 70% 左右就应该开始关注。如果等到 95%、100% 才处理,很多服务可能已经写不进日志、创建不了临时文件,甚至出现业务异常。
1. 磁盘空间不足的常见原因
磁盘空间不足主要有 3 类原因。
| 原因 | 表现 | 排查方向 |
|---|---|---|
| Block 不足 | 大文件太多,磁盘容量被占满 | df -h、du -sh |
| Inode 不足 | 小文件太多,容量还没满,但无法创建新文件 | df -i、find |
| 进程占用已删除文件 | 文件删了,但空间没有释放 | `lsof |
2. 原因 1:Block 不足
Block 不足是最常见的磁盘空间问题。简单说,就是大文件太多,真的把磁盘容量占满了。
场景模拟
创建一个大文件:
[root@atguigu ~]# dd if=/dev/zero of=/var/log/big bs=1M count=6000记录了6000+0 的读入 记录了6000+0 的写出6291456000字节(6.3GB)已复制,84.179 秒,74.7 MB/秒查看磁盘使用情况:
[root@atguigu ~]# df -h文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 979M0979M0% /dev tmpfs 991M0991M0% /dev/shm tmpfs 991M9.6M 981M1% /run tmpfs 991M0991M0% /sys/fs/cgroup /dev/mapper/centos-root 47G9.1G 38G20% / /dev/sdb1 17M1.1M 16M7% /data /dev/sda1 1014M 138M 877M14% /boot tmpfs 199M0199M0% /run/user/0这里根分区使用率变高了,下一步要逐层往下找。
排查方式
先看根目录下哪个目录最大:
[root@atguigu ~]# du -sh /* | sort -rhk16.6G /var1.4G /usr 1001M /tmp 121M /root 105M /boot 32M /etc9.6M /run 52K /atguigu 16K /home0/sys0/srv发现/var比较大,再查/var:
[root@atguigu ~]# du -sh /var/* | sort -rhk15.9G /var/log 620M /var/cache 71M /var/lib 16K /var/spool8.0K /var/db4.0K /var/tmp0/var/yp0/var/run继续查/var/log:
[root@atguigu ~]# du -sh /var/log/* | sort -rhk15.9G /var/log/big2.4M /var/log/anaconda1.4M /var/log/sa1.2M /var/log/messages-20250627 984K /var/log/audit最终定位到/var/log/big。
注意:生产环境中不能看到大文件就直接rm -f。尤其是日志、数据库文件、业务上传文件,要先确认文件用途,再决定清理、压缩、归档还是扩容。
3. 原因 2:Inode 不足
Inode 不足是 Linux 比较典型的问题。
每创建一个文件,就会消耗一个 inode。inode 用来保存文件属性信息,比如权限、属主、大小、时间戳、数据块位置等。
有时候磁盘容量明明还有,但创建文件还是报No space left on device,这就可能是 inode 被耗尽了。
场景模拟
创建一个 10MB 的小分区,挂载后模拟 inode 被耗尽:
[root@atguigu ~]# dd if=/dev/zero of=/tmp/10m bs=1M count=10[root@atguigu ~]# mkfs.ext4 /tmp/10m[root@atguigu ~]# mkdir /inode[root@atguigu ~]# mount /tmp/10m /inode查看挂载情况:
[root@atguigu ~]# df -h文件系统 容量 已用 可用 已用% 挂载点... /dev/loop08.7M 172K7.9M3% /inode查看 inode 使用情况:
[root@atguigu inode]# df -i文件系统 Inode 已用(I)可用(I)已用(I)% 挂载点... /dev/loop025601125491% /inode创建大量小文件:
[root@atguigu ~]# cd /inode/[root@atguigu inode]# touch inode{01..3000}.txttouch: 无法创建"inode2550.txt":设备上没有空间 touch: 无法创建"inode2551.txt":设备上没有空间 touch: 无法创建"inode2552.txt":设备上没有空间再次查看 inode:
[root@atguigu inode]# df -i文件系统 Inode 已用(I)可用(I)已用(I)% 挂载点... /dev/loop0256025600100% /inode此时容量没有完全用完,但 inode 已经 100%,所以无法继续创建新文件。
排查方式
方式一:查找比较大的目录:
find/-typed-size+1M方式二:统计文件集中在哪些目录:
find/-typef|xargsdirname|sort|uniq-c|sort-rn|head示例输出:
2549/inode877/usr/share/man/man3859/usr/share/man/man1711/usr/share/man/man8700/usr/bin如果某个目录下文件数量异常高,就要重点排查这个目录。
解决方案
找到小文件所在目录后,确认文件可删除,再进行清理。
如果一次性创建或删除大量文件,可能遇到参数列表过长:
-bash: /usr/bin/touch: 参数列表过长可以使用xargs解决:
echoa{01..350000}.txt|xargstouch删除大量文件时也可以用:
ls|xargsrm-f或者缩小匹配范围:
ls1*|xargsrm-f如果是千万级别小文件,逐个删除会非常慢。更实际的方式是删除整个目录,然后重新创建目录并恢复权限。
4. 原因 3:进程占用已删除文件
还有一种很容易误判的情况:文件已经被rm删除了,但空间没有释放。
原因是 Linux 文件真正释放要满足两个条件:
- 文件的引用计数为 0,也就是没有文件名指向它。
- 文件没有被任何进程打开。
如果一个日志文件正在被tail -f或某个服务进程打开,即使执行了rm,文件名入口没了,但进程仍然持有文件描述符,磁盘空间不会立即释放。
场景模拟
创建一个大文件:
[root@atguigu ~]# dd if=/dev/zero of=/var/log/test_big bs=1M count=6000查看磁盘:
[root@atguigu ~]# df -h文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 979M0979M0% /dev tmpfs 991M0991M0% /dev/shm tmpfs 991M9.6M 981M1% /run tmpfs 991M0991M0% /sys/fs/cgroup /dev/mapper/centos-root 47G7.5G 40G16% / /dev/sda1 1014M 138M 877M14% /boot tmpfs 199M0199M0% /run/user/0打开两个连接:
- 一个连接执行
tail -f /var/log/test_big占用文件。 - 另一个连接执行
rm /var/log/test_big删除文件。
再次查看磁盘,可能发现空间并没有释放。
排查方式
先用df -h看文件系统使用情况:
df-h再用du -sh /看目录真实占用:
du-sh/如果df显示占用很高,但du统计出来明显小很多,就要怀疑有“已删除但仍被进程占用”的文件。
安装lsof:
yuminstall-ylsof查看被进程占用的文件:
lsof|greptail查看已删除但仍被占用的文件:
lsof|grepdeleted示例:
tail12991root 3r REG253,0629145600033561843/var/log/test_big(deleted)其中deleted表示文件入口已经没了,但还有进程在占用。
解决方式就是关闭或重启对应进程:
kill12991如果是业务服务占用日志文件,生产环境中不要随手kill -9。更稳妥的方式是重启对应服务,或者按服务自己的日志切割机制处理。
五、文件系统
文件系统决定了分区如何组织和管理文件。不同 Linux 发行版、不同版本,默认文件系统也不完全一样。
1. ext4
ext4 是目前常见的 Linux 文件系统之一,Ubuntu 和 CentOS 6.x 环境中比较常见。
特点:
- 支持大文件和大容量存储。
- 最大文件大小可达 16TB。
- 文件系统最大容量可达 1EB。
- 改进了日志机制,提高可靠性和恢复速度。
- 支持在线碎片整理。
适用场景:
- 通用服务器
- 桌面系统
- 大量普通文件存储
- 对兼容性要求比较高的环境
2. xfs
xfs 是 CentOS 7 及之后版本常见的默认文件系统。
特点:
- 专为高性能和大容量存储设计。
- 最大文件大小可达 8EB。
- 文件系统最大容量可达 8EB。
- 文件分配和扩展机制效率高。
- 支持在线扩展和碎片整理。
适用场景:
- 存储服务器
- 大文件场景
- 高并发文件访问
- 日志、备份、对象存储类目录
注意:xfs 支持在线扩容,但不支持像 ext4 那样方便地缩小文件系统。生产环境缩容前一定要备份,并确认文件系统能力。
3. tmpfs
tmpfs 是基于内存的临时文件系统。
特点:
- 数据存储在内存中,速度非常快。
- 重启后数据会丢失。
- 适合临时数据,不适合持久化数据。
适用场景:
- 临时文件
- 缓存目录
- 运行时目录
- 对速度要求高、但数据可丢失的场景
4. swap
swap 可以是交换分区,也可以是 swap 文件。
特点:
- 作为物理内存不足时的补充空间。
- swap 文件创建和删除更灵活。
- swap 分区需要在分区时提前规划。
- swap 文件可以通过权限控制访问。
适用场景:
- 内存不足时提供缓冲。
- 避免系统因为瞬时内存压力直接崩溃。
- Java 等内存占用较高的服务,可以根据实际情况配置一定 swap。
六、磁盘性能指标
磁盘不只看容量,还要看性能。常见指标有 IOPS、吞吐量、响应时间和 MTBF。
| 指标 | 含义 | 说明 |
|---|---|---|
| IOPS | 每秒完成的 I/O 操作数量 | 小文件随机读写场景非常关注 |
| 吞吐量 | 每秒传输的数据量,单位通常是 MB/s 或 GB/s | 大文件连续读写更关注 |
| 响应时间 Latency | 从发出 I/O 请求到完成所需时间 | 越低越好,单位通常是 ms |
| 平均无故障时间 MTBF | 两次相邻故障之间的平均时间 | 越高代表可靠性越好 |
举个例子:
- 数据库小查询很多,更关注 IOPS 和延迟。
- 备份大文件传输,更关注吞吐量。
- 业务请求偶尔卡顿,可能要重点看磁盘延迟。
七、查看磁盘信息常用命令
磁盘排查时,几个命令要分清楚用途:
df看文件系统整体使用情况。du看目录或文件实际占用。lsblk看块设备结构。fdisk看分区表。blkid看 UUID 和文件系统类型。
1. df
df用来查看磁盘分区的整体使用情况,包括空间占用、挂载点等。
| 常用选项 | 说明 |
|---|---|
df -h | 以人类可读的单位显示,如 GB、MB |
df -T | 显示文件系统类型 |
df -i | 查看 inode 使用情况,而不是磁盘空间 |
常见用法:
df-hdf-Tdf-i2. du
du用来查看指定目录或文件的磁盘占用详情,更偏向文件级别的大小统计。
| 常用选项 | 说明 |
|---|---|
du -h <目录> | 以可读单位显示目录下各文件或子目录大小 |
du -sh <目录> | 只显示指定目录总大小 |
du -h --max-depth=1 <目录> | 显示一级子目录大小 |
常见用法:
du-sh/*du-sh/var/*du-h--max-depth=1/vardu-sh/var/log/*|sort-rhk13. lsblk
lsblk用来列出块设备结构,适合查看磁盘、分区、挂载点之间的关系。
| 常用选项 | 说明 |
|---|---|
lsblk | 默认显示设备名称、大小、挂载点等 |
lsblk -f | 显示文件系统类型和 UUID |
lsblk -l | 以列表形式显示,不使用树形结构 |
lsblk 常见列说明
| 列名 | 含义说明 |
|---|---|
| NAME | 设备名称,如sda、sda1、vdb |
| MAJ:MIN | 主设备号和次设备号 |
| RM | 是否为可移动设备,1表示可移动,0表示固定设备 |
| SIZE | 设备容量 |
| RO | 是否只读,1表示只读,0表示可读写 |
| TYPE | 设备类型,如disk、part、loop、lvm、rom |
| MOUNTPOINT | 挂载点,如/、/data |
lsblk -f 常见列说明
| 列名 | 含义说明 |
|---|---|
| FSTYPE | 文件系统类型,如ext4、xfs、vfat |
| LABEL | 文件系统标签 |
| UUID | 文件系统唯一标识,常用于/etc/fstab自动挂载 |
4. fdisk 和 blkid
fdisk用来查看磁盘分区表,通常需要管理员权限。
fdisk-lblkid用来查看块设备 UUID、文件系统类型等信息,配置/etc/fstab时很常用。
blkid如果要做永久挂载,推荐优先使用 UUID,而不是直接写/dev/sdb1。因为磁盘设备名在某些情况下可能变化,但 UUID 更稳定。
八、常用排查思路总结
磁盘问题不要一上来就删文件,先判断是哪类问题。
# 1. 看整体空间df-h# 2. 看 inodedf-i# 3. 找大目录du-sh/*|sort-rhk1# 4. 继续逐层深入du-sh/var/*|sort-rhk1du-sh/var/log/*|sort-rhk1# 5. 如果 df 和 du 对不上,查已删除但仍被占用的文件lsof|grepdeleted# 6. 看磁盘和分区结构lsblk lsblk-f# 7. 看 UUID 和文件系统类型blkid最后记住一条排查顺序:
先看空间,再看 inode,最后查进程和挂载关系。