首页 > 解决方案 > 使用启动脚本时首次重启后无法访问虚拟机

问题描述

我在 GCP 的 CentOS7 VM 中使用以下启动脚本。首次重启后可访问该 url。但是,如果我重新启动机器或停止然后启动机器,则机器无法访问,并且 url 也不起作用。我虽然这可能是由于 selinux,所以我添加了禁用 selinux 的代码,但结果仍然相同。我通过创建多个新虚拟机尝试了这一点,但看起来有些东西我无法弄清楚。当我在虚拟机上手动执行这个脚本并尝试多次重启时,我没有遇到任何问题。

#!/bin/bash -xe

# introducing sleep so network interfaces and routes can get ready before fetching software
sleep 10

if rpm -q --quiet httpd ; then 
    echo "installed"
else
  yum update -y
  yum install -y httpd php php-common
  setenforce 0
  sed -i.bak -e 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
  
cat > /var/www/html/index.php <<'EOF'
<?php
function metadata_value($value) {
    $opts = array(
        "http" => array(
            "method" => "GET",
            "header" => "Metadata-Flavor: Google"
        )
    );
    $context = stream_context_create($opts);
    $content = file_get_contents("http://metadata/computeMetadata/v1/$value", false, $context);
    return $content;
}
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == "http") {
        $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        header('HTTP/1.1 301 Moved Permanently');
        header('Location: ' . $redirect);
        exit();
}
?>

<!doctype html>
<html>
<head>
<!-- Compiled and minified CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.0/css/materialize.min.css">

<!-- Compiled and minified JavaScript -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.0/js/materialize.min.js"></script>
<title>Frontend Web Server</title>
</head>
<body>
<div class="container">
<div class="row">
<div class="col s2">&nbsp;</div>
<div class="col s8">

<img src="/assets/gcp-logo.svg"/>

<div class="card blue">
<div class="card-content white-text">
<div class="card-title">Backend that serviced this request</div>
</div>
<div class="card-content white">
<table class="bordered">
  <tbody>
    <tr>
      <td>Name</td>
      <td><?php printf(metadata_value("instance/name")) ?></td>
    </tr>
    <tr>
      <td>ID</td>
      <td><?php printf(metadata_value("instance/id")) ?></td>
    </tr>
    <tr>
      <td>Hostname</td>
      <td><?php printf(metadata_value("instance/hostname")) ?></td>
    </tr>
    <tr>
      <td>Zone</td>
      <td><?php printf(metadata_value("instance/zone")) ?></td>
    </tr>
    <tr>
      <td>Machine Type</td>
      <td><?php printf(metadata_value("instance/machine-type")) ?></td>
    </tr>
    <tr>
      <td>Project</td>
      <td><?php printf(metadata_value("project/project-id")) ?></td>
    </tr>
    <tr>
      <td>Internal IP</td>
      <td><?php printf(metadata_value("instance/network-interfaces/0/ip")) ?></td>
    </tr>
    <tr>
      <td>External IP</td>
      <td><?php printf(metadata_value("instance/network-interfaces/0/access-configs/0/external-ip")) ?></td>
    </tr>
  </tbody>
</table>
</div>
</div>

<div class="card blue">
<div class="card-content white-text">
<div class="card-title">Proxy that handled this request</div>
</div>
<div class="card-content white">
<table class="bordered">
  <tbody>
    <tr>
      <td>Address</td>
      <td><?php printf($_SERVER["HTTP_HOST"]); ?></td>
    </tr>
  </tbody>
</table>
</div>

</div>
</div>
<div class="col s2">&nbsp;</div>
</div>
</div>
</html>
EOF

mkdir -p /var/www/html/group1 && cp /var/www/html/index.php /var/www/html/group1/index.php

systemctl enable httpd
systemctl restart httpd

fi

在控制台上,我可以看到以下输出

serialport: Connected to mytower.us-central1-a.centos7 port 1 (session ID: 405c4d17b926f0906f45a53784d4abd379d6480d, active connections: 1).
DS   - 0000000000000030, ES  - 0000000000000030, FS  - 0000000000000030
GS   - 0000000000000030, SS  - 0000000000000030
CR0  - 0000000080010033, CR2 - 0000000000000000, CR3 - 00000000BF401000
CR4  - 0000000000000668, CR8 - 0000000000000000
DR0  - 0000000000000000, DR1 - 0000000000000000, DR2 - 0000000000000000
DR3  - 0000000000000000, DR6 - 00000000FFFF0FF0, DR7 - 0000000000000400
GDTR - 00000000BF3EEA98 0000000000000047, LDTR - 0000000000000000
IDTR - 00000000BEE1F018 0000000000000FFF,   TR - 0000000000000000
FXSAVE_STATE - 00000000BFF39AB0
!!!! Find image based on IP(0xBF2E6D5C) /build/work/af60adde42b1d1ad5be2a01e4924bb905248/google3/blaze-out/k8-opt/genfiles/third_party/edk2/ovmf_x64_csm_debug_workspace_dir/ovmf_x64_csm_debug_edk2_files_dir/Build/OvmfX64/DEBUG_CLANG38/X64/OvmfPkg/8254TimerDxe/8254Timer/DEBUG/Timer.dll (ImageBase=00000000BF2E5000, EntryPoint=00000000BF2E6AB5) !!!!

有没有人面临这样的问题?请求帮助我找出重启后无法访问 VM 的原因。

谢谢

标签: google-cloud-platformgoogle-compute-engine

解决方案


这是已知问题,Google 工程师也知道:

我们目前遇到了运行 RHEL 和 CentOS 7 和 8 的 Google Compute Engine 实例的问题。有关此问题的更多详细信息,请参阅以下文章和错误:

症状:运行 yum update 的运行 RHEL 和 CentOS 7 和 8 的实例在重新启动后可能无法启动,错误消息涉及以下组合:

  • "X64 异常类型 - 0D(#GP - 一般保护) CPU Apic ID",
  • "FXSAVE_STATE",
  • 或“根据 IP 查找图像”。

此问题会影响安装了特定版本的 shim 包的实例。要查找当前安装的 shim 版本,请使用以下命令:rpm -q shim-x64

受影响的垫片版本:CentOS 7: shim-x64-15-7.el7_9.x86_64 CentOS 8: shim-x64-15-13.el8.x86_64 RHEL 7: shim-x64-15-7.el7_8.x86_64 RHEL 8: shim-x64-15-14.el8_2.x86_64

解决方法:不要更新或重新启动运行 RHEL 或 CentOS 7 和 8 的实例。如果您使用的是受影响的 shim 版本,请运行yum downgrade shim\* grub2\* mokutil以降级到正确的版本。此命令可能无法在 CentOS 8 上运行。如果您已经重新启动,则需要将磁盘附加到工作实例(尚未使用有问题的 shim 二进制文件更新),并将工作 shim 二进制文件复制到相关的 EFI挂载磁盘上的目录。对于 RHEL,这是/boot/efi/EFI/redhat/shimx64.efi. 对于 CentOS,这是 /boot/efi/EFI/centos/shimx64.efi

请关注 redhat 线程以获取实时更新。一旦问题最终解决,我们将在此处更新。

我建议您加入 Google 问题跟踪器并关注此案例

此外,您可以在Google Cloud Status Dashboard上查看此问题的状态。


推荐阅读