如何调试 Incus¶
有关调试实例问题的更多信息,请参阅 如何排查故障实例。
调试 incus 和 incusd¶
以下是一些有助于排查 incus 和 incusd 代码的方法。
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 查询(例如 SELECT、INSERT、UPDATE),可以使用 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命令行工具检查该文件。