Cestino spostato e altre cartelle! Come riaverli?


13

Ho accidentalmente spostato tutte le cartelle dalla radice a una sottocartella. ( /bin, /etc, /home, /lib, /usr... tutto spostato) Gli unici che non sono stati spostati, dal momento che erano in uso, sono /bak, /boot, /dev, /proc, /sys.

Ora, qualsiasi comando che provo ad eseguire semplicemente non avverrà. Ricevo costantemente "Nessun file o directory".

Sono connesso tramite SSH e FTP, ma non riesco a spostare i file tramite FTP, poiché l'accesso diretto SU è disabilitato. Ho anche accesso al server effettivo se devo fare qualcosa direttamente da lì.

Suppongo che avrei bisogno di modificare un file di configurazione per dirgli dove trovare la /bincartella e che mi aiuterebbe ad accedere di nuovo, ma non so quale file sarebbe o come farlo (dal momento che non è nemmeno possibile eseguire chmodper modificare le autorizzazioni).

Esiste una via d'uscita diversa dalla reinstallazione?

Sto lavorando a una vecchia versione di CentOS.

Sono estremamente nuovo nel mondo di Linux, quindi questa azione e la domanda ...


Sebbene non sia una soluzione al tuo problema, ti consiglio di leggere questo: lug.wsu.edu/node/414 Situazione simile ma in realtà ha eliminato / bin.
stribika,

Risposte:


33

Se hai ancora una shell di root, potresti avere la possibilità di riparare il tuo sistema. Diciamo che è stato spostato tutte le directory comuni ( /bin, /etc, /lib, /sbin, /usr- questi sono quelli che potrebbero rendere difficile il recupero) sotto /oops.

Non sarà possibile emettere mvdirettamente il comando, anche se si specifica il percorso completo /oops/bin/mv. Questo perché mvè collegato dinamicamente ; perché hai spostato la /libdirectory, mvnon può essere eseguito perché non trova le librerie che fanno parte del suo codice. In effetti, è anche peggio di così: mvimpossibile trovare il caricatore dinamico /lib/ld-linux.so.2 (il nome può variare a seconda dell'architettura e della variante di Unix e la directory potrebbe essere un nome diverso come /lib32o /lib64). Pertanto, fino a quando non hai spostato /libindietro la directory, devi richiamare esplicitamente il linker e devi specificare il percorso delle librerie spostate. Ecco il comando testato su Debian squeeze i386.

export LD_LIBRARY_PATH=/oops/lib:/oops/lib/i386-linux-gnu
/oops/lib/ld-linux.so.2 /oops/bin/mv /oops/* /

Potrebbe essere necessario modificarlo leggermente per altre distribuzioni o architetture. Ad esempio, per CentOS su x86_64:

export LD_LIBRARY_PATH=/oops/lib:/oops/lib64
/oops/lib64/ld-linux-x86-64.so.2 /oops/bin/mv /oops/* /

Quando hai rovinato qualcosa /lib, è utile avere una cassetta degli attrezzi collegata staticamente. Alcune distribuzioni (non conosco CentOS) forniscono una copia staticamente collegata di Busybox . C'è anche sash , una shell standalone con molti comandi integrati. Se ne hai uno, puoi fare il tuo recupero da lì. Se non li hai installati prima del fatto, è troppo tardi.

# mkdir /oops
# mv /lib /bin /oops
# sash
Stand-alone shell (version 3.7)
> -mv /oops/* /
> exit

Se non hai più una shell root, ma hai ancora un demone SSH in ascolto e puoi accedere direttamente come root su ssh e hai una di queste caselle degli strumenti collegate staticamente, potresti essere in grado di accedere. può funzionare se ti sei spostato /libe /bin, ma non /etc.

ssh root@broken.example.com /oops/bin/sash
root@broken.example.com's password:
Stand-alone shell (version 3.7)
> -mv /oops/* /

Alcuni amministratori configurano un account alternativo con una shell collegata staticamente o fanno in modo che l'account root utilizzi una shell collegata staticamente, proprio per questo tipo di problema.

Se non si dispone di una shell di root e non si sono prese precauzioni, è necessario eseguire l'avvio da un CD / USB live di Linux (tutti lo faranno finché è abbastanza recente da poter accedere a dischi e file system) e sposta i file indietro.


1
Grazie Gilles. Hai fornito alcune informazioni molto utili su ciò di cui dovrei fare attenzione in futuro.
Menelao,

Grazie Gilles! Questo mi ha salvato. Ho aggiunto una modifica per Linux Env ​​a 64 bit. Nel mio caso, CentOS 7 a 64 bit
CompEng88

@ ComputerEngineer88 Grazie, ma quando fai delle modifiche, per favore non aggiungere marcatori “EDIT” o aggiungerli alla fine del post a cui non appartengono. Mantieni il flusso del testo. I post hanno una cronologia delle modifiche se le persone vogliono sapere cosa conteneva il post in precedenza. Quando le persone leggono il post normalmente, a loro non importa che un po 'sia stato aggiunto in seguito.
Gilles 'SO- smetti di essere malvagio' il

Veramente? Mi concentro sempre sulle modifiche. Significa che qualcosa di nuovo è stato appreso e per me è molto importante. Tuttavia, purché le persone ne traggano beneficio!
CompEng88,

@ ComputerEngineer88 Ho avuto lo stesso riflesso quando ho iniziato a usare Stack Overflow. Ma in effetti un post di Stack Exchange è per molti versi più vicino a un articolo di Wikipedia che a un post in un forum di discussione. Ti aspetti che le persone leggano i post del forum subito dopo che sono stati pubblicati, quindi ha senso avere un'indicazione visibile se sono stati modificati. Ma supponiamo che qualcuno veda questa discussione nel 2027: non gli importerebbe se un paragrafo fosse stato lì dal 2011 o fosse stato aggiunto nel 2019.
Gilles 'SO- smetti di essere malvagio' il

11

Probabilmente puoi ripristinare senza riavviare, quindi non riavviare fino a quando non hai provato alcune altre cose perché non si avvierà. Se hai ancora la sessione SSH aperta, prova questi:

  • Da dove vengono eseguiti i programmi viene impostato usando la variabile $ PATH. È possibile aggiungere la nuova posizione del cestino al percorso eseguendo export PATH="$PATH:/newpath/to/bin:/newpath/to/usr/bin". Potrebbe essere necessario aggiungere anche le corrispondenti directory sbin . Puoi anche eseguire i programmi manualmente tramite il loro percorso completo, /path/to/mv [from] [to]ad esempio dovrebbe funzionare anche se mv si trova in una posizione diversa. La parte difficile è che la maggior parte dei comandi vorranno accedere alle librerie comuni e tu dici che sono /libstati spostati, quindi è necessario impostare una variabile anche dove si trova.export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/newpath/to/lib/:/newpath/to/usr/lib

  • Una volta che puoi eseguire alcuni comandi di base, sposta le cose indietro! mv /path/to/subfolder/* /sarebbe in ordine! Una volta che tutto è tornato a posto, il sistema dovrebbe comportarsi normalmente.

In caso contrario, l'avvio di QUALSIASI LiveCD e il montaggio dell'unità dovrebbe consentire di spostare le cartelle al loro posto. Non è necessario reinstallare o utilizzare le distribuzioni livecd, è sufficiente montare l'unità e spostare le cartelle nella posizione corretta sul disco. Molti dischi di ripristino basati su Linux sono specializzati nel fornire solo alcuni strumenti di base per eseguire questo tipo di riparazione.


Lavorare attraverso SSH non è riuscito, quindi ho scaricato un liveCD e sto cercando di far funzionare le cose. Sono su grub e sto provando a montare il drive, ma non mi permetterà perché il kernel non è caricato. e non riuscire a vedere il percorso esatto dei percorsi esistenti sta chiaramente rendendo questo difficile ...
Menelaos,

1
Avvia per vivere, monta il tuo disco, sposta le cose nei loro posti corretti, riavvia il sistema ... e buona fortuna.
Caleb,

2
Non è sufficiente impostare LD_LIBRARY_PATH, è inoltre necessario richiamare esplicitamente il caricatore dinamico, ad es LD_LIBRARY_PATH=/newpath/to/lib /newpath/to/lib/ld-linux.so.2 /newpath/to/bin/mv.
Gilles 'SO- smetti di essere malvagio' il

4

Dovresti essere in grado di riavviare il computer con un CD di installazione in modalità utente singolo, montare il filesystem di root e spostare nuovamente i file su Linux. Non conosco molto centos, ma è come RHEL, quindi dovrebbe funzionare.


Grazie. Lo sto scaricando mentre parliamo. Fa differenza se si tratta del cd live o dell'intero dvd di installazione?
Menelao,

@Menelaos: non vuoi installare, vuoi qualcosa che puoi eseguire live per questa soluzione. Alcuni dischi di installazione hanno versioni live, ma alcuni vogliono semplicemente non essere immediatamente. Alcuni hanno modalità di "ripristino" che è ciò che si desidera in realtà, ma ci sono anche dischi di ripristino Linux dedicati. Non deve essere la tua distribuzione, deve solo essere qualcosa che può montare un file system linux e spostare indietro le cartelle. Vedi la mia risposta
Caleb,

Guarda sysresccd.org per vedere uno dei CD di salvataggio se ti piace Ha una vasta documentazione per vedere come usarlo. Aiutare a usarlo per risolvere questo problema può essere difficile in questo forum e oltre il mio tempo disponibile. Altrimenti, i CD di centos dovrebbero aiutare. L'ultimo CD live potrebbe non funzionare o meno ... Quindi, tenendo presente questo tipo di problemi, è necessario tenere sempre un supporto / iso di installazione della versione installata. Crea anche un backup di interi filesystem.
Jamess,

2

Grazie mille a Gilles, 5 anni dopo e i tuoi post mi hanno ancora salvato la giornata, se non la settimana.

Volevo spostare il contenuto di una sottocartella alla cartella corrente ma invece di mv sub/* ., l'ho fatto mv sub /* ., così ho spostato tutto alla cartella corrente. Fortunatamente ho trovato questa risposta e sono stato in grado di riparare la mia macchina con relativa facilità. Tuttavia, ho dovuto modificare leggermente i comandi poiché sto lavorando su una macchina x86_64 con Ubuntu 16.04. Vorrei lasciare le istruzioni qui, nel caso qualcuno stia lottando:

export LD_LIBRARY_PATH=/oops/lib:/oops/lib/x86_64-linux-gnu
/oops/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /oops/bin/mv /oops/* /

0

Vorrei aggiungere un altro paio di comandi da fare dopo aver applicato la risposta di Ktipr per i sistemi moderni (macchine x86_64 che eseguono Unix), non sono stato in grado di spostare le directory "etc" con mv poiché mostrava errore

Error : Directory not empty

quindi ho dovuto usare

rsync -a source_file target_location

per assicurarmi di essere in grado di rimettere tutto in ordine. Se non lo hai già installato, dovrai prima installarlo.

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.