Назад | Перейти на главную страницу

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

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

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

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

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

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

Любая помощь приветствуется.

Вам нужно заменить / bin / sh на что-то; это ключ. Если вы можете войти в загрузчик FreeBSD во время запуска (с приглашением «ok»), попробуйте что-нибудь вроде этого:

set init_shell=/bin/csh
unset init_script
unset init_path

Я получил эту информацию от погрузчик (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.

Сделайте все три.

Хорошо, сначала лекция:

  1. НЕ ОБРАЩАЙТЕСЬ С СИСТЕМНЫМИ БИНАРЯМИ
    Что-нибудь в /bin, /sbin и /rescue на FreeBSD следует оставить в покое. Даже если вы знаете, что делаете (если вы знаете, что делаете, вы также знаете, что их следует оставить в покое. Они действительно важны - все!)

  2. НЕ Удалить /bin/sh. КОГДА-ЛИБО. На любой * Система NIX, в которой он есть.
    В самом деле. Не делай этого. А МНОГО сценариев полагаются на /bin/sh будучи Bourne Shell. Это разрушает вселенную.
    Если вы ДЕЙСТВИТЕЛЬНО хотите, вы можете смело заменить его на копировать из bash как предложил Адам З., но если вы собираетесь это сделать, вы можете статическая ссылка эта копия bash - Он включает множество библиотек, и у вас их может не быть, пока система не будет запущена и /usr/local установлен.


Теперь, как исправить беспорядок? Два варианта:

Вариант 1. Скорее болезненный
Направляйтесь к http://www.freesbie.org/ (или FreeBSD LiveCD по вашему выбору - вы, вероятно, даже можете использовать компакт-диск восстановления из http://www.freebsd.org для этого). Возьмите LiveCD, запишите его и загрузите.

Как только вы окажетесь в среде LiveCD, смонтируйте корневой раздел вашей заблокированной системы, скопируйте /bin/sh с LiveCD на вашу машину, затем перезагрузитесь.

это должен восстановить работу - вы можете следовать инструкциям для Восстановление «Мира», или хотя бы перекомпилировать /bin/sh из исходного дерева, которое соответствует вашей работающей системе.

Вариант 2: менее болезненный, без LiveCD
Если у вас есть еще одна коробка FreeBSD, вы можете от нее избавиться (или каким-то другим способом получить копию /bin/sh, переведите вашу машину FreeBSD в однопользовательский режим. Настройте сеть (или смонтируйте любой носитель, на котором есть заменяющая оболочка) и скопируйте его на место, где он должен быть.

Перезагрузитесь, и все будет в порядке - те же предостережения, что и LiveCD, хотя /bin/sh вы берете его не с практически идентичной машины.

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