谷歌云账号购买 GCP谷歌云清理磁盘空间技巧
你有没有在某个凌晨三点,被一条邮件惊醒——「/dev/sda1 使用率 99%」?打开GCP控制台,发现磁盘像被塞进三年没整理的衣柜:快照堆成山、旧实例删了但磁盘还在、日志文件悄悄长到40GB……别慌,这不是服务器中邪,而是GCP磁盘空间管理的日常修行。
谷歌云(GCP)不像本地电脑——你删个文件,空间不会立刻回来;你删个实例,它的磁盘可能还在后台默默吃着账单。今天这篇不讲概念、不贴文档截图,只掏干货:从定位垃圾到一键清空,从防踩坑到建立长效机制,全是实测有效的「磁盘瘦身术」。
第一步:先别删!搞清谁在占地方
盲目 rm -rf 是运维大忌,尤其在GCP里——误删系统快照可能让你回滚不了昨天的bug修复。先登录你的虚拟机(比如用SSH),跑这三行:
df -h # 看整体使用率(重点盯 / 和 /var/log)
du -sh /var/log/* | sort -hr | head -10 # 日志谁最能吃?
sudo lsof +L1 # 找「已删除但进程还占着」的幽灵文件(常见于nginx、java应用)
你会发现:一个 /var/log/journal 目录竟有18GB?别急着清空——这是systemd日志,默认永不清除。执行:sudo journalctl --disk-usage 查用量,再用 sudo journalctl --vacuum-size=500M 限制上限,永久生效就加进 /etc/systemd/journald.conf 里的 SystemMaxUse=500M。
第二步:干掉「僵尸磁盘」——那些没人认领的挂载盘
GCP里最隐蔽的空间杀手,是「已停止实例但未删的磁盘」。它们不运行、不收费计算资源,却按月收你存储费(标准持久化磁盘约$0.04/GB/月)。去控制台 → Compute Engine → Disks,按「状态」排序,一眼揪出「unused」磁盘。
更狠的是命令行批量扫描:
gcloud compute disks list \
--filter='status=READY AND users:""' \
--format='table(name,zone,sizeGb,creationTimestamp)' \
--project=YOUR_PROJECT_ID
注意:users:"" 表示该磁盘当前没被任何实例引用。但请务必二次确认——有些磁盘可能刚解绑、正准备挂给新实例。安全做法是:先加标签 cleanup:pending,观察48小时无异常再删。
第三步:快照不是保险柜,是碎纸机待填区
很多人把快照当备份神器,结果快照越攒越多,费用反超原磁盘。查快照清单:
gcloud compute snapshots list \
--sort-by=~creationTimestamp \
--limit=20 \
--format='table(name,sourceDisk,diskSizeGb,creationTimestamp,storageBytes)' \
--project=YOUR_PROJECT_ID
重点关注:
• 创建时间超过90天的快照(业务稳定期后老快照基本无用)
• 源磁盘已删除的快照(sourceDisk 字段为空或显示 NOT_FOUND)
• 多个快照指向同一磁盘且时间间隔<24小时(自动备份脚本没设去重)
删快照前,先锁定关键快照(比如上线前打的):gcloud compute snapshots add-labels SNAPSHOT_NAME --labels=keep=true --project=YOUR_PROJECT_ID
再批量清理非锁定快照:gcloud compute snapshots list --filter='labels.keep!=true' --format='value(name)' | xargs -I {} gcloud compute snapshots delete {} --quiet
第四步:Docker?它在你的根分区挖了个矿
装过Docker的GCP实例,/var/lib/docker 常成黑洞。即使你删了所有容器和镜像,docker system prune -a 可能仍留着构建缓存、匿名卷、停滞的build cache。
终极清理(慎用!确保无正在运行的容器):
sudo docker system prune -a --volumes --force
# 再手动扫尾
sudo du -sh /var/lib/docker/* | sort -hr
# 若 build cache 占大头,直接删(Docker 24+支持 --prune-builder)
sudo rm -rf /var/lib/docker/buildkit
# 清理旧容器日志(默认不轮转)
sudo find /var/lib/docker/containers/ -name '*.log' -size +100M -delete
一劳永逸?改Docker daemon.json:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"storage-driver": "overlay2",
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65536,
"Soft": 65536
}
}
}
第五步:启动盘也能「瘦身」——别让100GB磁盘只装2GB系统
新建实例时选「100GB启动盘」很常见,但Ubuntu 22.04系统本身才2.3GB。多出来的97.7GB不仅是钱的问题,更是安全隐患(攻击面更大、克隆耗时更长)。
正确姿势:
• 新建实例时,启动盘大小设为「30GB」(预留20%冗余)
• 已有大磁盘?用 gcloud compute instances disk-resize 缩容(⚠️仅支持缩小至小于当前使用量!先清理再缩)
• 或更稳妥:创建新小盘 → dd克隆 → 切换启动盘 → 删除旧盘(GCP支持在线切换)
最后送你三条「血泪守则」
- 快照命名必须带语义:别叫
snapshot-20240520,改成prod-db-pre-migration-v2——三个月后你仍知道它为何而生; - 所有自动任务加「dry-run」开关:写清理脚本时,第一版必须输出要删什么、不真删,确认无误再关开关;
- 每月第一个周五下午,花15分钟执行「磁盘健康检查」:就跑一遍开头那三行命令 + 快照列表,养成习惯比救火强十倍。
谷歌云账号购买 技术没有玄学,只有可重复的动作。下次再看到磁盘告警,别先抓头发——打开终端,按顺序敲完这五步,喝口咖啡,看着 df -h 里的百分比回落到70%以下,你会觉得,云计算,原来也可以很清爽。
(完)

