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

89

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

sudo rm -r /bin

Вместо:

sudo rm -r bin

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

Как восстановить каталог /bin ?

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

    
задан Ravexina 19.04.2017 в 17:02
источник

4 ответа

177

Возможно ли это?

Ну, самые тривиальные и важные утилиты установлены в /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.cof

Теперь скопируйте сценарий где-нибудь на смонтированном разделе, например:

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. например: named bintmp в сломанном системном корне:

mkdir /mnt/bintmp

Затем привяжите live /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 , чтобы принять их все.

И теперь мы закончили.

    
ответ дан Ravexina 19.04.2017 в 17:02
источник
26

Если ваша текущая система по-прежнему имеет рабочую оболочку и доступ в Интернет, это можно сделать с помощью инструментов, существующих в других местах системы. Я предполагаю, что вы удалили только /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. % файлов co_de% на самом деле .deb архивов (опять в ar ):

    ar x tar_*.deb
    
  2. Состоит из двух% архивов co_de%, /usr/bin и .tar.* :

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

    unxz data.tar.xz
    

Теперь у нас есть файл unxz без /usr/bin , чтобы извлечь из него data.tar .

Python для спасения ! Здесь действительно требуется tar :

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

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

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 для непосредственного извлечения файла dpkg , поскольку Python 2 поддерживает только сжатие gzip и bzip2. Однако Python 3 поддерживает его, поэтому вы можете напрямую использовать Python 3 без /bin :

    sudo python3 -c 'import tarfile; tarfile.open("data.tar.xz").extractall("/")'
    
  2. После возврата data.tar.xz вам все равно нужно извлечь некоторые из файлов deb, прежде чем вы сможете использовать unxz : оболочки, coreutils и т. д. Легче просто извлечь все из них и переустановить позже.
ответ дан muru 19.04.2017 в 17:49
7

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

    
ответ дан Dmitry Grigoryev 20.04.2017 в 13:21
0

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

  • chroot требует наличия /lib и /lib64 ; в противном случае вы получите следующую ошибку:
    failed to run command ‘/bin/bash’: No such file or directory
    Я скопировал их с LiveCD OS и не испытывал никаких проблем при восстановлении. 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/*

    
ответ дан mrtumnus 05.07.2018 в 16:29