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 chrootwejść 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 /binkatalogu, a następnie pobierzemy tylko potrzebne pakiety i wyodrębnimy niezbędne pliki /bin. Wtedy skończymy.
Na przykład później chrootmożemy uzyskać listę pakietów, które mają zainstalowane pliki przy /binuż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 /binpomocą 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 rootsystem plików (dla mnie to /dev/sda1):
mount /dev/sda1 /mnt
Będziemy potrzebować łączności z Internetem, więc skopiuj resolv.confz 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ą wgetitp., 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 chrootprzejść do uszkodzonego systemu, gdy nie ma /binw nim katalogu? Którą powłokę powinniśmy uruchomić?
Utwórz tymczasowy katalog bin. np .: nazwa bintmpw obrębie uszkodzonego katalogu głównego systemu:
mkdir /mnt/bintmp
Następnie połącz życie /binw to:
mount --bind /bin /mnt/bintmp
Chroot do systemu podczas ustawiania /bintmp/bashjako powłoki logowania:
chroot /mnt /bintmp/bash
Wyeksportuj /bintmpjako PATHzmienną ś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ć /bini 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 /binkatalogu 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.
/binna Ubuntu nie ma tylko dowiązania symbolicznego do/usr/bintych dni? Więc wszystko, co musisz zrobić, to odłożyć link symboliczny z powrotem?