GCP Compute Engine VM 启动脚本和 SSH 在“apt-get update”后中断

GCP Compute Engine VM startup-script and SSH Breaks after `apt-get update`

要在 e2-medium (2 vCPUs, 4 GB memory) Debian GNU/Linux 10 (buster) 个实例上安装 git,我们 运行 按照此处显示的说明在 startup-script-url 中定义以下脚本:GCP Startup Scripts on Linux.

在 运行 宁 sudo apt-get updatesudo apt update 之后,VMS 的行为发生了变化:

  1. 启动脚本在停止和恢复 VM 后似乎不执行
  2. 无法通过 GCP GUI 通过 Web 控制台进行 SSH。

关于为什么会发生这种情况以及如何解决这个问题有什么想法吗?我们通过从源安装 git 来临时解决问题。


startupscript.sh

定义为--metadata startup-script-url=gs://my-project/startupscript.sh

#!/bin/bash

if ! command -v git &> /dev/null
then
    echo "============================================"
    echo "GIT WAS NOT FOUND. PLEASE INSTALL"
    sudo apt -y update 
    sudo apt install -y git-all
    echo "============================================"
fi

echo "CONTINUE TO DO MORE HERE"

1.初始成功 运行

检查启动脚本日志

根据以下日志,脚本已 运行 成功:

Oct 29 14:48:48 instance-1 google_metadata_script_runner[521]: startup-script-url: Processing triggers for man-db (2.8.5-2) ...
Oct 29 14:49:09 instance-1 google_metadata_script_runner[521]: startup-script-url: Processing triggers for install-info (6.5.0.dfsg.1-4+b1) ...
Oct 29 14:49:09 instance-1 google_metadata_script_runner[521]: startup-script-url: Processing triggers for mime-support (3.62) ...
Oct 29 14:49:09 instance-1 google_metadata_script_runner[521]: startup-script-url: Processing triggers for libglib2.0-0:amd64 (2.58.3-2+deb10u3) ...
Oct 29 14:49:09 instance-1 google_metadata_script_runner[521]: startup-script-url: Processing triggers for libc-bin (2.28-10) ...
Oct 29 14:49:09 instance-1 google_metadata_script_runner[521]: startup-script-url: Setting up glib-networking:amd64 (2.58.0-2+deb10u2) ...
Oct 29 14:49:09 instance-1 google_metadata_script_runner[521]: startup-script-url: Setting up libsoup2.4-1:amd64 (2.64.2-2) ...
Oct 29 14:49:09 instance-1 google_metadata_script_runner[521]: startup-script-url: Setting up libsoup-gnome2.4-1:amd64 (2.64.2-2) ...
Oct 29 14:49:09 instance-1 google_metadata_script_runner[521]: startup-script-url: Setting up librest-0.7-0:amd64 (0.8.1-1) ...
Oct 29 14:49:09 instance-1 google_metadata_script_runner[521]: startup-script-url: Setting up libgtk-3-0:amd64 (3.24.5-1) ...
Oct 29 14:49:09 instance-1 google_metadata_script_runner[521]: startup-script-url: Setting up emacs-gtk (1:26.1+1-3.2+deb10u2) ...
Oct 29 14:49:09 instance-1 google_metadata_script_runner[521]: startup-script-url: update-alternatives: using /usr/bin/emacs-gtk to provide /usr/bin/emacs (emacs) in auto mode
Oct 29 14:49:09 instance-1 google_metadata_script_runner[521]: startup-script-url: Install emacsen-common for emacs
Oct 29 14:49:09 instance-1 google_metadata_script_runner[521]: startup-script-url: emacsen-common: Handling install of emacsen flavor emacs
Oct 29 14:49:09 instance-1 google_metadata_script_runner[521]: startup-script-url: Install git for emacs
Oct 29 14:49:09 instance-1 google_metadata_script_runner[521]: startup-script-url: Setting up git-el (1:2.20.1-2+deb10u3) ...
Oct 29 14:49:10 instance-1 google_metadata_script_runner[521]: startup-script-url: Install git for emacs
Oct 29 14:49:10 instance-1 google_metadata_script_runner[521]: startup-script-url: Install git for emacs
Oct 29 14:49:10 instance-1 google_metadata_script_runner[521]: startup-script-url: Setting up emacs (1:26.1+1-3.2+deb10u2) ...
Oct 29 14:49:10 instance-1 google_metadata_script_runner[521]: startup-script-url: Setting up git-all (1:2.20.1-2+deb10u3) ...
Oct 29 14:49:10 instance-1 google_metadata_script_runner[521]: startup-script-url: Processing triggers for libgdk-pixbuf2.0-0:amd64 (2.38.1+dfsg-1) ...
Oct 29 14:49:10 instance-1 google_metadata_script_runner[521]: startup-script-url: Processing triggers for libc-bin (2.28-10) ...
Oct 29 14:49:10 instance-1 sudo[1212]: pam_unix(sudo:session): session closed for user root
Oct 29 14:49:10 instance-1 google_metadata_script_runner[521]: startup-script-url: ============================================
Oct 29 14:49:10 instance-1 google_metadata_script_runner[521]: startup-script-url: CONTINUE TO DO MORE HERE
Oct 29 14:49:10 instance-1 google_metadata_script_runner[521]: startup-script-url exit status 0

也在 GOOGLE 云日志记录中验证

Cloud Logging 只显示到 Processing triggers for man-db 日志,这有点奇怪,但看起来应该已经全部安装了。


2。关机

sudo poweroff


3。从 GUI 启动 VM

启动脚本执行,网络 ssh 损坏。

检查启动脚本日志

No journal files were found.

也在 GOOGLE 云日志记录中验证

除了启动之外,看不到任何日志。也没有迹象表明找到了 startup-script-url 元数据(通常会发生)

WEB SSH 不再有效

启动日志

journalctl -b

No journal files were found
-- No entries --

sudo /var/log/dmesg

command not found

/var/log/boot.log

-bash: /var/log/boot.log: No such file or directory

GCP 启动脚本 运行 在容器创建时,而不是在 Linux 启动时(那些“后续启动”是一种错觉)。而且剧本本身是荒谬的;就做 apt install -y git。当 aptitude 执行相同的检查时,检查包是否存在根本没有意义(尝试不必要的包时可以查看日志)。请注意,此脚本所做的一切都将 运行 作为用户 root 并归用户 root 所有,这可能需要一个或另一个 chmodchown。 “虚拟机不再按预期工作”是我无法重现的;这不是错误描述。

在这里,当我们安装 git-all 时,它用旧的 SysV 初始化系统替换了 systemd 初始化系统,破坏了 cloud-init 和几乎所有启动 process.This 是您无法通过 SSH 连接到您的实例的原因。

此问题有 2 个可能的修复方法:

  1. 正如@John Hanley 所说,尝试使用 git 而不是 git-all。
  2. 如果 git-all 是强制性的,那么尝试使用 apt install --no-install-recommends -y git-all 这将确保没有安装推荐。