unix - случайно переместил все под root в / old - Solaris 10

13

Как гласит заголовок, все или почти все, что важно, поскольку root под root (/) был перемещен в / old на машине с Solaris 10. Так что теперь типичная ошибка при попытке при выполнении команды Cannot find /usr/lib/ld.so.1(изменено , $PATHа также попытались изменить $LD_LIBRARY_PATH, $LD_LIBRARY_PATH_64и $LD_RUN_PATHи экспортировать их , но ничего из этого не кажется , чтобы изменить реальный путь к библиотеке). Вчера довольно много пытался найти что-то, что могло бы помочь, но не нашел ничего, что фактически изменило бы путь к библиотеке для Solaris 10, кроме, может быть, crleно с тех пор не может его запустить Cannot find /usr/lib/ld.so.1.

Нашел много советов по восстановлению root или / usr / bin и т. Д. Для Linux, но информация о том, что касается Solaris 10 / Unix, не распространена и очень скудна.

Не удается запустить cp, ln, mkdirили с mvтех пор Cannot find /usr/lib/ld.so.1. Невозможно войти в систему с другими сеансами на машине. Хотя один сеанс все еще работает, который можно использовать, и это окно останавливается while true; do date; echo hej 1234567; done. Мы обсудили решение использовать загрузочный компакт-диск Solaris, а также дистрибутив Linux на USB-накопителе. Мы обсудили решение для переключения жестких дисков на другую стойку.

/.../static/.../mvРешение было проверено , но это не сработало.

Команды , которые все еще могут быть использованы (там могут быть несколько команд , которые могут быть использованы): echo, <, >, >>, |, pwd, cd.

Есть ли способ создать каталог или папку без mkdir? Есть ли способ использовать echoи >или echoи >>восстановить /usr/lib/ld.so.1? Я знаю, что больше, чем /usr/lib/ld.so.1, вероятно, нужно будет восстановить, чтобы команды работали.

Большое спасибо за чтение и хорошего дня =)

propatience
источник
2
Какая команда использовалась для перемещения вещей в / old?
Schaiba
Солярис стандарт mv. Или точнее: shopt -s extglob; mv !(old) /old.
терпение
1
Какая оболочка работает в данный момент? в некоторых оболочках есть встроенные команды
Ferrybig
Вы можете это исправить ln, если это работает.
Дэвид Шварц
2
«Решение /.../static/.../mv было протестировано, но оно не сработало». Что произошло? Это дало ошибку загрузчика? Что именно "не сработало"? Двоичные файлы staticпредназначены именно для этой категории проблем, если вы не хотите загружать временные носители.
Ti Strga

Ответы:

19

Если у вас больше нет оболочки, работающей от имени пользователя root, вам придется перезагрузиться на загрузочный носитель. Все будет делать, пока оно способно монтировать корневую файловую систему для чтения-записи.

Если вы все еще можете запускать команды с правами root, все в порядке. Задайте для переменной среды LD_LIBRARY_PATHуказатели на каталоги, содержащие библиотеки, используемые основными системными инструментами. Это по крайней мере /usr/libна 32-битном Solaris, /usr/lib/64на 64-битном Solaris, возможно, в других каталогах (сейчас у меня нет доступа к Solaris 10 для проверки). Чтобы запустить исполняемый файл, добавьте к нему префикс компоновщика : /usr/lib/ld.so.1(для 32-разрядного исполняемого файла) или /usr/lib/64/ld.so.1(для 64-разрядного исполняемого файла) - теперь перемещен в /old. Таким образом, вы сможете восстановить что-то вроде:

LD_LIBRARY_PATH=/old/usr/lib
export LD_LIBRARY_PATH
/old/usr/lib/ld.so.1 /old/usr/bin/mv /old/* /
Жиль "ТАК - прекрати быть злым"
источник
Умное использование загрузчика. Если вся иерархия не была перенесена /old, мой комментарий к собственному комментарию Пешке и здесь действителен. mvне должна использоваться, но команда, которая сохраняет существующую иерархию, как pax, tarи любит.
jlliagre
1
Большое спасибо за ваше терпение и за то, что нашли время написать это. Он работает в настоящее время выполнения команд , как /old/usr/lib/ld.so.1 /old/usr/bin/mvи /old/usr/lib/ld.so.1 /old/usr/bin/cpи так далее. Я посмотрю, что я могу сделать, теперь проблема в том, что мне не хватает места, но я мог бы это исправить.
терпение
@propatience Жаль, что ты и Жиль не
учли
1
Yay БОГ! Мне удалось переместить обратно все с первым /old/usr/lib/ld.so.1 /old/usr/bin/mvи , /old/usr/lib/ld.so.1 /old/usr/bin/cpно нет места , так не могло использовать /old/usr/lib/ld.so.1 /old/usr/bin/cp. А затем редактирование, $PATHа затем папку за папкой, используя mvс измененным $PATH. Теперь все перемещено назад, поэтому я могу снова войти в систему и набрать df -h и все. Большое спасибо всем. Действительно, большое спасибо тебе, Жиль! Спасибо StackExchange!
терпение
1
Установка LD_LIBRARY_PATHв Solaris сопряжена с некоторыми опасностями, если вам нужно установить ее, чтобы вы могли запускать как 32-, так и 64-битные исполняемые файлы. Было бы лучше использовать 32- и 64-битные версии LD_LIBRARY_PATH, доступные в Solaris. В этом случае: LD_LIBRARY_PATH_32=/old/usr/libи LD_LIBRARY_PATH_64=/old/usr/lib/64. См.ld.so.1 Справочную страницу : «Каждая переменная среды может быть указана с суффиксом _32 или _64. Это делает переменную среды специфичной, соответственно, для 32-битных или 64-битных процессов».
Эндрю Хенле
16

Невозможно создать каталог или скопировать двоичные файлы, используя только встроенные команды оболочки (хотя Жиль описывает в своем ответе умный потенциальный обходной путь ).

Лучший вариант - загрузить Solaris на внешнем носителе (dvd, usb-флешка), смонтировать или импортировать файловую систему (-ы) и исправить ситуацию следующим образом:

  • Загрузите установочный диск Solaris и выберите запуск оболочки.

  • Смонтируйте старый корень (и все другие файловые системы, если таковые имеются) в некотором каталоге, например /mntили /a. Загрузочный диск Solaris может помочь вам сделать это при обнаружении существующих файловых систем.

  • верните файлы в их исходное местоположение с помощью этой команды (при условии, что все смонтировано под /mnt):

    cd /mnt/old
    find . -depth | cpio -pdlmPV@ /mnt
    
  • Перезагрузите вашу систему

    init 6
    

Если вы используете ZFS и существует недавний моментальный снимок, резервное копирование /oldкаталога в другом месте, а затем возврат к последнему моментальному снимку также может быть вариантом.

jlliagre
источник
Отличный ответ. Ботинок в спасательной USB, смонтировать файловую систему, а затем сделать что - то вродеmv /mountpoint/old/* /mountpoint
Пешке
1
@Peschke Спасибо, хотя слепое выполнение предложенной вами mvкоманды не было бы моим советом. ОП написала «все или почти все ». Во втором случае переезд сломает все еще существующие каталоги. Скорее всего, я использую утилиту, например tar, paxили cpioдля сохранения иерархии целевого каталога.
jlliagre
Большое спасибо за быстрый ответ и большое спасибо за ваши ответы. Я мог бы попробовать это завтра.
терпение
Привязанный к возможному снимку (ZFS или UFS), вы можете загрузить альтернативную версию BE, если вы используете живое обновление. lustatus И пока не паникуйте. Все данные все еще существуют на диске (ах).
Sleyweasel
0

Solaris включает в себя статические сборки основных коммунальных услуг ( cp, ln, mv, rcp, и tar) в /usr/sbin/staticтом , что вы можете использовать , чтобы восстановить любую проблему с наличием того, /usr/lib/ld.so.1что предотвращает использование регулярных динамически связанных /usr/binверсий.

Статических данных не mkdirпредусмотрено, но вы можете использовать статические lnдля символической ссылки на любой каталог, lib/ld.so.1который /usrвременно находится на месте , а затем использовать стандарт mkdirдля создания любых необходимых вам каталогов. Вы можете переименовать каталоги, которые уже существуют, используя статические mv.

rakslice
источник
Это относится, по крайней мере, к Solaris 2.5.1, где я обнаружил, что фондовый ld.so.1сегмент не работает, если вы попытаетесь запустить его вручную, как показано в примере Жиля
rakslice