Pracowałem nad katalogiem o nazwie bin
. Po skończeniu, z powodu własności bin
i niektórych plików, przypadkowo uruchomiłem:
sudo rm -r /bin
Zamiast:
sudo rm -r bin
Wygląda na to, że moje ręce dodawały /
przed wszystkim, co piszę.
Jak mogę przywrócić mój /bin
katalog?
Chcę tych samych plików, które należą do mojego Ubuntu, nie lubię kopiować i wklejać ich z dysku na żywo lub innego działającego systemu.
command-line
restore
Ravexina
źródło
źródło
/bin
na Ubuntu nie ma tylko dowiązania symbolicznego do/usr/bin
tych dni? Więc wszystko, co musisz zrobić, to odłożyć link symboliczny z powrotem?/bin
nie jest to symboliczny link do/usr/bin
tutaj, myślę, że byłoby to sprzeczne zFHS
. także jeśli sprawdzimy trywialny pakiet jakcoreutils
wzesty
(tutaj) . możemy zobaczyć, że wiele rzeczy zostanie zainstalowanych/bin
obok/usr/bin
, ale wciąż może to być link, nie jestem tego świadomy./bin
, rozważałem coś, co może się przydarzyć każdemu innemu (na podstawie innego pytania, na które odpowiedziałem), Potem napisałem instrukcję, aby podzielić się moją wiedzą z innymi :), choć doceniam wszystkie komentarze, są one również pomocne dla innych osób, które przychodzą przeczytać to pytanie. Dziękuję wszystkim;)Odpowiedzi:
Czy to możliwe?
Cóż, większość trywialnych i ważnych narzędzi jest zainstalowanych
/bin
, a teraz straciłeś dostęp do wszystkich z nich. W rzeczywistości, jeśli zrestartujesz komputer, twój system nie będzie mógł się ponownie uruchomić.W każdym razie zamierzamy naprawić problem i sprawić
/bin
, by zawartość była jak najbliżej miejsca, w którym się znajdowała. Jedyną różnicą byłyby niektóre dowiązania symboliczne, które również naprawimy.W jaki sposób?
Po pierwsze, powinniśmy
chroot
wejść w twój zepsuty system, ale z niewielką różnicą ! Następnie otrzymamy listę zainstalowanych pakietów w twoim systemie, które mają dowolny zainstalowany plik w/bin
katalogu, a następnie pobierzemy tylko potrzebne pakiety i wyodrębnimy niezbędne pliki/bin
. Wtedy skończymy.Na przykład później
chroot
możemy uzyskać listę pakietów, które mają zainstalowane pliki przy/bin
użyciu:I możemy również użyć:
aby wyświetlić listę zainstalowanych plików według tych pakietów w
/bin
.Następnie po prostu tworzymy listę wszystkich pakietów, które są nam potrzebne, a następnie pobieramy je i rozpakowujemy za
/bin
pomocą czegoś takiego:Musimy jednak użyć skryptu, aby sprawdzić wszystkie zainstalowane pakiety w naszym systemie, ponieważ robienie tego ręcznie jest po prostu szaleństwem.
Napisałem więc skrypt, który robi wszystko, czego potrzebujemy. Znajduje wszystkie niezbędne pakiety do przywrócenia
/bin
, pokazuje nam nazwę każdego pakietu i powiązanych z nim plików, które należą/bin
. Oto zrzut ekranu:Na koniec decydujemy się na ponowną instalację wszystkich pakietów lub pobranie i wyodrębnienie niezbędnych plików
/bin
(co jest zalecaną opcją):Możesz pobrać kopię tego skryptu lub pobrać go bezpośrednio .
Zaczynajmy
chroot
Uruchom system z dysku na żywo, który ma taką samą architekturę jak zainstalowany Ubuntu, otwórz terminal i uzyskaj dostęp do roota:
Zamontuj swój
root
system plików (dla mnie to/dev/sda1
):Będziemy potrzebować łączności z Internetem, więc skopiuj
resolv.conf
z Live Ubuntu na zamontowaną partycję root:Teraz skopiuj skrypt gdzieś na zamontowanej partycji, np .:
lub możesz pobrać go za pomocą
wget
itp., takich jak:Zamontuj inne niezbędne ścieżki:
A oto drobna różnica : jak możemy
chroot
przejść do uszkodzonego systemu, gdy nie ma/bin
w nim katalogu? Którą powłokę powinniśmy uruchomić?Utwórz tymczasowy katalog bin. np .: nazwa
bintmp
w obrębie uszkodzonego katalogu głównego systemu:Następnie połącz życie
/bin
w to:Chroot do systemu podczas ustawiania
/bintmp/bash
jako powłoki logowania:Wyeksportuj
/bintmp
jakoPATH
zmienną środowiskową:Podaj skryptowi plik wykonywalny:
Uruchom skrypt:
Poczekaj na zakończenie wyszukiwania, a następnie odpowiedz na pytanie, które widzieliśmy na zrzucie ekranu. Zacznie się przywracać
/bin
i już prawie skończyliśmy.Po zakończeniu użyj CTRL+, Daby wyjść ze
chroot
środowiska i odmontować zamontowane ścieżki:Uruchom ponownie system.
Przywracanie linków w ramach
/bin
Teraz prawie wszystkie pliki w
/bin
katalogu są z powrotem, z wyjątkiem około 5 dowiązań symbolicznych, którymi zarządzaupdate-alternatives
.W uruchomionym systemie uruchom:
Zadaje ci kilka pytań; możesz po prostu nacisnąć, ENTERaby zaakceptować je wszystkie.
A teraz skończymy.
źródło
Jeśli twój obecny system nadal ma działającą powłokę i dostęp do Internetu, można to zrobić za pomocą narzędzi istniejących gdzie indziej w systemie. Zakładam, że tylko usunąłeś
/bin
./bin
oczywiście ma najwygodniejsze narzędzie, którego można użyć w takiej sytuacji (busybox), ale bez tego będziemy musieli się trochę kreatywnie.Ponieważ masz już działającą powłokę, a ponieważ
sudo
jest w/usr/bin
środku, zdobądźmy działającą powłokę root, zanim wyrządzimy dalsze szkody. Ale/bin/bash
i większość innych pocisków zniknęła! Na szczęście Linux wciąż ma w pamięci kopię używanej powłoki. Więc:Ściśle mówiąc, nie potrzebujemy powłoki roota do większości następujących rzeczy. Ale w każdym razie.
Teraz
dpkg
nadal działa, przynajmniej do wyszukiwania pakietów, w których znajdują się pliki/bin
:Możemy użyć go
awk
do przetworzenia go i uzyskania nazw pakietówxargs
orazapt-get
do pobrania pakietów (wszystko w/usr/bin
). Jeśli masz katalog tymczasowy, którego możesz użyćcd
, ponieważ w twoim bieżącym katalogu będzie trochę bałagan:Teraz największym problemem jest to, że go
/bin/tar
brakuje, a bez niegodpkg
nie można wyodrębnić archiwów. Możemy tam dostać dwie trzecie, ponieważ:.deb
pliki są w rzeczywistościar
archiwami (ponownie w/usr/bin
):Składa się z dwóch
.tar.*
archiwówdata
icontrol
:Podczas gdy narzędzia gzip są włączone
/bin
,unxz
znajduje się w/usr/bin
:Teraz mamy
data.tar
plik, z którego można gotar
wyodrębnićtar
.Python na ratunek ! Oto, gdzie
sudo
jest to naprawdę potrzebne:Teraz możemy użyć
dpkg
do wyodrębnienia pozostałych plików deb, aby uzyskać racjonalnie ukończone/bin
:Powinniśmy jednak nadal poprawnie instalować pliki deb, aby dowiązania symboliczne itp., Które byłyby tworzone przez pakiety, były ponownie tworzone:
Lub:
Uwagi:
Nie możemy użyć Pythona 2 do bezpośredniego wyodrębnienia
data.tar.xz
pliku, ponieważ Python 2 obsługuje tylko kompresję gzip i bzip2. Jednak Python 3 obsługuje go, więc możesz używać Python 3 bezpośrednio bezunxz
:/bin/tar
nadal musisz wyodrębnić niektóre pliki deb, zanim będziesz mógł ich użyćapt-get
: powłoki, coreutils itp. Łatwiej jest po prostu wyodrębnić je wszystkie i zainstalować ponownie później.źródło
/usr/bin
, powiedziałem cokolwiek pójdę z chroot ... Niesamowite./proc/$$/exe
jest link do/bin/bash
? jak to działa po/bin
usunięciu? (Działa, ale jak), pomyślałem, że powinien to być zepsuty link ... dlatego zostawiłem ten pomysł za sobą.Możesz tymczasowo umieścić pliki z płyty CD na żywo lub innego systemu w swoim
/bin
systemie, aby system był użyteczny, a następnie zastąpić je plikami z instalacji Ubuntu, uruchamiającapt-get install --reinstall
pakiety, które mają coś w sobie/bin
.źródło
Niektóre dodatki do tego doskonałą odpowiedź , po I napotkał ten problem (wraz z usunięciem
/boot
,/etc
,/lib
i/lib64
):chroot
wymaga/lib
i/lib64
musi być obecny; w przeciwnym razie pojawi się następujący błąd:failed to run command ‘/bin/bash’: No such file or directory
Skopiowałem je z LiveCD OS i nie miałem problemów z przywróceniem. YMMV w zależności od pakietów zainstalowanych w systemie
cp /etc/resolv.conf /mnt/etc/resolv.cof
powinna być
cp /etc/resolv.conf /mnt/etc/resolv.conf
/boot
można go łatwo przywrócić za pomocą narzędzi grub. Zobacz tutaj .apt install --reinstall <package>
jest to świetny sposób, aby przywrócić brakujące pliki/bin
,/lib
a/lib64
.libaio1
,mysql-server
,openvpn
,vsftpd
Uwaga do siebie:
rm -rf folder /*
to nie to samo corm -rf folder/*
źródło