Come creare un collegamento simbolico senza usare ln?


31

Ho eliminato un collegamento simbolico critico - libc.so.6. Ho il file a cui dovrebbe puntare, ma i comandi di base come lno wgetnon funzioneranno più a causa della mancanza del collegamento. Tuttavia, echoo altri built-in di Bash funzionano.

Sto cercando un modo per ricreare questo collegamento simbolico.


1
@Sebas, penso che intendevi tutti i builtin di Bash , non solo echo.
Cristian Ciupitu,

@CristianCiupitu forse, che cos'è? catè disabilitato ... in realtà era tutto.
Sebas,

1
@Sebas, questo perché catè un programma esterno. La pagina di manuale dei comandi incorporati di Bash contiene dettagli su ciò che potrebbe essere disponibile.
Cristian Ciupitu,

3
Suppongo che intendi i sistemi basati su GNU / Linux quando dici "Unix" poiché molti altri sistemi * nix hanno versioni "di salvataggio" delle utility standard che sono staticamente collegate solo per quei momenti "oops".
Chris S,

Qui
sto

Risposte:


58

puoi usare ldconfig, ricrea il link simbolico:

# 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

appena provato, come vedi.


4
E, convenientemente, / sbin / ldconfig è staticamente collegato. ldconfig è responsabile in primo luogo di quei collegamenti simbolici.
etherfish,

16
Non è proprio "conveniente", un binario collegato staticamente è praticamente un componente di progettazione necessario dello strumento che mantiene le tue librerie dinamiche! Ma è ciò che lo rende uno strumento ideale per risolvere questo problema e IMHO è l'unico modo "corretto". La domanda qui non riguarda davvero un link simbolico cancellato (il 99,999% di questi può essere eliminato senza conseguenze), è "Ho rotto il negozio di librerie dinamiche del mio sistema". Dando il suggerimento di @ natxo, "risolvilo usando lo strumento che gestisce quel negozio", ovvio e ragionevole. Qualsiasi altra cosa (ricreare manualmente il collegamento) è una soluzione aleatoria.
FeRD

Sì, è effettivamente più logico procedere così anche se anche l'altra risposta era corretta.
Sebas,

(negromanzia, scusa) Il motivo principale per cui è importante, BTW, l' eliminazione dei collegamenti simbolici non è l'unico modo per rovinare il tuo negozio di biblioteche dinamico. Ad esempio, supponiamo che tu abbia rinominato per errore /lib/libc-2.12.sonell'esempio sopra /lib/foobar. Beh, merda, non di più mv. Ma ldconfig -l /lib/foobarè anche abbastanza intelligente da /lib/libc.so.6indicare il file sbagliato . (Gli arg sono obbligatori, il default ldconfigignora i nomi dei file che non iniziano con "lib" e contengono ".so".) A quel punto puoi mvtornare indietro (o cp -pse sei paranoico / intelligente), quindi esegui di ldconfignuovo per ripulire .
FERD

44

In genere CentOS 6 viene fornito con busyboxun set di strumenti Unix collegati staticamente /sbin. Puoi eseguirlo in questo modo:

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

1
+1, appena testato dopo aver rimosso il link simbolico in un test vm, si sveglia in centos 6.5
natxo asenjo

+1 Questo risponde anche alla domanda generica nel titolo della domanda.
MattBianco,

Su Debian / Ubuntu è / bin / busybox
PHZ.fi-Pharazon il

23

Impostare LD_PRELOAD per precaricare la libreria pertinente. L'ho provato con libpthread e sembra funzionare:

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...

interessante, si raggruppa con quello che hanno detto gli altri.
Sebas,

21

slnserve esattamente a quello scopo: correggere i collegamenti simbolici quando non è possibile utilizzare ln regolare perché si è rotto un collegamento simbolico essenziale. Per citare la sua pagina man:

DESCRIZIONE

  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.

bello, non conoscevo questo strumento. In centos fa parte di glibc, quindi deve essere installato di default
natxo asenjo

8

È possibile impostare la LD_LIBRARY_PATHvariabile per includere la directory in cui reale libc.so.6è:

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

Inoltre, esegui ldconfigper ricreare i collegamenti. Ciò dovrebbe far funzionare i comandi in modo da poter utilizzare i lncomandi per riparare il sistema.

Un altro modo potrebbe essere l'avvio tramite LiveCD e il collegamento del file lì.


Quindi l'unico modo per avviare livecd e collegare il file lì in chroot.
phoops,

1
Inoltre, dovresti semplicemente impostare LD_LIBRARY_PATH per includere la directory dove si trova il file libc.so.6. Questo potrebbe permetterti di usare i comandi come dovrebbe trovare la lib.
phoops,

maledizione, scusa non ci ho pensato prima io.
phoops,

2
Non funziona, perché il file collegato non si chiama libc.so.6. Dovrai impostare LD_PRELOAD come nella mia risposta.
Dennis Kaarsemaker,

1
L'ho provato su Fedora 20 e non ha funzionato.
Cristian Ciupitu,

-4

Usa scp o sftp per copiare una versione staticamente collegata di ln. Assicurati che sia eseguibile. Quindi usalo per riparare il file.


1
scp e sftp non funzioneranno in quanto non saranno nemmeno in grado di caricare quel file.
Florin Asăvoaie

scp, sftp, ftp verrebbero eseguiti da un host remoto. Questo presuppone che il demone nella macchina rotta sia già in esecuzione. Altre possibilità per il trasferimento di file sono i file system già montati, sia locali che remoti.
Robert Jacobs,

3
Si prega di interrompere la disinformazione. SCP richiede che il binario scp sia presente e verrà eseguito su entrambi gli host. SFTP avvia anche nuovi processi da OpenSSH che richiedono il rispettivo binario. La maggior parte dei demoni FTP fa lo stesso.
Florin Asăvoaie,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.