由于一个愚蠢的用户错误,我设法弄乱了我的 Ubuntu 16.04 LTS 安装——它启动到黑屏。
幸运的是,文件系统完好无损,我可以毫无困难地进入控制台会话。我试图恢复我的损害(逆转日志中的最后一组更改),在朋友的英勇帮助下,我们设法使用 xfce4 桌面(我在 14.04 天作为实验安装)进入图形会话.
我正在尝试按照此答案中的步骤将我的系统恢复到正确的工作状态(我使用 Unity),但是当我进入“第 3 步”时sudo debsums -cs
,它会停止。很快我就列出了一些丢失的字体(我删除了一些 Noto 字体——我知道这一点),然后这个过程就安静下来了。
我第一次让它运行了 18 个小时,并且在最初的几分钟后没有得到新的结果。我关闭了它,重新运行debsums_init
,然后再次尝试......结果完全相同。检查top
过程,它向我展示了这一点:
那么,我是否应该期望它debsums -cs
完成它的工作并退出提示?还是挂了?还是它告诉了我它要告诉我的一切,我应该杀了它?
更新- 解决了来自@muru 的以下诊断和建议(请参阅下面接受的答案):
这是输出lsof -p PID
:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
debsums 14678 root cwd DIR 8,2 4096 13369346 /home/user
debsums 14678 root rtd DIR 8,2 4096 2 /
debsums 14678 root txt REG 8,2 1907192 8475875 /usr/bin/perl
debsums 14678 root mem REG 8,2 27168 8651816 /usr/lib/x86_64-linux-gnu/perl/5.22.1/auto/File/Glob/Glob.so
debsums 14678 root mem REG 8,2 10368 10493560 /usr/lib/x86_64-linux-gnu/perl5/5.22/auto/File/FnMatch/FnMatch.so
debsums 14678 root mem REG 8,2 14480 9859421 /usr/lib/x86_64-linux-gnu/perl5/5.22/auto/Locale/gettext/gettext.so
debsums 14678 root mem REG 8,2 35328 8654166 /usr/lib/x86_64-linux-gnu/perl/5.22.1/auto/Encode/Encode.so
debsums 14678 root mem REG 8,2 102064 8524369 /usr/lib/x86_64-linux-gnu/perl/5.22.1/auto/POSIX/POSIX.so
debsums 14678 root mem REG 8,2 18704 8658188 /usr/lib/x86_64-linux-gnu/perl/5.22.1/auto/Digest/MD5/MD5.so
debsums 14678 root mem REG 8,2 18768 8654260 /usr/lib/x86_64-linux-gnu/perl/5.22.1/auto/IO/IO.so
debsums 14678 root mem REG 8,2 18696 8524352 /usr/lib/x86_64-linux-gnu/perl/5.22.1/auto/Fcntl/Fcntl.so
debsums 14678 root mem REG 8,2 47696 8658199 /usr/lib/x86_64-linux-gnu/perl/5.22.1/auto/List/Util/Util.so
debsums 14678 root mem REG 8,2 14608 8524357 /usr/lib/x86_64-linux-gnu/perl/5.22.1/auto/Cwd/Cwd.so
debsums 14678 root mem REG 8,2 2981280 8389721 /usr/lib/locale/locale-archive
debsums 14678 root mem REG 8,2 39224 7078564 /lib/x86_64-linux-gnu/libcrypt-2.23.so
debsums 14678 root mem REG 8,2 1864888 7078561 /lib/x86_64-linux-gnu/libc-2.23.so
debsums 14678 root mem REG 8,2 138696 7078570 /lib/x86_64-linux-gnu/libpthread-2.23.so
debsums 14678 root mem REG 8,2 1088952 7078569 /lib/x86_64-linux-gnu/libm-2.23.so
debsums 14678 root mem REG 8,2 14608 7078560 /lib/x86_64-linux-gnu/libdl-2.23.so
debsums 14678 root mem REG 8,2 162632 7078534 /lib/x86_64-linux-gnu/ld-2.23.so
debsums 14678 root mem REG 8,2 1719 9999141 /usr/share/locale-langpack/en_GB/LC_MESSAGES/dpkg-dev.mo
debsums 14678 root 0u CHR 136,0 0t0 3 /dev/pts/0
debsums 14678 root 1u CHR 136,0 0t0 3 /dev/pts/0
debsums 14678 root 2u CHR 136,0 0t0 3 /dev/pts/0
debsums 14678 root 3r REG 8,2 307 2915907 /var/lib/dpkg/info/libfm-extra4:amd64.md5sums
它前面有这个警告:
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
的输出watch lsof -p PID
是静态的,并且自开始以来没有改变:
watch
用| tail
管道运行给出:
也就是说,与上面屏幕截图中的最后 10 行相同。FWIW,libfm-extra4:amd64.md5sums
文件(307字节)以这种方式列出:
-rw-r--r-- 1 root root 307 Jul 12 2016 /var/lib/dpkg/info/libfm-extra4:amd64.md5sums
的输出sudo strace -p PID
给出了以下五行无限循环:
readlink("/usr/share/doc/libfm-extra4", "libfm4", 4095) = 6
lstat("/usr/share/doc/libfm4", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/usr/share/doc/libfm4/changelog.Debian.gz", {st_mode=S_IFLNK|0777, st_size=35, ...}) = 0
readlink("/usr/share/doc/libfm4/changelog.Debian.gz", "../libfm-extra4/changelog.Debian"..., 4095) = 35
lstat("/usr/share/doc/libfm-extra4", {st_mode=S_IFLNK|0777, st_size=6, ...}) = 0
调查/usr/share/doc/libfm-extra4
目录导致发现该changelog.Debian.gz
文件是符号链接,并且找不到目标。删除该文件允许该 debsums -cs
过程继续。
如果它有帮助:我通过将 Debian 源代码放入我的系统sources.list
并运行更新,而不是使用 GDebi 包管理器,从而损坏了我的系统。我失去了对统一的访问权限,尽管我现在正在同一台机器上工作,其中 xcfe 会话从控制台通过xstart
. 我无法以这种方式启动 Unity 会话。
如果
debsums
退出,您可以期待出现提示。但是,我认为它正在执行 IO 密集型操作,而且这些操作非常耗时。在另一个终端中,运行
lsof -p PID
,您可以从顶部获取 debsum 的 PID。这应该显示它打开的文件列表。运行watch lsof -p PID
以更新列表,您可以查看它是在进行还是卡住。打开文件列表的顶部主要由用于运行
debsums
自身的文件(perl 和各种 perl 模块)组成。感兴趣的部分是这里的最后一行——.md5sums
它正在读取的文件。它正在检查的文件可能会在列表的下方,所以可能运行watch 'lsof -p PID | tail'
.