在体验一段时间的 fedora 不可变原子操作系统接触到了一个叫 bootc 的技术,它基于 ostree,允许通过 OCI 标准的 Containerfile(Dockerfile) 来构建一个可引导启动的容器镜像。可实现叠层更新的同时,也可切换任意一份构建好的容器镜像来作为操作系统基座,同时原子更新和回滚机制也有,可实现类似 rpm-ostree rollback 和 update 的功能,是一套演进和替代方案。
目前 bootc 相对比较适合用于红帽系发行版,像 fedora、rhl、centos 都有不错的适配,其他发行版系不太了解,也许理论上也行但看社区适配程度如何。这里像 fedora 的话可以直接通过软件源来直装 bootc
sudo dnf install bootc
通过一个标准的 Containerfile 来定义整个操作系统,包括基础镜像、软件包、配置等。过程和构建应用容器镜像完全一样,可以使用 Podman、Docker 或 CI/CD 管道完成,具体的 dockerfile 或 Containerfile 请移步相关的容器教程。
这是一个简单的 Containerfile 文件:
# 拿到某个发行版的基础镜像
FROM quay.io/fedora/fedora-bootc:44
# 安装一些软件包..可看自己的需要来
RUN dnf -y install btop fastfetch
# 创建一个 tester 用户和家目录,设置了密码为 tester123
RUN useradd -m -G wheel -c "Test" tester \
&& echo 'tester:tester123' | chpasswd
最后使用以下命令来构建镜像:
sudo podman build -t test-bootc:latest -f <容器文件路径> <容器文件所在的目录>
构建完成后,我们可以在 sudo podman images 找到我们构建好的镜像
接下来可以使用 bootc 命令将基础系统切换到某个本地容器镜像,输入:
sudo bootc switch --transport containers-storage localhost/test-bootc
这样会切换成 test-bootc 这个镜像,完成后再重启系统即可。
切换完成后,系统会保留现有的 /etc 和 /var 状态(包括用户主目录),确保配置的连续性。
后续如果基于这个 test-bootc 镜像做系统更新,也只需要再构建一次 test-bootc 然后 sudo bootc update
如果需要将容器镜像运行在 qemu/kvm 虚拟机,可使用 bcvk 来导出 qcow2 格式,可通过源来安装:
sudo dnf install bcvk
使用 bcvk 命令来将镜像输出为 qcow2 格式文件
sudo bcvk to-disk \
--format=qcow2 \
--disk-size 20G \
--filesystem ext4 \
localhost/test-bootc:latest \
output-disk.qcow2
qemu 运行 qcow2 方式
sudo qemu-system-x86_64 \
--enable-kvm \
-cpu host \
-smp 2 \
-m 4096 \
-drive file=/path/to/output-disk.qcow2,if=virtio,format=qcow2 \
-net nic -net user,hostfwd=tcp::2222-:22
