Есть ли способ получить APT устанавливать пакеты в мой домашний каталог?
Я не хочу вносить изменения в систему.
В качестве альтернативы, есть ли какие-либо менеджеры пакетов Linux на основе домашнего каталога?
Dpkg не имеет функции --relocate, которая есть в RPM. Однако стоит учесть, сколько пакетов RPM поддерживают эту функцию. В принципе, это невозможно.
Что вы можете сделать, так это использовать chroot, если вы хотите что-то протестировать перед глобальной установкой в системе. Для этого нужно иметь возможность получить root-доступ. Первое, что нужно сделать, это создать базовый chroot:
# debootstrap lenny lenny-chroot
Это создает chroot Ленни внутри lenny-chroot
каталог.
Теперь мы можем войти в chroot:
# chroot lenny-chroot
Теперь мы можем делать все, что захотим, и устанавливать что угодно, не испортив остальную часть системы. Когда мы закончим, просто введите exit или нажмите ctrl-D.
Linuxbrew - еще один некорневой менеджер пакетов для Linux (основанный на популярной системе управления пакетами Homebrew для OS X), который компилируется из исходного кода и сохраняет двоичные файлы в вашем домашнем каталоге.
Цитируя документы, особенности Linuxbrew:
Префикс Gentoo делает именно то, что вы хотите.
Он устанавливает все пакеты в указанный каталог. Корневой доступ не требуется. Если вы хотите избавиться от него, просто удалите базовый каталог.
PS: Это не работает на Ubuntu> = 11.04 или любой другой производной Debian с Multiarch.
В качестве незначительного дополнения к возможности его компиляции существует промежуточный вариант компиляции в пакет с другим параметром префикса во время компиляции (с помощью «checkinstall» или, возможно, каким-либо другим методом). Преимущество состоит в том, что пакет будет отображаться в диспетчерах пакетов, таких как aptitude или synaptic.
Кроме того, я думаю, что в некоторых случаях можно загрузить фактический .deb и принудительно использовать другой префикс с помощью установки dpkg, но я думаю, что это не то, что можно сделать с любым случайным пакетом, но они должны быть скомпилированы с некоторая переменная для их местоположения (а не явный буквальный префикс), которую вы экспортируете перед установкой. Я ничего не знаю о процедуре, погуглите "dpkg instdir prefix".
Ты можешь использовать поддельный - посмотрите демо на их сайте.
GoboLinux без рута может делать именно то, о чем вы просите: менеджер пакетов без повышенных привилегий в вашем собственном домашнем каталоге. Надеюсь, вы знаете, что делаете; Rootless - не самый поддерживаемый режим установки Gobo, и когда я использовал его несколько лет назад, потребовалось несколько настроек, так как сценарий установки был немного устаревшим по сравнению с другими изменениями Gobo.
Еще есть клик, который переупаковывает довольно много .deb
s, может устанавливать пакеты в ваш домашний каталог и не требует прав root для работы ... но для начальной настройки требуется root.
Обычно я беру исходники и проверяю файл типа «INSTALL». Обычно есть инструкции по выполнению ./configure --prefix=somedir
. Затем вам нужно добавить somedir/bin
на твой путь.
Нет, не думаю, что сможешь.
Лучшее, что я могу сейчас придумать, - это использовать apt-get source
и скомпилируйте свой пакет. Возможно, вам удастся каким-то образом настроить процедуру (которая может быть более или менее автоматизированной) для установки пакетов в вашем доме.
Другой - использовать dpkg -X
чтобы извлечь его в каталог по вашему выбору.
Очень мало случаев, когда вам нужно устанавливать пакеты в вашу домашнюю папку.
Однако вы можете скомпилировать и установить программное обеспечение на свой локальный компьютер. Просто разархивируйте, затем настройте с помощью ./configure --prefix=$HOME/local
или какой-нибудь другой каталог. Тогда ты можешь make
и make install
как обычно. Это скомпилирует и установит эту программу в ~/local/
, например, программа, которую вы выполняете, будет в ~/local/bin/programmname
.
По моему собственному опыту, нет простого способа использовать существующие пакеты DEB для установки в другой каталог, который не является chroot Окружающая среда. Инструменты установки Debian / Ubuntu dpkg/способность/dselect все требуют привилегий root для правильной работы.
Теперь, учитывая исходный DEB, вы можете изменить файл Debian / rules, чтобы пакет был собран и установлен в другое дерево каталогов, но тогда вы не используете уже доступные двоичные пакеты.
Как уже упоминали другие, вы можете использовать debootstrap и легко создать среду chroot, что я делал в прошлом, чтобы иметь 32-разрядную среду на 64-разрядном хосте, но для этого требуется установка chroot с дублированием хотя бы базовых пакетов. Если у вас есть место и это жизнеспособное решение, вы можете объединить его с dchroot
или даже лучше schroot
, чтобы упростить выполнение приложений, установленных в среде chroot.
Мне сложно представить, как это будет работать с официальными репозиториями из дистрибутива. Как он должен разрешать зависимости? Из системы или из домашних каталогов? Что, если он обнаружит разные версии в обоих?
Лучшее, что я могу придумать, - это chroot-среда, как люди делают для 32-битных приложений в 64-битных системах. Это больше накладных расходов, поскольку вы вызываете debootstrap в chroot, но с некоторыми символическая ссылка, сценарий оболочки оболочки весело, он может делать то, что вы хотите.
Я все еще работаю над проблемой, но debootstrap в основном то, что вам нужно, и должен работать с fakeroot. debootstrap - это просто набор сценариев оболочки, поэтому я разбираю его, чтобы посмотреть, что заставляет его работать. Сложнее всего будет удалить файлы после их установки.
К сожалению, я не слышал о каком-либо дистрибутиве, предоставляющем что-то подобное (хотя я уверен, что он был бы очень популярен). Хотя вы можете имитировать дистрибутив на основе rpm ... Я не пробовал этого, но вы можете создать базу данных rpm на основе пользователя, а затем установить rpm в базу данных пользователя.
Попробуйте настроить новый пользовательский дистрибутив с помощью:
rpm --initdb --dbpath DIRECTORY
Тогда есть несколько вариантов, которые могут помочь:
--prefix
--relocate
У меня есть решение, которое я успешно использовал для установки БОЛЬШОЙ коллекции взаимодействующих программных пакетов на школьном сервере Debian, где у меня вообще нет корневого доступа (даже для установки другого диспетчера пакетов). Он не использует deboostrap
ни какой-либо менеджер пакетов.
Метод частично ручной, но я постарался сделать его удобным.
Он использует этот сценарий, который я назвал install
(не забудьте chmod +x
Это):
#!/bin/bash
# PREFIX is the installation root, i.e. a directory you have write access to
PREFIX=$HOME
# unpack the archive to $PREFIX
ar p "$1" data.tar.xz | tar xJ -C $PREFIX
# go through all unpacked text files and search for occurences of /usr/...
# we're gonna replace some of them with $PREFIX/usr
files=$(dpkg --contents $1 | grep '^-' | awk '{print $6}' | sed 's/^..//' | sort | uniq)
for f in $files; do
file="${PREFIX}${f}"
if grep -Iq . "$file"; then
if grep -q '/usr' "$file"; then
# interactively ask for each occurence, if it should be replaced
vim -c '%s#/usr#'$PREFIX'/usr#gc' -c 'wq' "$file"
fi
else
echo "Leaving binary file $file unmodified"
fi
done
Обычно я сначала загружаю файл deb, используя apt-get download package_name
. Тогда я бегу ./install package_name_blabla.deb
, и вручную принимать решение о каждом возникновении /usr
в распакованных файлах, если его нужно заменить на $PREFIX/usr
или не.
Это решение полностью зависит от того, какие пакеты установлены в системе, а какие установлены этим методом. Обычно, например, файлы pkg-config нуждаются в этой подстановке, тогда как строки shebang вроде #!/usr/bin/perl
не. Общее практическое правило - полученный путь должен указывать на существующий файл.
Если пакеты установлены таким образом, вам, очевидно, нужно как-то сообщить о них другим программам. Этого можно добиться, добавив правильные значения к LD_LIBRARY_PATH
, PATH
, PYTHONPATH
, PKG_CONFIG_PATH
, CMAKE_MODULES_PATH
, CMAKE_PREFIX_PATH
и т.п.
В этом подходе есть предостережение, что зависимости не загружаются / не устанавливаются автоматически; вы должны отслеживать их вручную.
Кроме того, APT явно не знает об этих пакетах, поэтому он всегда будет показывать их как отсутствующие. Но в этом есть смысл - кто захочет установить общесистемное приложение, которое зависит от установки пользователя.
Если вы хотите удалить программу, вы можете просмотреть содержимое архива deb, используя ar p "$1" data.tar.xz | tar tJ
а затем удалите все эти файлы из PREFIX
.