Здравствуйте, хабрачитатели.
Одним трудным вечером на работе при установке новых пакетов на сервере под Ubuntu вдруг появилось сообщение, что зависимости порушились, версия libc6 мол не та. Автоматическое исправление зависимостей предлагало снести половину системы, что меня естественно не устраивало. Я для себя решил, что удалю этот libc6, поставлю нужную версию и все будет хорошо.
Простым sudo apt-get remove libc6
ничего удалить не вышло, поэтому я применил sudo dpkg --remove --force-all libc6
, но вылезла какая-то ошибка. После этой ошибки я уже ничего не мог сделать (ls
, dir
, sudo
и прочие команды были не найдены, работала только cd
). Тогда в моей душе закрались подозрения, что я сделал что-то ужасное, особенно, когда прочитал 24 пункт этой статьи.
Кому интересно как накладывался гипс, прошу под кат.
Гугление привело меня к статье в Википедии, в которой говорится, что libc6 является библиотекой C, которая обеспечивает системные вызовы и основные функции, такие как open, malloc, printf и т.д., а также используется для всех динамически скомпонованых программ. После этого сразу стало ясно почему не работает большинство команд. К счастью, все уже запущенные сервисы сервера работали, поэтому все сотрудники предприятия спокойно продолжали свою работу в нормальном режиме. Было понятно, что если сервер будет выключен, то система просто не загрузится (любят у нас уборщицы вилки из розеток вытаскивать и блоки питания от коммутаторов), да и работал я через ssh, сессию продублировать не получалось, поэтому и разрыв сетевого соединения был бы крахом.
До конца рабочего дня мне так и не удалось найти решение проблемы, поэтому придя домой, я взял свой старый ноутбук и накатил на него ту же систему (Ubuntu Server 12.04), снова удалил libc6 и принялся яростно разбираться.
Во время своих поисков я выяснил, что достаточно, чтобы библиотеки лежали на своих местах, осталось разобраться где их взять и как закинуть. В Ubuntu по умолчанию идет команда static-sh
, которая запускает BusyBox, который мог бы помочь, но в моем случае сеанс ssh был не под root, а команда sudo не работала.
Ничего не поделать, сделал загрузочную флешку с Ubuntu, и загрузил ноутбук с нее.
Просмотрел все жесткие диски и подмонтировал диск с системой:
fdisk -l
mount /dev/hda1 /mnt/
Так получилось обрести доступ к файлам убитой системы. После этого потребовались сами файлы библиотеки, благо deb-пакет легко разыскивается тут (нужно не забыть выбрать именно свой выпуск операционной системы).
Я перешел в папку tmp, скачал туда пакет (соблюдая разрядность системы), распаковал его и засунул полученные файлы по их местам
cd /mnt/tmp
wget http://security.ubuntu.com/ubuntu/pool/main/e/eglibc/libc6_2.15-0ubuntu10.5_amd64.deb
dpkg -x libc6_2.15-0ubuntu10.5_amd64.deb libc6_files
cp -R libc6_files/* /
Перезагрузив систему, я вздохнул с облегчением, теперь она запускалась.
Повторив эти действия на сервере, я опять столкнулся с порушенными зависимостями. Но я то знал, что я распаковал нужную версию, но как это объяснить системе? Пытался найти какие-нибудь файлы, в которых прописано какие пакеты установлены и какой версии, чтобы их отредактировать самому, но так их и не нашел (если такие есть, расскажите о них, пожалуйста).
Попробовал установить недавно загруженный пакет снова, на что получил:
A copy of the C library was found in an unexpected directory:
'/lib/x86_64-linux-gnu/libc-2.15.so'
It is not safe to upgrade the C library in this situation;
please remove that copy of the C library or get it out of
'/lib/x86_64-linux-gnu' and try again.
Пришлось идти напролом: пересобрать пакет, подправив проверки.
# Распаковываем
dpkg-deb -R /tmp/libc6_2.15-0ubuntu10.5_amd64.deb /tmp/libc6_package
# В текстовом редакторе удаляем все надписи exit 1
editor /tmp/libc6_package/DEBIAN/preinst
# Собираем
dpkg-deb -b /tmp/libc6-package
#Устанавливаем
dpkg -i /tmp/libc6-package.deb
После этого, в системе отображалась нужная версия libc6.
P.S. Пост может показаться коротким, но я не нашел в рунете решение данной проблемы, англоязычный интернет тоже содержит малое количество информации по этой теме.
Автор: mrol