Przeniesiono kosz i inne foldery! Jak je odzyskać?

13

Przypadkowo przeniosłem wszystkie foldery z katalogu głównego do podfolderu. ( /bin, /etc, /home, /lib, /usr... wszystko przeniesiony) jedynymi, które nie zostały przeniesione, ponieważ były one w użyciu, są /bak, /boot, /dev, /proc, /sys.

Teraz każde polecenie, które próbuję wykonać, po prostu się nie wydarzy. Ciągle pojawia się komunikat „Brak takiego pliku lub katalogu”.

Jestem połączony przez ssh i przez ftp, ale nie mogę przenosić plików przez ftp, ponieważ bezpośrednie logowanie SU jest wyłączone. Mam również dostęp do rzeczywistego serwera, jeśli muszę coś zrobić bezpośrednio z tego miejsca.

Zakładam, że musiałbym edytować plik konfiguracyjny, aby powiedzieć mu, gdzie znaleźć /binfolder, co pomogłoby mi uzyskać dostęp ponownie, ale nie wiem, który to plik i jak to zrobić (ponieważ nie można nawet uruchomić, chmodaby zmienić uprawnienia).

Czy jest na to wyjście poza ponownym zainstalowaniem?

Pracuję nad starą wersją CentOS.

Jestem niezwykle nowy w świecie Linuksa, stąd ta akcja i pytanie ...

Menelaos
źródło
Chociaż nie jest to rozwiązanie twojego problemu, polecam przeczytać to: lug.wsu.edu/node/414 Podobna sytuacja, ale tak naprawdę usunął / bin.
stribika

Odpowiedzi:

33

Jeśli nadal masz powłokę root, możesz mieć szansę naprawić swój system. Powiedzmy, że przeniósł wszystkich wspólnych katalogów ( /bin, /etc, /lib, /sbin, /usr- są to te, które mogłyby spowodować odzyskanie trudną) pod /oops.

Nie będziesz mógł wydać mvpolecenia bezpośrednio, nawet jeśli podasz pełną ścieżkę /oops/bin/mv. To dlatego, że mvjest dynamicznie powiązany ; ponieważ /libkatalog został przeniesiony , mvnie można go uruchomić, ponieważ nie można znaleźć bibliotek, które stanowią część jego kodu. W rzeczywistości jest nawet gorzej: mvnie można znaleźć dynamicznego modułu ładującego /lib/ld-linux.so.2 (nazwa może się różnić w zależności od architektury i wariantu unix, a katalog może mieć inną nazwę, taką jak /lib32lub /lib64). Dlatego, dopóki nie przeniesiesz /libkatalogu z powrotem, musisz jawnie wywołać konsolidator i określić ścieżkę do przeniesionych bibliotek. Oto polecenie przetestowane na ściśnięciu Debiana i386.

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

Może być konieczne dostosowanie tego nieco w przypadku innych dystrybucji lub architektur. Na przykład dla CentOS na x86_64:

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

Kiedy coś spieprzysz /lib, pomoże Ci mieć statycznie połączony zestaw narzędzi. Niektóre dystrybucje (nie wiem o CentOS) zapewniają statycznie połączoną kopię Busybox . Jest też sash , samodzielna powłoka z wieloma wbudowanymi poleceniami. Jeśli masz jeden z nich, możesz odzyskać stamtąd. Jeśli nie zainstalowałeś ich wcześniej, jest za późno.

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

Jeśli nie masz już powłoki roota, ale nadal nasłuchujesz demona SSH i możesz zalogować się bezpośrednio jako root przez ssh, a masz jeden z tych statycznie połączonych zestawów narzędzi, możesz być w stanie ssh. może działać, jeśli zostały przeniesione /libi /bin, ale nie /etc.

ssh [email protected] /oops/bin/sash
[email protected]'s password:
Stand-alone shell (version 3.7)
> -mv /oops/* /

Niektórzy administratorzy zakładają alternatywne konto ze statycznie połączoną powłoką lub zmuszają konto root do korzystania ze statycznie połączonej powłoki, tylko dla tego rodzaju problemów.

Jeśli nie masz root-a i nie podjąłeś żadnych środków ostrożności, będziesz musiał uruchomić system z Live CD / USB na Linuksa (każdy będzie działał tak długo, jak będzie wystarczająco nowy, aby mieć dostęp do twoich dysków i systemów plików) i przenieś pliki z powrotem.

Gilles „SO- przestań być zły”
źródło
1
Dziękuję Gilles. Dostarczyłeś kilka bardzo przydatnych informacji na temat tego, na co powinienem uważać w przyszłości.
Menelaos
Dzięki Gilles! To mnie uratowało. Dodałem edycję 64-bitowej wersji env dla Linuksa. W moim przypadku 64-bitowy CentOS 7
CompEng88
@ ComputerEngineer88 Dzięki, ale kiedy wprowadzasz zmiany, nie dodawaj znaczników „EDYCJA” ani nie dodawaj ich na końcu wpisu, do którego nie należą. Zachowaj przepływ tekstu. Wpisy mają historię edycji, jeśli ludzie chcą wiedzieć, co zawierał wcześniej. Kiedy ludzie czytają post normalnie, nie obchodzi ich, że trochę później zostało dodane.
Gilles „SO- przestań być zły”
Naprawdę? Zawsze koncentruję się na edycjach. Oznacza, że ​​nauczyłem się czegoś nowego i dla mnie to najważniejsze. Tak samo - o ile ludzie korzystają!
CompEng88
@ ComputerEngineer88 Miałem ten sam refleks, kiedy zacząłem używać przepełnienia stosu. Ale w rzeczywistości post Stack Exchange jest pod wieloma względami bliższy artykułowi z Wikipedii niż postowi na forum dyskusyjnym. Oczekujesz, że ludzie będą czytać posty na forum wkrótce po ich opublikowaniu, więc sensowne jest, aby mieć widoczne wskazanie, jeśli zostały edytowane. Ale powiedzmy, że ktoś widzi ten wątek w 2027 r .: nie obchodzi go, czy akapit był tam od 2011 r., Czy został dodany w 2019 r.
Gilles „SO- przestań być zły”
11

Prawdopodobnie możesz odzyskać bez ponownego uruchamiania, więc nie uruchamiaj ponownie, dopóki nie wypróbujesz innych rzeczy, ponieważ nie uruchomi się. Jeśli nadal masz otwartą sesję SSH, spróbuj wykonać następujące czynności:

  • Miejsce uruchamiania programów ustawia się za pomocą zmiennej $ PATH. Możesz dodać nową lokalizację kosza do ścieżki, uruchamiając export PATH="$PATH:/newpath/to/bin:/newpath/to/usr/bin". Konieczne może być również dodanie odpowiednich katalogów sbin . Możesz także uruchamiać programy ręcznie przez ich pełną ścieżkę, /path/to/mv [from] [to]na przykład powinno działać, nawet jeśli mv znajduje się w innym miejscu. Trudna część polega na tym, że większość poleceń będzie chciała uzyskać dostęp do wspólnych bibliotek i mówisz, że zostałeś /libprzeniesiony, więc musisz ustawić zmienną dla tego, gdzie to jest.export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/newpath/to/lib/:/newpath/to/usr/lib

  • Gdy będziesz w stanie wykonać kilka podstawowych poleceń, cofnij to! mv /path/to/subfolder/* /byłoby w porządku! Gdy wszystko wróci na miejsce, system powinien działać normalnie.

Jeśli to się nie powiedzie, uruchomienie KAŻDEJ płyty LiveCD i zamontowanie napędu powinno umożliwić przeniesienie folderów z powrotem do ich miejsca. Nie musisz ponownie instalować ani nawet korzystać z dystrybucji na żywo, wystarczy zamontować dysk i przenieść foldery z powrotem do właściwej lokalizacji na dysku. Wiele dysków ratunkowych opartych na systemie Linux specjalizuje się w udostępnianiu zaledwie kilku podstawowych narzędzi konsoli do wykonania tego rodzaju naprawy.

Caleb
źródło
Praca przez SSH nie powiodła się, więc pobrałem płytę LiveCD i staram się, aby wszystko działało. Próbuję zamontować dysk, ale nie pozwala mi to, ponieważ jądro nie jest załadowane. niemożność zobaczenia dokładnej ścieżki istniejących ścieżek wyraźnie utrudnia to ...
Menelaos
1
Uruchom komputer, zamontuj dysk, przenieś rzeczy z powrotem na właściwe miejsca, uruchom ponownie system ... i powodzenia.
Caleb
2
Nie wystarczy ustawić LD_LIBRARY_PATH, musisz również bezpośrednio wywołać moduł ładujący dynamiczny, np LD_LIBRARY_PATH=/newpath/to/lib /newpath/to/lib/ld-linux.so.2 /newpath/to/bin/mv.
Gilles „SO- przestań być zły”
4

Powinieneś być w stanie ponownie uruchomić komputer z instalacyjną płytą CD w trybie pojedynczego użytkownika, zamontować główny system plików i przenieść pliki z powrotem na Linux. Nie znam dużo centów, ale to jest jak RHEL, więc to powinno działać.

Jamess
źródło
Dziękuję. Pobieram go w trakcie rozmowy. Czy robi to różnicę, czy jest to płyta CD na żywo czy cała płyta instalacyjna?
Menelaos,
@Menelaos: Nie chcesz instalować, potrzebujesz czegoś, co możesz uruchomić na żywo dla tego rozwiązania. Niektóre dyski instalacyjne mają wersje na żywo, ale niektóre po prostu chcą od razu nie zainstalować. Niektóre mają tryby „ratunkowe”, które są właśnie tym, czego naprawdę chcesz, ale są też dedykowane dyski ratunkowe dla systemu Linux. To nie musi być twoja dystrybucja, to po prostu coś, co może zamontować system plików Linux i przenieść foldery z powrotem. Zobacz moją odpowiedź.
Caleb
Patrzy na sysresccd.org, aby zobaczyć jedną z ratunkowych płyt CD, jeśli chcesz. Ma obszerną dokumentację, aby zobaczyć, jak z niej korzystać. Pomoc w użyciu go do rozwiązania tego problemu może być trudna na tym forum i poza moim dostępnym czasem. W przeciwnym razie centos CD powinny pomóc. Najnowsza płyta CD na żywo może, ale nie musi ... Mając na uwadze tego rodzaju problemy, zawsze powinieneś mieć nośnik instalacyjny / ISO zainstalowanej wersji. Utwórz także kopię zapasową całych systemów plików.
Jamess,
2

Wielkie dzięki dla Gillesa, 5 lat później, a twoje posty wciąż uratowały mi dzień, jeśli nie tydzień.

Chciałem przenieść zawartość podfolderu do bieżącego folderu, ale zamiast tego mv sub/* .zrobiłem mv sub /* ., więc przeniosłem wszystko do bieżącego folderu. Na szczęście znalazłem tę odpowiedź i byłem w stanie naprawić moją maszynę ze względną łatwością. Musiałem jednak nieco dostosować polecenia, ponieważ pracuję na maszynie x86_64 z systemem Ubuntu 16.04. Chciałbym zostawić instrukcje tutaj, na wypadek, gdyby ktoś miał problemy:

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/* /
Ktipr
źródło
0

Chciałbym dodać jeszcze kilka poleceń do wykonania po zastosowaniu odpowiedzi Ktipr dla nowoczesnych systemów (maszyny x86_64 z systemem Unix), nie byłem w stanie uzyskać przeniesienia katalogów „etc” z mv, ponieważ pokazywał błąd

Error : Directory not empty

więc musiałem użyć

rsync -a source_file target_location

aby upewnić się, że udało mi się odzyskać wszystko w porządku. Jeśli jeszcze go nie masz, musisz go najpierw zainstalować.

Rishabh Gupta
źródło