Unix - versehentlich alles unter root auf / old verschoben - Solaris 10

13

Wie die Überschrift schon sagt, wurde auf einem Solaris 10-Computer alles oder fast alles, was als root under root (/) wichtig ist, nach / old verschoben. So , jetzt die typische Fehler bei dem Versuch , beim Ausführen von Befehlen sind Cannot find /usr/lib/ld.so.1(geändert $PATHund auch zu ändern versucht $LD_LIBRARY_PATH, $LD_LIBRARY_PATH_64und $LD_RUN_PATHund Exportieren von ihnen aber nichts davon scheint die reale Bibliothek Pfad zu ändern). Habe gestern ziemlich oft versucht, etwas zu finden, das helfen könnte, aber nichts gefunden, das den Bibliothekspfad für Solaris 10 tatsächlich ändert, außer vielleicht crle, dass es seitdem nicht mehr ausgeführt werden kann Cannot find /usr/lib/ld.so.1.

Habe viele Root- oder / usr / bin-Wiederherstellungstipps usw. für Linux gefunden, aber die entsprechenden Informationen zu Solaris 10 / Unix sind nicht weit verbreitet und sehr spärlich.

Kann nicht ausgeführt werden cp, ln, mkdiroder mvda Cannot find /usr/lib/ld.so.1. Sie können sich auch nicht mit anderen Sitzungen am Computer anmelden. Es ist jedoch noch eine Sitzung aktiv, die verwendet werden kann und mit der das Fenster blockiert wird while true; do date; echo hej 1234567; done. Wir haben die Lösung für die Verwendung einer Solaris-Boot-CD und einer Linux-Distribution auf einem USB-Laufwerk erörtert. Wir haben die Lösung für den Wechsel der Festplatten in ein anderes Rack erörtert.

Die /.../static/.../mvLösung wurde getestet, hat aber nicht funktioniert.

Die Befehle , die noch verwendet werden sollen (es könnte mehr Befehle, die verwendet werden können): echo, <, >, >>, |, pwd, cd.

Gibt es eine Möglichkeit, ein Verzeichnis oder einen Ordner ohne zu erstellen mkdir? Gibt es eine Möglichkeit, echound >oder echound >>wiederherzustellen /usr/lib/ld.so.1? Ich weiß, dass /usr/lib/ld.so.1wahrscheinlich mehr wiederhergestellt werden muss, damit Befehle funktionieren.

Vielen Dank fürs Lesen und einen schönen Tag =)

Propatience
quelle
2
Welcher Befehl wurde verwendet, um Dinge unter / old zu verschieben?
Schaiba
Solaris-Standard mv. Oder genauer gesagt: shopt -s extglob; mv !(old) /old.
Propatience
1
Welche Shell läuft gerade? Einige Shells haben eingebaute Befehle
Ferrybig
Sie könnten es beheben ln, wenn das funktioniert.
David Schwartz
2
"Die /.../static/.../mv Lösung wurde getestet, hat aber nicht funktioniert." Was ist passiert? Hat es einen Ladefehler gegeben? Was "hat nicht genau funktioniert"? Die Binärdateien in staticsind für genau diese Kategorie von Problemen verfügbar, wenn Sie keine temporären Medien booten möchten.
Ti Strga

Antworten:

19

Wenn Sie keine Shell mehr als Root ausführen, müssen Sie das Rettungsmedium neu starten. Alles wird funktionieren, solange es in der Lage ist, das Root-Dateisystem mit Lese- und Schreibzugriff zu mounten.

Wenn Sie weiterhin Befehle als root ausführen können, ist alles kopaketisch. LD_LIBRARY_PATHStellen Sie die Umgebungsvariable so ein, dass sie auf die Verzeichnisse verweist, die Bibliotheken enthalten, die von den grundlegenden Systemprogrammen verwendet werden. Das ist zumindest /usr/libauf einem 32-Bit-Solaris, /usr/lib/64auf einem 64-Bit-Solaris, möglicherweise anderen Verzeichnissen (ich habe jetzt keinen Zugriff auf Solaris 10, um dies zu überprüfen). Um eine ausführbare Datei auszuführen, muss der Laufzeitlinker vorangestellt werden : /usr/lib/ld.so.1(für eine 32-Bit-ausführbare Datei) oder /usr/lib/64/ld.so.1(für eine 64-Bit-ausführbare Datei) - jetzt verschoben nach /old. Sie sollten sich also mit etwas wie Folgendem erholen können:

LD_LIBRARY_PATH=/old/usr/lib
export LD_LIBRARY_PATH
/old/usr/lib/ld.so.1 /old/usr/bin/mv /old/* /
Gilles 'SO - hör auf böse zu sein'
quelle
Intelligente Verwendung des Laders. Wenn die gesamte Hierarchie nicht verschoben wurde, /oldgilt mein Kommentar zu Peschkes eigenem Kommentar auch hier. mvsollte nicht verwendet werden sondern ein Befehl, der die bestehende Hierarchie beibehält wiepax , tarund beibehält.
Juli
1
Vielen Dank für Ihre Geduld und Ihre Zeit, dies zu schreiben. Es funktioniert jetzt laufenden Befehle wie /old/usr/lib/ld.so.1 /old/usr/bin/mvund /old/usr/lib/ld.so.1 /old/usr/bin/cpund so weiter. Ich werde sehen, was ich tun kann. Jetzt ist das Problem, dass mir der Raum ausgeht, aber ich kann das möglicherweise beheben.
Propatience
@propatience Schade, dass du und Gilles meine Kommentare nicht berücksichtigt haben ...
jlliagre
1
Ja Gott! Ich schaffte es wieder alles mit dem ersten zu bewegen /old/usr/lib/ld.so.1 /old/usr/bin/mvund /old/usr/lib/ld.so.1 /old/usr/bin/cpdoch kein Platz konnte so nicht verwenden /old/usr/lib/ld.so.1 /old/usr/bin/cp. Und dann bearbeiten $PATHund dann Ordner für Ordner mvmit geändert $PATH. Jetzt ist alles zurückgesetzt, sodass ich mich erneut anmelden und df -h und alles eingeben kann. Vielen dank allen. Wirklich, großartig, danke @Gilles! Vielen Dank, dass Sie StackExchange!
Propatience
1
Das Einstellen LD_LIBRARY_PATHunter Solaris birgt einige Gefahren, wenn Sie es einstellen müssen, damit Sie sowohl 32- als auch 64-Bit-ausführbare Dateien ausführen können. Es ist besser, die 32- und 64-Bit-spezifischen Versionen zu verwenden LD_LIBRARY_PATH, die in Solaris verfügbar sind. In diesem Fall: LD_LIBRARY_PATH_32=/old/usr/libund LD_LIBRARY_PATH_64=/old/usr/lib/64. Siehe die ld.so.1Manpage : "Jede Umgebungsvariable kann mit einem _32- oder _64-Suffix angegeben werden. Dadurch ist die Umgebungsvariable für 32-Bit- bzw. 64-Bit-Prozesse spezifisch."
Andrew Henle
16

Es gibt keine Möglichkeit, ein Verzeichnis zu erstellen oder Binärdateien nur mit Shell-Befehlen zu kopieren (obwohl Gilles in seiner Antwort eine intelligente, mögliche Problemumgehung beschreibt ).

Sie können Solaris am besten auf einem externen Datenträger (DVD, USB-Stick) starten, die Dateisysteme einbinden oder importieren und das Durcheinander folgendermaßen beheben:

  • Booten Sie eine Solaris-Installationsdiskette und wählen Sie, um eine Shell auszuführen.

  • Hängen Sie das alte Stammverzeichnis (und alle anderen Dateisysteme, falls vorhanden) in ein Verzeichnis wie /mntoder ein /a. Die Solaris-Startdiskette kann Ihnen dabei helfen, wenn vorhandene Dateisysteme erkannt werden.

  • Bringe die Dateien mit diesem Befehl an ihren ursprünglichen Speicherort zurück (vorausgesetzt, alles ist unter gemountet /mnt):

    cd /mnt/old
    find . -depth | cpio -pdlmPV@ /mnt
    
  • Starten Sie Ihr System neu

    init 6
    

Wenn Sie ZFS verwenden und ein aktueller Snapshot vorhanden ist, /oldkann es auch eine Option sein , das Verzeichnis an einer anderen Stelle zu sichern und auf den letzten Snapshot zurückzugreifen.

jlliagre
quelle
Gute Antwort. Booten Sie in Rescue USB, hängen Sie das Dateisystem ein und machen Sie dann etwas wiemv /mountpoint/old/* /mountpoint
Peschke
1
@Peschke Danke, obwohl mves nicht mein Rat wäre , den von Ihnen vorgeschlagenen Befehl blind auszuführen . Das OP schrieb "alles oder fast alles ". Im zweiten Fall werden durch das Verschieben noch vorhandene Verzeichnisse beschädigt. Ich verwende wahrscheinlich ein Hilfsprogramm wie tar, paxoder cpio, um die Zielverzeichnishierarchie beizubehalten.
Juli
Vielen Dank für Ihre schnelle Antwort und vielen Dank für Ihre Antworten. Ich könnte das morgen versuchen.
Propatience
An den möglichen Snapshot (ZFS oder UFS) gebunden, können Sie bei Verwendung eines Live-Upgrades auf eine alternative BE booten. lustatus Und noch keine Panik. Alle Daten sind noch auf den Datenträgern vorhanden.
Sleepyweasel
0

Solaris beinhaltet statische Builds von grundlegenden Werkzeugen ( cp, ln, mv, rcp, und tar) in /usr/sbin/staticdass Sie ein Problem mit der Verfügbarkeit reparieren können /usr/lib/ld.so.1die Verwendung der regulären verhindert , dass dynamisch gebundenen /usr/binVersionen.

Es gibt keine statische mkdirvorgesehen, aber man kann die statische verwenden lnzu Symlink was Verzeichnis enthält lib/ld.so.1die Stelle als /usrvorübergehend und dann den Standard verwenden , mkdirzu schaffen , was Verzeichnisse , die Sie benötigen. Sie können bereits vorhandene Verzeichnisse mit dem Static umbenennen mv.

Rakslice
quelle
Dies reicht mindestens bis Solaris 2.5.1 zurück, wo ich feststellte, dass die ld.so.1Standardeinstellung fehlerhaft ist, wenn Sie versuchen, sie manuell auszuführen, wie in Gilles 'Beispiel gezeigt
rakslice,