Linux磁盘分区与Swap和磁盘故障查询 📅 2026/8/2 4:12:22 Linux 磁盘分区 GPT、swap 与磁盘故障排查总结一、磁盘分区实操GPTGPT全称是GUID Partition Table中文一般叫“全局唯一标识分区表”。如果说 MBR 是老式分区表那么 GPT 就是现在新服务器、大容量磁盘更常见的分区方式。尤其是磁盘容量超过 2TB或者服务器使用 UEFI 引导时GPT 基本就是优先选择。1. MBR 和 GPT 的区别MBR 和 GPT 都是分区表作用都是记录“磁盘被怎么分区了”。区别在于MBR 设计比较早结构简单兼容老系统GPT 设计更现代支持更大的磁盘、更多分区并且有校验和备份机制。分区表结构MBRMBR 分区表位于磁盘的第 0 磁道、第 0 柱面、第 1 扇区也就是通常说的磁盘第一个扇区。MBR 分区表大小为 512 字节其中包含446 字节引导代码64 字节分区表2 字节结束标志55AAMBR 最多支持 4 个主分区或者 3 个主分区加 1 个扩展分区。分区表信息在固定位置一旦损坏恢复成本比较高。GPTGPT 分区表位于磁盘的开头和结尾结尾处有冗余备份。GPT 使用 GUID 标识分区分区信息更完整。GPT 通常支持最多 128 个主分区。GPT 分区表包含分区类型、分区名称、分区大小等更多信息。分区大小限制MBRMBR 使用 32 位 LBA 表示分区起始和结束位置。常见最大分区大小为 2TB。如果磁盘使用 4KB 扇区在特定系统支持下可以突破到更大但兼容性不如 GPT。GPTGPT 使用 64 位 LBA。理论最大分区大小可达到 9.4ZB。更适合现代大容量磁盘。数据完整性MBR分区表固定放在磁盘开头。没有内置校验机制。如果 MBR 损坏可能导致系统无法启动或分区信息丢失。GPT磁盘开头和结尾都有分区表信息。使用 CRC32 校验分区表完整性。主分区表损坏时可以尝试从备份分区表恢复。应用场景MBR 适合老系统老硬件小于 2TB 的磁盘BIOS 引导环境GPT 适合新服务器大容量磁盘UEFI 引导环境对分区数量和数据完整性要求更高的场景综合比较特性MBRGPT分区表位置磁盘的第 1 扇区磁盘的开头和结尾最大分区数量4 个主分区或 3 个主分区 1 个扩展分区128 个主分区最大分区大小2TB或 16TB取决于扇区大小9.4ZB引导方式BIOSUEFI数据完整性无冗余备份无校验机制冗余备份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 的文件[rootatguigu ~]# dd if/dev/zero of/tmp/swap_1g bs1M count1000记录了10000 的读入 记录了10000 的写出1048576000字节(1.0GB)已复制33.1107 秒31.7 MB/秒[rootatguigu ~]# ll /tmp/swap_1g-rw-r--r--1root root10485760006月3009:18 /tmp/swap_1g参数说明参数说明if/dev/zero输入文件为/dev/zero持续输出 0of/tmp/swap_1g输出文件路径bs1M每次写入 1MBcount1000写入 1000 次约 1GB第二步格式化使用mkswap将普通文件转换为 swap 文件[rootatguigu ~]# mkswap /tmp/swap_1g正在设置交换空间版本1大小1023996KiB 无标签UUID687d8ad0-5261-44e7-bf13-fd0a6f6149d8查看文件类型[rootatguigu ~]# file /tmp/swap_1g/tmp/swap_1g: Linux/i386 swapfile(new style), version1(4K pages), size255999pages, no label,UUID687d8ad0-5261-44e7-bf13-fd0a6f6149d8第三步启用启用前先看当前内存和 swap[rootatguigu ~]# free -htotal usedfreeshared buff/cache available Mem:1.9G 223M 431M9.5M1.3G1.5G Swap:2.0G 0B2.0G修改 swap 文件权限[rootatguigu ~]# chmod 600 /tmp/swap_1g启用 swap[rootatguigu ~]# swapon /tmp/swap_1g再次查看[rootatguigu ~]# 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[rootatguigu ~]# free -htotal usedfreeshared buff/cache available Mem:1.9G 224M 430M9.5M1.3G1.5G Swap:3.0G 0B3.0G关闭指定 swap 文件[rootatguigu ~]# swapoff /tmp/swap_1g再次查看[rootatguigu ~]# free -htotal usedfreeshared buff/cache available Mem:1.9G 223M 431M9.5M1.3G1.5G Swap:2.0G 0B2.0G关闭所有 swapswapoff-a启用/etc/fstab中配置的所有 swapswapon-a三、企业分区方案安装 Linux 时可以自动分区也可以根据业务需要手动分区。企业环境更推荐提前规划因为分区方式会影响后续扩容、重装系统、数据保留和故障恢复。1. 服务器数据不重要这种场景常见于测试机、临时环境、可随时重建的服务器。分区作用与大小补充/boot引导分区存放系统启动文件和内核镜像推荐 1GBswap内存大于 8GBswap 配 8GB 即可内存低于 8GB可按 1.5 倍或 2 倍配置最大 8GB公有云可以不配置Java 服务建议配置一些/根分区所有剩余空间给根分区简单省事这种方式维护简单但缺点是系统和数据混在一起。重装系统时如果没有提前备份数据容易一起丢。2. 服务器存放重要数据这种场景更接近生产环境。核心思路是系统和业务数据分开。分区作用与大小补充/boot引导分区存放系统启动文件和内核镜像推荐 1GBswap内存大于 8GBswap 配 8GB 即可内存低于 8GB可按 1.5 倍或 2 倍配置最大 8GB公有云可以不配置Java 服务建议配置一些/根分区40GB 到 200GB主要安装系统和软件重要数据不要直接堆在根分区/data剩余所有空间重装系统时可以保留该分区业务数据不受影响比如数据库文件、业务上传文件、备份文件、应用日志等都可以规划到/data或/data/mysql、/data/app这样的目录。3. 不确定数据是否重要如果前期业务还没有完全定型可以预留空间。分区作用与大小补充/boot引导分区存放系统启动文件和内核镜像推荐 1GBswap内存大于 8GBswap 配 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 -shInode 不足小文件太多容量还没满但无法创建新文件df -i、find进程占用已删除文件文件删了但空间没有释放lsof2. 原因 1Block 不足Block 不足是最常见的磁盘空间问题。简单说就是大文件太多真的把磁盘容量占满了。场景模拟创建一个大文件[rootatguigu ~]# dd if/dev/zero of/var/log/big bs1M count6000记录了60000 的读入 记录了60000 的写出6291456000字节(6.3GB)已复制84.179 秒74.7 MB/秒查看磁盘使用情况[rootatguigu ~]# 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这里根分区使用率变高了下一步要逐层往下找。排查方式先看根目录下哪个目录最大[rootatguigu ~]# 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[rootatguigu ~]# 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[rootatguigu ~]# 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. 原因 2Inode 不足Inode 不足是 Linux 比较典型的问题。每创建一个文件就会消耗一个 inode。inode 用来保存文件属性信息比如权限、属主、大小、时间戳、数据块位置等。有时候磁盘容量明明还有但创建文件还是报No space left on device这就可能是 inode 被耗尽了。场景模拟创建一个 10MB 的小分区挂载后模拟 inode 被耗尽[rootatguigu ~]# dd if/dev/zero of/tmp/10m bs1M count10[rootatguigu ~]# mkfs.ext4 /tmp/10m[rootatguigu ~]# mkdir /inode[rootatguigu ~]# mount /tmp/10m /inode查看挂载情况[rootatguigu ~]# df -h文件系统 容量 已用 可用 已用% 挂载点... /dev/loop08.7M 172K7.9M3% /inode查看 inode 使用情况[rootatguigu inode]# df -i文件系统 Inode 已用(I)可用(I)已用(I)% 挂载点... /dev/loop025601125491% /inode创建大量小文件[rootatguigu ~]# cd /inode/[rootatguigu inode]# touch inode{01..3000}.txttouch: 无法创建inode2550.txt:设备上没有空间 touch: 无法创建inode2551.txt:设备上没有空间 touch: 无法创建inode2552.txt:设备上没有空间再次查看 inode[rootatguigu inode]# df -i文件系统 Inode 已用(I)可用(I)已用(I)% 挂载点... /dev/loop0256025600100% /inode此时容量没有完全用完但 inode 已经 100%所以无法继续创建新文件。排查方式方式一查找比较大的目录find/-typed-size1M方式二统计文件集中在哪些目录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文件名入口没了但进程仍然持有文件描述符磁盘空间不会立即释放。场景模拟创建一个大文件[rootatguigu ~]# dd if/dev/zero of/var/log/test_big bs1M count6000查看磁盘[rootatguigu ~]# 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统计出来明显小很多就要怀疑有“已删除但仍被进程占用”的文件。安装lsofyuminstall-ylsof查看被进程占用的文件lsof|greptail查看已删除但仍被占用的文件lsof|grepdeleted示例tail12991root 3r REG253,0629145600033561843/var/log/test_big(deleted)其中deleted表示文件入口已经没了但还有进程在占用。解决方式就是关闭或重启对应进程kill12991如果是业务服务占用日志文件生产环境中不要随手kill -9。更稳妥的方式是重启对应服务或者按服务自己的日志切割机制处理。五、文件系统文件系统决定了分区如何组织和管理文件。不同 Linux 发行版、不同版本默认文件系统也不完全一样。1. ext4ext4 是目前常见的 Linux 文件系统之一Ubuntu 和 CentOS 6.x 环境中比较常见。特点支持大文件和大容量存储。最大文件大小可达 16TB。文件系统最大容量可达 1EB。改进了日志机制提高可靠性和恢复速度。支持在线碎片整理。适用场景通用服务器桌面系统大量普通文件存储对兼容性要求比较高的环境2. xfsxfs 是 CentOS 7 及之后版本常见的默认文件系统。特点专为高性能和大容量存储设计。最大文件大小可达 8EB。文件系统最大容量可达 8EB。文件分配和扩展机制效率高。支持在线扩展和碎片整理。适用场景存储服务器大文件场景高并发文件访问日志、备份、对象存储类目录注意xfs 支持在线扩容但不支持像 ext4 那样方便地缩小文件系统。生产环境缩容前一定要备份并确认文件系统能力。3. tmpfstmpfs 是基于内存的临时文件系统。特点数据存储在内存中速度非常快。重启后数据会丢失。适合临时数据不适合持久化数据。适用场景临时文件缓存目录运行时目录对速度要求高、但数据可丢失的场景4. swapswap 可以是交换分区也可以是 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. dfdf用来查看磁盘分区的整体使用情况包括空间占用、挂载点等。常用选项说明df -h以人类可读的单位显示如 GB、MBdf -T显示文件系统类型df -i查看 inode 使用情况而不是磁盘空间常见用法df-hdf-Tdf-i2. dudu用来查看指定目录或文件的磁盘占用详情更偏向文件级别的大小统计。常用选项说明du -h 目录以可读单位显示目录下各文件或子目录大小du -sh 目录只显示指定目录总大小du -h --max-depth1 目录显示一级子目录大小常见用法du-sh/*du-sh/var/*du-h--max-depth1/vardu-sh/var/log/*|sort-rhk13. lsblklsblk用来列出块设备结构适合查看磁盘、分区、挂载点之间的关系。常用选项说明lsblk默认显示设备名称、大小、挂载点等lsblk -f显示文件系统类型和 UUIDlsblk -l以列表形式显示不使用树形结构lsblk 常见列说明列名含义说明NAME设备名称如sda、sda1、vdbMAJ:MIN主设备号和次设备号RM是否为可移动设备1表示可移动0表示固定设备SIZE设备容量RO是否只读1表示只读0表示可读写TYPE设备类型如disk、part、loop、lvm、romMOUNTPOINT挂载点如/、/datalsblk -f 常见列说明列名含义说明FSTYPE文件系统类型如ext4、xfs、vfatLABEL文件系统标签UUID文件系统唯一标识常用于/etc/fstab自动挂载4. fdisk 和 blkidfdisk用来查看磁盘分区表通常需要管理员权限。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最后查进程和挂载关系。