AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 906674
Accepted
Ravexina
Ravexina
Asked: 2017-04-20 07:02:13 +0800 CST2017-04-20 07:02:13 +0800 CST 2017-04-20 07:02:13 +0800 CST

意外删除 /bin。我该如何恢复它?

  • 772

我正在处理一个名为bin. 完成后,由于其中的bin一些文件的所有权,我不小心运行了:

sudo rm -r /bin

代替:

sudo rm -r bin

似乎我的手习惯于/在我输入的所有内容前面添加一个。

如何恢复我的/bin目录?

我想要属于我的 Ubuntu 的相同文件,我不喜欢从活动磁盘或其他正在运行的系统中复制和粘贴它们。

command-line
  • 4 4 个回答
  • 35879 Views

4 个回答

  • Voted
  1. Best Answer
    Ravexina
    2017-04-20T07:02:13+08:002017-04-20T07:02:13+08:00

    可能吗?

    好吧,大多数琐碎和重要的实用程序都安装在 中/bin,现在您无法访问所有这些实用程序。事实上,如果您重新启动,您的系统将无法再启动。

    无论如何,我们将解决这个问题,并使/bin's 的内容尽可能接近它的位置。唯一的区别是我们也会修复一些符号链接。


    如何?

    首先,我们应该chroot进入您损坏的系统,但有细微的差别!之后,我们将获得系统上已安装软件包的列表,其中包含目录中的任何已安装文件/bin,然后我们将只下载所需的软件包并将必要的文件解压缩到/bin. 然后我们就完成了。

    例如,在 之后,我们可以得到一个在usingchroot中安装了文件的包列表:/bin

    dpkg --search /bin | cut -f1 -d: | tr ',' '\n'
    

    我们还可以使用:

    dpkg --listfiles PACKAGE-NAME | grep "^/bin/" # or awk '$0 ~ "^/bin/
    

    列出这些包中的已安装文件/bin。

    然后我们简单地创建一个我们需要的所有包的列表,然后下载它们并将它们提取到/bin类似的东西:

    xargs apt download < list-packages
    dpkg-deb -x PACKAGE .
    mv ./bin/* /bin
    

    但是,我们必须使用脚本来检查系统上所有已安装的软件包,因为手动操作简直是疯了。

    所以我写了一个脚本来做我们需要的一切。它为我们找到所有需要恢复的包/bin,向我们显示每个包的名称及其所属的相关文件/bin。这是一个屏幕截图:

    我的脚本输出的 <code>/bin</code> 包列表截图

    最后,我们选择重新安装所有软件包或仅下载并解压缩必要的文件/bin(这是推荐的选项):

    我的脚本给出的选项的屏幕截图

    您可以获取此脚本的副本或直接下载。


    开始吧

    chroot

    使用与安装的 Ubuntu 具有相同架构的 live 磁盘启动系统,打开终端并获得 root 访问权限:

    sudo -i
    

    挂载你的root文件系统(对我来说是/dev/sda1):

    mount /dev/sda1 /mnt
    

    我们需要连接到 Internet,因此resolv.conf从实时 Ubuntu 复制到您安装的根分区:

    cp /etc/resolv.conf /mnt/etc/resolv.conf
    

    现在将脚本复制到已安装分区上的某个位置,例如:

    cp /media/ubuntu/usb/restore-bin.sh /mnt/restore-bin.sh
    

    或者您可以使用wget等下载它,例如:

    wget https://git.io/v9fRm -O /mnt/restore-bin.sh
    

    挂载其他必要的路径:

    mount --bind /dev /mnt/dev
    mount --bind /sys /mnt/sys
    mount -t proc /proc /mnt/proc
    

    这是一个小的区别:chroot当那里没有/bin目录时,我们如何处理损坏的系统?我们应该运行哪个shell?

    所以创建一个临时的bin目录。bintmp例如:在您损坏的系统根目录中命名:

    mkdir /mnt/bintmp
    

    然后将 live 绑定/bin到:

    mount --bind /bin /mnt/bintmp
    

    Chroot 进入系统,同时将 设置/bintmp/bash为您的登录 shell:

    chroot /mnt /bintmp/bash
    

    导出/bintmp为您的PATH环境变量:

    export PATH=/bintmp:$PATH
    

    给脚本可执行位:

    chmod +x restore-bin.sh
    

    运行脚本:

    ./restore-bin.sh
    

    等待搜索完成,然后回答我们在屏幕截图中看到的问题。它将开始恢复/bin,我们几乎完成了。

    完成后,使用CTRL+D退出chroot环境并卸载已安装的路径:

    umount -R /mnt
    

    重新启动系统。

    恢复里面的链接/bin

    现在目录中的几乎所有文件/bin都回来了,除了大约 5 个由update-alternatives.

    在您正在运行的系统中,运行:

    sudo update-alternatives --all
    

    它问你一些问题;你可以简单地按ENTER接受它们。

    现在我们完成了。

    • 189
  2. muru
    2017-04-20T07:49:42+08:002017-04-20T07:49:42+08:00

    如果您当前的系统仍然有一个正在运行的 shell 和互联网访问,这可以使用系统上其他地方的工具来完成。我假设你只删除了/bin. /bin当然有在这种情况下可以使用的最方便的实用程序(busybox),但没有它,我们将不得不有点创意。


    既然您已经有一个正在运行的 shell,并且因为sudo是 in /usr/bin,那么在我们造成进一步的损害之前,让我们自己获得一个正在运行的 root shell。但是/bin/bash,大多数其他贝壳都不见了!幸运的是,Linux 仍然有您正在使用的 shell 的内存副本。所以:

    sudo /proc/$$/exe
    

    严格来说,我们在接下来的大部分内容中都不需要 root shell。但不管怎么说。

    现在,dpkg仍然可以工作,至少可以找到哪些包有文件/bin:

    dpkg -S /bin
    

    我们可以使用awk它来处理它并获取包名,并xargs下载apt-get包(全部在 中/usr/bin)。如果您有一个可以使用的临时目录,cd则在那里,因为您的当前目录会变得有点混乱:

    dpkg -S /bin | awk -F '[, :]' '{NF--}1' | xargs apt-get download
    

    现在,我们遇到的最大问题/bin/tar是缺少,没有它,dpkg无法提取档案。我们可以到达那里的三分之二,因为:

    1. .deb文件实际上是ar档案(再次在 中/usr/bin):

      ar x tar_*.deb
      
    2. 包括两个.tar.*档案,data和control:

      $ echo *.tar.*
      control.tar.gz data.tar.xz
      
    3. 当 gzip 实用程序位于 时/bin,unxz位于/usr/bin:

      unxz data.tar.xz
      

    现在我们有一个data.tar文件,无需tar从中提取tar。

    Python来救援!这是sudo真正需要的地方:

    $ sudo python -c 'import tarfile; tarfile.open("data.tar").extractall("/")'
    $ echo /bin/*
    /bin/tar
    

    现在我们可以使用dpkg提取剩余的 deb 文件来获得一个相当完整的/bin:

    for i in *.deb; do dpkg-deb -x "$i" /; done
    

    但是,我们仍然应该正确安装 deb 文件,以便重新创建将由包创建的符号链接等:

    sudo apt install --reinstall ./*.deb
    

    或者:

    sudo dpkg -i *.deb
    sudo apt-get install -f
    

    笔记:

    1. 我们不能使用 Python 2 直接提取data.tar.xz文件,因为 Python 2 只支持 gzip 和 bzip2 压缩。然而,Python 3 确实支持它,因此您可以直接使用 Python 3 而无需unxz:

      sudo python3 -c 'import tarfile; tarfile.open("data.tar.xz").extractall("/")'
      
    2. 回来后/bin/tar,您仍然需要提取一些 deb 文件才能使用apt-get:shell、coreutils 等。更容易将它们全部提取并稍后重新安装。
    • 30
  3. Dmitry Grigoryev
    2017-04-21T03:21:18+08:002017-04-21T03:21:18+08:00

    您可以暂时将来自 live CD 或其他系统的文件放入您/bin的系统中以使您的系统可用,然后通过运行apt-get install --reinstall包含/bin.

    • 7
  4. mrtumnus
    2018-07-06T06:29:48+08:002018-07-06T06:29:48+08:00

    在我遇到此问题后(连同删除 、 和 ),对这个出色的答案进行了一些补充:/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/*

    • 1

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve