Как восстановить после удаления символической ссылки libc.so.6?

На нашем сервере символьная ссылка на libc.so.6 была удалена. Теперь ни один из двоичных файлов в системе не работает. Чтобы исправить это, я попытался:

/bin/ln -s /lib/libc-2.11.3.so /lib/libc.so.6

который, как и ожидалось, дает мне:

/bin/ln: error while loading shared libraries: libc.so.6: 
    cannot open shared object file: No such file or directory

Я также пробовал:

/lib/ld-linux-x86-64.so.2  --inhibit-rpath /lib/libc.so.6 \
   --library-path /lib/libc-2.11.3.so \
   /bin/ln -s /lib/libc-2.11.3.so /lib/libc.so.6

с тем же результатом. Дальнейшие неудачные попытки включают cp, mv, cat.

Я подключен через ssh, и я считаю, что после закрытия этого сеанса я не смогу открыть еще одну сессию. Есть ли способ исправить эту систему (возможно, с помощью bash встроенных модулей)?

[ edit] Я сделал:

while read line; do echo $line; done < /lib/libc-2.11.3.so > libc.so.6

чтобы скопировать файл и попытался с помощью:

/lib/ld-linux-x86-64.so.2  --inhibit-rpath libc.so.6 --library-path . \
  /bin/ln -s /lib/libc-2.11.3.so /lib/libc.so.6

и получил:

/bin/ln: error while loading shared libraries: ./libc.so.6: ELF file OS ABI invalid

Ответы

Ответ 1

Вы можете просто запустить ldconfig. Большинство дистрибутивов передают это как статический двоичный файл.

Ответ 2

Это помогло в моем случае (фактическая версия зависит от вашей библиотеки):

ldconfig -l -v /lib/libc-2.13.so

Ответ 3

Try:

LD_PRELOAD=/lib/libc-2.17.so ln -s /lib/libc-2.17.so /lib/libc.so.6

Примечание. Фактическая версия зависит от вашей библиотеки.

Ответ 4

Загрузитесь с помощью live cd, такого как Knoppix или что-то еще, и исправьте недостающее звено после установки диска с "сломанной" системой из работающей живой системы.

Ответ 5

Примечание: для 64 бит:

LD_PRELOAD=libc-2.13.so ln -s libc-2.13.so libc.so.6

Это сработало отлично для меня

Если вы не в этом каталоге, конечно, это будет что-то вроде:
LD_PRELOAD=/lib/x86_64-linux-gnu/libc-2.13.so ln -s /lib/x86_64-linux-gnu/libc-2.13.so /lib/x86_64-linux-gnu/libc.so.6

Ответ 6

Если вы уже делали команду ls и знаете, что такое версия libc,

ldconfig -l -v /lib64/libc-2.x.so

где x работает ваша версия. Обратите внимание, что это может быть lib64 или lib в зависимости от вашей версии.

Я просто сделал это, и это сработало.

Короче говоря, никогда не удаляйте ссылку. Плохая идея.

Ответ 7

Большое спасибо за ответ ниже. Это работало хорошо с root ID. Мы отсоединяем libc.so.6 для связи с более libc.so.6 версией, но внезапно после отсоединения libc.so.6 сервер перестает отвечать на запросы. ln -s не работала. Другие пользователи не смогли подключиться к серверу ssh. Но когда мы побежали ниже команды, это сработало. (с версией libc на сервере) сервер начал работать нормально.

Ниже приведена правильная команда и спасение жизни тоже....

LD_PRELOAD=/lib/libc-2.17.so ln -s /lib/libc-2.17.so /lib/libc.so.6

Примечание: фактическая версия зависит от вашей библиотеки

Ответ 8

Если вы используете Ubuntu, ldconfig не будет работать. Просто беги:

/sbin/ldconfig.real