Установить программы пользовательского пространства на сервере без доступа root

Вопрос или проблема

Я хотел бы установить некоторые программы на свой рабочий сервер разработки, потому что на нем отсутствуют некоторые программы, которые мне нужны для повседневной работы. У меня нет доступа 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, когда вы будете уверены в своих навыках настройки.

Если у вас есть дополнительные вопросы или требуется помощь, не стесняйтесь обращаться.

Оцените материал
Добавить комментарий

Капча загружается...