重新安装所有涉及的 Debian 软件包/usr

重新安装所有涉及的 Debian 软件包/usr

我正在使用运行 Ubuntu Bionic Beaver 版本 18.04 的 Linux 机器。

前几天,我错误地将/usr/目录更改为用户所有,而不是 root。不幸的是,我以递归方式执行了此操作,因此弄乱了相当一部分系统,因为它还更改了suid某些命令的权限(例如passwdsudo)。我们真的无法重新安装(我们可以,但需要付费!),​​因此我从 LiveUSB 启动,并手动更改了每个我能识别出具有非 User Root:Root:Group 的文件的所有正确用户/组/权限。我通过比较另一台 Ubuntu 计算机的输出来做到这一点ls -lha /usr/

这个问题似乎基本已经修复,但现在我在运行一些相当标准的 Python 脚本后遇到了错误“std::bad_alloc”。奇怪的是,它只会偶尔出现。例如,如果我从命令行打开 Python 并复制和粘贴代码,代码将正常运行,不会出现任何错误。但是,如果我从命令行运行整个脚本(例如python script.py),则会出现此错误。完整的错误消息是:

terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc Aborted (core dumped)

但是还有另外一个问题——有时我可以从命令行运行相同的 python 脚本而没有任何问题,而其他时候我就会收到如上所述的错误。

如果有人知道具体在哪里可以修复这个问题,那就太好了!我将尝试做和以前一样的事情,但使用ls -lha /usr/18.04 版本的输出,因为我手头只有 16 版本的输出。

答案1

重新安装所有涉及的 Debian 软件包/usr

运行此命令来apt重新安装每个将文件放入的包/usr

dpkg-query -S '/usr/' |
  sed 's/: .*$//' |
  tr -d ',' |
  xargs apt install -y --reinstall

警告:重新安装无需确认提示。

如果你收到类似这样的消息

Package PACKAGE-NAME is not available, but is referred to by another package.

其中PACKAGE-NAME是无法获取的包,您可以排除该包以进行重新安装,如下所示:

dpkg-query -S '/usr/' |
  sed 's/: .*$//' |
  tr -d ',' |
  tr ' ' '\n' |
  grep -v 'PACKAGE-NAME' |
  xargs apt install -y --reinstall

grep -v您可以根据需要链接任意数量的命令。

解释

您所比较的 Ubuntu 系统可能没有安装相同的软件包,这意味着其中可能有更多具有错误权限的文件/usr

通过apt重新安装软件包,您可以非常确信/usr操作系统安装的所有文件都具有预期的权限。


重新安装所有 pip 包

本节假设您已以piproot 身份安装了 Python 包。

运行此命令重新安装所有 pip 包:

sudo pip freeze --local | xargs sudo pip install --upgrade --force-reinstall

运行此命令来删除 Python 字节码文件:

sudo find /usr/ -name '*.pyc' -delete

解释

由于您的问题涉及 Python,我认为您可能在类似/usr/local/lib/python2.7/dist-packages和 的路径中安装了系统范围的 Python 包/usr/local/lib/python3/dist-packages

当 Python 解释器运行时,它还会创建字节码文件 ( *.pyc),当您以递归方式弄乱文件夹权限时,这些文件的权限也可能受到影响/usr。删除这些.pyc文件可确保 Python 会在下次运行脚本时重新生成它们。


重新安装所有 Debian 软件包

如果仅重新安装涉及目录的软件包不能解决您的问题,那么还有这个更极端的选择。

运行此命令来apt重新安装系统上的每个软件包:

dpkg --get-selections |
  awk '{if($2=="install"){print $1}}' |
  xargs sudo apt install -y --reinstall

警告:重新安装无需确认提示。

解释

也许您的文件夹外面有东西/usr损坏了。

2018 年 2 月 7 日,我发现一个生产环境的 Debian 8 (jessie) 虚拟机管理程序崩溃了。重启后,该节点没有上线。

当我加载 Ubuntu 救援映像时,我甚至无法chroot进入损坏的虚拟机管理程序,因为/bin/bash出现了分段错误(有点像中止的 Python 脚本)。事实上,大多数系统文件都以某种方式损坏了。

该虚拟机管理程序上有一个生产虚拟机,由于虚拟机管理程序的状态损坏,需要花费相当大的精力才能将其重新部署到其他地方,因此我想尝试修复。

我将已知良好的 Debian 8 二进制文件和库文件复制到机器中,直到我能够chroot运行aptdpkg从这里,我可以指示apt重新安装整个系统。

处理完几个软件包问题后,每个软件包都成功重新安装。我重启后,服务器恢复正常,就像从未损坏过一样。

我确实必须单独重新部署服务器的 Python 包,因为它们也奇怪地损坏了,但至少生产虚拟机没有受到损害。

可以通过重新安装可以修复的系统来修复严重损坏的系统。对于未来,我建议尽可能地复制你的服务器版本,这样如果你的软件意外结盟无论怎样,您都可以轻松地重新配置系统。

相关内容