Pokud stále máte root shell, můžete mít šanci opravit váš systém. Řekněme, že jste přesunuli všechny běžné adresáře (/bin
, /etc
, /lib
, /sbin
, /usr
— to jsou ty, které by mohly ztížit obnovu) pod /oops
.
Nebudete moci vydat mv
příkaz přímo, i když zadáte úplnou cestu /oops/bin/mv
. To proto, že mv
je dynamicky propojen; protože jste přesunuli /lib
adresář, mv
nelze spustit, protože nemůže najít knihovny, které tvoří součást jeho kódu. Ve skutečnosti je to ještě horší:mv
nemůže najít dynamický zavaděč /lib/ld-linux.so.2
(název se může lišit v závislosti na vaší architektuře a variantě unixu a adresář může mít jiný název, například /lib32
nebo /lib64
). Dokud tedy nepřesunete /lib
adresář zpět, musíte explicitně vyvolat linker a musíte zadat cestu k přesunutým knihovnám. Zde je příkaz testovaný na Debianu squeeze i386.
export LD_LIBRARY_PATH=/oops/lib:/oops/lib/i386-linux-gnu
/oops/lib/ld-linux.so.2 /oops/bin/mv /oops/* /
Možná to budete muset trochu upravit pro jiné distribuce nebo architektury. Například pro CentOS na x86_64:
export LD_LIBRARY_PATH=/oops/lib:/oops/lib64
/oops/lib64/ld-linux-x86-64.so.2 /oops/bin/mv /oops/* /
Když jste něco podělali /lib
, pomáhá mít staticky propojenou sadu nástrojů. Některé distribuce (nevím o CentOS) poskytují staticky propojenou kopii Busyboxu. K dispozici je také sashe, samostatný shell s mnoha vestavěnými příkazy. Pokud máte jeden z nich, můžete se odtud zotavit. Pokud jste je nenainstalovali dříve, je příliš pozdě.
# mkdir /oops
# mv /lib /bin /oops
# sash
Stand-alone shell (version 3.7)
> -mv /oops/* /
> exit
Pokud již nemáte root shell, ale stále vám naslouchá SSH démon a můžete se přihlásit přímo jako root přes ssh a máte jeden z těchto staticky propojených toolboxů, možná budete moci připojit ssh. může fungovat, pokud jste přesunuli /lib
a /bin
, ale ne /etc
.
ssh [email protected] /oops/bin/sash
[email protected]'s password:
Stand-alone shell (version 3.7)
> -mv /oops/* /
Někteří administrátoři nastaví alternativní účet se staticky propojeným shellem nebo přimějí účet root používat staticky propojený shell, právě pro tento druh problémů.
Pokud nemáte root shell a neučinili jste žádná opatření, budete muset zavést systém z živého CD/USB Linuxu (které bude fungovat, pokud bude dostatečně aktuální, aby bylo možné přistupovat k vašim diskům a souborovým systémům) a přesunout soubory zpět.
Pravděpodobně se můžete obnovit bez restartu, takže nerestartujte, dokud nevyzkoušíte nějaké jiné věci, protože se nespustí. Pokud máte stále otevřenou relaci SSH, zkuste toto:
-
Odkud se programy spouštějí, se nastavuje pomocí proměnné $PATH. Své nové skladové místo můžete přidat do cesty spuštěním
export PATH="$PATH:/newpath/to/bin:/newpath/to/usr/bin"
. Možná budete muset přidat odpovídající sbin adresáře také. Programy můžete také spouštět ručně přes jejich úplnou cestu/path/to/mv [from] [to]
například by měl fungovat, i když je mv na jiném místě. Záludná část je v tom, že většina příkazů bude chtít získat přístup k běžným knihovnám a vy řeknete/lib
se přesunul, takže musíte nastavit proměnnou, kde to také je.export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/newpath/to/lib/:/newpath/to/usr/lib
-
Jakmile budete moci provést některé základní příkazy, přesuňte věci zpět!
mv /path/to/subfolder/* /
by bylo v pořádku! Jakmile je vše zpět na svém místě, systém by se měl chovat normálně.
Pokud to selže, spuštění JAKÉHOKOLI LiveCD a připojení jednotky by vám mělo umožnit přesunout složky zpět tam, kam patří. Nemusíte znovu instalovat nebo dokonce používat vaše distribuce livecd, stačí připojit jednotku a přesunout složky zpět na správné místo na disku. Spousta linuxových záchranných disků se specializuje na to, že vám poskytne jen několik základních konzolových nástrojů k provedení tohoto druhu opravy.
Měli byste být schopni restartovat počítač pomocí instalačního CD v režimu jednoho uživatele, připojit kořenový souborový systém a přesunout soubory zpět na Linux. Centos moc neznám, ale je to jako RHEL, takže by to mělo fungovat.