Установка пакетов в локальный каталог?


38

Я хотел бы установить программные пакеты, похожие на apt-get install <foo>:

  1. Без sudoи
  2. В локальный каталог

Цель этого упражнения - изолировать независимые сборки на моем сервере непрерывной интеграции .

Я не возражаю против компиляции из исходного кода, если это то, что нужно, но, очевидно, я бы предпочел самый простой подход. Я попытался, apt-get source --compile <foo>как упоминалось здесь, но я не могу заставить его работать для пакетов, таких как autoconf. Я получаю следующую ошибку:

dpkg-checkbuilddeps: Unmet build dependencies: help2man

У меня help2man, скомпилированный в локальном каталоге, но я не знаю, как сообщить apt-get об этом. Любые идеи?

ОБНОВЛЕНИЕ : я нашел ответ, который почти работает на https://askubuntu.com/a/350/23678 . Проблема в chrootтом, что для этого требуется sudo. Проблема в apt-get sourceтом, что я не знаю, как разрешить зависимости. Надо сказать, chrootвыглядит очень привлекательно. Есть ли эквивалентная команда, которая не требует sudo?


Я полагаю, что это дубликат этого вопроса: [ askubuntu.com/questions/147654/… [1]: askubuntu.com/questions/147654/…

7
@ Камил, это не так. Я не пытаюсь установить без доступа к сети. Я пытаюсь установить без sudoи в несистемный каталог.
Гили

4
Ребята, пожалуйста, не отрицайте мой вопрос, не объяснив почему . Спасибо.
Гили

Если у вас нет root в системе, вы не сможете легко разрешить зависимости . Хотя иногда это возможно; вам придется начать установку программного обеспечения у себя дома, начиная с самых нижних зависимостей и изменяя свой LD_PATH, чтобы программы могли находить свои библиотеки. Тем не менее, вы потерпите неудачу, если для запуска любого из пакетов требуется root (или suid)
январь

@ Январь, я пытаюсь скомпилировать программный проект внутри автоматизированной системы сборки. Насколько я знаю, ни одна из его зависимостей (необходимых для компиляции) не требует root.
Гили

Ответы:


20

В общем, это невозможно, потому что вы могли бы связываться с системой зависимостей apt.

Есть два решения:

  1. Установите исходный пакет, перейдите в исходный каталог, настройте и установите пакет независимо от систем упаковки вручную в каталог по вашему выбору.

    apt-get source <package>
    

    Это не требует root, загружает исходный код пакета, распаковывает его в каталог в текущем каталоге. Затем вы можете перейти в этот каталог, внести изменения в источник, настроить установку для другой цели и т. Д.

    Однако настройка директории установки, в которую должны идти программы, зависит от конкретной программы. Многие программы используют ./configure --prefix localdirдля установки установки localdir; но это далеко не всегда так.

  2. Создайте среду chroot, в которую вы будете устанавливать пакеты:

    debootstrap precise myfancyinstall
    

    Теперь вы создали фиктивную установку в каталоге myfancyinstall /

    chroot myfancyinstall
    

    Вы можете использовать apt-get install внутри chroot cage, чтобы установить что угодно.


Это выглядит многообещающе. Использование apt-get sourceбез, --compileкажется, подавляет предупреждение о неудовлетворенных зависимостях (позволяя мне разрешить их самостоятельно)
Gili

Есть ли способ получить пакеты, которые также не имеют исходного кода?
Soandos

Решение (2) будет работать независимо. В противном случае вы по своему усмотрению: возможно, есть другой способ установки пакета. Или загрузите файл пакета DEB и распаковать его с ар: ar vx mypackage.deb. Затем проанализируйте содержимое пакета и узнайте, как установить его вручную.
январь

14

используя оболочку bash и получая файл «package.deb» (при условии, что имя пакета - «пакет»), вы можете выполнить следующую команду, чтобы выполнить то, что вы хотите - установить пакет так, чтобы ваш домашний каталог обрабатывался так же, как «/ "будет рассматриваться в обычной установке.

Это команда:

apt-get download package; dpkg -i --force-not-root --root=$HOME package.deb

Вы можете столкнуться с некоторыми ошибками, такими как отсутствие $ HOME / var / lib / dpkg / lock, поэтому просто создайте все отсутствующие файлы, которые вы получите из ошибок, и тогда установка должна работать без sudo.

обратите внимание, что если «apt-get download» не работает, вы можете попробовать «apt download» или «apitutde download package».

если ни один из методов не работает, вы можете просто загрузить пакет вручную с http://packages.ubuntu.com/

Другой способ - запустить команду chroot с параметром $ HOME, а затем установить ее, как описано выше, только без --root = $ HOME. эта команда приведет вас в оболочку, где "/" - ваш текущий $ HOME. чтобы вернуться в нормальный режим, не забудьте "выйти"

удачи.


После создания недостающих файлов, на которые жаловался dpkg, он просто начал segfaulting.
Мэтт Чемберс

0

Если вы используете общий веб-хостер с sshдоступом, но без apt-getрута и т. Д., Или с аналогичной системой ограничения, вам может помочь следующее. У меня это работало в системе, где uname -aвозвращалось что-то вродеSMP Debian 4.9.65-3+deb9u2~bpo8+1 (2017-01-05) x86_64 GNU/Linux

# examples tried on a shared hoster with ssh access but no apt-get no root etc.
# http://mirrors.kernel.org/ubuntu/pool/main/g/gawk/gawk_4.1.3+dfsg-0.1_amd64.deb
# https://github.com/dvorka/hstr/releases/download/1.25/hstr_1.25-1_amd64.deb

debURL="http://mirrors.kernel.org/ubuntu/pool/main/g/gawk/gawk_4.1.3+dfsg-0.1_amd64.deb"
# get the filename only, remove all till last slash "/"
# see http://wiki.bash-hackers.org/syntax/pe#substring_removal
debFile=${debURL##*/}
# change to your desired directory for installation/unpacking; here: $HOME
cd $HOME
# get the .deb file (no dependencies checked or resolved here)
curl -OL $debURL 
# unpack only the data part from the .deb file
# see https://en.wikipedia.org/wiki/Deb_%28file_format%29
ar p $debFile data.tar.xz | tar xJv --strip-components=2 -f - 
rm -v $debFile # clean up
echo "Done unpacking $debFile into $(pwd)"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.