Це можливо?
Ну, більшість тривіальних і важливих утиліт встановлені в /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? Отже, все, що вам потрібно зробити, - це повернути симпосилання назад?