GCE启动脚本在Ubuntu 18.04实例上无法运行求助
解决GCP Ubuntu 18.04实例启动脚本不运行的思路
我之前也碰到过类似的糟心事,给你梳理几个实用的排查方向,应该能找到问题根源:
1. 先确认metadata的键名是否正确
GCP Linux实例的启动脚本URL必须用特定的metadata键:startup-script-url,别写成下划线分隔或者其他拼写错误!
你可以用命令验证键名和值是否匹配:
gcloud compute instances describe [INSTANCE_NAME] --zone [ZONE] | grep -A2 startup-script-url
确保输出里的键名完全是startup-script-url,值是你的存储桶完整URL(比如gs://your-bucket/script.sh)
2. 检查存储桶的访问权限
虽然你手动下载能运行,但启动脚本是用实例默认服务账号(格式是[PROJECT-NUMBER]-compute@developer.gserviceaccount.com)来拉取的,这个账号可能没有存储桶的读取权限:
- 给服务账号添加存储桶的
storage.objectViewer角色:gsutil iam ch serviceAccount:[PROJECT-NUMBER]-compute@developer.gserviceaccount.com:objectViewer gs://your-bucket - 如果是测试用,也可以临时把存储桶设为公开可读(但生产环境千万别这么做)
3. 查看专门的启动脚本日志
Ubuntu 18.04的GCP启动脚本日志不在常规的syslog里,得找专门的日志文件:
- 查看启动脚本的执行细节:
这里面会记录脚本下载、执行的全流程,哪怕没有明显“错误”,也可能藏着警告(比如脚本语法问题、依赖缺失)cat /var/log/google-startup-scripts.log - 另外可以看
/var/log/cloud-init.log,cloud-init负责处理metadata脚本,里面有更多初始化过程的细节
4. 检查脚本本身的格式问题
脚本自身的小问题也会导致无法执行:
- 确保脚本开头有正确的shebang,比如
#!/bin/bash或者#!/usr/bin/env bash,没有的话系统不知道用什么解释器运行 - 检查脚本下载后的权限:cloud-init默认会给脚本加执行权限,但可以手动确认:
如果没有执行权限,试试手动加ls -l /var/lib/google/scripts/startup-script # 这是脚本下载后的默认路径chmod +x再测试
5. 升级cloud-init版本
Ubuntu 18.04自带的cloud-init版本可能比较老,存在一些metadata处理的bug:
- 查看当前版本:
cloud-init --version - 如果版本低于0.9.10,建议升级后重启实例测试:
sudo apt update && sudo apt install --only-upgrade cloud-init
6. 用极简脚本做测试
如果上面都没问题,先写个极简测试脚本放到存储桶里,比如:
#!/bin/bash echo "Startup script ran at $(date)" >> /tmp/test-startup.log
用这个脚本的URL设置metadata,重启后检查/tmp/test-startup.log是否生成,排除脚本复杂逻辑导致的问题
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

