FreeBSD 8.2, gelöscht / bin / sh, kann nicht booten

8

Ich habe auf einem meiner Server eine wirklich schlechte Entscheidung getroffen.

Ich habe gelöscht /bin/sh. Ich habe den Server neu gestartet und der Server wird nicht ausgeführt, da er /bin/shdie RC-Skripte starten muss. Ich kann auch nicht auf den Einzelbenutzermodus zugreifen, da sh benötigt wird.

Gibt es eine einfache Möglichkeit, die Bourn-Shell neu zu installieren?

Ich habe versucht, sh von einer Live-CD zu kopieren. Dies ist in der Bibliothek ld-elf.so.1 fehlgeschlagen. Also habe ich das von der livecd nach / libexec auf meine / partition kopiert. Es braucht dann die Bibliothek libedit.so und ich habe sie nach / libexec kopiert, aber diesmal funktioniert es nicht.

Ich habe versucht, einen Symlink zu zu erstellen, /usr/local/bin/bashaber das zeigt immer noch den Fehler "kann sh nicht finden" an. Ich gehe davon aus, dass dies daran liegt, dass /usres noch nicht gemountet ist, weil es über ein RC-Skript erstellt wurde.

Jede Hilfe wird sehr geschätzt.

jon
quelle
2
Oh mein. Das ist ähm, nicht gut. Zeit, das letzte Band zu ziehen.
MDMarra
Ihre LiveCD-Probleme sind wahrscheinlich darauf zurückzuführen, dass es sich um eine andere Version von FreeBSD handelt (oder Ihre LiveCD verwendet eine magische gequetschte Binärdatei, die mit / bin / ABunchOfStuff fest mit verschiedenen Namen verknüpft ist). Welche Version von FreeBSD verwenden Sie?
voretaq7
Herp-Derp-Version ist im Titel. Stört mich nicht. Brauche Kaffee.
voretaq7
3
Also ... ähm ... was hat dich dazu gezwungen? Sie lassen es so klingen, als ob es beabsichtigt wäre.
user606723

Antworten:

8

Sie müssen / bin / sh durch etwas ersetzen ; Das ist der Schlüssel. Wenn Sie während des Startvorgangs (mit der Aufforderung "OK") in den FreeBSD-Loader gelangen können, versuchen Sie Folgendes:

set init_shell=/bin/csh
unset init_script
unset init_path

Ich habe diese Informationen von Loader (8) aus den FreeBSD-Handbuchseiten (online) erhalten. Ich habe dies nicht getan, aber es sollte funktionieren (vorausgesetzt, / bin / csh ist vorhanden und ausführbar).

Wenn Sie einen FreeBSD 8.2-Server haben, der an einem anderen Ort ausgeführt wird, können Sie versuchen, / bin / sh von dieser Quelle zu stehlen und bei Bedarf in das System zu integrieren.

Alternativ können Sie auch ein statisch erstelltes / bin / sh abrufen und dieses stattdessen eingeben. Bei einer statisch erstellten Binärdatei treten keine Bibliotheksprobleme auf.

EDIT: Ich hätte beachten sollen: Wenn Sie in / bin / csh booten, müssen Sie immer noch etwas anstelle von / bin / sh verwenden. Sie können es über das Internet herunterladen oder von einer anderen CD oder einem Paket oder etwas anderem kopieren. Wenn Sie zum Starten / bin / csh verwenden, gelangen Sie in den Computer. Für das Kopieren über das Netzwerk müssen Sie das Netzwerk aufrufen. Andernfalls kopieren Sie von einer CD-ROM.

Die besten Möglichkeiten, dies in Zukunft zu vermeiden:

  1. Nicht aus / bin löschen! (das ist der einfache Teil)
  2. Haben Sie ein statisch erstelltes / bin / sh, nicht dynamisch verknüpft.
  3. Haben Sie ein Backup sh wie /bin/sh.static.

Mach alle drei.

Mei
quelle
Auch eine großartige Lösung, mit der Sie mich wieder auf den neuesten Stand bringen können, damit ich das Problem beheben kann (da Sie keine Live-CD zum Booten benötigen).
voretaq7
6

OK, zuerst die Vorlesung:

  1. Verwirren Sie nicht mit Systembinärdateien
    Alleswas in/bin,/sbinund/rescueauf FreeBSD sollteRuhe gelassen werden. Selbst wenn Sie wissen, was Sie tun (wenn Sie wissen, was Sie tun, wissen Sie auch, dass diese in Ruhe gelassen werden sollten. Sie sind wirklich wichtig - alle!)

  2. NICHT löschen/bin/sh. JE. Auf jedem * NIX-System, das es hat.
    Ja wirklich. Tu es nicht. A LOT von Skripten stützen sich auf/bin/sheine BourneShellsein. Es bricht das Universum.
    Wenn Sie WIRKLICH möchten, können Sie es wahrscheinlich sicher durch eine Kopie vonbashAdam Zersetzen, aber wenn Sie dies tun, möchtenSiediese Kopiemöglicherweise statisch verknüpfenbash - Sie zieht viele Bibliotheken ein, und Sie Möglicherweise haben Sie diese erst, wenn das System hochgefahren und/usr/localmontiert ist.


Wie kann man das Chaos beheben? Zwei Optionen:

Option 1: Etwas schmerzhaft
Kopf auf mehr als auf http://www.freesbie.org/ (oder FreeBSD LiveCD Ihrer Wahl - Sie könnenwahrscheinlich auch die RecoveryCD verwendenvon http://www.freebsd.org für diese). Holen Sie sich die LiveCD, brennen Sie sie und starten Sie sie.

Sobald Sie sich in der LiveCD-Umgebung befinden, mounten Sie die Root-Partition Ihres kaputten Systems, kopieren Sie die /bin/shvon der LiveCD auf Ihren Computer und starten Sie sie neu.

Dies sollte Sie wieder zum Laufen bringen - Möglicherweise möchten Sie den Anweisungen zum Neuerstellen von "World" folgen oder zumindest /bin/shaus einem Quellbaum neu kompilieren , der Ihrem laufenden System entspricht.

Option 2: Weniger schmerzhaft, keine
Live-CD Wenn Sie eine andere FreeBSD-Box in der Nähe haben, von der Sie abheben können (oder auf andere Weise, um eine Kopie davon zu erhalten)/bin/sh,rufen SieIhren FreeBSD-Computer im Einzelbenutzermodus auf. Konfigurieren Sie das Netzwerk (oder mounten Sie es) Auf jedem Medium befindet sich die Ersatzhülle. Kopieren Sie sie an die Stelle, an der sie sich befinden soll.

Starten Sie neu und Sie sollten in Ordnung sein - die gleichen Einschränkungen wie bei der LiveCD, wenn /bin/shSie sie jedoch nicht von einem annähernd identischen Computer beziehen.

voretaq7
quelle
1
Die Verwendung von / bin / bash aus einer anderen Distribution von FreeBSD funktioniert nur, wenn die gemeinsam genutzten Bibliotheken die richtige Version haben. Verwenden Sie lieber etwas, das direkt aus FreeBSD 8.2 stammt, als einen alternativen Build. Jedes FreeBSD 8.x-System sollte jedoch in der Lage sein, eine statisch erstellte Shell bereitzustellen, die funktioniert.
Mei
@david Guter Punkt - /binist nicht mehr statisch verknüpft. Ich denke, die Rescue-CDs für die entsprechende Version von FreeBSD haben eine verwendbare Shell (dh eine, die einfach an Ort und Stelle abgeladen werden kann), aber es ist schon eine Weile her, seit ich eine gebootet habe ...
voretaq7
4

Anstatt zu verknüpfen, kopieren Sie Ihre bashin /bin/sh. Verwenden Sie den lddBefehl, um Bibliotheken zu finden, die sich möglicherweise auf anderen Dateisystemen als rootfs befinden, und kopieren Sie sie auch in rootfs.

Adam Zalcman
quelle
1
Dies ist eine gute Lösung, führt jedoch zu einem Durcheinander in der Bibliothek, das später bereinigt werden muss.
voretaq7
Ja, danach muss aufgeräumt werden. Eine Alternative wäre die Verwendung einer statisch erstellten Shell-Binärdatei.
Adam Zalcman