阿里云 ESSD 盘上跑着 Jenkins,出错后从三天前的快照回滚,实例启动后 df -h 显示 /data 只有 500G,而控制台里这块盘写的是 1T,du 统计出来的数据量也对得上旧快照。

原因不止一个,得分开看。快照只回滚了块设备内容,分区表和文件系统元数据是三天前的状态;回滚后分区表还是旧布局,后扩的那段空间没有对应分区;云盘本身容量没变,只是文件系统记录的块数还是旧的;回滚时系统盘和数据盘选了不同时间点的快照,两边对不上。

先确认块设备真实容量和分区范围

lsblk /data && blockdev --getsize64 /dev/vdb

然后查看分区末尾有没有空出来的空间

fdisk -l /dev/vdb

再往下把分区扩到盘尾再让文件系统跟上

growpart /dev/vdb 1 && resize2fs /dev/vdb1

等前面都确认过,再核对容量和挂载状态

df -h /data && findmnt /data

改完先别撤,确认这几项。df -h 显示的容量与控制台一致,/data 下历史数据能正常读取,写入测试文件不报错。

容易忽略的是,回滚快照等于把整块盘拨回过去,回滚之后做的扩容和分区调整都会丢,动手前先把当前盘再做一份快照。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189