GCP Ubuntu实例无法启动且无法SSH,如何进入安全模式并修复服务循环问题
GCP Ubuntu实例无法启动且无法SSH,如何进入安全模式并修复服务循环问题
这种情况我太熟了!之前帮客户处理过好多次——服务循环把实例搞崩连SSH都摸不到,别慌,GCP有两种靠谱的方法能救回来,我给你一步步说:
方法一:用启动脚本强制进入单用户模式(无需额外实例)
这个方法不用新建实例,直接给故障实例加个启动脚本,让它启动时直接进入root控制台:
- 先在GCP控制台找到你的故障实例,点击停止,等它彻底停稳
- 点击实例的编辑,拉到「自定义元数据」部分,点击添加项
- 键填
startup-script,值填下面这段脚本:
#!/bin/bash # 修改GRUB参数,让系统启动时直接进入bash(单用户root模式) sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"/GRUB_CMDLINE_LINUX_DEFAULT="init=/bin/bash"/' /etc/default/grub update-grub
- 保存修改,然后启动实例
- 回到实例详情页,点击连接→串行控制台,等一会儿就能看到root权限的命令行(不用输密码)
- 先把根分区改成读写模式:
mount -o remount,rw /
- 现在你就可以排查问题了:
- 用
journalctl -xb看系统日志,找哪个服务在循环崩溃 - 找到后用
systemctl disable 有问题的服务名禁用它 - 别忘了把GRUB改回去,不然下次启动还是直接进bash:
sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="init=/bin/bash"/GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"/' /etc/default/grub update-grub
- 用
- 重启实例:
reboot,之后应该就能正常SSH了
方法二:挂载故障磁盘到临时实例(更直观,适合新手)
如果串行控制台搞不定,这个方法更稳妥——把故障实例的磁盘拆下来,挂到一个正常的实例上直接改文件:
- 停止故障实例,然后在「磁盘」页面找到它的根磁盘,点击分离(别点删除!)
- 新建一个临时的Ubuntu实例(和故障实例同区域,省费用还快)
- 编辑这个临时实例,拉到「附加磁盘」部分,点击添加磁盘,选择刚才分离的故障磁盘,挂载点可以填
/mnt/faulty-disk - SSH进入临时实例,先确认故障磁盘的分区:
lsblk,一般是/dev/sdb1 - 挂载磁盘:
sudo mount /dev/sdb1 /mnt/faulty-disk
- 现在你就像操作本地文件夹一样修改故障系统的文件了:
- 进入
/mnt/faulty-disk/etc/systemd/system/,找可疑的服务文件,重命名禁用它:sudo mv bad-service.service bad-service.service.bak - 查看
/mnt/faulty-disk/var/log/syslog找崩溃原因 - 甚至可以直接修改
/mnt/faulty-disk/etc/default/grub调整启动参数
- 进入
- 操作完记得卸载磁盘:
sudo umount /mnt/faulty-disk - 分离临时实例上的故障磁盘,重新挂载回原来的故障实例,启动试试
小提醒
- 操作前最好给故障磁盘打个快照,万一改坏了还能恢复
- 临时实例用完记得删除,避免不必要的收费
- 串行控制台可能需要等30秒到1分钟才会出现命令行,别着急
备注:内容来源于stack exchange,提问作者RickyLo
相关产品推荐
相关产品推荐

