FreeBSD 8.2, удален /bin/sh, не загружается
Я принял действительно плохое решение на одном из моих серверов.
я удалил /bin/sh
, Я перезапустил сервер, и сервер не будет работать, потому что это нужно /bin/sh
запустить сценарии rc. Я не могу получить доступ к однопользовательскому режиму, потому что нужен sh.
Есть ли простой способ переустановить оболочку Bourn?
Я попытался скопировать sh с живого компакт-диска, это не удалось в библиотеке ld-elf.so.1. Поэтому я скопировал это в /libexec из live cd в мой раздел /. Затем ему нужна библиотека libedit.so, и я скопировал ее в /libexec, но на этот раз она не работает.
Я пробовал символическую ссылку на /usr/local/bin/bash
но это все еще дарит мне ошибку типа "не могу найти sh". Я предполагаю, что это потому, что /usr
еще не смонтирован, потому что сделан из скрипта rc.
Любая помощь очень ценится.
3 ответа
Вам нужно заменить / bin / sh чем-то; это ключ. Если вы можете войти в загрузчик FreeBSD во время запуска (с подсказкой "ok"), попробуйте что-то вроде этого:
set init_shell=/bin/csh
unset init_script
unset init_path
Я получил эту информацию от loader(8) со страниц руководства FreeBSD (онлайн). Я этого не делал, но он должен работать (при условии, что / bin / csh присутствует и исполняется).
Если у вас есть сервер FreeBSD 8.2, запущенный и работающий в другом месте, вы можете попробовать украсть / bin / sh из этого источника и поместить его в систему, где это необходимо.
В качестве альтернативы, получите статически построенный / bin / sh и вставьте его вместо этого; не будет никаких проблем с библиотекой со статически построенным двоичным файлом.
РЕДАКТИРОВАТЬ: я должен был заметить: если вы загрузитесь в / bin / csh, вам все равно придется получить что-то, чтобы использовать вместо / bin / sh. Вы можете получить его через Интернет или скопировать с другого компакт-диска, пакета или чего-то еще; использование / bin / csh для загрузки приводит вас к машине. Копирование по сети требует подключения к сети; в противном случае скопируйте с CDROM.
Лучшие способы избежать этого в будущем:
- Не удаляйте из / bin! (это самая легкая часть)
- Имейте статически построенный /bin/sh, не динамически связанный.
- Иметь резервную копию sh, например /bin/sh.static.
Делай все три.
ОК, первая лекция:
НЕ БУДЬТЕ С СИСТЕМАМИ
Что-нибудь в/bin
,/sbin
а также/rescue
на FreeBSD следует оставить в покое. Даже если вы знаете, что делаете (если вы знаете, что делаете, вы также знаете, что их следует оставить в покое. Они действительно важны - все они!)НЕ удаляйте
/bin/sh
, КОГДА-ЛИБО. В любой системе *NIX, которая имеет это.
В самом деле. Не делай этого. МНОГО сценариев полагаются на/bin/sh
быть Борн Шелл. Это ломает вселенную.
Если вы действительно хотите, вы можете смело заменить его на копиюbash
как предложил Адам Z, но если вы собираетесь это сделать, вы можете статически связать эту копиюbash
- Это тянет за собой много библиотек, и вы можете не иметь их, пока система не работает и/usr/local
установлен.
Теперь, как исправить беспорядок? Два варианта:
Вариант 1: несколько болезненный
Перейдите на http://www.freesbie.org/ (или на FreeBSD LiveCD по вашему выбору - для этого вы, вероятно, даже можете использовать компакт-диск восстановления с http://www.freebsd.org/). Возьмите LiveCD, запишите его и загрузите.
Как только вы попали в среду LiveCD, смонтируйте корневой раздел вашей системы, /bin/sh
с LiveCD на вашу машину, затем перезагрузите компьютер.
Это должно вернуть вас в рабочее состояние - вы можете следовать инструкциям по восстановлению "World" или, по крайней мере, перекомпилировать /bin/sh
из исходного дерева, которое соответствует вашей работающей системе, хотя.
Вариант 2: менее болезненный, нет LiveCD
Если у вас есть еще одна коробка FreeBSD, вы можете отключить ее (или каким-либо другим способом достать копию /bin/sh
Переведите вашу машину с FreeBSD в однопользовательский режим. Сконфигурируйте сеть (или смонтируйте любой носитель с оболочкой для замены) и скопируйте его на место, где он должен быть.
Перезагрузитесь, и вы должны быть в порядке - те же предостережения, что и на LiveCD, хотя, если /bin/sh
вы берете его не из машины, достаточно близкой к идентичной.
Вместо символической ссылки скопируйте bash
в /bin/sh
, Использовать ldd
Команда, чтобы найти любые библиотеки, которые могут находиться в файловых системах, отличных от rootfs, и скопировать их в rootfs.