Skip to content

磁盘管理

磁盘扩容、挂载和空间告警的排查,需要了解设备、分区、文件系统和挂载点之间的关系。

一、磁盘、分区、文件系统、挂载点

排查磁盘问题时,四个概念容易混:

概念说明示例
设备系统检测到的物理或虚拟磁盘/dev/sdb
分区磁盘上划分的一段独立区域/dev/sdb1
文件系统组织数据的方式,决定文件怎么存、怎么查xfs、ext4
挂载点文件系统在目录树中的入口/data/mnt/backup

排查时从底层往上逐层确认:系统有没有识别到盘?分区表对不对?文件系统有没有创建?有没有挂载?

查看块设备和挂载关系:

bash
lsblk               # 块设备树:磁盘→分区→挂载点
blkid               # 看 UUID 和文件系统类型
df -h               # 看文件系统空间使用情况
df -i               # 看 inode 使用情况

lsblk 输出是最直观的设备总览。df -h 看各挂载点的空间,df -i 看 inode 耗尽——空间没满但写不进文件时,几乎可以肯定是 inode 用完了。

二、分区

分区表是磁盘上的"目录",记录每个分区的起止位置。常见的分区表格式:

格式特点
MBR(DOS)老格式,最大支持 2TB 磁盘、4 个主分区
GPT现代格式,支持大磁盘、128 个分区、有备份分区表
bash
fdisk -l             # 查看所有磁盘分区(MBR 和 GPT 都支持)
parted -l            # 更详细,GPT 操作更方便

给新磁盘分区的流程:

bash
lsblk                # 先看磁盘设备名,比如 /dev/sdb
parted /dev/sdb      # 进入 parted 交互模式

parted 交互模式中:

命令作用
mklabel gpt创建 GPT 分区表(会清空原有分区信息)
mkpart primary 0% 100%创建一个主分区,占满整块盘
print查看当前分区表
quit退出

分区完成后通知内核重新读取分区表:

bash
partprobe /dev/sdb       # 通知内核重新扫描分区
lsblk                    # 确认 /dev/sdb1 是否出现

云环境中,有些云主机的设备名在重启后可能变化(如 /dev/sdb 变成 /dev/sdc)。挂载时不依赖设备名,而是用 UUID,可以避免这个问题。

三、格式化

在分区上创建文件系统:

bash
mkfs.xfs /dev/sdb1
mkfs.ext4 /dev/sdb1

XFS 和 ext4 的取舍:

XFSext4
在线扩容支持支持
在线缩容不支持不支持(需卸载)
适用场景RHEL 7+ 默认,大数据量大文件通用,Ubuntu 上常见

格式化会清空分区上原有数据。生产环境执行 mkfs 前,一定要再确认一遍设备和挂载情况:

bash
lsblk -f             # 看当前文件系统类型
mount | grep sdb     # 看是否正在挂载使用

四、挂载与 fstab

挂载是把文件系统接入到目录树的某个位置:

bash
mkdir -p /data
mount /dev/sdb1 /data
df -h /data

手动 mount 在重启后失效。持久化挂载需要写入 /etc/fstab。fstab 中推荐用 UUID 指定设备,而不是设备名:

bash
blkid /dev/sdb1            # 获取 UUID

/etc/fstab 格式:

UUID=xxxx-xxxx /data xfs defaults 0 0

每列含义:

示例说明
设备标识UUID=xxxx-xxxx推荐 UUID,也可用设备路径
挂载点/data挂到哪个目录
文件系统xfs文件系统类型
挂载选项defaults默认参数(rw、suid、dev、exec、auto、nouser、async)
dump0是否被 dump 备份(通常 0)
fsck 顺序0开机时文件系统检查顺序(0=跳过,1=根分区,2=其他)

写完 fstab 后用 mount -a 测试——它会按 fstab 尝试挂载所有未挂载的条目。如果 fstab 有语法错误,mount -a 会报错,但系统还在正常运行。fstab 写错直接重启的话,可能进 emergency mode。

五、SWAP

SWAP 是磁盘上划出的一块区域,当内存不够用时,内核会把不活跃的内存页换出到 SWAP 上,腾出物理内存。

bash
free -h              # 看内存和 SWAP 使用量
swapon --show        # 看当前 SWAP 设备

创建 SWAP 文件:

bash
fallocate -l 2G /swapfile          # 创建 2G 大小的文件
chmod 600 /swapfile                # SWAP 文件权限要严格控制
mkswap /swapfile                   # 格式化为 SWAP
swapon /swapfile                   # 启用

写入 /etc/fstab 永久生效:

/swapfile none swap sw 0 0

对于数据库服务器(MySQL、PostgreSQL、Redis 等),通常不希望严重依赖 SWAP。偶尔换出一点是正常的,但频繁大量的 SWAP 活动(thrashing)说明物理内存不足以承载当前负载,需要加内存或优化配置。

六、LVM

LVM(Logical Volume Manager)在物理磁盘和文件系统之间加了一个抽象层,实现动态扩容。

三层结构:

名称说明
PV(Physical Volume)物理卷把磁盘分区初始化,标记为由 LVM 管理
VG(Volume Group)卷组一个或多个 PV 组成的存储池
LV(Logical Volume)逻辑卷从 VG 中划出来的逻辑存储单元,上面建文件系统

创建流程:

bash
pvcreate /dev/sdb1                          # 初始化物理卷
vgcreate vg_data /dev/sdb1                  # 创建卷组
lvcreate -n lv_data -l 100%FREE vg_data    # 用全部剩余空间创建逻辑卷
mkfs.xfs /dev/vg_data/lv_data               # 在逻辑卷上建文件系统

挂载:

bash
mkdir -p /data
mount /dev/vg_data/lv_data /data

扩容流程(有新磁盘加入时):

bash
pvcreate /dev/sdc1                # 新磁盘初始化为 PV
vgextend vg_data /dev/sdc1        # 把新 PV 加入卷组
lvextend -r -l +100%FREE /dev/vg_data/lv_data   # 扩 LV 并同步扩文件系统

参数 -r 会自动扩展文件系统(内部调用 xfs_growfsresize2fs),不用手动再跑一遍扩容命令。

查看 LVM 状态:

bash
pvs       # 物理卷概览
vgs       # 卷组概览
lvs       # 逻辑卷概览

LVM 扩容方便,缩容麻烦——XFS 不支持在线缩容,ext4 也需要先卸载。所以规划存储时,"以后再缩"不是个好假设。

七、RAID

RAID(Redundant Array of Independent Disks)用多块磁盘组合成逻辑存储,提供性能提升或冗余保护。

级别特点
RAID 0条带化,性能好但无冗余,坏一块盘全丢
RAID 1镜像,容量减半,坏一块可继续
RAID 5奇偶校验,可坏 1 块,容量利用率高
RAID 10镜像+条带,性能好且冗余,最少 4 块盘

Linux 软件 RAID 用 mdadm 管理:

bash
cat /proc/mdstat              # 看当前 RAID 状态
mdadm --detail /dev/md0       # 看指定 RAID 的详细信息

云环境中,底层存储通常已经在云平台侧做了冗余(如多副本、分布式存储),在云主机上再套一层软 RAID 大部分情况下没有额外收益。云盘的可靠性保障和 RAID 解决的问题不是一个层面的。

八、排查空间占用

磁盘告警时分两步:先找到哪个目录在吃空间,再定位具体文件。

bash
df -h                 # 确认哪个分区满了
du -sh /*             # 根目录下各目录的占用排名
du -sh /var/*         # 逐层深入
find /var -type f -size +1G -ls     # 定位大文件

文件删了但空间没释放的情况:

bash
lsof | grep deleted

lsof 输出中出现 (deleted) 标记:文件已经被 rm 删除了文件名,但仍有进程持有该文件的文件描述符,内核不会释放 inode 和数据块。解决方案是重启持有该文件的进程,或者让进程重新打开日志文件(systemctl reload 或发信号)。