Установка пакетов изолированно от системы
По идее это можно сделать с помощью 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.
Да, как тебе уже анон сказал, по сути, в чруте тебе нужна базовая система, не все подряд, конечно, но вот в слаке надо туда как минимум slackware/ извлечь и т.к. нужны всякие /dev/null, прибиндить (mount --bind) /dev, /proc и /sys. Но в принципе, в Slackware скрипты управления пакетами могут устанавливать и удалять пакеты без chroot — достаточно выполнить, например, для того, чтобы установить пакет — # ROOT=/path/to/destinstion installpkg пакет . Не знаю как в Debian или в федорке, но у нас так.
О таких сущностях, как Appimage, Flatpak и Snap, знаешь?
Как вообще можно установить пакеты изолированно от системы?
Входишь в консольный режим изолированного окружения и устанавливаешь. В чём проблема-то?
Тебе будет проще их распаковатьх в нужное место. для 99% пакетов это будет равносильно установке в изолированное место.
Суть установки пакета заключается в распаковке его содержимого (в корень) и выполнению install-скрипта. Последнее необязательно, и в том же арче в подавляющем большинстве пакетов install-скрипта нет. С распаковкой всё понятно — просто распакуй содержимое куда надо, и будет тебе «изолировано от системы». Если есть install-скрипт, то он обычно изменяет какие-то файлы в системе, например дописывает какую-то строчку. Можешь его просто прочитать и взять из своей системы те файлы, что ему нужны, а потом запустить его на них.
Штатных средств для такого не предусмотрено, потому что пакеты на то и пакеты, что устанавливаются в систему, а не изолированно. Со всеми зависимостиями и прочим. Хотя есть исключения в виде например дистрибутива NixOS.
А теперь скажи, что ты на самом деле хочешь. Какая задача стоит? Ради чего ты хотел «установить отдельно от системы»? И мы попробуем подсказать, как решить именно реальную задачу.
Штатных средств для такого не предусмотрено, потому что пакеты на то и пакеты, что устанавливаются в систему, а не изолированно.
Не стоит делать столь категоричных заявлений. Например, в Slackware вполне штатно:ROOT=/куда installpkg . ROOT=/куда removepkg .
Ну да, есть исключения.
Впрочем, это мало чем отличается от распаковки туда же.
Аналогично для rpm:rpm --root /куда .
Аналогично для pacman:pacman --root /куда .
Аналогично для dpkg:dpkg --root /куда .
Вы правило с исключениями путаете.
Отличается сильно — например, поддержкой в будущем chroot-е базы установленных пакетов, возможностью их обновления/удаления средствами ПМ.
CBSD - система управления операционным окружением в изолированных средах FreeBSD.
Как тут правильно написал анонимус, возможно, проще использовать docker
Забивать гвозди кувалдой тоже можно, но скорее так они гнуться будут :)
Дальше запускаешь свою софтину. Если совсем не доверяешь пакету, то лучше сперва поставь пакетник в контейнер и став пакет уже непосредственно в нём.
С остальными дистрами по тому же принципу.
А теперь скажи, что ты на самом деле хочешь.
Установить и запустить приложения изолированно от системы, чтобы они не трогали никакие файлы в / и /home; т.е. песочницу. Зачем:
-
например, пакет А, при установке, подтягивает за собой 20+ зависимостей и не хочу засорять систему, так как я просто хочу посмотреть, что он из себя представляет. Не всегда при удалении пакета удаляются все зависимости, которые были установлены при установке пакета; плюс к этому в /home обычно остаётся папка с настройками;
Вообще нет такой задачи «изолировать приложение от системы», есть задача «помешать лезть куда не следует»
Из «песочницы» программу хочу запустить от имени обычного пользователя. В принципе, запретить доступ к Интернету программе не нужно (пока). По аналогии, в винде есть утилита Sandboxie; только программу не нужно «контролировать», она должна выполнятся как обычная программа, только без доступа на запись в / и /home.
По-моему, для этого отлично подойдёт chroot. Только сначала нужно его настроить, да?
Суть установки пакета заключается в распаковке его содержимого (в корень) и выполнению install-скрипта.
А сам install-скрипт (если он есть) находится в корень архива? В любом случае, спасибо за инфу.
Установить и запустить приложения изолированно от системы, чтобы они не трогали никакие файлы в / и /home; т.е. песочницу.
Для этого их не нужно устанавливать в отдельный каталог. Можно, но не обязательно. Если запускать приложение от обычного пользователя, а не рута, оно и так не может ничего тронуть в /. Даже если само лежит там. Это не имеет значения. В /home может. А вот чтобы не могло и в /home, используй например firejail. Запускать так:
Соответственно, приложение запустится и будет считать каталог pseudo_home хомяком пользователя, от которого это запущено. При этом в настоящий хомяк у него доступа не будет. Не просто прав, а оно вообще не будет знать о том, что есть ещё и какой-то настоящий хомяк.
Также можно просто --private вместо --private=pseudo_home. Тогда псевдохомяк для программы будет в tmpfs и не будет сохраняться на диске вообще, то есть никаких следов. Ну и --net=none, конечно же, опционально.