Является ли это возможным?
Ну, большинство тривиальных и важных утилит установлены в /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
(что является рекомендуемым вариантом):
Вы можете получить копию этого скрипта или загрузить его напрямую .
Давайте начнем
корневой
Загрузите вашу систему с живого диска, который имеет ту же архитектуру, что и установленная вами Ubuntu, откройте терминал и получите root-доступ:
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
каталога? Какую оболочку мы должны запустить?
Так что создайте временный каталог bin. Например: имя bintmp
внутри вашей сломанной системы root:
mkdir /mnt/bintmp
Тогда связывай жизнь /bin
с этим:
mount --bind /bin /mnt/bintmp
Загрузите систему, установив в /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
эти дни? Так что все, что вам нужно сделать, это вернуть символическую ссылку обратно?