Вопрос или проблема
Я хотел бы установить некоторые программы на свой рабочий сервер разработки, потому что на нем отсутствуют некоторые программы, которые мне нужны для повседневной работы. У меня нет доступа root.
Что я сделал до сих пор, так это скомпилировал необходимые мне программные обеспечения с опцией --prefix=/path/to/local/root
. Затем я создал скрипт, который выглядит следующим образом:
#!/bin/sh
export LOCAL_PATH="/path/to/local/root"
export LD_LIBRARY_PATH="$LOCAL_PATH/lib:$LOCAL_PATH/lib64:$LOCAL_PATH/lib64:$LD_LIBRARY_PATH"
binary=$(basename $0)
$LOCAL_PATH/bin/$binary "$@"
Теперь, если я создам символическую ссылку на эту программу с нужным именем, она запустит локальную версию. Однако у меня есть несколько проблем:
- Установочная папка может перемещаться время от времени. Это произошло недавно, и мне пришлось переустанавливать все.
- Некоторые программы используют
libtool
, который игнорируетLD_LIBRARY_PATH
, когда находит библиотеку в/usr/lib
(которая в моем случае была устаревшей). - Программы трудно поддерживать или обновлять.
Для первых двух проблем, похоже, создание chroot
решит проблему. Поможет ли в этом случае fakechroot
? Будет ли мой скрипт все еще работать?
Кроме того, последняя проблема заставляет меня задуматься о смене на пакетный менеджер. Я думал о Portage (от Gentoo, который я использую дома), но может быть есть что-то более подходящее для моих нужд. Есть предложения? Может, легковесное дистрибутив Linux?
Наконец, нужно ли мне связывать /local/lib
и /local/lib64
вместе?
Я не уверен, что это относится к вашему случаю – но я использую graft.
Он, по сути, позволяет мне иметь дерево установленных пакетов в любом месте, где я хочу (например, $HOME/packages
) и устанавливать символические ссылки на их файлы в любой иерархии, которую я хочу (например, под $HOME/local
или /usr/local
, если у меня есть доступ root). В результате это помогает вам поддерживать ряд пользовательских скомпилированных пакетов (скомпилированных так же, как вы, но с --prefix= /path/to/packages/foo-1.2.3
, чтобы они оказались в общем месте) – и у вас даже могут быть несколько версий одного и того же пакета. Вы не создаете обычный беспорядок, потому что можете выбрать, какая версия будет активной в любой момент:
$ cd $HOME/packages
$ ls
mpv-git
texinfo-4.13
texinfo-git
$ graft -i texinfo-4.13
$ # символические ссылки теперь установлены в мой $HOME/local/bin, $HOME/local/lib и т.д.
$ # и так как $HOME/local/bin в моем PATH, у меня теперь texinfo-4.13
$
$ graft -d texinfo-4.13
$ # удалены символические ссылки texinfo 4.13 - давайте установим последнюю версию
$
$ graft -i texinfo-git
Это также можно использовать для поддержания беспорядка, который иначе произойдет в вашем /usr/local
, даже если вы root.
Идея использования символических ссылок для управления пакетами была снова модернизирована в некоторых дистрибутивах Linux – но я думаю, что graft
может удовлетворить большинство случаев использования. Жаль, что только несколько людей о нем знают…
Homebrew — это утилита установки программного обеспечения, которая долгое время использовалась на MacOS, но в последние годы была расширена и для Linux. Она всегда поддерживала установку программного обеспечения в общий серверный каталог (требуя прав root), или в указанный пользователем каталог (не требуя прав root). Указанный пользователем каталог обычно находится в домашнем каталоге пользователя, но это не обязательно.
У Homebrew не так много доступных пакетов программного обеспечения для Linux, как для MacOS, но их достаточно. С ее функциями по размещению программного обеспечения и управлению обновлением пакетов программного обеспечения, она может быть полезна для вас.
Домашняя страница Homebrew: https://brew.sh/
Опции установки описаны здесь: https://docs.brew.sh/Installation
Документы, специфичные для Linux, находятся здесь: https://docs.brew.sh/Homebrew-on-Linux
Ответ или решение
Установка пользовательских программ на сервер без доступа root может быть сложной задачей, но это вполне осуществимо, если следовать правильным шагам. Давайте рассмотрим ваши вопросы и предложим несколько решений.
1. Управление установкой программ
На данный момент вы используете подход с компиляцией программ с указанием параметра --prefix=/path/to/local/root
и эмуляцией выполнения бинарников с помощью скрипта. Это, безусловно, работает, но у вас есть проблемы с переносимостью, а также с совместимостью библиотек.
Решение:
- Использование Homebrew: Это система управления пакетами, которая поддерживает установку программ в указанную пользователем директорию без необходимости root-доступа. Вы можете установить Homebrew в вашу домашнюю директорию и использовать его для облегчения установки и обновления программ.
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
После установки вы можете установить программы с помощью команды brew install <package>
, и Homebrew будет заботиться о путях и зависимостях.
- Использование graft: Я вижу, что вы нашли
graft
. Это также отличное решение, так как оно позволяет управлять деревьями установленных пакетов в произвольном месте и создавать символические ссылки на соответствующие файлы.
2. Проблемы с зависимостями
Ваша проблема с libtool
, игнорирующим настройки LD_LIBRARY_PATH
, может быть решена путем использования chroot
или fakechroot
, чтобы создать изолированное окружение, в котором будут доступны только установленные вами библиотеки. Однако настройка fakechroot
может быть сложной и потребует дополнительных знаний.
Рекомендации:
- Попробуйте сначала использовать методы управления пакетами, такие как Homebrew и graft, чтобы избежать сложности
chroot
до тех пор, пока это действительно не станет необходимо.
3. Поддержка и обновление
Для упрощения поддержки и обновления программ, попробуйте использовать систему управления пакетами, которая автоматически отслеживает зависимости и версии программ. Homebrew и graft могут помочь вам управлять версиями и удалять неиспользуемые пакеты.
4. Символические ссылки
Отвечая на ваш вопрос о символических ссылках на /local/lib
и /local/lib64
:
- В большинстве случаев вам не нужно совместно использовать эти пути, если ваши библиотеки не используются программами, ожидающими их в одном из этих каталогов. Вы можете создать символьные ссылки, если хотите упростить доступ, но очень важно поддерживать файловую структуру и подход к управлению версиями, который вы используете.
Заключение
Большинство проблем, с которыми вы столкнулись, можно решить с помощью использования более продвинутых инструментов управления пакетами, таких как Homebrew или graft. Эти инструменты помогут вам управлять установленными программами и их зависимостями без необходимости вручную выставлять пути и следить за обновлениями.
Если вам потребуется более высокая степень изоляции, вы всегда можете изучить chroot
или fakechroot
, когда вы будете уверены в своих навыках настройки.
Если у вас есть дополнительные вопросы или требуется помощь, не стесняйтесь обращаться.