Dopo aver rinominato / usr accidentalmente, come posso rinominarlo?


62

Ho rinominato accidentalmente la directory /usrin /usr_bak.

Voglio cambiare di nuovo, così ho aggiungere il percorso /usr_bak/binper $PATHpermettere al sistema di trovare il comando sudo.

Ma ora sudo mv /usr_bak /usrmi dà l'errore:

sudo: error while loading shared libraries: libsudo_util.so.0: cannot open shared object file: No such file or directory

C'è un modo per rinominare il /usr_bakcome /usr, oltre la reinstallazione del sistema?


2
Quale sistema operativo è questo? Mi chiedo come sudosia arrivato allo stadio della libreria, di solito è /usr/bin/e avrebbe dovuto fallire con un errore di comando non trovato. Inoltre, hai impostato una password di root?
muru

3
@muru È Ubuntu. Hai ragione, ho ricevuto l'errore circa not foundprima, quindi ho aggiunto il nuovo percorso /usr_bak/bina $PATHe ora ottengo l'errore nel mio post qui ...
Yves

2
@ user1717828 è complicato. Devo compilare un progetto, sviluppato su Ubuntu 16.04, su Ubuntu 17.10. Quindi sto pensando se posso semplicemente copiare /usrUbuntu 16.04 per sovrascrivere /usrUbuntu 17.10 ...
Yves

6
Hai mai pensato di utilizzare una macchina virtuale per compilare il progetto invece di tali cambiamenti drastici?
Kevin,

3
Puoi eseguire virtualbox in modalità senza testa . Potrebbe essere più semplice impostare un guest su un altro computer o ottenerne uno preconfigurato.
Kevin,

Risposte:


109

Dato che hai impostato una password per root, usa sue busybox, installato di default in Ubuntu. Sono presenti tutte sule librerie richieste /lib. Busybox è una raccolta di utility collegate staticamente, quindi le librerie mancanti non dovrebbero essere un problema. Fare:

su -c '/bin/busybox mv /usr_bak /usr'

(Mentre Busybox stesso ha anche suun'applet, il /bin/busyboxbinario non è setuid e quindi non funziona se non eseguito come root.)

Se non hai una password di root, probabilmente potresti usare la soluzione di Gilles usando quiLD_LIBRARY_PATH , o (Gilles dice che non funzionerà con binari setuid come sudo) riavviare e modificare il menu di GRUB con cui avviare init=/bin/busyboxcome parametro del kernel e spostare la cartella indietro.


73
Ora, non rinominare accidentalmente /lib.
slittino

5
LD_LIBRARY_PATHnon aiuterebbe a eseguire sudo poiché sudoè setuid. Se le sue librerie non sono nel posto giusto, sudo non funzionerà finché root non lo riparerà.
Gilles 'SO- smetti di essere malvagio' il

3
Nota storica di @Yves: vecchie versioni di Unix (che sono molto più vecchie di Linux) includevano una piccola raccolta di file binari collegati staticamente /sbinproprio per quel tipo di scenario: "Sto facendo alcune attività in cui le librerie di runtime saranno giocoleria ma devi ancora manipolare i file ". Fondamentalmente lo stesso approccio prima dell'invenzione di Busybox. (Il numero di comandi disponibili in questo modo era molto limitato, perché quei binari collegati staticamente inghiottono spazio su disco.)
Ti Strga

8
@Yves se hai rinominato /lib, probabilmente dovresti riavviareinit=/bin/busybox
muru

3
@Yves: avvia da una chiavetta USB, con una distribuzione live che può montare i tuoi filesystem e sei pronto per riparare qualsiasi cosa. Anche scaricando i file sostitutivi dai mirror dei pacchetti se hai eliminato qualcosa.
Peter Cordes,

33

Oltre alla risposta di Muru :

  • avresti potuto usare una chiave USB di avvio di ripristino per riparare il tuo sistema; ad esempio, se il tuo sistema è un po 'di Debian o Ubuntu, avvia la chiave USB di installazione in modalità di salvataggio e fai il comando appropriato mounte mve umount.

  • essere in grado di riparare più facilmente tali errori, io generalmente anche installare un guscio statico con diversi comandi incorporati (in particolare con alcune cp, rm, mvbuiltins -come) come sashconfezionato in Debian e Ubuntu, ed anche disponibile come telaio-3.8. tar.gz in formato sorgente) e avvia con init=/bin/sashpassato a Grub.

PS: sashè leggermente difettoso e non completamente conforme a Posix, ma comunque molto utile.


Potresti spiegare come installare una shell statica con diversi comandi integrati? C'è del manuale?
Yves

1
Su Debian o Ubuntu: apt-get install sash. Ma puoi anche scaricare sash-3.8.tar.gz e compilarlo.
Basile Starynkevitch

Tengo un liveiso sul disco fisso con una voce grub personalizzata per problemi come questo. Non c'è bisogno di complicarsi, basta avviare un sistema operativo dal vivo e manipolare i file liberamente :)
FreeSoftwareServers

3

Penso che il modo più sicuro sia riavviare usando un sistema operativo USB, CD o DVD (Debian, Ubuntu, Suse, ecc.). Quindi montare l'unità contenente i problemi ed eseguire la ridenominazione.

Più sicuro dell'avvio in un campo minato con / usr o / lib effettivamente mancanti.


1
Puoi avviare un ISO direttamente da Grub / HDD senza bisogno di USB / DVD ecc. Grub abbastanza carino ha il loopback delle chiamate.
FreeSoftwareServers il

0

Mi sono imbattuto in un problema simile in cui ho rinominato /usr/binper /usr/bin_bkpun po 'di test e quindi non ero in grado di rinominare (come il comando non ha trovato il sudonella directory standard, che è /usr/bin) e poi sono andato alla /usr/bin_bkpdirectory manualmente (utilizzando File manager ) e la maggior parte delle funzioni (incluso il nome) del tasto destro sono disabilitate.

Quindi ho provato il seguente comando e risolto il problema

$/usr/bin_bkp/sudo mv /usr/bin_bkp/ /usr/bin/

Ho invocato il sudo dal percorso corrente e ha funzionato, ora tutto è tornato alla normalità.

Sistema operativo: Xubuntu 14.04


-3

Non posso provarlo ora (e non sono sicuro che lo vorrei), ma sembra che dovrebbe funzionare per creare un nuovo "/ usr" come un hard link (non un soft link) al tuo " / usr_bak, quindi elimina "/ usr_bak"

ln /usr_bak /usr
rm /usr_bak

Il collegamento reale creato da "ln" ( senza argomento "-s") nel file system dovrebbe rendere entrambi le directory usr e usr_bak ugualmente valide per le directory in questione. "rm" rimuove solo il collegamento che gli è stato chiesto di rimuovere, non entrambi. Poiché esiste ancora un collegamento valido ai contenuti, dovrebbero rimanere accessibili tramite il collegamento rimanente in "/ usr".


5
Avevo l'impressione che Linux (o almeno Ubuntu) non consentisse collegamenti diretti alle directory. Ad esempio, askubuntu.com/questions/210741/…
Chris Bouchard,

4
@Chris: Giusto, Linux non consente i collegamenti hard della directory (oltre a .e .., quindi il conteggio dei collegamenti su una directory indica il numero di sottodir di primo livello). Inoltre, rmnon funziona su directory, dovresti usare rmdir. ( lne rmlavoriamo su collegamenti simbolici alle directory, ma stiamo parlando di una directory reale). Inoltre, questo non risolve il problema, perché richiede rootproprio come mv, a causa delle autorizzazioni su/ . Se potessi farlo, potresti correre mvinvece come una persona normale.
Peter Cordes,

2
I collegamenti diretti alle directory non sono supportati sulla maggior parte degli (tutti?) Unice perché è troppo difficile per il software eseguire una scansione ricorsiva del file system per rilevare loop infiniti. È possibile se il software tiene traccia di tutti gli inode visitati e sta eseguendo la scansione di un filesystem inode (cioè non FAT32 / NTFS), ma controllare i collegamenti simbolici e non attraversarli è molto più semplice. Tutto ciò che serve è una rapida chiamata a lstat (2) per verificare il tipo di file.
penguin359

2
@Pryftan, il mio ln(1)su Debian lo dice per l' opzione -d/ -F/ --directory: "consenti al superutente di tentare di collegare le directory hard link (nota: probabilmente fallirà a causa delle restrizioni del sistema, anche per il superutente)" . Quindi sei libero di provare, ma il tuo filesystem probabilmente non te lo permetterà.
Toby Speight,

1
@TobySpeight Un altro pensiero: vedi anche symlink (7) che dice: I collegamenti reali potrebbero non riferirsi alle directory (per prevenire la possibilità di cicli all'interno dell'albero dei filesystem, che confonderebbero molti programmi) e potrebbero non riferirsi ai file su diversi filesystem (perché i numeri di inode non sono univoci tra i filesystem). Questo mi fa pensare che il tentativo di collegamento reale potrebbe effettivamente essere il modo di formulare qualcos'altro che accade, vale a dire che la funzione viene chiamata ma fallisce esattamente perché è una directory. (Il riferimento al filesystem è quello a cui stavo pensando in un altro commento)
Pryftan,
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.