假设我有一个 Linux 系统,例如 Debian、Ubuntu 或 CentOS,其中用户删除了/lib
。假设我成功地使用该系统运行的任何操作系统的 livecd 版本来启动该系统。是否可以运行/lib
在损坏的系统上重建的命令?
例如,我猜想这样的事情可以通过重新安装目标系统正在使用的所有软件包来实现。
我有一个同事遇到过这种情况,但最终的结果是完全重装。然而,这让我思考是否可以修复,或者更快?
答案1
在大多数情况下,这应该相对容易修复。您可以使用以下目录生成所有已安装软件包的列表/lib
:
dpkg -S /lib | awk -F': ' '{ print $1 }' | tr -d ,
如果重新安装这些软件包,应该可以解决问题:
apt-get --reinstall $(dpkg -S /lib | awk -F': ' '{ print $1 }' | tr -d ,)
这当然取决于删除的目录对于apt-get
.工作所需的软件包apt-get
必须手动安装,甚至可能没有dpkg
.在这种情况下,可以在另一台计算机上提取软件包并将文件复制到位,无论如何它们稍后都会重新安装,apt
因此这不会导致任何其他问题。
查看我自己的将文件放入的软件包列表/lib
,我发现主要的是内核(所有模块都转到/lib/modules
)和libc
。这两个几乎肯定需要重新安装才能使系统启动。一种方法是从基于 Debian 的实时系统进行安装。如果您下载了必要的软件包并安装了目标系统的根目录,您可以将选项添加--root
到dpkg
那里进行安装,例如:
dpkg --root=/path/to/target/root -i package1.deb package2.deb ...
如果需要,该--root
选项也可以与第一个命令一起使用。dpkg
当然,只要有足够的耐心和技巧,在线修复应该是可以的。如果该dpkg
命令不起作用,您始终可以尝试直接在 中查找包依赖项,并通过中的文件/var/lib/dpkg/info
搜索放置文件的包。/lib
.list
/var/lib/dpkg/info
为了让您了解可以实现什么目标,这里有一篇关于某人设法恢复正在运行的 Gentoo 系统的博客,其中全部软件包已被卸载。它是一本有趣的读物,加上所使用的一些技术(或评论中建议的技术)可以应用于这种情况 -http://fakeguido.blogspot.co.uk/2010/08/rescuing-hosed-system-using-only-bash.html
答案2
我认为在大多数情况下,如果没有正常工作的/lib
目录,您需要进行修复工作的许多应用程序将不再存在。我会硬着头皮重新安装。
如果您无论如何都想尝试一下,那么以下是针对基于 RedHat 的发行版的操作。
对于基于 Redhat 的发行版(例如 CentOS/Fedora/RHEL),您可以使用 RPM 来验证和修复已安装软件包的某些方面。
验证所有包装
% rpm -qVav
......... /usr/bin/rdesktop
......... /usr/share/doc/rdesktop-1.6.0
......... d /usr/share/doc/rdesktop-1.6.0/AUTHORS
......... d /usr/share/doc/rdesktop-1.6.0/COPYING
......... d /usr/share/doc/rdesktop-1.6.0/ChangeLog
......... d /usr/share/doc/rdesktop-1.6.0/HACKING
......... d /usr/share/doc/rdesktop-1.6.0/README
......... d /usr/share/doc/rdesktop-1.6.0/TODO
......... d /usr/share/doc/rdesktop-1.6.0/ipv6.txt
......... d /usr/share/doc/rdesktop-1.6.0/keymap-names.txt
......... d /usr/share/doc/rdesktop-1.6.0/keymapping.txt
...
...
验证 openssh
% rpm -qVv openssh
......... /etc/ssh
..?...... c /etc/ssh/moduli
......... /usr/bin/ssh-keygen
......... /usr/libexec/openssh
......... /usr/libexec/openssh/ssh-keysign
......... /usr/share/doc/openssh-5.5p1
......... d /usr/share/doc/openssh-5.5p1/CREDITS
......... d /usr/share/doc/openssh-5.5p1/ChangeLog
......... d /usr/share/doc/openssh-5.5p1/INSTALL
......... d /usr/share/doc/openssh-5.5p1/LICENCE
......... d /usr/share/doc/openssh-5.5p1/OVERVIEW
...
...
修复权限和所有权
% rpm --setperms {packagename}
% rpm --setugids {packagename}
笔记:有关输出man rpm
的更多详细信息,请参阅 参考资料。-V|--verify
请参阅这篇文章了解更多详细信息:http://www.cyberciti.biz/tips/reset-rhel-centos-fedora-package-file-permission.html。
答案3
正如其他人所说,如果这种情况发生在我身上,我可能会重新安装。但是,如果我尝试进行修复,我首先将/lib
目录从实时安装复制到我的系统中。如果全部/lib
被删除,那么一开始什么都不起作用,甚至包管理器也不起作用,所以这样的步骤可能是必要的。然后我会进入我的包管理器,并重新安装所有包含/lib
已列出的文件的包(有关如何获取此类列表的信息,请参阅 Graeme 的答案)。然后,作为最后的清理工作,我会删除/lib
从实时安装中复制的所有不应该存在的文件; ie 与已安装包中的文件不对应。
答案4
就速度而言,我认为重新安装会更快。由于您仍然需要选择系统和平,更不用说您稍后调试可能由此引起的一些问题可能需要花费的时间,这会花费您更长的时间。我建议只重建机器,因为这肯定会让系统达到稳定状态。