排查因 fstab 错误而导致的 Linux 虚拟机启动问题


Fstab(文件系统表)是一个配置文件,用于定义 Linux 虚拟机中的磁盘分区、文件系统和文件共享装载在系统重新启动后的保留方式。

本文档概述了 fstab 配置不正确可能导致启动问题的多个条件,并提供了解决问题的问题排查建议。

下面列出了一些 fstab 配置错误的常见问题:

  • fstab 配置文件中存在语法错误
  • UUID 不正确
  • 存在未连接/不可用设备对应的条目
  • SUSERHEL 映像中,xfs 文件系统类型的装载选项(例如 nobarrier)已弃用。

准备工作

  • 如果您要在 Cloud Logging 中记录串行端口输出,请先了解 Cloud Logging
  • 如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. REST

      如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证

识别 fstab 问题

对于启动问题,Google 强烈建议您在 Linux 虚拟机的串行控制台中检查启动日志。虚拟机会进入紧急模式,并显示一条错误消息,提示该问题与 fstab 有关。

  [K[[1;31m TIME [0m] Timed out waiting for device dev-incorrect.device.
  [[1;33mDEPEND[0m] Dependency failed for /distribution.
  [[1;33mDEPEND[0m] Dependency failed for Local File Systems.
  ...
  Welcome to emergency mode! After logging in, type "journalctl -xb" to viewsystem logs, "systemctl reboot" to reboot, "systemctl default" to try again to boot into default mode.
  Give root password for maintenance
  (or type Control-D to continue)
  

根据错误消息,/distribution 文件系统存在依赖项故障。文件系统装载点的依赖项故障会因所使用的文件系统名称而异。

解决方法

使用以下方法来解决 Google Cloud 中托管的 Linux 虚拟机中的 fstab 错误。与使用手动方法相比,使用串行控制台可以更快地解决问题。

如需使用以下方法解决 fstab 问题,您必须为虚拟机启用串行端口访问权限

方法 1:使用串行控制台在紧急模式下登录虚拟机

  1. 从 Google Cloud 控制台登录虚拟机的串行控制台。 串行控制台

  2. 在当前紧急模式下,输入 root 密码以访问虚拟机。

  3. 使用您偏好的文本编辑器打开 fstab 文件。进行必要的更改,并将更改保存到 fstab 文件中。以下示例使用 vi 编辑器。

    vi /etc/fstab

    Fstab 文件

    在上面的示例中,/distribution 的设备与虚拟机分离。注释引用文件系统的行,或移除 /distribution 装载点的 fstab 条目。

    如需详细了解 fstab 配置和语法,请使用 man fstab

  4. 保存文件并退出编辑器。 如果您使用的是 vi 编辑器,请使用 ESC :wq! 保存并退出编辑器。

  5. 在提示符处输入 reboot 来恢复启动过程。

  6. 成功解决问题后,虚拟机启动过程应该会完成,并且串行控制台中会显示登录提示。

  7. 验证您是否可以使用 SSH 再次登录虚拟机。

方法 2 - 在串行控制台中使用单用户模式

如果未设置 root 密码,则可以使用此方法。

前提条件:grub 配置文件中的 GRUB_TIMEOUT 参数设置为非零值。此文件通常位于 /etc/default/grub,但在一些早期发行版中,它可能位于某个非标准目录中。

  1. 转到 Google Cloud 控制台中的“虚拟机实例”页面。 进入“虚拟机实例”

  2. 从 Google Cloud 控制台登录虚拟机的串行控制台。 串行控制台 2

  3. 在 Google Cloud 控制台中针对虚拟机点击重置

    重置文件

  4. 在串行控制台窗口中,点击 grub 屏幕或菜单中用于暂停的箭头键来中断启动过程。

  5. 在 grub 引导加载程序屏幕的内核列表中,选择内核,然后按键盘上的 e

    引导加载程序文件

  6. 在内核代码行的末尾添加 rd.break 参数,然后按 ctrl x。这有助于启动虚拟机进入单用户模式。

    引导加载程序菜单

  7. 以读写模式装载根文件系统。

  8. 分析、进行必要的更改并保存 fstab 文件。如需详细了解配置和语法,请使用 man fstab。使用您偏好的文本编辑器打开 fstab 文件。以下示例使用 vi 编辑器。

    vi /etc/fstab

    Fstab 文件 2

    在此示例中,/distribution 的设备与虚拟机分离,因此注释掉该行或移除 /distribution 装载点的 fstab 条目。

  9. 保存文件并退出编辑器。如果您使用的是 vi 编辑器,请使用 ESC :wq! 保存并退出 fstab。

  10. 在提示符处输入 reboot 来恢复启动过程。

  11. 成功解决问题后,虚拟机启动过程应该会完成,并且您应该会在串行控制台中看到登录提示。

  12. 验证您是否可以使用 SSH 登录虚拟机。

方法 3 - 救援虚拟机

如果未设置 root 密码或者您无法使用单用户模式,则可以使用此方法。

如需了解详情,请参阅救援无法访问的虚拟机