公司动态
如何为 Universal Blue main 添加或移除软件包?packages.json 配置深度指南
如何为 Universal Blue main 添加或移除软件包packages.json 配置深度指南【免费下载链接】mainOCI base images of Fedora with batteries included项目地址: https://gitcode.com/gh_mirrors/main9/mainUniversal Blue main 是 Fedora 生态中开箱即用的 OCI 基础镜像OCI base images of Fedora with batteries included而packages.json 配置正是决定这个镜像里预装哪些软件包的核心清单。无论你是想为镜像添加常用工具比如 htop、tmux、ffmpeg还是移除默认自带的软件包只需要改好这一个 JSON 文件其余交给构建流水线即可。本文将从零开始带你彻底搞懂 packages.json 的结构、添加与移除软件包的正确姿势以及配置背后的运行原理读完你就能动手定制自己的 Fedora 镜像。 packages.json 是什么为什么它如此重要在 Universal Blue main 的仓库根目录下有一个名为 packages.json 的文件。它是一份软件包白名单 黑名单构建镜像时CI 会读取这份配置通过 dnf5 批量安装include里的软件包并移除exclude里的软件包。也就是说添加软件包 修改 include 段移除软件包 修改 exclude 段完全不需要改动任何构建脚本。这份文件是镜像内容定制的唯一入口也是项目以配置驱动构建理念的体现。而真正负责解析并执行这份配置的脚本是 build_files/packages.sh。在 Containerfile 的构建流程中它会在 build_files/install.sh 之后被调用完成最后的软件包增删动作。 packages.json 配置结构全解析打开 packages.json你会发现它只有两个顶层键include要安装的包和exclude要移除的包。每个键下面又分为三类分类键作用范围典型示例all所有镜像变体通用htop、tmux、ffmpegsilverblue仅 GNOME 桌面版Silverblueadw-gtk3-theme、ibus-mozckinoite仅 KDE 桌面版Kinoitefcitx5-mozc、kate、kcm-fcitx5举个例子仓库当前的 packages.json 中include.all里预置了distrobox、fzf、just、nvtop、smartmontools、zstd等实用工具而exclude.all则移除了fedora-third-party这类 Fedora 默认但 Universal Blue 不需要的软件包。这种全局 分桌面定制的结构非常巧妙公共工具只写一次Silverblue 和 Kinoite 各自维护专属软件列表互不干扰。➕ 如何为镜像添加软件包最快捷的配置方法给 Universal Blue main 添加软件包非常简单只需三步编辑 packages.json在include.all数组中新增一行例如添加btop终端系统监控工具。遵循 JSON 语法每个包名用双引号包裹与上一个包之间用英文逗号分隔。提交并触发构建推送改动后GitHub Actions 会自动重新构建镜像并发布新版本。如果你想让某个软件包只出现在 Silverblue 上就把它加进include.silverblue只给 Kinoite 用就放进include.kinoite。按需分类镜像体积更精简。 小贴士如果某个包在 Silverblue 和 Kinoite 都要装但base变体不需要可以同时写入两个桌面分类而不是塞进all。➖ 如何从镜像中移除软件包exclude 配置详解移除软件包的逻辑与添加完全对称。你只需在exclude段中填入要删除的包名全局移除写入exclude.all所有变体都会删掉它。比如当前配置里的google-noto-sans-cjk-vf-fonts、default-fonts-cjk-sans。按桌面移除写入exclude.silverblue或exclude.kinoite。例如当前配置中 Silverblue 移除了gnome-software-rpm-ostreeKinoite 移除了plasma-discover-rpm-ostree目的是用 Flatpak 应用商店替代系统级软件管理。一个值得注意的细节是exclude 中列出的包如果本就不存在于镜像中构建不会报错。脚本会先用rpm -qa查询实际已安装的包只对真正存在的包执行 dnf5 remove所以你可以放心写不必担心删不存在的包导致构建失败。⚙️ 配置是如何生效的揭开 packages.sh 的运行原理想深入理解配置机制就一定要看 build_files/packages.sh 这个核心脚本。它的工作流程可以拆解为四步校验 JSON先用jq empty检查 packages.json 语法是否合法格式错误会直接中止构建防止带病上线。合并软件包列表用 jq 将all与当前镜像变体通过$IMAGE_NAME环境变量判断的 include 列表合并、去重、排序。批量安装对合并后的列表执行dnf5 -y install一次性装入全部软件包。按需移除对 exclude 列表做同样的合并去重再过滤出实际安装过的包执行dnf5 -y remove。而$IMAGE_NAME如silverblue、kinoite、base和$FEDORA_MAJOR_VERSION这两个关键变量来自 Justfile 和 image-versions.yaml 的构建参数传递。也就是说同一份 packages.json会根据构建目标自动适配不同的软件包组合这也是一份配置、多镜像复用的精髓。 如何验证配置是否正确本地构建与测试指南改完 packages.json 后建议先在本地验证而不是直接依赖 CI校验 JSON 语法运行jq empty packages.json没有输出即代表格式正确。本地构建镜像使用项目自带的 Justfile 任务执行just build构建默认的 silverblue 镜像构建成功后进入容器检查软件包是否存在podman run -it --rm localhost/silverblue:44 bash rpm -q btop确认版本锁定项目会对内核等关键包执行 versionlock如果你添加的软件包恰好与锁定列表冲突构建会给出明确提示此时需要检查 build_files/install.sh 中的 versionlock 逻辑。⚠️ 注意构建前请确保本机已安装 podman并按照 CONTRIBUTING.md 的指引准备好开发环境。 常见踩坑与避坑指南逗号遗漏JSON 数组中最后一个元素不能带逗号中间元素不能漏逗号这是最常见的构建失败原因好在 packages.sh 的 jq 校验会第一时间拦住你。包名拼写请以dnf search 包名或 Fedora 软件仓库查询到的准确名称填写错误包名会导致安装阶段失败。桌面分类混淆把 GNOME 专用包写进include.kinoite会白白增加 KDE 镜像体积甚至引发依赖冲突。添加前先确认该包属于哪个桌面生态。exclude 与依赖冲突如果某包被其他包依赖dnf5 remove 可能会连带移除依赖它的软件建议先小范围测试。✅ 总结一份配置掌控整个镜像通过 packages.json 这一个文件你就能完成 Universal Blue main 镜像的软件包增删定制include段添加、exclude段移除、all与桌面分类灵活组合配合 build_files/packages.sh 的自动解析真正做到改一处、处处生效。对新手来说这可能是接触 OCI 系统镜像定制最友好、风险最低的入口——不需要懂复杂的构建脚本只需维护一份清晰的 JSON 清单。现在不妨克隆仓库动手试试git clone https://gitcode.com/gh_mirrors/main9/main在 packages.json 里加上你心仪的工具体验一把配置驱动镜像定制的乐趣吧【免费下载链接】mainOCI base images of Fedora with batteries included项目地址: https://gitcode.com/gh_mirrors/main9/main创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考