Cloud-init 初始化失败导致 Droplet 无法启动怎么重建

文章导读
Cloud-init 初始化失败导致 Droplet 无法启动时,优先通过恢复控制台(Recovery Console)登录系统禁用 cloud-init 服务,而不是直接重建实例。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

Cloud-init 初始化失败导致 Droplet 无法启动时,优先通过恢复控制台(Recovery Console)登录系统禁用 cloud-init 服务,而不是直接重建实例。

直接重建会清空磁盘数据,仅建议在无法通过控制台修复或无需保留数据时使用。

先说结论:Cloud-init 阻塞启动通常是因为网络元数据获取超时或用户脚本错误,优先尝试控制台修复而非直接重建。

  • 先确认:通过云厂商提供的 VNC 或恢复控制台访问实例。
  • 先处理:在控制台内临时禁用 cloud-init 服务以完成启动。
  • 再验证:检查系统日志确认启动流程恢复正常后再排查脚本。

命令速用版

若能通过控制台登录,执行以下命令临时禁用 cloud-init 并重启:

sudo touch /etc/cloud/cloud-init.disabled
sudo reboot

若必须重建实例,确保在控制面板中清除或修正 User Data 字段后再操作。

Cloud-init 初始化失败导致 Droplet 无法启动怎么重建

为什么会这样

Cloud-init 在系统启动早期运行,依赖网络连通性来获取元数据或执行用户脚本。

如果网络配置错误、元数据服务不可达或脚本中存在死循环,cloud-init 会阻塞后续启动流程,导致 SSH 无法连接或系统看似无响应。

分步处理

按照以下顺序操作,避免不必要的数据丢失:

  1. 访问恢复控制台:在云厂商控制面板找到 Droplet 的“访问控制台”或"Recovery Console"入口,这是唯一能在网络不可用时登录的方式。
  2. 查看启动日志:登录后可查看 /var/log/cloud-init.log/var/log/cloud-init-output.log 定位报错行。
  3. 禁用服务:执行 sudo touch /etc/cloud/cloud-init.disabled 创建禁用标记文件。
  4. 重启实例:执行 sudo reboot 观察是否能正常进入系统。
  5. 修正配置:启动成功后,检查 /etc/cloud/cloud.cfg 或用户数据脚本,修复错误后删除禁用文件。

怎么验证是否生效

重启后使用 SSH 正常连接,且系统负载不再持续偏高。

Cloud-init 初始化失败导致 Droplet 无法启动怎么重建

检查 systemctl status cloud-init-local.service 状态,若已禁用则显示 inactive 或 disabled。

常见坑

  • 直接点击“重建 Droplet"会清空所有磁盘数据,除非已有快照备份。
  • 禁用 cloud-init 后,后续重启不会自动应用新的元数据变更,需手动恢复服务。
  • 部分镜像默认配置了强依赖网络的 mount 点,网络未就绪时会卡住启动,需在 fstab 中调整 _netdev 参数。

常见问题

重建 Droplet 能解决 cloud-init 失败吗?

不能直接解决,若 User Data 脚本未修正,重建后 cloud-init 会再次失败。

禁用 cloud-init 会影响系统更新吗?

不会影响系统包更新,但会影响实例首次启动时的主机名设置、密钥注入等自动化配置。

如何永久修复而不是临时禁用?

修复用户数据脚本中的语法错误或网络依赖,删除 /etc/cloud/cloud-init.disabled 文件后重启。

参考来源

  • DigitalOcean 官方文档 - Product Documentation (https://docs.digitalocean.com/)
  • Cloud-init 官方文档 - Logging and Debugging (https://cloudinit.readthedocs.io/)