openSUSE:YaST 回报故障

跳转至: 导航, 搜索
本页面描述如何回报 YaST2 或安装过程的故障。

目录

附件 - y2logs,hwinfo 等等

我回报了一个 YaST2 故障,现在叫我 "附上 y2logs" (软件包安装问题还有 "libzypp 日志")。这什么意思?我该怎么做?

YaST2 运行时会写入日志信息到 /var/log/YaST2 下的日志文件。我们需要那些信息来重现故障。

Libzypp (软件包库) 会记录软件包安装信息到 /var/log/zypp, /var/log/zypper.log 和 /var/log/pk_backend_zypp (由 'gpk-update-viewer' 记录)。

从 SUSE Linux 9.3 或 SLES-9 SP1 起,在 QT 用户界面 (图形模式下) 按 Shift-F8。将提示您保存日志的文件名。

在 NCurses 用户界面 (文本模式下),退出用户界面并使用壳层命令

save_y2logs /tmp/y2logs.tgz

从 SUSE Linux 11.2 起,Shift-F8 和 save_y2logs 也会搜集 /var/log/zypper.log 和 /var/log/pk_backend_zypp。之前的版本 (包括 SLES 11 GM/ SP1/SP2) 需要手动添加这些文件。

SUSE Linux 9.2 (或 SLES-9) 或更早版本,请创建一个全部那些文件的 (压缩的) tar 存档。请不要尝试猜测我们可能需要哪个又不需要哪个 - 大多数人都猜不对的。您可以轻松地把它们全打包起来,像这样:

cd /var/log
tar -czvf /tmp/y2logs.tgz YaST2

不管您正在使用哪个版本,如果故障出现在安装/升级的第一个步骤或出现在系统修复的时候,请不要忘记从 /tmp (它是一个内存盘) 中复制生成的文件到安全位置 - 如软盘、USB 记忆棒、其它硬盘分区或本地网络中的其它计算机中。

最后,使用 /tmp/y2logs.tgz 文件为相关的故障报告创建一个新的 bugzilla 附件。请指定文件类型为 tar.gz 存档 (app/x-gunzip) 而别依赖 bugzilla 去自动检测文件类型。

Firefox 随附我使用 save_y2logs 保存的 /tmp/y2logs-*.tar.gz 失败了。为什么?

这很正常。因为 save_y2logs 需要以 root 身份运行,保存文件的模式是 0600。因此您的浏览器无法读取该文件。在 Firefox 中您不会看到错误消息,提交按钮无声无息的就失败了。请试试:

sudo chmod a+r /tmp/y2logs-*.tar.gz

我附上了 /var/log/YaST2/y2log 到 YaST2 故障报告,还问我要 y2logs。为什么呀?

因为 y2log 只是我们重现故障所需的文件之一。/var/log/YaST2 包含许多其它文件。y2logs 在特定大小就会被分割,因此名为 y2log 的那个文件只是最新的那个日志文件 - 若是老日志包含我们需要的信息时我们就会管你要。另外其它文件也可能帮助我们调试。

请不要尝试猜测我们可能需要哪个又不需要哪个 - 大多数人都猜不对。请压缩整个文件夹 - 细节请参考上一个问题。

这很重要,您在安装失败后应该总是附上 /var/log/YaST 的文件夹内容,这么做的最好方法是使用 安装时让 YaST 记录日志到 USB 随身碟

我希望回报一个软件包依赖和 libzypp 求解器相关的故障,让我 "附上一个求解器测试用例 (solver testcase)"。我要附上哪些日志?

您可以通过在单个软件包选择框选择菜单项:

 额外/生成一个依赖关系求解器测试用例 
来创建一个求解器测试用例。这种故障申报您需要附上生成的日志文件到 bugzilla 条目中。

要使用 zypper 创建一个求解器测试用例,添加选项 --debug-solver 到您的 zypper 命令即可。如果该选项不被您的命令支持,或者没有相关的 zypper 命令,像下面这样运行 zypper 即可:

 $ zypper in --debug-solver nopackage
 Loading repository data...
 Reading installed packages...
 'nopackage' not found.
 Resolving package dependencies...
 Generating solver test case...
 Solver test case generated successfully at /var/log/zypper.solverTestCase.

然后打包含有测试用例的文件夹并附到故障报告中:

 $ tar cjvf /tmp/zypper.solverTestCase.tar.bz2 /var/log/zypper.log /var/log/zypper.solverTestCase

如果测试用例超出了 Bugzilla 的 10MB 上传限制,您可以使用 split 来将该文件分成小块:

 $ cd /tmp
 $ ls -lh zypper.solverTestCase.tar.bz2
 -rw-r--r--  1 root root 22M Jul  8 09:44 zypper.solverTestCase.tar.bz2

 $ split -b 9M --additional-suffix=-zypper.solverTestCase.tar.bz2 zypper.solverTestCase.tar.bz2
 $ ls -lh x*
 -rw-r--r--  1 root root  9.0M Jul  8 09:56 xaa-zypper.solverTestCase.tar.bz2
 -rw-r--r--  1 root root  9.0M Jul  8 09:56 xab-zypper.solverTestCase.tar.bz2
 -rw-r--r--  1 root root  3.5M Jul  8 09:56 xac-zypper.solverTestCase.tar.bz2

上述生成的求解器测试用例针对 95% 的情况都是足够的!方法二(只适用于上述方法不起作用时。):

在 SUSE Linux 10.1 (或更早版本) 中请附上 /var/log/YaST2/* 到 bugzilla 条目,解释在。多数情况下先行增加日志级别和日志大小都是有用的:

针对软件包安装:

export ZYPP_FULLLOG=1
export Y2MAXLOGSIZE=123456789
export Y2MAXLOGNUM=42
yast2 -i

针对 YaST2 在线更新器:

export ZYPP_FULLLOG=1
export Y2MAXLOGSIZE=123456789
export Y2MAXLOGNUM=42
yast2 online_update

针对图形界面的 YaST:

 kdesu -u root -c env ZYPP_FULLLOG=1 Y2MAXLOGSIZE=123456789 Y2MAXLOGNUM=42 /sbin/yast2

我想要回报一个 Zypper 相关故障 (Zypper 以及使用 ZYpp 后端的 OpenSUSE 更新挂件)。我要附上那些日志?

请附 /var/log/zypper.log 到该故障。更多信息请参考Zypper 疑难解答

如果 KDE 更新挂件中选择了 ZYpp 后端,它将在内部使用 Zypper 来执行它的任务 (比如检查更新,安装更新)。如果您怀疑问题其实是与执行这些任务有关而不是与挂件的界面或其它部分有关,请附上 /var/log/zypper.log

我希望回报一个 ZENWorks 有关的故障 (ZMD, rug, 软件更新器)。我应该附上哪些日志?

请附 /var/log/zmd-*.log 到故障报告。我们通常需要 zmd-messages.log*zmd-backend.log*

由于这些文件可能非常大,上传前请先压缩。这将节省我们两边的流量。

如果您正在运行 SLES 或 SLED 10 服务报 2 或更新版本,您需要自行生成一个求解器测试用例。

/usr/lib/zmd/zmd-solver-testcase /var/lib/zmd/zmd.db output-dir

您应该在 rug 等待确认交易时生成它。因为这时 zmd.db 中才有交易信息。

打包输出文件夹并附到故障报告。

如果您在交易确认中生成了测试用例,例如当 rug 请求确认安装软件包时,测试用例将包含所选的交易,这能帮助查找问题。

我想要回报注册故障。我需要做什么特别的事情吗?

是的,请附 /root/.suse_register.log 和 /var/log/messages 到该故障。

我回报了一个 YaST2 故障,但要我 "附上 hwinfo"。这是什么意思,我该怎么做?

hwinfo 是进行硬件探测的命令。我们需要该命令的输出来确认检测到了哪些硬件 - 究竟是否检测到了您报错的硬件没有,是否正确检测到了,或者是不是已知硬件问题。

执行该命令:

hwinfo >/tmp/hwinfo.txt

并附上生成的文件 hwinfo.txt 到 Bugzilla 上。

请不要附上 /usr/sbin/hwinfo 文件本身 (哈哈,有些孩子确实这么干过) - 我们需要输出,哪个文件我也有 =。=

我如何附上 YaST2 荧幕截图?

在 Qt (图形模式下) 安装中,按 PrintScreen 键就可以。将提示您要保存的文件名。然而这不能用于 NCurses (文本模式下) 安装中。

(开发组卖个萌:这是 YaST 的功能,不是 KDE 的)

如果终端中依然出现该故障,您可以在终端中打开 YaST2 并使用 ksnapshot (或其它截图工具)截图。

我如何在安装时执行壳层命令?

如果您正在使用一个物理的 (不是网络的) 控制台,使用 Ctrl-Alt-F2 切换到 2 号控制台。安装期间那里会运行一个根用户壳层。

如果您在一个有图形界面的网络控制台中 (例如 VNC),您可以按 Ctrl-Alt-Shift-X 获得 X 终端窗口,详情见从 YaST 调用终端

y2logs 似乎没有显示我的问题。可以让日志更加详细吗?

是的,可以:您可以开启调试日志 (日志界别 y2debug):

  • 在安装好的系统上,设置 Y2DEBUG 环境变量并从相同的壳层启动YaST2(!):
export Y2DEBUG=1
yast2
  • 安装时如果需要调试日志,添加 y2debug 到内核引导参数中 (在引导菜单底部的输入区)。
  • 如果您忘记了添加 y2debug 到内核引导参数,您仍可以在 QT 界面 (图形模式下) 使用 Shift-F7。
  • 发送 SIGUSR1 到 y2base 也能触发调试日志:
pkill -USR1 -f y2base

在任何情况下,请注意调试日志非常之详细,以至于日志可能非常长 - 如果处在安装第一阶段这可能会是一个问题,因为 /var/log 那时候是一个内存盘。

如果我告诉您出故障的计算机的主机名或 IP,您可以自己从那儿撷取全部所需信息,不行吗?

不行,这是故障回报人的责任。

有对问题计算机的 ssh 访问是一个非常好的加分点,但这在任何时候都不能替代附上y2logs 到故障报告。

首先,我们发现很大部分回报为 YaST2 或安装相关的故障最后其实都是其它一些完全不相关的故障 - 软件包问题 (通过 YaST2 安装,但那不代表这些就是 YaST2 的问题),内核问题,硬件不兼容,出于不阅读文档导致的误解。这意味着我们 YaST2 维护者,已经为许多其它问题做了耗时的第一手支持,我们真的不想再做更多的「奴隶样」工作了 (例如撷取 y2logshwinfo 等)。

另外,等我们有空去做事的时候,这台有问题的计算机可能早就发生变动了 - 重装了、记录的全是无用的东西等等; 我们也不能放弃所有工作,一有故障报告就及时地 ssh 到计算机撷取日志等东西 - 尤其是那个时候就没有办法清晰的判断出谁应该来对付那个故障,因此那些分配故障报告的人就必须在他们的本职工作之外进行该工作。

我该如何在安装时将 YaST 日志重定向到远程计算机?

这在高级测试/调试时非常有用。您可以在安装开始前轻松地将您的安装日志重定向到一个远程 NFS 服务器 (或其它计算机)。这里有一篇如何配置的文章。

我该如何在安装时将 YaST 日志重定向到 USB 记忆棒?

这和前面的答案很像。YaST 日志可重定向到启用了写入权限的任何设备中,比如 USB 记忆棒或其它硬盘。这里有一篇如何配置的文章。

我如何在调试器 (gdb) 中启动 YaST?我该如何创建回溯 (backtrace)?

有时会要求您在调试器中运行 YaST (例如,当 YaST 崩溃时) 来取得更纤细的信息。

要提供这些完整的调试信息您需要安装相关的 *-debuginfo 软件包。这通常意味着 yast2-core-debuginfoyast2-pkg-bindings-debuginfolibzypp-debuginfo 软件包。如果崩溃发生在 YaST 之外 (在外部库而不是 YaST 自身的库中) 您或许还需要额外的 debuginfo 软件包。

Debuginfo 软件包可从 extra 仓库安装,例如 http://download.opensuse.org/factory/repo/debug/ 含有 Factory 仓库的 debuginfo 软件包。不安装 debuginfo 软件包调试可行,但会丢失一些信息 (例如,函数名,源代码中的精确位置...) 所以结果或许会没用。

要在 gdb 调试器中启动 YaST 解释器使用本命令

gdb /usr/lib/YaST2/bin/y2base

然后用

run <模块名> qt

来在 Qt 图形界面下运行相应的 YaST 模块,使用 gtk 来在 Gtk 图形界面下运行 (ncurses 图形界面也可以用但那样 gdb 和 YaST 输出将混掉,如果解决请见下一段)。您可以使用 'yast -l ' 命令来查看可用模块列表。

另一种方法是让 gdb 监视已经运行的 YaST 进程。这种情况使用本命令

gdb /usr/lib/YaST2/bin/y2base <PID>

PID 是 y2base 进程的进程 ID。使用如 'ps -aux' 命令来取得该 ID。在监视了之后在调试器中使用 'cont' 命令来再次运行 YaST。 这种方法可以调试在 ncurses 界面下运行的 YaST 模块 (在另一个终端中做)。

现在我们在 gdb 中跑起了 YaST,可以尝试重现错误 (崩溃) 了。当 YaST 模块崩溃时在运行中的调试器中使用 bt 命令来显示问题堆栈 (即回溯,backtrace)。如果您需要把它附到故障报告中,您可以复制&粘贴该输出。

常见问题

我遇到了一个红色弹出文本,提示我 "安装时出错 (An error occurred during installation)"。还有办法抢救出日志文件吗?

可以!只要错误的弹出窗口还开着,2 号控制台的根壳层就依然还在运行。这时您可以使用 2 号控制台的壳层来复制那次失败的安装尝试的日志文件。然而您一旦确认那个错误弹出窗口它就终止了。

YaST 询问我是否该错误也在手动安装时发生。什么是 "手动安装"?

在安装介质引导菜单,选择 "安装" 并输入 "manual=1" 作为引导选项。将提示您确认装载内核模块。当安装在确认了一个模块后僵死,您就知道是由于硬件不兼容或内核驱动问题造成的错误了。

我中止了安装并从 "linuxrc" 重启了安装,现在它问我许多关于装载内核模块的问题。我哪里做错啦?

您掉到 "手动安装" 模式去了。这是完全正常的。

安装只在文本模式启动,但我很确定我的计算机的显卡没有问题!发生什么啦?

图形安装需要在帧缓冲模式有 800x600 或更高的分辨率。不是所有的显卡都能支持 VESA 兼容到这个地步的,因此安装时使用的 X 服务器将回滚到 640x480,该分辨率是不能显示出全部东西的。我们收到了如此之多的抱怨说文本或对话框元素被截断以至于我们决定放弃支持这些古老显卡的图形安装模式。

阅读 YaST 日志

如果您希望自行阅读 YaST 日志 (/var/log/YaST2/y2log),您可能会迷失在完整的信息中而忽略了相应的部分。

想要只查看重要消息,您可以在 y2log 中 grep 日志级别:

grep '<[2345]>' /var/log/YaST2/y2log

将只显示重要性超过 "警告" 级别的日志。

现存的日志级别有:

  • 0: 调试
  • 1: 里程碑
  • 2: 警告
  • 3: 错误
  • 4: 安全 (很少用 - 如果有用的话)
  • 5: 内部 (有时用于特殊的调试消息)
日志级别的详细描述可以在YaST2 文档中找到。