Случайно удален /bin. Как мне его восстановить?

Я работал над каталогом с именем bin, После того, как я был закончен, из-за собственности на bin и некоторые файлы внутри него я случайно запустил:

sudo rm -r /bin

Вместо:

sudo rm -r bin

Кажется, мои руки добавляли / перед всем, что я печатаю.

Как я могу восстановить свой /bin каталог?

Мне нужны те же файлы, которые принадлежат моему Ubuntu, я не люблю копировать и вставлять их с живого диска или другой работающей системы.

4 ответа

Решение

Является ли это возможным?

Ну, самые тривиальные и важные утилиты установлены в /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, /bin конечно, есть самая удобная утилита, которую вы могли бы использовать в такой ситуации (busybox), но без этого нам придется проявить немного творчества.


Так как у вас уже есть запущенная оболочка, а так как sudo в /usr/binдавайте запустим работающую корневую оболочку, прежде чем наносить дальнейший ущерб. Но /bin/bash и большинство других снарядов ушли! К счастью, в Linux все еще есть копия оболочки, которую вы используете. Так:

sudo /proc/$$/exe

Строго говоря, нам не нужна корневая оболочка для большей части следующего. Но в любом случае.

Сейчас, dpkg по-прежнему работает, по крайней мере, для определения, какие пакеты имеют файлы в /bin:

dpkg -S /bin

Мы можем использовать awk обработать его и получить имена пакетов, и xargs а также apt-get скачать пакеты (все в /usr/bin). Если у вас есть временный каталог, который вы можете использовать, cd там, потому что ваш текущий каталог будет немного грязным:

dpkg -S /bin | awk -F '[, :]' '{NF--}1' | xargs apt-get download

Теперь самая большая проблема у нас заключается в том, что /bin/tar отсутствует, и без него, dpkg не могу извлечь архивы. Мы можем пройти две трети пути, потому что:

  1. .deb файлы на самом деле ar архивы (снова в /usr/bin):

    ar x tar_*.deb
    
  2. Состоящий из двух .tar.* архивы, data а также control:

    $ echo *.tar.*
    control.tar.gz data.tar.xz
    
  3. Пока утилиты gzip находятся в /bin, unxz в /usr/bin:

    unxz data.tar.xz
    

Теперь у нас есть data.tar файл без tar извлекать tar от него.

Питон на помощь! Это где sudo действительно нужно:

$ sudo python -c 'import tarfile; tarfile.open("data.tar").extractall("/")'
$ echo /bin/*
/bin/tar

Теперь мы можем использовать dpkg извлечь оставшиеся файлы deb, чтобы получить достаточно полный /bin:

for i in *.deb; do dpkg-deb -x "$i" /; done

Тем не менее, мы все равно должны сделать правильную установку файлов deb, чтобы символические ссылки и т. Д., Которые создавались бы пакетами, создавались заново:

sudo apt install --reinstall ./*.deb

Или же:

sudo dpkg -i *.deb
sudo apt-get install -f

Заметки:

  1. Мы не можем использовать Python 2 для непосредственного извлечения data.tar.xz файл, так как Python 2 поддерживает только сжатие gzip и bzip2. Python 3, однако, поддерживает его, поэтому вы можете использовать Python 3 напрямую без unxz:

    sudo python3 -c 'import tarfile; tarfile.open("data.tar.xz").extractall("/")'
    
  2. После возвращения /bin/tarВам все еще нужно извлечь некоторые файлы deb, прежде чем вы сможете использовать apt-get: оболочки, coreutils и т. д. Проще просто извлечь их все и переустановить позже.

Вы можете временно поместить файлы с live CD или другой системы в ваш /bin чтобы сделать вашу систему работоспособной, замените их файлами из вашей установки Ubuntu, запустив apt-get install --reinstall для пакетов, в которых есть вещи /bin,

Некоторые дополнения к этому отличному ответу после того, как я столкнулся с этой проблемой (наряду с удалением /boot, /etc, /lib а также /lib64):

  • chroot требует /lib а также /lib64 присутствовать; в противном случае вы получите следующую ошибку:
    failed to run command ‘/bin/bash’: No such file or directory
    Я скопировал их из ОС LiveCD, и у меня не возникло проблем с восстановлением. YMMV в зависимости от установленных вами пакетов в системе
  • Я не могу отредактировать ответ, указанный выше, но есть опечатка:
    cp /etc/resolv.conf /mnt/etc/resolv.cof
    должно быть
    cp /etc/resolv.conf /mnt/etc/resolv.conf
  • /boot может быть легко восстановлен с помощью инструментов Grub. Смотрите здесь
  • Поскольку этот ответ рекомендует, apt install --reinstall <package> отличный способ восстановить отсутствующие файлы в /bin, /lib а также /lib64,
    • Некоторые пакеты, требующие переустановки: libaio1, mysql-server, openvpn, vsftpd

Примечание для себя:
rm -rf folder /* это не то же самое, что rm -rf folder/*

Другие вопросы по тегам