Случайно удален /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 не могу извлечь архивы. Мы можем пройти две трети пути, потому что:
.debфайлы на самом делеarархивы (снова в/usr/bin):ar x tar_*.debСостоящий из двух
.tar.*архивы,dataа такжеcontrol:$ echo *.tar.* control.tar.gz data.tar.xzПока утилиты 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
Заметки:
Мы не можем использовать 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("/")'- После возвращения
/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/*
