如何调试 Incus

有关调试实例问题的更多信息,请参阅 如何排查故障实例

调试 incusincusd

以下是一些有助于排查 incusincusd 代码的方法。

incus --debug

在任何客户端命令中添加 --debug 标志将提供有关内部的额外信息。如果没有任何有用的信息,则可以与日志记录调用一起添加它

logger.Debugf("Hello: %s", "Debug")

incus monitor

此命令将在远程服务器上显示消息。

通过本地套接字的 REST API

在服务器端,最简单的方法是通过本地套接字与 Incus 通信。此命令访问 GET /1.0 并使用 jq 实用程序将 JSON 格式化为人类可读的形式

curl --unix-socket /var/lib/incus/unix.socket incus/1.0 | jq .

有关可用的 API,请参阅 RESTful API

通过 HTTPS 的 REST API

到 Incus 的 HTTPS 连接 需要有效的客户端证书,该证书在第一次 incus remote add 时生成。此证书应传递给连接工具以进行身份验证和加密。

如果需要,可以使用 openssl 检查证书(~/.config/incus/client.crt

openssl x509 -text -noout -in client.crt

在这些行中,您应该看到

Certificate purposes:
SSL client : Yes

使用命令行工具

wget --no-check-certificate --certificate=$HOME/.config/incus/client.crt --private-key=$HOME/.config/incus/client.key -qO - https://127.0.0.1:8443/1.0

使用浏览器

一些浏览器插件提供了方便的界面来创建、修改和重放 Web 请求。要对 Incus 服务器进行身份验证,请将 incus 客户端证书转换为可导入的格式并将其导入浏览器。

例如,这将在 Windows 兼容格式中生成 client.pfx

openssl pkcs12 -clcerts -inkey client.key -in client.crt -export -out client.pfx

之后,打开 https://127.0.0.1:8443/1.0 应该可以按预期工作。

调试 Incus 数据库

全局 数据库 的文件存储在 Incus 数据目录(/var/lib/incus/database/global)的 ./database/global 子目录下。

由于集群的每个成员也需要保留一些特定于该成员的数据,因此 Incus 还使用一个简单的 SQLite 数据库(“本地”数据库),您可以在 ./database/local.db 中找到它。

在升级之前会对全局数据库目录和本地数据库文件进行备份,并使用 .bak 后缀进行标记。如果需要将状态恢复到升级之前的状态,可以使用这些备份。

转储数据库内容或模式

如果要获取数据库内容或模式的 SQL 文本转储,请使用 incus admin sql <local|global> [.dump|.schema] 命令,该命令会生成与 sqlite3 命令行工具的 .dump.schema 指令等效的输出。

从控制台运行自定义查询

如果需要对本地或全局数据库执行 SQL 查询(例如 SELECTINSERTUPDATE),可以使用 incus admin sql 命令(运行 incus admin sql --help 以获取详细信息)。

您只需要在从损坏的更新或错误中恢复时执行此操作。请先咨询 Incus 团队(创建 GitHub 问题论坛 帖子)。

在 Incus 守护进程启动时运行自定义查询

如果 Incus 守护进程在升级后由于 SQL 数据迁移错误或类似问题而无法启动,可以通过创建包含修复损坏更新的查询的.sql文件来恢复这种情况。

要对本地数据库执行修复,请编写一个包含相关查询的./database/patch.local.sql文件,类似地,对于全局数据库修复,请编写一个./database/patch.global.sql文件。

这些文件将在守护进程启动序列的早期加载,如果查询成功,则将其删除(如果失败,则不会更改任何状态,因为它们是在 SQL 事务中运行的)。

如上所述,请先咨询 Incus 团队。

将集群数据库同步到磁盘

如果要将集群数据库的内容刷新到磁盘,请使用incus admin sql global .sync命令,该命令会将一个纯 SQLite 数据库文件写入./database/global/db.bin,然后可以使用sqlite3命令行工具检查该文件。