LINUX.ORG.RU

Установка пакетов изолированно от системы

 , ,


0

1

Задача: установить изолированно от системы:

  • .rpm / .deb пакет из локальной папки;
  • пакет из репозитории с помощью менеджера пакетов.

По идее это можно сделать с помощью chroot — изменить корневой каталог, и потом установить пакет; примерно так:

mkdir ~/new_root
cd ~/new_root
sudo chroot .

Да, именно так я себе и представлял это сначала :-) Просто недавно с помощью chroot поднял загрузчик grub2 и подумал что это будет так же просто.

Конечно, такой номер не пройдёт: sudo chroot . выводит chroot: failed to run command ‘/bin/bash’: No such file or directory. Я так понял, new_root должна быть не «пустой папкой», да?

Как вообще можно установить пакеты изолированно от системы?

Если ты хочешь что-то *запустить* в chroot, этому приложению нужны как минимум либы, /dev/null, /dev/zero, /dev/random, /dev/log, возможно ещё что-то.

Не путать с приложением, которое делает chroot() *после* запуска. Тогда либы ему уже не нужны (если не используются плагины с dlopen()).

Вообще нет такой задачи «изолировать приложение от системы», есть задача «помешать лезть куда не следует», а для этого есть масса методов: упомянутый chroot, apparmor/другие rbac, lxc, простигосподи docker.

anonymous ()

new_root должна быть не пустой

Да, как тебе уже анон сказал, по сути, в чруте тебе нужна базовая система, не все подряд, конечно, но вот в слаке надо туда как минимум slackware/{a,n} извлечь и т.к. нужны всякие /dev/null, прибиндить (mount --bind) /dev, /proc и /sys. Но в принципе, в Slackware скрипты управления пакетами могут устанавливать и удалять пакеты без chroot — достаточно выполнить, например, для того, чтобы установить пакет — # ROOT=/path/to/destinstion installpkg пакет. Не знаю как в Debian или в федорке, но у нас так.

yars068 ★★★★ ()
Последнее исправление: yars068 (всего исправлений: 1)

О таких сущностях, как Appimage, Flatpak и Snap, знаешь?

greenman ★★★★★ ()

Как вообще можно установить пакеты изолированно от системы?

Входишь в консольный режим изолированного окружения и устанавливаешь. В чём проблема-то?

iZEN ★★★★★ ()

Тебе будет проще их распаковатьх в нужное место. для 99% пакетов это будет равносильно установке в изолированное место.

Суть установки пакета заключается в распаковке его содержимого (в корень) и выполнению install-скрипта. Последнее необязательно, и в том же арче в подавляющем большинстве пакетов install-скрипта нет. С распаковкой всё понятно — просто распакуй содержимое куда надо, и будет тебе «изолировано от системы». Если есть install-скрипт, то он обычно изменяет какие-то файлы в системе, например дописывает какую-то строчку. Можешь его просто прочитать и взять из своей системы те файлы, что ему нужны, а потом запустить его на них.

Штатных средств для такого не предусмотрено, потому что пакеты на то и пакеты, что устанавливаются в систему, а не изолированно. Со всеми зависимостиями и прочим. Хотя есть исключения в виде например дистрибутива NixOS.

 

А теперь скажи, что ты на самом деле хочешь. Какая задача стоит? Ради чего ты хотел «установить отдельно от системы»? И мы попробуем подсказать, как решить именно реальную задачу.

Psych218 ★★★★★ ()
Последнее исправление: Psych218 (всего исправлений: 4)
Ответ на: комментарий от Psych218

Штатных средств для такого не предусмотрено, потому что пакеты на то и пакеты, что устанавливаются в систему, а не изолированно.

Не стоит делать столь категоричных заявлений.
Например, в Slackware вполне штатно:
ROOT=/куда installpkg ...
ROOT=/куда removepkg ...

bormant ★★★★★ ()
Ответ на: комментарий от Psych218

Аналогично для rpm:
rpm --root /куда ...

Аналогично для pacman:
pacman --root /куда ...

Аналогично для dpkg:
dpkg --root /куда ...

Вы правило с исключениями путаете.

Отличается сильно — например, поддержкой в будущем chroot-е базы установленных пакетов, возможностью их обновления/удаления средствами ПМ.

bormant ★★★★★ ()
Последнее исправление: bormant (всего исправлений: 4)

CBSD - система управления операционным окружением в изолированных средах FreeBSD.

iZEN ★★★★★ ()
Ответ на: комментарий от slamd64

Забивать гвозди кувалдой тоже можно, но скорее так они гнуться будут :)

yars068 ★★★★ ()
Последнее исправление: yars068 (всего исправлений: 1)
sudo yum --installroot /path/to/new/root install passwd systemd vim-enhanced centos-release /path/to/package.rpm
sudo systemd-nspawn -D /path/to/new/root

Дальше запускаешь свою софтину. Если совсем не доверяешь пакету, то лучше сперва поставь пакетник в контейнер и став пакет уже непосредственно в нём.

С остальными дистрами по тому же принципу.

Ivan_qrt ★★★★★ ()
Ответ на: комментарий от Psych218

А теперь скажи, что ты на самом деле хочешь.

Установить и запустить приложения изолированно от системы, чтобы они не трогали никакие файлы в / и /home; т.е. песочницу. Зачем:

  • например, пакет А, при установке, подтягивает за собой 20+ зависимостей и не хочу засорять систему, так как я просто хочу посмотреть, что он из себя представляет. Не всегда при удалении пакета удаляются все зависимости, которые были установлены при установке пакета; плюс к этому в /home обычно остаётся папка с настройками;
  • Вообще нет такой задачи «изолировать приложение от системы», есть задача «помешать лезть куда не следует»

    протестировать разные программы ничего не боясь;
  • попробовать потихоньку компилировать и установить программы из исходников; не хочу сразу в /;
  • изучать Linux.

Из «песочницы» программу хочу запустить от имени обычного пользователя. В принципе, запретить доступ к Интернету программе не нужно (пока). По аналогии, в винде есть утилита Sandboxie; только программу не нужно «контролировать», она должна выполнятся как обычная программа, только без доступа на запись в / и /home.

По-моему, для этого отлично подойдёт chroot. Только сначала нужно его настроить, да?


Суть установки пакета заключается в распаковке его содержимого (в корень) и выполнению install-скрипта.

А сам install-скрипт (если он есть) находится в корень архива? В любом случае, спасибо за инфу.

Mg_usr ()
Ответ на: комментарий от Mg_usr

Установить и запустить приложения изолированно от системы, чтобы они не трогали никакие файлы в / и /home; т.е. песочницу.

Для этого их не нужно устанавливать в отдельный каталог. Можно, но не обязательно. Если запускать приложение от обычного пользователя, а не рута, оно и так не может ничего тронуть в /. Даже если само лежит там. Это не имеет значения. В /home может. А вот чтобы не могло и в /home, используй например firejail. Запускать так:

mkdir pseudo_home
firejail --private=pseudo_home --net=none mydangerousapplication

Соответственно, приложение запустится и будет считать каталог pseudo_home хомяком пользователя, от которого это запущено. При этом в настоящий хомяк у него доступа не будет. Не просто прав, а оно вообще не будет знать о том, что есть ещё и какой-то настоящий хомяк.

Также можно просто --private вместо --private=pseudo_home. Тогда псевдохомяк для программы будет в tmpfs и не будет сохраняться на диске вообще, то есть никаких следов. Ну и --net=none, конечно же, опционально.

Как-то так. Подробнее man firejail.

Psych218 ★★★★★ ()
Последнее исправление: Psych218 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.