FreeBSD 8.2,删除/bin/sh,无法启动

FreeBSD 8.2,删除/bin/sh,无法启动

我在我的一台服务器上做出了一个非常糟糕的决定。

我删除了/bin/sh。我重新启动了服务器,但服务器无法运行,因为它需要/bin/sh启动 rc 脚本。我也无法访问单用户模式,因为需要 sh。

有没有什么简单的方法可以重新安装 bourn shell?

我尝试从 live cd 复制 sh,但在 ld-elf.so.1 库上失败。因此,我将其从 livecd 复制到我的 / 分区的 /libexec。然后它需要 libedit.so 库,我将其复制到 /libexec,但这次不起作用。

我尝试了符号链接/usr/local/bin/bash,但仍然出现“找不到 sh”类型的错误。我猜是因为/usr尚未安装,因为它是通过 rc 脚本完成的。

任何帮助是极大的赞赏。

答案1

您需要将 /bin/sh 替换为某物;这是关键。如果您可以在启动期间进入 FreeBSD 加载程序(出现“ok”提示),请尝试以下操作:

set init_shell=/bin/csh
unset init_script
unset init_path

我从装载机(8)来自 FreeBSD 手册页(在线)。我还没有这样做过,但它应该可以工作(假设 /bin/csh 存在并且可以执行)。

如果您在其他地方启动并运行 FreeBSD 8.2 服务器,您可以尝试从该源窃取 /bin/sh 并将其放入需要的系统中。

或者,获取静态构建的 /bin/sh 并将其放入;静态构建的二进制文件不会出现任何库问题。

编辑:我应该指出:如果您启动到 /bin/csh,您仍然需要获取一些可以代替 /bin/sh 的东西。您可以通过互联网获取它,也可以从另一张 CD 或软件包或其他东西中复制它;使用 /bin/csh 启动可以进入机器。通过网络复制需要您启动网络;否则,请从 CDROM 复制。

将来避免此类情况发生的最佳方法是:

  1. 不要从/bin 中删除!(这是最简单的部分)
  2. 有一个静态构建的 /bin/sh,没有动态链接。
  3. 有一个备份 sh,例如 /bin/sh.static。

三者全部做。

答案2

好的,首先是讲座:

  1. 不要弄乱系统二进制文件
    /bin和FreeBSD 上 的任何内容都应保留。即使您知道自己在做什么(如果您知道/sbin自己/rescue在做什么,您也知道这些内容应保留。它们真的很重要 - 全部!)

  2. 删除/bin/sh曾经。任何*NIX 系统有这个功能。
    真的。不要这么做。很多脚本依赖于/bin/shBourne Shell。它打破了宇宙。
    如果你真的想要,你可以安全地用复制就像bashAdam Z 建议的那样,但如果你要这么做,你可能需要静态链接该副本bash——它引入了许多库,您可能直到系统启动并/usr/local安装后才拥有这些库。


那么,该如何收拾残局呢?有两个选择:

选项 1:有些痛苦
前往http://www.freesbie.org/(或者您选择的 FreeBSD LiveCD - 您甚至可以使用来自http://www.freebsd.org为此)。获取 LiveCD,刻录并启动它。

进入 LiveCD 环境后,安装损坏的系统的根分区,将其/bin/sh从 LiveCD 复制到您的机器,然后重新启动。

应该让您恢复正常运行——您可能需要按照以下说明进行操作重建“世界”/bin/sh,或者至少从与您的运行系统匹配的源代码树重新编译。

选项 2:更省事,不用 LiveCD
如果您身边有另一个可以利用的 FreeBSD 机器(或者可以通过其他方式获取 的副本)/bin/sh,请将您的 FreeBSD 机器设置为单用户模式。配置网络(或安装任何具有替换 shell 的介质),然后将其复制到它应该在的位置。

/bin/sh重新启动,你就应该没问题了 —— 但如果你获取的不是来自相当接近相同的机器,则需要注意与 LiveCD 相同的事项。

答案3

不要使用符号链接,而是将您的复制bash/bin/sh。使用ldd命令查找可能驻留在 rootfs 以外的文件系统上的任何库,并将它们也复制到 rootfs 中。

相关内容