FreeBSD 8.2, удален / bin / sh, не загружается

8

Я принял действительно плохое решение на одном из моих серверов.

Я удалил /bin/sh. Я перезапустил сервер, и сервер не будет работать, потому что он должен /bin/shзапустить сценарии rc. Я не могу получить доступ к однопользовательскому режиму, потому что нужен sh.

Есть ли простой способ переустановить оболочку Bourn?

Я попытался скопировать sh из live cd, это не удалось в библиотеке ld-elf.so.1. Поэтому я скопировал это в / libexec из livecd в мой раздел /. Затем ему нужна библиотека libedit.so, и я скопировал ее в / libexec, но на этот раз она не работает.

Я попытался использовать символическую ссылку, /usr/local/bin/bashно это все еще дает мне ошибку типа «не могу найти sh». Я предполагаю, что это потому, что /usrеще не смонтирован, потому что это сделано из сценария rc.

Любая помощь очень ценится.

джон
источник
2
Боже мой Это не хорошо. Время вытянуть последнюю ленту.
MDMarra
Ваши проблемы с LiveCD, вероятно, вызваны тем, что это другая версия FreeBSD (или ваш LiveCD использует магический сжатый двоичный файл, который / bin / ABunchOfStuff жестко связан с разными именами). Какую версию FreeBSD вы используете?
voretaq7
версия herp-derp есть в названии. Не против меня Нужен кофе.
voretaq7
3
Итак ... хм ... что заставило тебя сделать это? Вы делаете это звучит так, как будто это было сделано намеренно.
user606723

Ответы:

8

Вам нужно заменить / 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.

Лучшие способы избежать этого в будущем:

  1. Не удаляйте из / bin! (это самая легкая часть)
  2. Имейте статически построенный / bin / sh, не динамически связанный.
  3. Иметь резервную копию sh, например /bin/sh.static.

Делай все три.

Mei
источник
Также отличное решение «верните меня, чтобы я мог исправить это» (благодаря тому, что вам не нужно иметь LiveCD для загрузки).
voretaq7
6

ОК, первая лекция:

  1. Не шутите с бинарники системы
    Чтонибудь в/bin,/sbinи/rescueна FreeBSD следует оставитьпокое. Даже если вы знаете, что делаете (если вы знаете, что делаете, вы также знаете, что их следует оставить в покое. Они действительно важны - все они!)

  2. НЕ удаляйте/bin/sh. КОГДА-ЛИБО. В любой системе * NIX, которая имеет это.
    В самом деле. Не делай этого. LOT сценариев полагаться на/bin/shбудучи Bourne Shell. Это ломает вселенную.
    Если вы действительно хотите, товероятноможет безопасно заменить его копию наbashкак Adam 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вы берете его не с достаточно близкой к идентичной машине.

voretaq7
источник
1
Использование / bin / bash из другого дистрибутива FreeBSD будет работать только в том случае, если разделяемые библиотеки имеют правильную версию. Лучше использовать то, что приходит непосредственно из FreeBSD 8.2 вместо альтернативной сборки. Однако любая система FreeBSD 8.x должна быть в состоянии обеспечить статически созданную оболочку, которая будет работать.
Мей
@ Давид Хороший вопрос - /binбольше не связан статически. Я думаю, что компакт-диски Rescue для соответствующего выпуска FreeBSD имеют удобную оболочку (то есть ту, которую можно просто сбросить на место), но я давно загрузил ее ...
voretaq7
4

Вместо символической ссылки скопируйте bashв /bin/sh. Используйте lddкоманду, чтобы найти любые библиотеки, которые могут находиться в файловых системах, отличных от rootfs, и скопировать их также в rootfs.

Адам Зальцман
источник
1
Это хорошее решение, но оно делает библиотечный беспорядок, который потребует последующей очистки позже.
voretaq7
Да, очистка необходима позже. Одной из альтернатив будет использование статически созданного двоичного файла оболочки.
Адам Зальцман