作为一名探索 GPU 的科学软件开发人员,特别是快速发展的平均ROC由于 AMD 生态系统以及 Vulkan,我经常加载和测试新的尖端库,其中许多库很复杂,有时还不稳定。我不想用所有这些安装弄乱我的“基本”系统,其中一些安装可能会损害系统的其他部分。我还经常需要卸载并重新安装。这个问题在 Python 开发中是众所周知的,其中开发了“虚拟环境”(又名 virtualenv)系统,允许自定义“pip”环境,其中包含不同的软件包版本,甚至 Python 版本。所以我的问题是:
在 Linux 上是否可以实现 Python 风格的虚拟环境,尤其是 Ubuntu,它允许进行与基础系统隔离的 apt(或 snap 或 flatpak 或者实际上基于源的)安装?
与 Python 虚拟环境一样,它必须满足以下标准:
a) 所有基础系统包都应该在“virtualenv”内部可见。
b) 在“virtualenv”中安装的任何东西都不应该影响外部的任何东西。
c) 当我删除虚拟环境时,它应该删除其自身的所有痕迹以及我在其中所做的与软件安装有关的任何操作。
d) 所有硬件必须可见,包括 GPU。
e) 没有必要:不同的 Linux 内核版本类似于 virtualenvs 允许的不同 python 版本。
我意识到点 c) 可能存在文件级问题,因为如果您在 python 级虚拟环境中创建文件和目录,它们之后会保留下来。因此,基于源代码的软件包安装在这方面可能会有问题,但我愿意在这方面保持灵活性。
我不想使用的一种技术是虚拟化。它不符合上述标准 a),而且通常也不符合 d)。我的“基础”系统已经相当复杂,包含常用的东西,我不想每次都重新安装它们。基于 Grub 的多个操作系统分区也不符合标准 a)。
docker 能做到这一点吗?我一直没搞清楚如何在容器内创建一种“bash 命令行”,然后开始安装东西,最后将其密封起来。我是否必须经历反复试验的“docker compose”风格工作流程才能实现这一目标?
那么 KVM、Snap、flatpak 或甚至更低级别的 cgroups 呢?某种文件系统级技术,比如 ZFS 或 btrfs?
我有什么选择?
答案1
答案2
Docker 容器不能满足:
- A)Docker 容器有自己的文件系统气泡,并且看不到系统上的其他文件,除非明确映射到容器中的某些文件/目录(但这旨在用于数据文件)。Docker 映像通常是通过在基础映像上安装额外软件来创建的,通常是已知的发行版(CentOS、Debian、Ubuntu……)。您可以通过再次运行 Dockerfile 重新创建新映像来更新。这样做的好处是,映像中的内容是可控且可重现的。
- e)根据设计,Docker 容器只是一个与其他容器一样的进程,因此它使用主机的内核。