Я работал над каталогом с именем bin
. После того, как я закончил, из-за владения bin
и некоторых файлов в нем я случайно запустил:
sudo rm -r /bin
Вместо:
sudo rm -r bin
Кажется, мои руки добавляли /
перед всем, что я печатаю.
Как я могу восстановить мой /bin
каталог?
Мне нужны те же файлы, которые принадлежат моему Ubuntu, я не люблю копировать и вставлять их с живого диска или другой работающей системы.
command-line
restore
Ravexina
источник
источник
/bin
в Ubuntu не просто символическая ссылка на/usr/bin
эти дни? Так что все, что вам нужно сделать, это вернуть символическую ссылку обратно?/bin
это не символическая ссылка/usr/bin
, думаю, это будет противFHS
. Также, если мы проверим тривиальный пакет, какcoreutils
вzesty
(здесь) . мы можем видеть, что много вещей будет установлено/bin
рядом/usr/bin
, но все же это может быть ссылка, о которой я не знаю./bin
, я думал о том, что может случиться с кем-то еще (основываясь на другом вопросе, на который я ответил), затем я написал инструкцию, чтобы поделиться своими знаниями с другими :), хотя я ценю все комментарии, они также полезны для других людей, которые приходят, чтобы прочитать этот вопрос. Спасибо всем;)Ответы:
Является ли это возможным?
Ну, большинство тривиальных и важных утилит установлены в
/bin
, и теперь вы потеряли доступ ко всем из них. Фактически, если вы перезагрузите компьютер, ваша система больше не сможет загружаться.В любом случае, мы собираемся исправить проблему и сделать
/bin
содержимое как можно ближе к тому, где оно было. Единственным отличием будут некоторые символические ссылки, которые мы тоже исправим.Как?
Во-первых, мы должны
chroot
в вашу сломанную систему, но с небольшой разницей ! После этого мы получим список установленных пакетов в вашей системе, в которых есть какой-либо установленный файл в/bin
каталоге, затем мы будем только загружать необходимые пакеты и извлекать необходимые файлы в/bin
. Тогда мы будем готовы.Например, после
chroot
этого мы можем получить список пакетов, в которых установлены файлы при/bin
использовании:И мы также можем использовать:
перечислить установленные файлы этими пакетами в
/bin
.Затем мы просто создаем список всех пакетов, которые нам нужны, затем скачиваем их и распаковываем в
/bin
нечто вроде:Однако мы должны использовать скрипт для проверки всех установленных пакетов в нашей системе, потому что делать это вручную - просто безумие.
Поэтому я написал сценарий, который делает все, что нам нужно. Он находит все необходимые пакеты для восстановления
/bin
, показывает нам имя каждого пакета и связанные с ним файлы, к которым он принадлежит/bin
. Вот скриншот:В конце мы решили переустановить все пакеты или только загрузить и распаковать необходимые файлы
/bin
(что является рекомендуемым вариантом):Вы можете получить копию этого скрипта или загрузить его напрямую .
Давайте начнем
корневой
Загрузите вашу систему с живого диска, который имеет ту же архитектуру, что и установленная вами Ubuntu, откройте терминал и получите root-доступ:
Смонтируйте свою
root
файловую систему (для меня это/dev/sda1
):Нам понадобится подключение к Интернету, поэтому скопируйте
resolv.conf
из живого Ubuntu в ваш смонтированный корневой раздел:Теперь скопируйте скрипт куда-нибудь на смонтированный раздел, например:
или вы можете скачать его, используя
wget
, и т. д. как:Смонтировать другие необходимые пути:
И вот небольшая разница : как мы можем
chroot
сломать систему, если там нет/bin
каталога? Какую оболочку мы должны запустить?Так что создайте временный каталог bin. Например: имя
bintmp
внутри вашей сломанной системы root:Тогда связывай жизнь
/bin
с этим:Загрузите систему, установив в
/bintmp/bash
качестве оболочки для входа в систему:Экспортируйте
/bintmp
какPATH
переменную среды:Дайте скрипту исполняемый бит:
Запустите скрипт:
Дождитесь завершения поиска и ответьте на вопрос, который мы видели на скриншоте. Это начнет восстанавливать,
/bin
и мы почти закончили.После того, как это сделано, используйте CTRL+, Dчтобы выйти из
chroot
среды и размонтировать смонтированные пути:Перезагрузите систему.
Восстановление ссылок внутри
/bin
Теперь почти все файлы в
/bin
каталоге вернулись, за исключением около 5 символических ссылок, которыми управляетupdate-alternatives
.В вашей работающей системе запустите:
Он задает вам несколько вопросов; Вы можете просто нажать, ENTERчтобы принять их все.
И теперь мы закончили.
источник
Если ваша текущая система все еще имеет работающую оболочку и доступ к Интернету, это можно сделать с помощью инструментов, существующих в других местах системы. Я предполагаю, что вы только удалили
/bin
./bin
конечно, есть самая удобная утилита, которую вы могли бы использовать в такой ситуации (busybox), но без этого нам придется проявить немного творчества.Поскольку у вас уже есть работающая оболочка, и, поскольку
sudo
она/usr/bin
включена, давайте запустим работающую корневую оболочку, прежде чем мы нанесем дополнительный ущерб. Но/bin/bash
и большинство других оболочек ушли! К счастью, в Linux все еще есть копия оболочки, которую вы используете. Так:Строго говоря, нам не нужна корневая оболочка для большей части следующего. Но в любом случае.
Теперь
dpkg
все еще работает, по крайней мере, для определения, в каких пакетах есть файлы/bin
:Мы можем использовать его
awk
для обработки и получения имен пакетов,xargs
а такжеapt-get
для загрузки пакетов (все в/usr/bin
). Если у вас есть временный каталог, который вы можете использовать,cd
там, потому что ваш текущий каталог будет немного грязным:Теперь самая большая проблема, с которой мы сталкиваемся, - это
/bin/tar
отсутствие, и без негоdpkg
невозможно извлечь архивы. Мы можем пройти две трети пути, потому что:.deb
файлы на самом деле являютсяar
архивами (снова в/usr/bin
):Состоит из двух
.tar.*
архивовdata
иcontrol
:В то время как GZIP утилиты находятся в
/bin
,unxz
в/usr/bin
:Теперь у нас есть
data.tar
файл безtar
извлеченияtar
из него.Питон на помощь ! Вот где
sudo
действительно нужно:Теперь мы можем использовать
dpkg
для извлечения оставшихся файлов deb, чтобы получить достаточно полный/bin
:Тем не менее, мы все равно должны сделать правильную установку файлов deb, чтобы символические ссылки и т. Д., Которые создавались бы пакетами, создавались заново:
Или же:
Примечания:
Мы не можем использовать Python 2 для непосредственного извлечения
data.tar.xz
файла, так как Python 2 поддерживает только сжатие gzip и bzip2. Python 3, однако, поддерживает его, поэтому вы можете использовать Python 3 напрямую безunxz
:/bin/tar
вам по-прежнему необходимо извлечь некоторые файлы deb, прежде чем вы сможете их использоватьapt-get
: оболочки, coreutils и т. Д. Проще просто извлечь их все и переустановить позже.источник
/usr/bin
, я сказал, что я иду с chroot ... Удивительно./proc/$$/exe
ссылка на/bin/bash
? как это работает при/bin
удалении? (Это работает, но как), я подумал, что это должна быть неработающая ссылка ... вот почему я оставил эту идею позади.Вы можете временно поместить файлы с живого компакт-диска или другой системы в свою,
/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/*
источник