我正在使用运行 Ubuntu Bionic Beaver 版本 18.04 的 Linux 机器。
前几天,我错误地将/usr/
目录更改为用户所有,而不是 root。不幸的是,我以递归方式执行了此操作,因此弄乱了相当一部分系统,因为它还更改了suid
某些命令的权限(例如passwd
,sudo
)。我们真的无法重新安装(我们可以,但需要付费!),因此我从 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 包
本节假设您已以pip
root 身份安装了 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
运行apt
。dpkg
从这里,我可以指示apt
重新安装整个系统。
处理完几个软件包问题后,每个软件包都成功重新安装。我重启后,服务器恢复正常,就像从未损坏过一样。
我确实必须单独重新部署服务器的 Python 包,因为它们也奇怪地损坏了,但至少生产虚拟机没有受到损害。
可以通过重新安装可以修复的系统来修复严重损坏的系统。对于未来,我建议尽可能地复制你的服务器版本,这样如果你的软件意外结盟无论怎样,您都可以轻松地重新配置系统。