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:
dpkg --search /bin | cut -f1 -d: | tr ',' '\n'
I możemy również użyć:
dpkg --listfiles PACKAGE-NAME | grep "^/bin/" # or awk '$0 ~ "^/bin/
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:
xargs apt download < list-packages
dpkg-deb -x PACKAGE .
mv ./bin/* /bin
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:
sudo -i
Zamontuj swój root
system plików (dla mnie to /dev/sda1
):
mount /dev/sda1 /mnt
Będziemy potrzebować łączności z Internetem, więc skopiuj resolv.conf
z Live Ubuntu na zamontowaną partycję root:
cp /etc/resolv.conf /mnt/etc/resolv.conf
Teraz skopiuj skrypt gdzieś na zamontowanej partycji, np .:
cp /media/ubuntu/usb/restore-bin.sh /mnt/restore-bin.sh
lub możesz pobrać go za pomocą wget
itp., takich jak:
wget https://git.io/v9fRm -O /mnt/restore-bin.sh
Zamontuj inne niezbędne ścieżki:
mount --bind /dev /mnt/dev
mount --bind /sys /mnt/sys
mount -t proc /proc /mnt/proc
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:
mkdir /mnt/bintmp
Następnie połącz życie /bin
w to:
mount --bind /bin /mnt/bintmp
Chroot do systemu podczas ustawiania /bintmp/bash
jako powłoki logowania:
chroot /mnt /bintmp/bash
Wyeksportuj /bintmp
jako PATH
zmienną środowiskową:
export PATH=/bintmp:$PATH
Podaj skryptowi plik wykonywalny:
chmod +x restore-bin.sh
Uruchom skrypt:
./restore-bin.sh
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:
umount -R /mnt
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ądza update-alternatives
.
W uruchomionym systemie uruchom:
sudo update-alternatives --all
Zadaje ci kilka pytań; możesz po prostu nacisnąć, ENTERaby zaakceptować je wszystkie.
A teraz skończymy.
/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?