Frage Wie erstelle ich eine symbolische Verbindung, ohne ln zu benutzen?


Ich habe einen kritischen symbolischen Link gelöscht - libc.so.6. Ich habe die Datei, auf die es zeigen sollte, aber die grundlegenden Befehle wie ln oder wget funktioniert nicht mehr, da der Link fehlt. Jedoch, echo oder andere Bash-Builtins arbeiten.

Ich suche nach einer Möglichkeit, diese symbolische Verbindung wiederherzustellen.


31
2018-05-10 18:05


Ursprung


@Sebas, ich denke du meintest das alles Bash gebaut, nicht nur echo. - Cristian Ciupitu
@ CristianCiupitu vielleicht, was ist das? cat ist deaktiviert ... eigentlich war alles. - Sebas
@Sebas, das ist weil cat ist ein externes Programm. Das Bash Builtin Befehle Handbuchseite enthält Details darüber, was verfügbar sein könnte. - Cristian Ciupitu
Ich nehme an, Sie meinen GNU / Linux-basierte Systeme, wenn Sie "Unix" sagen, da viele andere * nix-Systeme "Rettungs" -Versionen der Standarddienstprogramme haben, die nur für diese "oops" -Momente statisch verknüpft sind. - Chris S
Ich habe die Fahnen angepasst. Vielen Dank - Sebas


Antworten:


Sie können ldconfig verwenden, es erstellt den Symlink erneut:

# rm /lib/libc.so.6 
rm: remove symbolic link `/lib/libc.so.6'? y
# ls -l /lib/libc*
ls: error while loading shared libraries: libc.so.6: cannot open shared object file:
# ldconfig 
# ls -l /lib/libc*
[skip]
lrwxrwxrwx. 1 root root      12 May 11 07:59 /lib/libc.so.6 -> libc-2.12.so

gerade getestet, wie Sie sehen.


58
2018-05-11 06:02



Und praktischerweise ist / sbin / ldconfig statisch verknüpft. ldconfig ist in erster Linie verantwortlich für diese symbolischen Links. - etherfish
Das ist nicht wirklich einfach "praktisch", eine statisch verknüpfte Binärdatei ist so ziemlich eine notwendige Designkomponente des Tools, das Ihre dynamischen Bibliotheken verwaltet! Aber es ist, was es zu einem idealen Werkzeug macht, um dieses Problem zu beheben, und IMHO der einzige "richtige" Weg. Die Frage hier ist wirklich nicht über einen gelöschten Symlink (99,999% davon können ohne Folgen gelöscht werden), es ist "Ich habe den dynamischen Bibliotheksspeicher meines Systems zerstört". Machen Sie @ natxos Vorschlag, "reparieren Sie es mit dem Tool, das den Laden verwaltet", offensichtlich und sinnvoll. Alles andere (manuelle Neuerstellung des Links) ist ein hacky Workaround. - FeRD
Ja, das ist in der Tat logischer, obwohl die andere Antwort auch richtig war. - Sebas
(Nekromantie, Entschuldigung) Der größte Grund, warum das wichtig ist, ist BTW löschen Symlinks sind nicht die einzige Möglichkeit, Ihren dynamischen Bibliotheksladen zu vermasseln. Sagen wir zum Beispiel, du hast dich versehentlich umbenannt /lib/libc-2.12.so im obigen Beispiel zu /lib/foobar. Nun, Mist, nicht mehr mv. Aber ldconfig -l /lib/foobar ist sogar schlau genug zu machen /lib/libc.so.6 Zeigen Sie auf den falsch benannt Datei. (Die Argumente sind erforderlich, Standard ldconfig ignoriert Dateinamen, die nicht mit "lib" beginnen und ".so" enthalten. An welcher Stelle können Sie mv es zurück (oder cp -p Wenn du paranoid / schlau bist, dann renn ldconfig wieder aufräumen. - FeRD


CentOS 6 kommt normalerweise mit busybox, eine statisch verknüpfte Gruppe von Unix-Tools, installiert in /sbin. Du kannst es so ausführen:

/sbin/busybox ln -s libc-2.12.so /lib/libc.so.6

43
2018-05-10 22:30



+1, gerade getestet nach dem Entfernen der Symlink in einem Test vm, es woks in Centos 6.5 - natxo asenjo
+1 Dies beantwortet auch die generische Frage im Fragentitel. - MattBianco


Setzen Sie LD_PRELOAD, um die relevante Bibliothek vorab zu laden. Ich habe es mit libpthread probiert und es scheint zu funktionieren:

root@spirit:~# mv /lib/x86_64-linux-gnu/libpthread.so.0 /lib/x86_64-linux-gnu/libpthread.so.0-bak
root@spirit:~# chattr
chattr: error while loading shared libraries: libpthread.so.0: cannot open shared object file: No such file or directory
root@spirit:~# LD_PRELOAD=/lib/x86_64-linux-gnu/libpthread.so.0-bak chattr
Usage: chattr [-RVf] [-+=AaCcDdeijsSu] [-v version] files...

23
2018-05-10 19:32



Interessant, es gruppiert sich mit dem, was die anderen sagten. - Sebas


sln dient genau diesem Zweck: um symbolische Links zu fixieren, wenn du reguläres ln nicht benutzen kannst, weil du einen essentiellen Symlink gebrochen hast. Um seine Manpage zu zitieren:

BESCHREIBUNG

  The  sln  program creates symbolic links.  Unlike the ln(1) program, it
  is statically linked.  This means that if for some reason  the  dynamic
  linker  is  not  working,  sln  can  be  used to make symbolic links to
  dynamic libraries.

21
2018-05-12 11:15



Nett, ich kannte dieses Tool nicht. In Centos ist es Teil von glibc, daher muss es standardmäßig installiert sein - natxo asenjo


Sie können einstellen LD_LIBRARY_PATH Variable, die das Verzeichnis enthält, in dem es real ist libc.so.6 ist:

 export LD_LIBRARY_PATH="/dir/for/libc.so.6/:$LD_LIBRARY_PATH"

Auch ausführen ldconfig um die Links neu zu erstellen. Dadurch sollten die Befehle funktionieren, damit Sie sie verwenden können ln Befehle, um Ihr System zu reparieren.

Ein anderer Weg wäre, über LiveCD zu booten und die Datei dort zu verlinken.


8
2018-05-10 18:12



Dann nur noch die Möglichkeit, die Livecd zu booten und die Datei dort in chroot zu verlinken. - phoops
Außerdem sollten Sie LD_LIBRARY_PATH so einstellen, dass das Verzeichnis enthalten ist, in dem sich die Datei libc.so.6 befindet. Dadurch können Sie die Befehle verwenden, da sie die lib finden soll. - phoops
Verdammt, Entschuldigung, ich habe nicht zuerst daran gedacht. - phoops
Das funktioniert nicht, denn die Datei, mit der verlinkt wird, heißt nicht libc.so.6. Sie müssen LD_PRELOAD wie in meiner Antwort festlegen. - Dennis Kaarsemaker
Ich habe es auf Fedora 20 versucht und es hat nicht funktioniert. - Cristian Ciupitu


Verwenden Sie scp oder sftp, um eine statisch verknüpfte Version von ln zu kopieren. Stellen Sie sicher, dass es ausführbar ist. Dann benutze es, um die Datei zu reparieren.


-4
2018-05-11 21:27



scp und sftp funktionieren nicht, da sie diese Datei auch nicht laden können. - Florin Asăvoaie
scp, sftp, ftp würde von einem entfernten Host laufen. Dies setzt voraus, dass der Daemon in der defekten Maschine bereits läuft. Andere Möglichkeiten für die Dateiübertragung sind Dateisysteme, die bereits lokal oder remote eingebunden sind. - Robert Jacobs
Bitte hör auf Fehlinformationen. SCP benötigt die scp-Binärdatei und wird auf beiden Hosts ausgeführt. SFTP startet auch neue Prozesse aus OpenSSH, die die jeweilige Binärdatei benötigen. Die meisten FTP-Daemons machen das gleiche. - Florin Asăvoaie