Appearance
磁盘管理
磁盘扩容、挂载和空间告警的排查,需要了解设备、分区、文件系统和挂载点之间的关系。
一、磁盘、分区、文件系统、挂载点
排查磁盘问题时,四个概念容易混:
| 概念 | 说明 | 示例 |
|---|---|---|
| 设备 | 系统检测到的物理或虚拟磁盘 | /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/sdb1XFS 和 ext4 的取舍:
| XFS | ext4 | |
|---|---|---|
| 在线扩容 | 支持 | 支持 |
| 在线缩容 | 不支持 | 不支持(需卸载) |
| 适用场景 | 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) |
| dump | 0 | 是否被 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_growfs 或 resize2fs),不用手动再跑一遍扩容命令。
查看 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 deletedlsof 输出中出现 (deleted) 标记:文件已经被 rm 删除了文件名,但仍有进程持有该文件的文件描述符,内核不会释放 inode 和数据块。解决方案是重启持有该文件的进程,或者让进程重新打开日志文件(systemctl reload 或发信号)。