Решение проблемы: не найдена определённая версия библиотеки
Иногда программа не запускается из-за отсутствия библиотеки определённой версии, при этом в системе может присутствовать эта самая библиотека, но другой версии.
Чтобы было понятно, после одного из обновлений (в Arch Linux) перестал запускаться NetworkManager
sudo systemctl restart NetworkManager
Job for NetworkManager.service failed because the control process exited with error code.
See "systemctl status NetworkManager.service" and "journalctl -xe" for details.
В журнале
journalctl -xe
было следующее:
-- Начат процесс запуска юнита NetworkManager.service.
мар 21 16:37:23 HackWare NetworkManager[1110]: /usr/bin/NetworkManager: error while loading shared libraries: libpsl.so.5: cannot open shared object file: No such file or directory
мар 21 16:37:23 HackWare systemd[1]: NetworkManager.service: Main process exited, code=exited, status=127/n/a
мар 21 16:37:23 HackWare systemd[1]: NetworkManager.service: Failed with result 'exit-code'.
мар 21 16:37:23 HackWare systemd[1]: Failed to start Network Manager.
-- Subject: Ошибка юнита NetworkManager.service
-- Defined-By: systemd
-- Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Произошел сбой юнита NetworkManager.service.
--
-- Результат: RESULT.
мар 21 16:37:23 HackWare systemd[1]: NetworkManager.service: Service hold-off time over, scheduling restart.
мар 21 16:37:23 HackWare systemd[1]: NetworkManager.service: Scheduled restart job, restart counter is at 5.
-- Subject: Назначен автоматический перезапуск юнита
-- Defined-By: systemd
-- Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
Главной там является строка /usr/bin/NetworkManager: error while loading shared libraries: libpsl.so.5: cannot open shared object file: No such file or directory, которая говорит о том, что произошла ошибка во время загрузки разделяемой библиотеки libpsl.so.5, проблема в том, что не получается открыть файл из-за его отсутствия.
С помощью locate я поискал, какие именно версии разделяемой библиотеки присутствуют:
locate libpsl.so
/usr/lib/libpsl.so
/usr/lib/libpsl.so.6
/usr/lib/libpsl.so.6.2.0
Как можно увидеть, в принципе библиотека в системе есть, но у неё другая версия.
Одним из способов решить данную проблему является создание символической ссылки командой следующего вида:
ln -s /путь/до/существующего.файла /путь/до/отсутствующего.файла
Например, у меня в системе есть файл /usr/lib/libpsl.so, а программа не может запуститься из-за отсутствия файла /usr/lib/libpsl.so.5, тогда получается команда:
ln -s /usr/lib/libpsl.so /usr/lib/libpsl.so.5
Это нельзя назвать полноценным решением проблемы – это, скорее «хот фикс», быстрое и не особо правильное решение проблемы. Но я пару раз применял этом приём и оба раза он срабатывал! Например, служба NetworkManager всё-таки запустилась.
Если вы пытаетесь запустить какую-то старую программу, и она требует библиотеку определённой версии, а возможности установить эту версию нет, то можно попробовать поступить описанным выше способом.
Но поскольку NetworkManager – это популярная программа, то правильное исправление прилетело уже при следующем обновлении пакетов, причём из-за созданного мной файла обновление завершалось ошибкой:
(42/42) проверка конфликтов файлов [##################] 100%
ошибка: не удалось завершить транзакцию (конфликтующие файлы)
libpsl: '/usr/lib/libpsl.so.5' существует в файловой системе
Обнаружены ошибки, пакеты не обновлены.
Как только я удалил символическую ссылку (файл /usr/lib/libpsl.so.5), то обновление прошло успешно. После этого NetworkManager начал работать без созданной мной символической ссылки:
https://zalinux.ru/wp-content/uploads/2018/03/21-350x213.png 350w, https://zalinux.ru/wp-content/uploads/2018/03/21-300x183.png 300w, https://zalinux.ru/wp-content/uploads/2018/03/21-768x468.png 768w" alt="" width="801" height="488">
Думается, не надо злоупотреблять этим способом – лучше сообщить разработчику о возникшей проблеме, но в качестве очень быстрого решения в неотложных ситуациях, либо когда других вариантов нет – иногда можно использовать и такой грязный хак.