如何排查实例故障

如果您的实例无法启动并进入错误状态,这通常表示与用于创建实例的镜像或服务器配置相关的更大问题。

要排查问题,请完成以下步骤

  1. 保存相关的日志文件和调试信息

    实例日志

    输入以下命令以显示实例日志

    incus info <instance_name> --show-log
    
    控制台日志

    输入以下命令以显示控制台日志

    incus console <instance_name> --show-log
    
  2. 重新引导运行 Incus 服务器的机器。

  3. 尝试再次启动您的实例。如果错误再次出现,请比较日志以检查它是否是相同的错误。

    如果是,并且如果无法从日志信息中找出错误的来源,请在论坛中提出问题。请务必包含您收集的日志文件。

故障排除示例

在此示例中,让我们调查一个 RHEL 7 系统,其中systemd无法启动。

user@host:~$ incus console --show-log systemd
控制台 日志: 无法 插入 模块 'autofs4'无法 插入 模块 'unix'无法 挂载 sysfs /sys: 操作 不允许无法 挂载 proc /proc: 操作 不允许[!!!!!!] 无法 挂载 API 文件系统, 冻结。

这里的错误表明无法挂载/sys/proc - 这在非特权容器中是正确的。但是,如果可以,Incus 会自动挂载这些文件系统。

容器要求指定每个容器都必须带有一个空的/dev/proc/sys目录,并且必须存在/sbin/init。如果这些目录不存在,Incus 无法挂载它们,然后systemd将尝试这样做。由于这是一个非特权容器,因此systemd没有执行此操作的能力,然后它会冻结。

因此,您可以查看任何内容更改之前环境,并且可以使用raw.lxc配置参数在容器中显式更改 init 系统。这相当于在 Linux 内核命令行上设置init=/bin/bash

incus config set systemd raw.lxc 'lxc.init.cmd = /bin/bash'

以下是它的外观

user@host:~$ incus config set systemd raw.lxc 'lxc.init.cmd = /bin/bash'
user@host:~$ incus start systemd
user@host:~$ incus console --show-log systemd
控制台 日志: [root@systemd /]#

现在容器已启动,您可以检查它并查看事物是否按预期运行

user@host:~$ incus exec systemd -- bash
[root@systemd ~]# ls[root@systemd ~]# mountmount: 无法 读取 mtab: 没有 此类 文件 目录[root@systemd ~]# cd /[root@systemd /]# ls /proc/sys[root@systemd /]# exit

由于 Incus 尝试自动修复,因此它在启动时创建了一些目录。关闭并重新启动容器可以解决问题,但根本原因仍然存在 - 模板不包含所需的文件。