4. 存储环境验证:磁盘分区、文件系统、挂载点、磁盘性能
存储验证是部署环节里最容易“翻车”的地方。我记得有次上线前,同事说分区都做好了,结果一写数据,根目录直接爆满——原来日志分区根本没挂上。今天就聊明白这件事。
4.1 磁盘分区验证:别让“看不见”的空间浪费
分区验证说白了就三件事:能看到吗?大小对吗?对齐了吗?我个人的习惯是用lsblk一把梭。
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE
这条命令会输出一个清爽的列表。举个输出样例:
NAME SIZE TYPE MOUNTPOINT FSTYPE
sda 100G disk
├─sda1 1G part /boot ext4
├─sda2 50G part / ext4
└─sda3 49G part /data xfs
sdb 500G disk
└─sdb1 500G part /backup xfs
关键检查项:
- 完整性:所有预期分区都在,没有被遗漏的磁盘。
- 容量:实际大小和设计文档是否一致?例如标称200G,实际只有180G,可能就是有坏道或预留分区没算进来。
- 分区对齐:尤其SSD。我踩过坑——分区没对齐,生产跑了一天,iowait飙升。
对齐检查技巧:用parted /dev/sda align-check optimal 1检查第一个分区是否对齐。返回1 aligned才算过。
4.2 文件系统验证:从格式化到元数据
文件系统决定性能和可靠性的下限。验证文件系统,我通常分成三步:
- 类型确认:
blkid /dev/sda2看UUID和文件系统类型。 - 挂载选项:
mount | grep /data,确认noatime、discard(SSD)等参数是否生效。 - 元数据检查:
tune2fs -l /dev/sda2 | grep -E "Filesystem state|Block size|Inode count"
# 文件系统状态输出示例
Filesystem volume name: root
Filesystem state: clean
Block size: 4096
Inode count: 3276800
这里有个坑:Inode count如果太小,小文件多了会爆。我曾经遇到日志服务写了很多小文件,inode用完,磁盘还有几百G空间,服务却报“No space left on device”。那叫一个难受。建议挂载前估算一下目录的文件数上限。
注意:生产环境建议使用tune2fs -c 0 -i 0 /dev/sdaX禁用强制自检间隔,避免意外fsck导致启动超时。
4.3 挂载点验证:守护好每一条路径
挂载点检查不仅要确认/etc/fstab配置正确,还要验证重启后能自动挂上。我个人常用的命令组合:
# 查看当前挂载
df -hT
# 验证fstab语法
mount -a -v
# 检查fstab中每行格式
cat /etc/fstab | grep -v '^#'
/etc/fstab每一列都不能马虎。我见过有人把UUID写错字符,重启后系统进不去单用户模式才改。下面是标准格式示例:
# device mountpoint fstype options dump pass
UUID=xxxx-xx /data xfs defaults,noatime 0 2
选项dump通常填0,pass根分区填1,其他填2。如果pass都填0,系统不会自动fsck。
4.4 磁盘性能验证:用数字说话
性能验证不能用感觉,得跑基准。我常用的工具是fio和dd,但dd只能测顺序,fio更能模拟真实负载。下面给一个典型的混合读写测试脚本:
fio --name=randrw \
--ioengine=libaio \
--direct=1 \
--rw=randrw \
--rwmixread=70 \
--bs=4k \
--numjobs=4 \
--size=1G \
--runtime=60 \
--group_reporting
重点关注三个指标:
| 指标 | 说明 | 参考阈值(SSD) |
|---|---|---|
| IOPS | 每秒读写请求数 | 随机读写 > 10k |
| 吞吐量 (BW) | 每秒传输字节 | 顺序读写 > 500 MB/s |
| 延迟 (Lat) | 每次IO完成耗时 | 平均值 < 2ms |
我一般会跑三遍:空盘、写满50%、写满90%。差距太大说明磁盘有性能缺陷。
避坑指南:千万不要在生产机上直接跑fio写测试,后果很严重。我曾在一个数据库节点上做过--rw=randwrite,直接把业务挂了。建议在空的测试分区或非业务窗口执行。
4.5 存储验证流程图
下面这张图汇总了存储验证的完整流程,按箭头顺序操作即可覆盖所有要点。
4.6 常见故障与快速定位
还是那句话——实践经验比理论重要。这里列几个我在项目里遇到的真实场景:
| 现象 | 原因 | 快速排查命令 |
|---|---|---|
| 挂载后df看不到 | 有mount over目录,或fstab priority冲突 | findmnt |
| 写入缓慢 | 文件系统未开启noatime,或raid卡缓存关着 |
mount | grep noatime |
磁盘显示ro(只读) |
文件系统有严重错误,被内核强制只读 | dmesg | grep -i error |
| fstab正确但重启后未挂 | systemd-fstab-generator失败,或UUID未更新 |
systemctl status -.mount |
你的工具箱:我习惯把所有收集脚本放到一个文件里,每次新环境直接跑,省得重复敲。比如./storage-check.sh,里面把lsblk、blkid、df、mount输出归类,一目了然。
存储验证做到位了,后续数据库、容器、日志服务才能睡个安稳觉。嗯,这个章节就到这儿。