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.

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


Также отличное решение «верните меня, чтобы я мог исправить это» (благодаря тому, что вам не нужно иметь 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вы берете его не с достаточно близкой к идентичной машине.


1
Использование / bin / bash из другого дистрибутива FreeBSD будет работать только в том случае, если разделяемые библиотеки имеют правильную версию. Лучше использовать то, что приходит непосредственно из FreeBSD 8.2 вместо альтернативной сборки. Однако любая система FreeBSD 8.x должна быть в состоянии обеспечить статически созданную оболочку, которая будет работать.
Мей

@ Давид Хороший вопрос - /binбольше не связан статически. Я думаю, что компакт-диски Rescue для соответствующего выпуска FreeBSD имеют удобную оболочку (то есть ту, которую можно просто сбросить на место), но я давно загрузил ее ...
voretaq7

4

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


1
Это хорошее решение, но оно делает библиотечный беспорядок, который потребует последующей очистки позже.
voretaq7

Да, очистка необходима позже. Одной из альтернатив будет использование статически созданного двоичного файла оболочки.
Адам Зальцман
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.