我正在处理一个名为bin
. 完成后,由于其中的bin
一些文件的所有权,我不小心运行了:
sudo rm -r /bin
代替:
sudo rm -r bin
似乎我的手习惯于/
在我输入的所有内容前面添加一个。
如何恢复我的/bin
目录?
我想要属于我的 Ubuntu 的相同文件,我不喜欢从活动磁盘或其他正在运行的系统中复制和粘贴它们。
我正在处理一个名为bin
. 完成后,由于其中的bin
一些文件的所有权,我不小心运行了:
sudo rm -r /bin
代替:
sudo rm -r bin
似乎我的手习惯于/
在我输入的所有内容前面添加一个。
如何恢复我的/bin
目录?
我想要属于我的 Ubuntu 的相同文件,我不喜欢从活动磁盘或其他正在运行的系统中复制和粘贴它们。
可能吗?
好吧,大多数琐碎和重要的实用程序都安装在 中
/bin
,现在您无法访问所有这些实用程序。事实上,如果您重新启动,您的系统将无法再启动。无论如何,我们将解决这个问题,并使
/bin
's 的内容尽可能接近它的位置。唯一的区别是我们也会修复一些符号链接。如何?
首先,我们应该
chroot
进入您损坏的系统,但有细微的差别!之后,我们将获得系统上已安装软件包的列表,其中包含目录中的任何已安装文件/bin
,然后我们将只下载所需的软件包并将必要的文件解压缩到/bin
. 然后我们就完成了。例如,在 之后,我们可以得到一个在using
chroot
中安装了文件的包列表:/bin
我们还可以使用:
列出这些包中的已安装文件
/bin
。然后我们简单地创建一个我们需要的所有包的列表,然后下载它们并将它们提取到
/bin
类似的东西:但是,我们必须使用脚本来检查系统上所有已安装的软件包,因为手动操作简直是疯了。
所以我写了一个脚本来做我们需要的一切。它为我们找到所有需要恢复的包
/bin
,向我们显示每个包的名称及其所属的相关文件/bin
。这是一个屏幕截图:最后,我们选择重新安装所有软件包或仅下载并解压缩必要的文件
/bin
(这是推荐的选项):您可以获取此脚本的副本或直接下载。
开始吧
chroot
使用与安装的 Ubuntu 具有相同架构的 live 磁盘启动系统,打开终端并获得 root 访问权限:
挂载你的
root
文件系统(对我来说是/dev/sda1
):我们需要连接到 Internet,因此
resolv.conf
从实时 Ubuntu 复制到您安装的根分区:现在将脚本复制到已安装分区上的某个位置,例如:
或者您可以使用
wget
等下载它,例如:挂载其他必要的路径:
这是一个小的区别:
chroot
当那里没有/bin
目录时,我们如何处理损坏的系统?我们应该运行哪个shell?所以创建一个临时的bin目录。
bintmp
例如:在您损坏的系统根目录中命名:然后将 live 绑定
/bin
到:Chroot 进入系统,同时将 设置
/bintmp/bash
为您的登录 shell:导出
/bintmp
为您的PATH
环境变量:给脚本可执行位:
运行脚本:
等待搜索完成,然后回答我们在屏幕截图中看到的问题。它将开始恢复
/bin
,我们几乎完成了。完成后,使用CTRL+D退出
chroot
环境并卸载已安装的路径:重新启动系统。
恢复里面的链接
/bin
现在目录中的几乎所有文件
/bin
都回来了,除了大约 5 个由update-alternatives
.在您正在运行的系统中,运行:
它问你一些问题;你可以简单地按ENTER接受它们。
现在我们完成了。
如果您当前的系统仍然有一个正在运行的 shell 和互联网访问,这可以使用系统上其他地方的工具来完成。我假设你只删除了
/bin
./bin
当然有在这种情况下可以使用的最方便的实用程序(busybox),但没有它,我们将不得不有点创意。既然您已经有一个正在运行的 shell,并且因为
sudo
是 in/usr/bin
,那么在我们造成进一步的损害之前,让我们自己获得一个正在运行的 root shell。但是/bin/bash
,大多数其他贝壳都不见了!幸运的是,Linux 仍然有您正在使用的 shell 的内存副本。所以:严格来说,我们在接下来的大部分内容中都不需要 root shell。但不管怎么说。
现在,
dpkg
仍然可以工作,至少可以找到哪些包有文件/bin
:我们可以使用
awk
它来处理它并获取包名,并xargs
下载apt-get
包(全部在 中/usr/bin
)。如果您有一个可以使用的临时目录,cd
则在那里,因为您的当前目录会变得有点混乱:现在,我们遇到的最大问题
/bin/tar
是缺少,没有它,dpkg
无法提取档案。我们可以到达那里的三分之二,因为:.deb
文件实际上是ar
档案(再次在 中/usr/bin
):包括两个
.tar.*
档案,data
和control
:当 gzip 实用程序位于 时
/bin
,unxz
位于/usr/bin
:现在我们有一个
data.tar
文件,无需tar
从中提取tar
。Python来救援!这是
sudo
真正需要的地方:现在我们可以使用
dpkg
提取剩余的 deb 文件来获得一个相当完整的/bin
:但是,我们仍然应该正确安装 deb 文件,以便重新创建将由包创建的符号链接等:
或者:
笔记:
我们不能使用 Python 2 直接提取
data.tar.xz
文件,因为 Python 2 只支持 gzip 和 bzip2 压缩。然而,Python 3 确实支持它,因此您可以直接使用 Python 3 而无需unxz
:/bin/tar
,您仍然需要提取一些 deb 文件才能使用apt-get
:shell、coreutils 等。更容易将它们全部提取并稍后重新安装。您可以暂时将来自 live CD 或其他系统的文件放入您
/bin
的系统中以使您的系统可用,然后通过运行apt-get install --reinstall
包含/bin
.在我遇到此问题后(连同删除 、 和 ),对这个出色的答案进行了一些补充:
/boot
/etc
/lib
/lib64
chroot
需要/lib
并且/lib64
必须在场;否则您将收到以下错误:failed to run command ‘/bin/bash’: No such file or directory
我从 LiveCD 操作系统复制了这些,恢复时没有任何问题。YMMV 取决于您在系统上安装的软件包
cp /etc/resolv.conf /mnt/etc/resolv.cof
应该是
cp /etc/resolv.conf /mnt/etc/resolv.conf
/boot
可以使用 grub 工具轻松恢复。见这里。apt install --reinstall <package>
是恢复 和 中丢失文件的好/bin
方法。/lib
/lib64
libaio1
,mysql-server
,openvpn
,vsftpd
自我注意:
rm -rf folder /*
不一样rm -rf folder/*