Как научный разработчик программного обеспечения, исследующий графические процессоры и, в частности, быстро развивающуюся экосистему ROCm для AMD, а также Vulkan, я часто загружаю и тестирую новые передовые библиотеки, многие из которых сложны и иногда нестабильны. Я не хочу загромождать мою «базовую» систему всеми этими установками, некоторые из которых могут делать то, что вредит другим частям системы. Мне также часто нужно удалить и переустановить. Эта проблема хорошо известна в разработке на Python, где была разработана система «виртуальной среды» (aka virtualenv), позволяющая создавать собственные среды «pip» с различными версиями пакетов и даже версиями Python внутри них. Итак, мой вопрос:
Возможно ли использование virtualenv в стиле Python в Linux и, в частности, в Ubuntu, которое допускает установки apt (или snap, или flatpak, или даже на основе исходного кода), которые запечатаны вне базовой системы?
Как и Python virtualenvs, он должен соответствовать следующим критериям:
a) Все пакеты базовой системы должны быть видны изнутри «virtualenv» .
б) Все, что установлено внутри «virtualenv», не должно быть в состоянии повлиять на что-либо снаружи.
в) Когда я удаляю virtualenv, он должен удалить все следы самого себя и все, что я когда-либо делал внутри него в отношении установки программного обеспечения.
d) Все оборудование должно быть видимым, включая графические процессоры.
e) необязательно: разные версии ядра Linux аналогичны разным версиям python, которые позволяют virtualenv.
Я понимаю, что могут быть проблемы на уровне файлов с пунктом c), потому что если вы создадите файлы и каталоги в virtualenv уровня python, они останутся после этого. Таким образом, установка пакетов на основе исходного кода может быть проблематичной в этом отношении, но я готов проявить гибкость в этом вопросе.
Одна технология, которую я не хочу использовать, это виртуализация. Это не соответствует критерию а) выше и часто не соответствует г). Моя «базовая» система уже довольно сложна с часто используемыми вещами, и я не хочу переустанавливать их каждый раз. Несколько разделов ОС на основе Grub также не соответствуют критерию а).
Может ли докер сделать это? Я никогда не мог понять, как создать своего рода «командную строку bash» в контейнере, чтобы я мог затем начать установку вещей, в которые затем красиво закрываются. Должен ли я проходить рабочий процесс в стиле "docker compose" методом проб и ошибок, чтобы достичь этой цели?
Как насчет KVM, Snap, flatpak или даже более низкого уровня cgroups? Какие-то технологии на уровне файловой системы, например, ZFS или btrfs?
Какие у меня варианты?
Контейнер Docker не удовлетворяет:
Чтобы вести себя еще более как «обычная система Ubuntu» вместо Docker, я думаю, вы могли бы рассмотреть контейнеры LXD .