FreeBSD 8.2、/ bin / shを削除、起動できません


8

私は自分のサーバーの1つで本当に悪い決定をしました。

削除しました/bin/sh。サーバーを再起動しましたが/bin/sh、rcスクリプトを開始する必要があるため、サーバーが実行されません。shが必要なため、シングルユーザーモードにもアクセスできません。

ボーンシェルを再インストールする簡単な方法はありますか?

ライブCDからshをコピーしようとしましたが、ld-elf.so.1ライブラリで失敗しました。それをlivecdから/ libexecに/パーティションにコピーしました。次に、libedit.soライブラリが必要です。それを/ libexecにコピーしましたが、今回は機能しません。

へのシンボリックリンクを試しました/usr/local/bin/bashが、それでも「shが見つかりません」というタイプのエラーが表示されます。/usrこれは、rcスクリプトから実行されるため、まだマウントされていないためだと思います。

どんな助けでも大歓迎です。


2
ああ。それは、ええと、良くありません。最後のテープを引く時間です。
MDMarra

あなたのLiveCDの問題は、おそらくそれがFreeBSDの異なるバージョンである(または、LiveCDが/ bin / ABunchOfStuffが異なる名前にハードリンクされた魔法の押し潰されたバイナリを使用している)ためです。実行しているFreeBSDのバージョンは何ですか?
voretaq7 2011

タイトルにはherp-derpバージョンが含まれています。気にしないで。コーヒーが必要です。
voretaq7 2011

3
それで...ええと...これをやらざるを得なかったのは何ですか?意図的であるかのように聞こえます。
user606723

回答:


8

/ bin / shを何かで置き換える必要があります。それが鍵です。起動時にFreeBSDローダーに入ることができる場合(「ok」プロンプトを使用)、次のようなことを試してください。

set init_shell=/bin/csh
unset init_script
unset init_path

この情報は、FreeBSDのマニュアルページ(オンライン)のloader(8)から入手しました。私はこれをしていませんが、動作するはずです(/ bin / cshが存在し、実行可能であると想定しています)。

FreeBSD 8.2サーバーが稼働していて別の場所で実行されている場合は、そのソースから/ bin / shを盗み、必要な場所にシステムに入れてみることができます。

または、静的に構築された/ bin / shを取得して、代わりにそれを配置します。静的にビルドされたバイナリではライブラリの問題は発生しません。

編集:私は注意すべきでした:/ bin / cshで起動した場合でも、/ bin / shの代わりに何かを使用する必要があります。インターネット経由で入手したり、別のCDやパッケージなどからコピーしたりできます。/ bin / cshを使用して起動すると、マシンが起動します。ネットワーク経由でコピーするには、ネットワークを起動する必要があります。それ以外の場合は、CDROMからコピーします。

これを将来的に回避する最善の方法:

  1. / binから削除しないでください!(それは簡単な部分です)
  2. 動的にリンクされていない、静的に構築された/ bin / shがある。
  3. /bin/sh.staticなどのバックアップshを用意します。

3つすべて実行します。


また、「この問題を解決するためにバックアップを取得する」という優れたソリューション(LiveCDを起動する必要がないため)。
voretaq7 2011

6

さて、最初に講義:

  1. システムバイナリを無視し
    ないでください/bin/sbinおよび/rescueFreeBSDのすべてをそのままにしてください。何をしているのかわかっていても(何をしているのかわかっていれば、これらはそのままにしておく必要があります。これらは本当に重要です-すべてです!)

  2. 削除しないでください/bin/shこれまで。上のいずれかのそれを持っている* NIXシステム。
    本当に。しないでください。LOTスクリプトのは、に依存している/bin/shのBourneシェルです。それは宇宙を壊します。
    あなたが本当にしたい場合は、おそらく安全に置き換えることができますコピーbashアダムZが提案のように、しかし、あなたがしたいことをやろうとしている場合、静的にリンクのコピーということbash-それは、ライブラリの多くのプル、そしてあなたシステムが起動し/usr/localてマウントされるまで、それらはないかもしれません。


今、混乱を修正する方法は?2つのオプション:

オプション1:やや苦痛
にオーバーの頭 http://www.freesbie.org/(またはお好みのFreeBSDのLiveCDを-あなたはおそらくからのリカバリーCDを使用することができます http://www.freebsd.orgこのため)。LiveCDを入手して書き込み、起動します。

LiveCD環境になったら、バストされたシステムのルートパーティションをマウント/bin/shし、LiveCDからマシンにコピーして、再起動します。

これで元に戻して実行できるはずです- 「World」の再構築の指示に従うか、少なくとも/bin/sh実行中のシステムに一致するソースツリーから再コンパイルすることをお勧めします。

オプション2:それほど苦痛ではなく、LiveCDがない
周りに別のFreeBSDボックスがある場合は(またはのコピーに指を入れる他の方法で/bin/sh、FreeBSDマシンをシングルユーザーモードで起動します。ネットワークを構成します(またはマウント)交換用シェルが含まれているすべてのメディア)、それがあるはずの場所にコピーします。

再起動すれば大丈夫です。LiveCDと同じ警告が表示され/bin/shますが、取得するのがかなり近いマシンからのものではない場合です。


1
FreeBSDの別のディストリビューションからの/ bin / bashの使用は、共有ライブラリが正しいバージョンである場合にのみ機能します。代替ビルドではなく、FreeBSD 8.2から直接提供されるものを使用する方が良いでしょう。ただし、すべてのFreeBSD 8.xシステムは、機能する静的に構築されたシェルを提供できる必要があります。
Mei

@david良い点- /bin静的にリンクされなくなりました。FreeBSDの適切なリリースのRescue CDには使用可能なシェル(つまり、所定の場所にダンプできるシェル)があると思いますが、ブートしてからしばらく経っていません...
voretaq7

4

代わりにシンボリックリンクの、あなたのコピーbashにします/bin/shlddコマンドを使用して、rootfs以外のファイルシステムに存在する可能性のあるライブラリを検索し、それらもrootfsにコピーします。


1
これは良い解決策ですが、後でクリーンアップを必要とするライブラリを少し混乱させます。
voretaq7

ええ、後でクリーンアップが必要です。1つの選択肢は、静的に構築されたシェルバイナリを使用することです。
Adam Zalcman、2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.