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 文件系统验证:从格式化到元数据

文件系统决定性能和可靠性的下限。验证文件系统,我通常分成三步:

  1. 类型确认:blkid /dev/sda2看UUID和文件系统类型。
  2. 挂载选项:mount | grep /data,确认noatime、discard(SSD)等参数是否生效。
  3. 元数据检查: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 存储验证流程图

下面这张图汇总了存储验证的完整流程,按箭头顺序操作即可覆盖所有要点。

存储环境验证流程 开始验证 1. 磁盘分区检查 2. 文件系统验证 3. 挂载点确认 4. 磁盘性能测试 验证完成 关键命令 lsblk blkid df -hT mount -a tune2fs -l fio(基准测试) dd(快速验证) cat /etc/fstab

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输出归类,一目了然。

存储验证做到位了,后续数据库、容器、日志服务才能睡个安稳觉。嗯,这个章节就到这儿。