есть ли способ получить apt для установки пакетов в мой домашний каталог?

<p>есть ли способ получить <a href="http://en.wikipedia.org/wiki/advanced\_packaging\_tool"> apt </a> для установки пакетов в мой домашний каталог?</p><p>я не хочу вносить изменения в систему в целом.</p><p>в качестве альтернативы, есть ли менеджеры пакетов linux на основе домашнего каталога?</p>

<p>у dpkg нет функции --relocate, которая есть у rpm. стоит учесть, сколько rpm-пакетов поддерживают эту функцию. по сути, это не может быть сделано.</p><p>что вы можете сделать, так это использовать chroot, если вы хотите что-то протестировать перед глобальной установкой в системе. для этого вам нужно иметь возможность получить доступ к root. первое, что нужно сделать, это создать базовый chroot:</p><pre># debootstrap lenny lenny-chroot</pre><p>это создает ленни chroot внутри <code>lenny-chroot</code> каталог.</p><p>теперь мы можем ввести chroot:</p><pre><code># chroot lenny-chroot </code></pre><p>теперь мы можем делать все, что захотим, и устанавливать все, что не мешает остальной системе. когда мы закончим, просто введите выход или нажмите ctrl-d</p>

<p> <a href="https://github.com/homebrew/linuxbrew">linuxbrew</a> - это еще один не-root менеджер пакетов для linux (основанный на популярной системе управления пакетами homebrew для os x), который компилируется из исходного кода и сохраняет двоичные файлы в вашем домашнем каталоге.</p><p>цитируя документы, возможности linuxbrew:</p><ul> <li>может устанавливать программное обеспечение в домашний каталог и поэтому не требует sudo</li> <li>установите программное обеспечение, не упакованное в собственный дистрибутив</li> <li>установите последние версии программного обеспечения, когда родной дистрибутив устарел</li> <li>используйте один и тот же менеджер пакетов для управления компьютерами mac и linux</li> </ul>

<p>префикс gentoo делает именно то, что вы хотите.</p><p>он устанавливает все пакеты в указанный каталог. нет корневого доступа требуется. если вы хотите избавиться от него, просто удалите базовый каталог.</p><ul> <li>смотрите <a href="http://archives.gentoo.org/gentoo-dev/msg\_6cfb555437e46cc41e3b9ed80433bc18.xml">пост разработчика</a> для некоторого вступления.</li> <li> <a href="http://www.gentoo.org/proj/en/gentoo-alt/prefix/usecases.xml">подробные примеры использования</a> </li> <li> <a href="http://www.gentoo.org/proj/en/gentoo-alt/prefix/bootstrap.xml">информация об установке (?)</a> </li> <li> <a href="http://www.gentoo.org/proj/en/gentoo-alt/prefix/index.xml">страница проекта</a> </li> </ul><p>ps: это не работает в ubuntu> = 11.04 или любой другой производной debian с multiarch.</p>

<p>так же, как незначительное дополнение к опции его компиляции, есть промежуточная опция компиляции в пакет с другим параметром префикса во время компиляции (с помощью "checkinstall" или, возможно, каким-либо другим способом). преимущество заключается в том, что пакет будет отображаться в менеджерах пакетов, таких как aptitude или synaptic.</p><p>кроме того, я думаю, что в некоторых случаях может быть возможно загрузить фактический .deb и принудительно установить другой префикс через установку dpkg, но я думаю, что это не то, что можно сделать с любым случайным пакетом, но они должны быть скомпилированы с некоторая переменная для их местоположения (а не буквальный явный префикс), которую вы экспортируете перед установкой. я ничего не знаю о процедуре, однако, google для "префикс dpkg instdir".</p>

<p>вы можете использовать <a href="https://github.com/dex4er/fakechroot">fakechroot</a> - посмотреть демо на их сайте.</p>

<p>нет, я не думаю, что ты можешь.</p><p>лучшее, о чем я могу думать сейчас, это использовать <code>apt-get source</code> и скомпилируйте ваш пакет. может быть, вы могли бы как-то настроить процедуру (которая может быть более или менее автоматизирована), чтобы установить пакеты в вашем доме.</p><p>еще один - использовать <code>dpkg -x</code>, чтобы извлечь его в каталог по вашему выбору.</p>

<p>безрукий gobolinux может делать именно то, что вы просите: менеджер пакетов, без повышенных привилегий, в вашем собственном домашнем каталоге. надеюсь, вы знаете, что делаете; rootless - не самый хорошо поддерживаемый режим установки gobo, и когда я использовал его несколько лет назад, он потребовал несколько настроек, поскольку скрипт установки был немного устаревшим по сравнению с другими изменениями gobo.</p><p>есть также клик, который перепаковывает довольно много <code>.deb</code>s, может устанавливать пакеты в ваш домашний каталог и не требует никаких привилегий root для работы ... но для первоначальной установки требуется root.</p>

<p>я обычно получаю исходники и проверяю файл типа "install". обычно есть инструкции, чтобы сделать <code>./configure --prefix=somedir</code>. затем вы должны добавить <code>somedir/bin</code> к вашему пути.</p>

<p>у меня есть решение, которое я успешно использовал для установки большой коллекции взаимодействующих программных пакетов на школьном сервере debian, где у меня вообще нет корневого доступа (даже для установки другого менеджера пакетов). он не использует <code>deboostrap</code> и менеджер пакетов.</p><p>метод частично ручной, но я сделал все возможное, чтобы сделать его удобным.</p><p>он использует этот скрипт, который я назвал <code>install</code> (не забудьте <code>chmod +x</code> это):</p><pre><code>#!/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 </code></pre><p>поэтому обычно я сначала загружаю файл deb, используя <code>apt-get download package\_name</code>. тогда я бегу <code>./install package\_name\_blabla.deb</code> и вручную принимать решение о каждом случае <code>/usr</code> в распакованных файлах, если его следует заменить на <code>$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</code>, а затем удалите все эти файлы из <code>prefix</code>.</p>

<p>у меня проблемы с представлением, как это будет работать с официальными репозиториями из дистрибутива. как это должно разрешить зависимости? из системы или из ваших домашних каталогов? что если он найдет разные версии в обоих?</p><p>лучшее, что я могу придумать, - это среда chroot, как люди делают для 32-битных приложений на 64-битных системах. это больше издержек, как если бы вы вызывали debootstrap в chroot, но с некоторым <a href="http://en.wikipedia.org/wiki/symbolic\_link">символическая ссылка</a> , забавным сценарием оболочки shell, он может делать то, что вы хотите.</p>

<p>очень мало случаев, когда вам нужно было бы устанавливать пакеты в вашу домашнюю папку.</p><p>однако вы можете скомпилировать и установить программное обеспечение на свой локальный компьютер. просто распакуйте, затем настройте с помощью <code>./configure --prefix=$home/local</code> или другой каталог. затем вы можете <code>make</code> и <code>make install</code> как обычно. это скомпилирует и установит эту программу в <code>~/local/</code>, например, исполняемая вами программа будет находиться в <code>~/local/bin/programmname</code>.</p>

<p>я все еще работаю над проблемой, но debootstrap в основном то, что вам нужно, и должно работать с fakeroot. debootstrap - это просто набор сценариев оболочки, поэтому я разбираю его, чтобы посмотреть, что заставляет его работать. сложной частью будет удаление файлов после их установки.</p>

<p>к сожалению, я не слышал ни о каком дистрибутиве, предоставляющем что-то подобное (хотя я уверен, что он будет очень популярен). возможно, вы сможете имитировать дистрибутив, основанный на rpm ... я не пробовал этого, но вы можете создать базу данных, основанную на пользователях, а затем установить rpm в базу данных пользователей.</p><p>попробуйте настроить новый пользовательский дистрибутив с помощью:</p><p><code>rpm --initdb --dbpath directory</code></p><p>тогда есть несколько вариантов, которые могут помочь:</p><ul> <li><code>--prefix</code></li> <li><code>--relocate</code></li> </ul>

<p>из моего собственного опыта не существует простого способа использовать существующие пакеты deb для установки в другой каталог, который не является <a href="http://en.wikipedia.org/wiki/chroot">chroot</a> средой. инструменты установки debian/ubuntu <a href="http://en.wikipedia.org/wiki/dpkg">dpkg</a> / <a href="http://en.wikipedia.org/wiki/aptitude\_%28software%29">aptitude</a> / <a href="http://en.wikipedia.org/wiki/dselect">dselect</a> для корректной работы требуются привилегии root.</p><p>теперь, имея исходную deb, вы можете изменить файл debian/rules, чтобы он собирал и устанавливал пакеты в другое дерево каталогов, но тогда вы не используете уже имеющиеся двоичные пакеты.</p><p>как уже упоминали другие, вы можете использовать <a href="http://wiki.debian.org/debootstrap">debootstrap</a> и легко создать среду chroot, что я делал в прошлом, чтобы иметь 32-битную среду на 64-битном хосте, но для этого нужно установить chroot с по крайней мере, базовые пакеты дублированы. если у вас есть место, и это жизнеспособное решение, вы можете связать его с <code>dchroot</code> или, что еще лучше, с <code>schroot</code>, чтобы упростить выполнение приложений, установленных в среде chroot.</p>