• 首页
  • 加入
  • RSS
  • 使用 distrobox 和 nix 加速 UOS 开发

    Thursday, January 2, 2025
    justforlxz @lxz:mkacg.com


    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!