这是《Linux 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 磁盘问题通常表现为空间不足、IO 延迟高、文件系统只读、挂载丢失或数据损坏。本章从设备识别、分区、格式化、挂载、交换分区、LVM、RAID、IO 指标和故障处理讲起。
11.1 存储栈
Application
-> File System
-> LVM / Software RAID
-> Block Device
-> Device Mapper
-> Disk / SSD / Cloud Disk
不同层次的问题表现不同:
| 层 | 常见现象 |
|---|---|
| 应用 | 写放大、锁文件、慢日志 |
| 文件系统 | 只读、元数据慢、inode 耗尽 |
| 块设备 | IO error、延迟高 |
| 云盘 / RAID | 容量、IOPS、吞吐限制 |
| 网络 | 存储链路抖动 |
11.2 设备识别
块设备:
lsblk
lsblk -f
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT
blkid
sudo fdisk -l
sudo parted -l
云服务器常见命名:
| 名称 | 常见含义 |
|---|---|
/dev/vda |
virtio 磁盘 |
/dev/sda |
SCSI / SATA |
/dev/nvme0n1 |
NVMe |
/dev/xvda |
Xen 虚拟盘 |
/dev/mapper/vg-lv |
LVM 逻辑卷 |
设备名在重启或变更后可能变化。fstab 推荐使用 UUID 或稳定标识。
查看 UUID:
blkid /dev/vdb1
lsblk -fp
11.3 分区与格式化
查看分区表:
sudo parted /dev/vdb print
sudo fdisk -l /dev/vdb
parted 示例:
sudo parted -s /dev/vdb mklabel gpt
sudo parted -s /dev/vdb mkpart primary xfs 1MiB 100%
sudo parted /dev/vdb print
格式化:
sudo mkfs.xfs /dev/vdb1
sudo mkfs.ext4 /dev/vdb1
查看文件系统信息:
sudo xfs_info /data
sudo tune2fs -l /dev/vdb1
格式化会清除数据,执行前必须确认设备路径和分区号。
11.4 挂载与 fstab
临时挂载:
sudo mkdir /data
sudo mount /dev/vdb1 /data
df -hT /data
卸载:
sudo umount /data
sudo umount -l /data
umount -l 是懒卸载,只作为特殊场景处理,不是常规操作。
开机自动挂载:
# /etc/fstab
UUID=12345678-1234-1234-1234-123456789012 /data xfs defaults,nofail 0 0
校验:
sudo findmnt --verify
sudo mount -a
常用选项:
| 选项 | 含义 |
|---|---|
| defaults | 常见默认组合 |
| nofail | 设备缺失时不阻塞启动 |
| noatime | 减少访问时间更新 |
| ro / rw | 只读 / 读写 |
| _netdev | 等待网络 |
关键数据盘建议加 nofail,避免单块数据盘异常导致整机无法启动。
11.5 文件系统选择
| 文件系统 | 特点 | 常见用途 |
|---|---|---|
| ext4 | 成熟稳定 | 通用数据盘 |
| XFS | 大文件、高并发写性能好 | 数据库、大文件 |
| btrfs | 快照、压缩等能力 | 场景化使用 |
| tmpfs | 内存文件系统 | 临时缓存 |
| overlay | 容器镜像分层 | 容器运行时 |
数据库选型应结合 workload、备份工具、云厂商能力和团队经验,不只看单项参数。
11.6 容量与 inode
容量:
df -hT
df -kT
du -sh /data/*
du -h --max-depth=2 /data | sort -h
inode:
df -ih
find /data -xdev -type f | wc -l
常见问题:
| 现象 | 原因 |
|---|---|
| 空间满但 du 不大 | 已删除文件仍被占用 |
| inode 满 | 海量小文件 |
| 写入卡住 | IO 队列高或存储故障 |
| 只读文件系统 | 错误后自我保护 |
处理:
lsof +L1
sudo journalctl --disk-usage
find /data -type f -size +1G -printf '%s %p\n' | sort -nr | head
11.7 Swap
查看:
free -h
swapon --show
cat /proc/swaps
cat /proc/sys/vm/swappiness
创建 swap 文件:
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
开机启用:
# /etc/fstab
/swapfile none swap sw 0 0
关闭:
sudo swapoff /swapfile
sudo rm /swapfile
数据库等服务通常要谨慎使用 swap,重点还是控制内存和监控水位。swap 是缓冲手段,不是常态内存方案。
11.8 LVM
概念:
Physical Volume PV
-> Volume Group VG
-> Logical Volume LV
-> File System
查看:
sudo pvs
sudo vgs
sudo lvs
创建:
sudo pvcreate /dev/vdb
sudo vgcreate datavg /dev/vdb
sudo lvcreate -n datalv -L 100G datavg
sudo mkfs.xfs /dev/datavg/datalv
sudo mount /dev/datavg/datalv /data
扩容:
sudo lvextend -L +50G /dev/datavg/datalv
sudo xfs_growfs /data
ext4:
sudo lvextend -L +50G /dev/datavg/datalv
sudo resize2fs /dev/datavg/datalv
缩容风险高,XFS 通常不支持在线缩容。生产应优先规划扩容和备份,而非临时缩容。
11.9 RAID
常见级别:
| 级别 | 特点 | 容错 |
|---|---|---|
| RAID 0 | 条带,性能高 | 无 |
| RAID 1 | 镜像 | 一块 |
| RAID 5 | 分布式校验 | 一块 |
| RAID 6 | 双校验 | 两块 |
| RAID 10 | 镜像加条带 | 每组一块 |
查看软件 RAID:
cat /proc/mdstat
sudo mdadm --detail /dev/md0
云盘和硬件 RAID 通常由平台或 RAID 卡暴露为块设备,应结合厂商工具监控健康状态。
RAID 不是备份。误删除、文件损坏、逻辑错误和安全事件仍需要独立备份。
11.10 文件系统检查
unmount 后检查:
sudo umount /data
sudo fsck -n /dev/vdb1
sudo fsck /dev/vdb1
ext4:
sudo e2fsck -f /dev/vdb1
XFS:
sudo xfs_repair -n /dev/vdb1
sudo xfs_repair /dev/vdb1
只读修复:
sudo xfs_repair -L /dev/vdb1
-L 会清空日志,可能丢数据,只能作为最后手段并在备份、变更评审和专家确认后执行。
11.11 IO 指标
iostat -xz 1
iostat -dx 1 /dev/vdb
vmstat 1
pidstat -d 1
iotop -P -d 2
关键指标:
| 指标 | 含义 |
|---|---|
| r/s、w/s | 每秒读写次数 |
| rkB/s、wkB/s | 每秒读写数据量 |
| await | 平均 IO 等待 |
| r_await、w_await | 读写等待 |
| aqu-sz | 队列深度 |
| util | 设备忙碌度 |
| iowait | CPU 等待 IO 占比 |
判断:
await 高 + util 高
-> 存储能力或 workload 问题
iowait 高 + iostat 不高
-> NFS、内存压力或调度问题,需要继续分层
单个进程 w/s 高
-> 应用写放大或日志刷盘
11.12 云盘与性能
云盘常见限制:
| 资源 | 说明 |
|---|---|
| 容量 | 最大和最小规格 |
| IOPS | 随容量或类型变化 |
| 吞吐 | MB/s 上限 |
| 突发 | 有限时长 |
| 并发连接 | 多盘挂载能力 |
排查前先确认:
lsblk
df -hT
iostat -xz 1
再对照云平台当前规格。云盘性能指标和实现随厂商变化,不要只凭经验判断。
11.13 故障案例
案例一:根分区写满
df -hT /
du -sh /var/* /tmp /root 2>/dev/null
sudo journalctl --disk-usage
lsof +L1
常见来源:
- journal 过大;
- core dump;
- 应用日志;
- 包缓存;
- 临时文件;
- 容器镜像和卷。
根分区写满可能导致 SSH、cron、日志和数据库异常,应设置提前告警。
案例二:文件系统只读
dmesg -T | tail -100
findmnt -no TARGET,OPTIONS /data
sudo touch /data/test
常见原因:
- 磁盘 IO 错误;
- journal 损坏;
- 存储链路断开;
- 人为只读挂载。
处理前先保存日志,再评估备份和修复方案,不要直接重启。
案例三:数据库盘延迟高
iostat -xz 1 /dev/vdb
pidstat -d 1
sudo lsblk -o NAME,SIZE,TYPE,MOUNTPOINT
检查:
- 云盘规格;
- checkpoint 和刷盘;
- 日志写入量;
- 快照或备份并发;
- 同宿主机干扰;
- 应用是否有批量扫描。
本章小结
磁盘排障要先分层:容量、inode、挂载、块设备、IO 指标和云盘规格。df 看文件系统,du 和 find 定位空间,iostat 看设备压力,dmesg 看内核错误。LVM 提供扩容灵活性,RAID 提供硬件冗余,但它们都不能替代备份和容量预测。
思考题
df和du的统计口径有什么不同?/etc/fstab使用 UUID 有什么优势?- XFS 和 ext4 在扩容、缩容上的差异是什么?
iostat的await和util如何解读?- 设计一个数据库磁盘的容量、水位和 IO 监控方案。