Jak mogę zmienić nazwę po przypadkowej zmianie nazwy / usr?

62

Przypadkowo zmieniłem nazwę katalogu /usrna /usr_bak.

Chcę to zmienić z powrotem, więc dołączam ścieżkę, /usr_bak/binaby $PATHsystem mógł znaleźć polecenie sudo.

Ale teraz sudo mv /usr_bak /usrdaje mi błąd:

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

Czy istnieje sposób, aby zmienić nazwę /usr_bakjak /usroprócz ponownej instalacji systemu?

Yves
źródło
2
Który to system operacyjny? Zastanawiam się, jak w sudoogóle dostał się do etapu biblioteki, zwykle jest /usr/bin/i powinien się nie udać z błędem braku polecenia. Ponadto, czy masz ustawione hasło roota?
muru
3
@muru It's Ubuntu. Masz rację, wcześniej miałem błąd, not foundwięc dołączyłem nową ścieżkę /usr_bak/bindo, $PATHa teraz pojawia się błąd w moim poście tutaj ...
Yves
2
@ user1717828 to skomplikowane. Muszę skompilować projekt, opracowany na Ubuntu 16.04, na Ubuntu 17.10. Myślę więc, czy mogę po prostu skopiować /usrUbuntu 16.04, aby zastąpić /usrUbuntu 17.10 ...
Yves
6
Czy rozważałeś użycie maszyny wirtualnej do skompilowania projektu zamiast tak drastycznych zmian?
Kevin
3
Możesz uruchomić virtualbox w trybie bezgłowym . Najłatwiej jest skonfigurować gościa na innym komputerze lub uzyskać wstępnie skonfigurowany.
Kevin,

Odpowiedzi:

109

Ponieważ ustawiłeś hasło dla roota, użyj sui busybox, domyślnie zainstalowany w Ubuntu. Wszystkie suwymagane biblioteki są w /lib. Busybox to zbiór narzędzi, które są połączone statycznie, więc brak bibliotek nie powinien stanowić problemu. Zrobić:

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

(Chociaż sam Busybox ma również suaplet, /bin/busyboxplik binarny nie jest setuid, więc nie działa, chyba że jest uruchamiany jako root).

Jeśli nie masz hasła roota, prawdopodobnie możesz użyć rozwiązania Gillesa tutaj, używającLD_LIBRARY_PATH ( lub Gilles mówi, że to nie będzie działać z setuidowymi plikami binarnymi, takimi jak sudo), uruchom ponownie i edytuj menu GRUB, aby uruchomić init=/bin/busyboxjako parametr jądra i przenieść folder z powrotem.

muru
źródło
73
Teraz nie zmieniaj nazwy przypadkowo /lib.
sleblanc
5
LD_LIBRARY_PATHnie pomoże uruchomić sudo, ponieważ sudojest setuid. Jeśli jego biblioteki nie są we właściwym miejscu, sudo nie będzie działać, dopóki root go nie naprawi.
Gilles
3
@Yves Uwaga historyczna: stare smaki Uniksa (które są znacznie starsze od Linuksa) zawierały niewielką kolekcję statycznie powiązanych plików binarnych /sbindla dokładnie tego rodzaju scenariusza: „Robię pewne czynności, w których biblioteki wykonawcze będą żonglowane, ale nadal trzeba manipulować plikami ”. Zasadniczo to samo podejście przed wynalezieniem Busybox. (Liczba poleceń dostępnych w ten sposób była bardzo ograniczona, ponieważ te statycznie połączone pliki binarne
pożerają przestrzeń dyskową
8
@Yves, jeśli zmieniłeś nazwę /lib, prawdopodobnie będziesz musiał ponownie uruchomić komputerinit=/bin/busybox
muru
3
@Yves: Uruchom z pamięci USB, z dystrybucją na żywo, która może zamontować twoje systemy plików, i wszystko jest gotowe, aby cokolwiek naprawić. Nawet pobieranie plików zastępczych z mirrorów pakietów, jeśli coś usunąłeś.
Peter Cordes,
33

Oprócz odpowiedzi muru :

  • mógłbyś użyć klucza USB rozruchu awaryjnego do naprawy systemu; na przykład, jeśli Twój system jest jakiś Debian lub Ubuntu, uruchom klucz USB instalacji w trybie ratunkowym, i wykonaj odpowiednie mounti mvi umount.

  • aby móc łatwiej naprawiać takich błędów, to na ogół również instalowanie statycznego powłokę z kilku wbudowanych poleceń (w szczególności niektóre cp, rm, mv-jak builtins), takie jak sash(jest to pakowane w Debianie i Ubuntu, a także dostępne w skrzydle-3.8. tar.gz w formie źródłowej) i uruchom z init=/bin/sashprzekazanym do Grub.

PS: sashjest nieco wadliwy i nie do końca zgodny z Posix, ale nadal bardzo przydatny.

Basile Starynkevitch
źródło
Czy możesz wyjaśnić, jak zainstalować statyczną powłokę za pomocą kilku wbudowanych poleceń? Czy jest jakaś instrukcja?
Yves
1
Na Debianie lub Ubuntu: apt-get install sash. Ale możesz również pobrać sash-3.8.tar.gz i skompilować go.
Basile Starynkevitch
Trzymam liveiso na dysku twardym z niestandardowym wpisem grub dla takich problemów. Nie musisz się komplikować, wystarczy uruchomić system
operacyjny
3

Myślę, że najbezpieczniejszym sposobem jest ponowne uruchomienie przy użyciu systemu operacyjnego uruchamianego z dysku USB, CD lub DVD (Debian, Ubuntu, Suse itp.). Następnie zamontuj dysk zawierający problemy i zmień nazwę.

Bezpieczniejsze niż uruchamianie na polu minowym przy braku / usr lub / lib.

Larry
źródło
1
Możesz uruchomić ISO bezpośrednio z Grub / HDD, bez potrzeby korzystania z USB / DVD itp. Całkiem sprytne sztuczki Grub ma pętlę zwrotną.
FreeSoftwareServers
0

Wpadłem na podobny problem, gdzie przemianowano /usr/bindo /usr/bin_bkpjakiegoś testu, a potem nie był w stanie zmienić nazwę (jak komenda nie znaleźć sudow standardowym katalogu, który jest /usr/bin), a następnie udałem się do /usr/bin_bkpkatalogu ręcznie (za pomocą menedżera plików ) i większość funkcji (w tym zmiana nazwy) prawym przyciskiem myszy jest wyłączona.

Następnie wypróbowałem następujące polecenie i rozwiązało to problem

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

Przywołałem sudo z bieżącej ścieżki i zadziałało, teraz wszystko wróciło do normy.

System operacyjny: Xubuntu 14.04

maniak
źródło
-3

Nie mogę teraz tego wypróbować (i nie jestem pewien, czy chciałbym), ale wydaje się, że powinno się stworzyć nowe „/ usr” jako twardy link (nie miękki link) do twojego „ / usr_bak, a następnie usuń „/ usr_bak”

ln /usr_bak /usr
rm /usr_bak

Twardy link utworzony przez „ln” ( bez argumentu „-s”) w systemie plików powinien sprawić, że zarówno katalog usr, jak i usr_bak będą równie poprawne dla odnośnych katalogów. „rm” usuwa tylko jeden link, o który prosiłeś, aby go usunąć, a nie oba. Ponieważ nadal istnieje prawidłowy link do treści, powinny one pozostać dostępne poprzez pozostały link w „/ usr”.

PRZETRZĄSAĆ
źródło
5
Miałem wrażenie, że Linux (a przynajmniej Ubuntu) nie zezwala na twarde linki do katalogów. Np. Askubuntu.com/questions/210741/…
Chris Bouchard
4
@Chris: Tak, Linux nie zezwala na twarde linki do katalogów (poza .i .., więc liczba linków w katalogu informuje o liczbie katalogów pierwszego poziomu). Ponadto rmnie działa na katalogach, musisz użyć rmdir. ( lni rmpracujemy nad dowiązaniami symbolicznymi do katalogów, ale mówimy o prawdziwym katalogu). To również nie rozwiązuje problemu, ponieważ wymaga rootpodobnie mv, ze względu na uprawnienia na/ . Jeśli potrafisz to uruchomić, możesz mvzamiast tego biegać jak normalna osoba.
Peter Cordes,
2
Dowiązania twarde do katalogów nie są obsługiwane w większości (wszystkich?) Uniksów, ponieważ zbyt trudno jest programowi przeszukiwać system plików w celu wykrycia nieskończonych pętli. Jest to możliwe, jeśli oprogramowanie śledzi wszystkie odwiedzane i-węzły i przeszukuje system plików rozpoznający i-węzły (tj. Nie FAT32 / NTFS), ale sprawdzanie dowiązań symbolicznych i nie przechodzenie przez nie jest znacznie łatwiejsze. Wystarczy szybkie wywołanie lstat (2), aby sprawdzić typ pliku.
penguin359
2
@Pryftan, mój ln(1)na Debianie mówi to dla opcji -d/ -F/ --directory: „zezwól superużytkownikowi na próbę twardego łączenia katalogów (uwaga: prawdopodobnie nie powiedzie się z powodu ograniczeń systemowych, nawet dla superużytkownika)” . Więc możesz spróbować, ale twój system plików prawdopodobnie nie pozwala.
Toby Speight
1
@TobySpeight Inna myśl: patrz także dowiązanie symboliczne (7), które mówi: Twarde linki mogą nie odnosić się do katalogów (aby zapobiec możliwości powstawania pętli w drzewie systemu plików, co mogłoby wprowadzić w błąd wiele programów) i mogą nie odnosić się do plików w różnych systemach plików (ponieważ numery i-węzłów nie są unikalne we wszystkich systemach plików). To sprawia, że ​​myślę, że próba twardego połączenia może być sposobem na sformułowanie czegoś innego, co się dzieje, mianowicie, że funkcja jest wywoływana, ale kończy się niepowodzeniem, ponieważ jest to katalog. (Odniesienie do systemu plików jest tym, o czym myślałem w innym komentarzu)
Pryftan