Чи є спосіб отримати APT для встановлення пакетів до мого домашнього каталогу?


42

Чи є спосіб отримати APT для встановлення пакетів до мого домашнього каталогу?

Я не хочу широко змінювати систему змін.

Крім того, чи є менеджери пакетів Linux на основі домашнього каталогу?


Відповіді:


17

Dpkg не мають функції --relocate, яку має RPM. Варто врахувати, скільки пакетів RPM підтримують цю функцію. В основному, це неможливо зробити.

Що ви можете зробити, це використовувати chroot, якщо ви хочете тестувати щось перед тим, як встановити його глобально в системі. Для цього потрібно мати можливість отримати доступ до root. Перше, що потрібно зробити - це створити базовий chroot:

# debootstrap lenny lenny-chroot

Це створює хроні Ленні всередині lenny-chrootкаталогу.

Тепер ми можемо ввести chroot:

# chroot lenny-chroot

Тепер ми можемо робити все, що завгодно, і встановлювати все, що завгодно, не псуючи решту системи. Коли ми закінчимо, просто введіть exit або натисніть ctrl-D


8

Linuxbrew - це ще один некореневий менеджер пакунків для Linux (заснований на популярній системі управління пакетами Homebrew для OS X), який збирає з джерела та зберігає бінарні файли у вашому домашньому каталозі.

Цитуючи документи, функціями Linuxbrew є:

  • Може встановлювати програмне забезпечення в домашній каталог і тому не вимагає sudo
  • Встановіть програмне забезпечення, яке не упаковується нашим розповсюдженням
  • Встановіть сучасні версії програмного забезпечення, коли рідний дистрибутив є старим
  • Використовуйте один і той же менеджер пакунків, щоб керувати комп'ютерами Mac і Linux

7

Префікс Gentoo робить саме те, що ви хочете.

Він встановлює всі пакети у вказаний каталог. Не потрібен кореневий доступ. Якщо ви хочете позбутися від нього, просто видаліть базовий каталог.

PS: Це не працює на Ubuntu> = 11.04 або будь-яку іншу похідну Debian з Multiarch.


1
Gentoo будує з джерела, плакат, здається, хоче встановити через пакет у певний каталог. Це насправді не те саме.
Ендрю Кейс

1
@AndrewCase Gentoo теж вважаю пакети. Те, що вони не є бінарними, не має значення для остаточної установки.
jiggunjer

4

Так само, як незначне доповнення до варіанту його компілювання, є опція на півдорозі компіляції в пакет з іншим параметром префікса під час компіляції (з "checkinstall" чи, можливо, іншим способом). Перевага полягає в тому, що пакет з’явиться на менеджерах пакунків, таких як здатність чи синаптичність.

Крім того, я думаю, що в деяких випадках можливо завантажити фактичний .deb і змусити інший префікс через встановити dpkg, але я думаю, що це не те, що можна зробити з будь-яким випадковим пакетом, але вони повинні бути складені з деяка змінна для їх розташування (а не буквальний явний префікс), яку ви експортуєте перед установкою. Я нічого не знаю про процедуру, хоч, google для "префікса dpkg instdir".



1

Безкоштовний GoboLinux може робити саме те, що ви просите: менеджер пакунків, без підвищених привілеїв, у власному домашньому каталозі. Сподіваємось, ви знаєте, що робите; rootless - це не самий доглянутий режим установки Gobo, і коли я використовував його кілька років тому, він потребував декількох налаштувань, оскільки сценарій установки трохи застарів у порівнянні з іншими змінами Gobo.

Також є кнопка, яка перепаковує досить багато .debс, може встановлювати пакети до вашої домашньої директорії та не потребує кореневих привілеїв для роботи ... але для початкової установки потрібен root.


1

Зазвичай я дістаю джерела і перевіряю файл типу "ВСТАНОВИТИ". Зазвичай є вказівки робити ./configure --prefix=somedir. Тоді вам доведеться додати somedir/binдо свого шляху.


це може бути важко отримати, компілювати та оновлювати залежності.
Паоло

Це назад. Питання полягає в тому, як змусити менеджерів пакетів (що є кращими з 1990-х років) таким чином поводитись.
Гонки легкості з Монікою

1

Ні, я не думаю, що ти можеш.

Найкраще, про що я зараз думаю, - це використовувати apt-get sourceта компілювати ваш пакет. Можливо, ви могли якось підробити процедуру (яка може бути більш-менш автоматизованою) для встановлення пакетів у вашому домі.

Інший варіант - використовувати його dpkg -Xдля витягування в каталозі на ваш вибір.


0

Дуже мало випадків, коли вам потрібно буде встановити пакунки в домашню папку.

Однак ви можете компілювати та встановлювати програмне забезпечення на свою локальну машину. Просто розпакуйте, а потім налаштуйте те ./configure --prefix=$HOME/localчи інший каталог. Тоді можна makeі make installяк звичайно. Це дозволить скласти та встановити цю програму ~/local/, наприклад, програма, яку ви виконуєте ~/local/bin/programmname.


0

З мого власного досвіду, не існує простого способу використання існуючих пакетів DEB для встановлення в інший каталог, який не є середовищем chroot . Усі інструменти встановлення Debian / Ubuntu dpkg / aptitude / dselect вимагають кореневих привілеїв, щоб правильно функціонувати.

Тепер, з огляду на джерело DEB, ви можете змінити файл Debian / rules, щоб він створив і встановив пакет у іншому дереві каталогів, але тоді ви не використовуєте вже наявні бінарні пакети.

Як уже згадували інші, ви можете використовувати debootstrap і легко створювати середовище chroot, що я раніше робив, щоб мати 32-бітове середовище на 64-бітному хості, але для цього потрібна установка chroot з принаймні копіями базових пакетів. Якщо у вас є простір, і це життєздатне рішення, ви можете з'єднати його dchroot, а ще краще schroot, щоб дозволити легке виконання програм, встановлених у середовищі chroot.


0

У мене є проблеми уявити, як це буде працювати з офіційними сховищами з дистрибуції. Як слід вирішувати залежності? З системи чи з ваших домашніх каталогів? Що робити, якщо він знаходить різні версії в обох?

Найкращим, що я можу придумати, було б середовище chroot'd, як це роблять люди для 32-бітних додатків у 64-бітних системах. Це більше накладних витрат, як ви б викликали debootstrap в chroot, але з деяким символом , що цікавить сценарій оболонки оболонки, він може робити те, що ви хочете.


0

Я все ще працюю над проблемою, але debootstrap в основному те, що вам потрібно, і повинен працювати з фальшивою системою. debootstrap - це лише маса сценаріїв оболонок, тому я розтягую її, щоб побачити, що змушує її поставити галочку. Важка частина полягатиме у видаленні файлів після їх встановлення.


Я (і тисячі інших користувачів) від усієї душі заохочую це. Щось, що потрапляє у вже існуючу загальносистемну базу даних rpm (або підходящу альтернативу), а також надану користувачем базу даних rpm та встановлює розташовані користувачем rpms. Це було б дивовижно. Це навіть може бути об'єднано в основну лінію. Чи було раніше проведено дослідження з цього приводу?
Ендрю Кейс

0

На жаль, я не чув жодного дистрибутива, що надав щось подібне (хоча я впевнений, що це було б дуже популярно). Ви, можливо, зможете імітувати дистрибутив на основі оборотів у хвилину ... Я цього не пробував, але ви можете створити базу даних об / хв на основі користувача, а потім встановити rpm в базу даних користувачів.

Спробуйте налаштувати новий користувальницький дистрибутив за допомогою:

rpm --initdb --dbpath DIRECTORY

Тоді є кілька варіантів, які можуть допомогти:

  • --prefix
  • --relocate

0

У мене є рішення, яке я успішно використовував для встановлення великої колекції програмних пакетів, що співпрацюють, на шкільному сервері 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, потребують цієї заміни, тоді як рядки 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.