Це можливо?
Ну, більшість тривіальних і важливих утиліт встановлені в /bin
, і тепер ви втратили доступ до всіх них. Насправді, якщо ви перезавантажитесь, ваша система більше не зможе завантажитися.
У будь-якому випадку ми вирішимо проблему та зробимо /bin
вміст якомога ближчим до того, де він був. Єдиною різницею були б деякі символічні посилання, які ми також виправити.
Як?
По-перше, ми повинні chroot
потрапити у вашу порушену систему, але з незначною різницею ! Після цього ми отримаємо список встановлених пакетів у вашій системі, у яких є будь-який встановлений файл у /bin
каталозі, тоді ми збираємось лише завантажити необхідні пакети та витягти потрібні файли в /bin
. Тоді ми закінчимо.
Наприклад, після chroot
, ми можемо отримати список пакетів, у яких встановлені файли за /bin
допомогою:
dpkg --search /bin | cut -f1 -d: | tr ',' '\n'
І ми також можемо використовувати:
dpkg --listfiles PACKAGE-NAME | grep "^/bin/" # or awk '$0 ~ "^/bin/
в списку встановлених файлів цими пакетами в /bin
.
Тоді ми просто створюємо список усіх необхідних нам пакетів, потім завантажуємо їх і витягуємо з ними /bin
щось на кшталт:
xargs apt download < list-packages
dpkg-deb -x PACKAGE .
mv ./bin/* /bin
Однак ми повинні використовувати скрипт, щоб перевірити всі встановлені пакети в нашій системі, тому що робити це вручну - просто безумство.
Тому я написав сценарій, який робить усе, що нам потрібно. Він знаходить усі необхідні нам пакети для відновлення /bin
, показує нам ім’я кожного пакету та пов'язані з ними файли, до яких належить /bin
. Ось скріншот:
Наприкінці ми вирішуємо перевстановити всі пакунки або лише завантажити та витягти потрібні файли /bin
(що є рекомендованою опцією):
Ви можете захопити копію цього сценарію або завантажити його безпосередньо .
Давайте розпочнемо
chroot
Завантажте свою систему живим диском, який має таку ж архітектуру, що і встановлений Ubuntu, відкрийте термінал і отримайте кореневий доступ:
sudo -i
Змонтуйте вашу root
файлову систему (для мене це /dev/sda1
):
mount /dev/sda1 /mnt
Нам знадобиться підключення до Інтернету, тому скопіюйте resolv.conf
з живого Ubuntu на встановлений кореневий розділ:
cp /etc/resolv.conf /mnt/etc/resolv.conf
Тепер скопіюйте скрипт кудись на змонтований розділ, наприклад:
cp /media/ubuntu/usb/restore-bin.sh /mnt/restore-bin.sh
або ви можете завантажити його за допомогою wget
тощо, наприклад:
wget https://git.io/v9fRm -O /mnt/restore-bin.sh
Монтувати інші необхідні шляхи:
mount --bind /dev /mnt/dev
mount --bind /sys /mnt/sys
mount -t proc /proc /mnt/proc
І ось незначна різниця : як ми chroot
можемо порушити систему, коли в ній немає /bin
каталогу? Яку оболонку потрібно запустити?
Тому створіть тимчасовий каталог бін. наприклад: названий bintmp
у вашому зламаному корені системи:
mkdir /mnt/bintmp
Потім прив’яжіть живий /bin
до цього:
mount --bind /bin /mnt/bintmp
Chroot в систему, встановлюючи /bintmp/bash
як свою оболонку для входу:
chroot /mnt /bintmp/bash
Експортуйте змінну /bintmp
як PATH
середовище:
export PATH=/bintmp:$PATH
Дайте сценарію виконуваного біта:
chmod +x restore-bin.sh
Запустіть сценарій:
./restore-bin.sh
Зачекайте, коли пошук завершиться, тоді відповідь на питання, яке ми побачили на скріншоті. Це почне відновити, /bin
і ми майже закінчили.
Після цього скористайтеся клавішею CTRL+, Dщоб вийти з chroot
оточення та відключіть змонтовані контури:
umount -R /mnt
Перезавантажте систему.
Відновлення посилань всередині /bin
Зараз майже всі файли в /bin
каталозі повернулися назад, за винятком приблизно 5 символічних посилань, якими керує update-alternatives
.
У вашій запущеній системі запустіть:
sudo update-alternatives --all
Це задає вам деякі питання; ви можете просто натиснути, ENTERщоб прийняти їх усіх.
І ось ми закінчили.
/bin
на сьогодні Ubuntu не є просто символьним посиланням/usr/bin
? Отже, все, що вам потрібно зробити, - це повернути симпосилання назад?