Bối cảnh & Vấn đề giải quyết
Vận hành cụm máy chủ sau 6 tháng thường phát sinh lỗi lệch cấu hình (configuration drift). Script Ansible chạy thành công trên node này nhưng lại fail trên node khác do sai khác package nền tảng. Mô hình Image-based OS giải quyết triệt để bài toán này bằng cách đóng băng toàn bộ hệ điều hành thành một artifact duy nhất.
Trước đây, Packer hay Image Builder tạo image khá nặng nề. bootc (Bootable Containers) đưa tư duy container quen thuộc xuống tầng OS. Bạn viết Containerfile, build bằng podman build rồi đẩy lên GHCR hoặc Quay.io. Máy chủ kéo image đó về và nạp trực tiếp vào kernel để boot phần cứng hoặc máy ảo.
Hệ điều hành lúc này hoạt động như một image bất biến (immutable) có gắn tag rõ ràng (ví dụ v1.0.4). Khi bản update lỗi kernel, bạn rollback về trạng thái trước chỉ trong 1 lần reboot.
Chuẩn bị môi trường
Bạn cần một máy Fedora Workstation hoặc Server đã cài sẵn Podman để thao tác:
1. Cài đặt bootc
# Cài đặt bootc CLI
sudo dnf install -y podman bootc
# Kiểm tra phiên bản
bootc --version
2. Kéo image builder
Ta dùng bootc-image-builder để chuyển container image thành đĩa ảo (.qcow2, .raw hoặc .ami):
# Kéo image builder chính thức
podman pull quay.io/centos-bootc/bootc-image-builder:latest
Cấu hình chi tiết
1. Viết Containerfile định nghĩa OS
Tạo thư mục dự án và file Containerfile. Ta dùng base image Fedora bootc, cài thêm công cụ quản trị, cấu hình user và kích hoạt SSH:
FROM quay.io/fedora/fedora-bootc:40
# Cài đặt package cần thiết trong một layer duy nhất
RUN dnf -y install \
tmux \
htop \
neovim \
curl \
git \
openssh-server \
&& dnf clean all
# Bật SSH service khi khởi động
RUN systemctl enable sshd
# Tạo user quản trị và cấp quyền sudo
RUN useradd -m -G wheel -s /bin/bash sysadmin && \
echo 'sysadmin:AdminSecret123!' | chpasswd && \
echo "%wheel ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/wheel-nopasswd
# Cấu hình SSH Public Key cho user
RUN mkdir -p /home/sysadmin/.ssh && \
chmod 700 /home/sysadmin/.ssh && \
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG... user@workstation" > /home/sysadmin/.ssh/authorized_keys && \
chmod 600 /home/sysadmin/.ssh/authorized_keys && \
chown -R sysadmin:sysadmin /home/sysadmin/.ssh
2. Đóng gói OS Container Image
Thao tác build tương tự như build ứng dụng web thông thường:
podman build -t quay.io/myrepo/fedora-custom-os:v1.0 .
3. Xuất file đĩa ảo QCOW2 cho KVM / Proxmox
Chạy container builder để tạo file đĩa ảo từ image vừa build:
mkdir -p ./output
sudo podman run \
--rm \
--privileged \
--security-opt label=type:unconfined_t \
-v ./output:/output \
-v /var/lib/containers/storage:/var/lib/containers/storage \
quay.io/centos-bootc/bootc-image-builder:latest \
--type qcow2 \
--local \
quay.io/myrepo/fedora-custom-os:v1.0
Quá trình xuất đĩa mất khoảng 2-3 phút. Kết quả trả về file ./output/qcow2/disk.qcow2 (dung lượng khoảng 2.2GB – 2.5GB), sẵn sàng import vào Proxmox hoặc virt-manager để khởi chạy VM.
Kinh nghiệm thực tế khi thiết kế image
- Cơ chế phân vùng: Phân vùng
/usrđược khóa ở chế độ read-only. Chỉ/etc(chứa config) và/var(chứa logs, database, container volumes) cho phép ghi dữ liệu. - Tối ưu dung lượng: Gom toàn bộ lệnh
dnf installvà luôn chạy kèmdnf clean alltrong cùng một layer để tránh phình dung lượng image. - Tách riêng build stage: Dùng multi-stage build để biên dịch Go/Rust binary ở stage đầu, sau đó copy binary sạch sang base image bootc.
Vận hành & Giám sát
1. Kiểm tra trạng thái triển khai
Đăng nhập SSH vào máy chủ bootc và chạy lệnh kiểm tra:
sudo bootc status
Màn hình sẽ hiển thị image đang chạy (staged/booted), digest SHA256 và remote registry đang liên kết.
2. Nâng cấp hệ điều hành (In-place Upgrade)
Sau khi sửa Containerfile và push tag v1.1 lên registry, bạn chỉ cần cập nhật OS bằng 2 lệnh:
# Tải bản build mới về vùng đệm
sudo bootc upgrade
# Khởi động lại để nạp OS mới
sudo systemctl reboot
Nếu cần chuyển sang một base image khác (chẳng hạn từ bản chuẩn sang bản cài sẵn Nvidia driver):
sudo bootc switch quay.io/myrepo/fedora-nvidia-os:latest
sudo systemctl reboot
3. Rollback khi gặp sự cố
Khi bản cập nhật bị lỗi kernel panic hoặc crash service mạng, ta hoàn tác ngay lập tức:
# Quay về deployment liền trước
sudo bootc rollback
sudo systemctl reboot
Nếu server không vào được mạng, bạn có thể chọn dòng kernel cũ trực tiếp từ menu GRUB khi máy khởi động.
4. Tự động kiểm tra bản cập nhật
Kích hoạt systemd timer có sẵn để máy chủ tự động kiểm tra image mới theo chu kỳ:
sudo systemctl enable --now bootc-fetch.timer
sudo systemctl list-timers | grep bootc
Timer sẽ âm thầm pull layer mới về đĩa ở chế độ nền. Hệ thống sẽ áp dụng bản cập nhật ở lần reboot kế tiếp mà không gây gián đoạn dịch vụ đang chạy.

