UOS 这仓库有多鬼畜,就不用我多说了,开发的时候每次都要重装一个不同版本的系统也挺麻烦,比如 1060、1063、1070、1070u1。。。

所以我就想到,我可以用构建用的 rootfs 加上仓库,整出来一个基础环境,然后通过 distrobox 来启动,这样随时都可以快速准备一个环境。

平时我用的开发工具就 neovim 和 vscode 居多,所以再配合上 nix 把 neovim 和一些 UOS 缺少的工具都装上,想想都是美滋滋。

说干就干!

构建 Docker 镜像

由于 UOS 有多个不同架构的支持,肯定不能绑死到一个平台上,我使用 docker buildx 来构建多架构镜像。rootfs 我就不公开了,直接上 Dockerfile。

FROM --platform=$TARGETPLATFORM scratch

ARG TARGETARCH
ARG UOS_VERSION

ADD buster-${TARGETARCH}-1050update4.tgz /

RUN echo "deb [trusted=yes] http://pools.uniontech.com/desktop-professional ${UOS_VERSION:-eagle/1070} main contrib non-free" > /etc/apt/sources.list

RUN apt-get update && apt-get install -y \
apt-utils \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release \
&& apt-get dist-upgrade -y \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*

CMD [ "bash" ]

这里为了方便我构建,我将仓库的名称使用变量控制了。

docker buildx build --platform=linux/amd64 -t linuxdeepin/1063:base --build-arg UOS_VERSION=eagle/1063 . --load

只需要控制 label 和 仓库名称,就能快速的创建出一个可用的 docker 镜像。使用 --load 参数构建完以后直接导入镜像,可以在 docker images 中看到。

创建 Distrobox 环境

现在有个可用的 docker 镜像,就可以使用 distrobox 创建环境了。

distrobox create --image linuxdeepin/1063:base --name 1063 --volume /nix:/nix:rw --additional-flags "--pids-limit -1"

安装 nix 的过程请参考上一篇文章,这里是把 nix 挂载到环境里了。

运行以后等待一会儿,就看到创建成功了。

Creating '1063' using image linuxdeepin/1063:base        [ OK ]
Distrobox '1063' successfully created.
To enter, run:

distrobox enter 1063

Successfully copied 2.05kB to /tmp/1063.os-release

提醒我们用 distrobox enter 1063 进入环境。

运行

运行的话没啥问题,只是需要设置一下用户密码,不知道是不是 distrobox 改变策略了,以前应该是首次进入的时候就提醒设置密码,现在必须手动先运行一下 passwd,不然 sudo 之类的命令是不能用的。

❯ distrobox enter 1063
Starting container... [ OK ]
Installing basic packages... [ OK ]
Setting up devpts mounts... [ OK ]
Setting up read-only mounts... [ OK ]
Setting up read-write mounts... [ OK ]
Setting up host's sockets integration... [ OK ]
Integrating host's themes, icons, fonts... [ OK ]
Setting up distrobox profile... [ OK ]
Setting up sudo... [ OK ]
Setting up user groups... [ OK ]
Setting up user's group list... [ OK ]
Adding user... [ OK ]
Ensuring user's access... [ OK ]

Container Setup Complete!