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.