Fedora Silverblue 服务器配置指南 轻松搞定不可变系统部署与容器化管理
引言:为什么选择 Fedora Silverblue 作为服务器?
在现代服务器管理中,稳定性、安全性和可重复性是核心诉求。传统的基于包管理的 Linux 发行版(如标准的 Fedora Server 或 Ubuntu)虽然灵活,但随着时间的推移,软件包的累积、配置文件的随意修改往往会导致“配置漂移”(Configuration Drift),使得服务器变得难以维护和复现。
Fedora Silverblue 作为一个以“不可变性”(Immutability)为核心的发行版,通过其独特的 OSTree 文件系统和 Podman 容器运行时,完美解决了这些问题。虽然它最初是为桌面设计的,但其理念非常适合服务器环境,特别是用于运行容器化应用、构建 CI/CD 流水线节点或作为边缘计算设备。
本指南将详细指导你如何在服务器环境中部署、配置和管理 Fedora Silverblue,利用其不可变特性实现“原子级”更新和回滚,并通过 Podman 进行应用部署。
第一部分:理解 Fedora Silverblue 的核心概念
在开始配置之前,我们需要理解几个关键概念,这将帮助你更好地驾驭这个系统。
1. 不可变文件系统 (Immutable Filesystem)
在 Silverblue 中,/usr、/etc、/lib 等核心系统目录是只读的。你不能像在传统 Linux 中那样直接运行 dnf install 来安装系统级软件。这确保了系统状态的一致性。任何对系统的修改(包括更新)都是以原子方式进行的——要么完全成功,要么完全失败,不会留下半安装的状态。
2. OSTree:系统的 Git
OSTree 是 Silverblue 的基石。你可以把它想象成针对操作系统的 Git。
- 基座 (Base):系统的核心镜像。
- 提交 (Commit):系统的每一个状态都有一个哈希值。
- 部署 (Deployment):当前启动的系统状态。
- 回滚 (Rollback):如果更新出了问题,只需重启即可回到上一个版本。
3. Layering (分层) 与 Packages
虽然系统核心是只读的,但你仍然可以安装 RPM 包。这被称为“分层”。Silverblue 会将你的包叠加在核心系统之上,生成一个新的可引导镜像。但这应该只用于系统级工具(如 tmux, bind-utils 等),日常应用应使用容器。
4. Podman:无守护进程的容器引擎
Fedora Silverblue 预装了 Podman。它兼容 Docker 命令,但不需要以 root 身份运行守护进程(Daemonless),且与 Systemd 集成良好。这是在 Silverblue 上运行服务的标准方式。
第二部分:服务器环境下的安装与初始化
1. 获取镜像
对于服务器,建议下载 Fedora Silverblue 的 ISO 镜像。虽然有专门的 IoT 版本,但 Silverblue 提供了更完整的工具链。
下载地址: https://silverblue.fedoraproject.org/download
2. 安装过程
安装过程与标准 Fedora 类似,但在分区时有几个建议:
- 自动分区:推荐使用 Btrfs 文件系统,它与 OSTree 配合良好。
- 手动分区:如果你需要特定的布局,确保
/var有足够的空间存放容器镜像和数据。
3. 首次启动后的基础设置
安装完成后,以 root 或创建的用户身份登录。
A. 设置 root 密码
默认情况下,Silverblue 禁用了 root 账户的密码登录。如果需要 root 权限,请设置密码:
sudo passwd root B. 配置网络(服务器关键)
如果是服务器,静态 IP 是必须的。使用 NetworkManager 的文本界面工具 nmtui:
sudo nmtui 选择 “Edit a connection”,配置你的网卡 IP、网关和 DNS。
C. 启用 SSH 服务
服务器通常需要远程管理。由于系统不可变,我们不能直接 systemctl enable sshd(重启后会失效)。我们需要使用 rpm-ostree 将 SSH 服务“固化”在系统中。
第三部分:系统定制与软件管理 (rpm-ostree)
这是 Silverblue 与传统服务器系统最大的不同之处。我们将使用 rpm-ostree 命令来管理基座系统。
1. 检查当前系统状态
rpm-ostree status 你会看到类似输出,显示当前的基座版本和部署情况。
2. 安装系统级工具 (Layering)
假设我们需要安装 tmux(终端复用工具)和 bind-utils(DNS 工具),以及最重要的 cockpit(Web 管理界面)。
注意: 每次 Layering 后,系统都会下载新的 RPM 包并生成一个新的 OS 镜像,需要重启才能生效。
# 搜索包(可选,因为不能直接 dnf search) # 我们直接安装 sudo rpm-ostree install tmux bind-utils cockpit # 查看状态(此时会显示 Pending deployment) rpm-ostree status # 重启以应用更改 sudo systemctl reboot 3. 启用 Cockpit (Web 管理界面)
Cockpit 是管理服务器的神器。安装后,它默认是启用的(如果安装了 cockpit-system 包)。
# 检查防火墙是否放行了 9090 端口 sudo firewall-cmd --list-ports # 如果没有,放行它(这也会在重启后丢失,除非我们 Layering 了防火墙配置,或者使用下面的持久化方法) sudo firewall-cmd --add-port=9090/tcp --permanent sudo firewall-cmd --reload 现在,你可以在浏览器访问 https://服务器IP:9090 登录管理服务器。
4. 移除软件 (Uninstall)
如果你想移除之前 Layering 的包:
sudo rpm-ostree uninstall tmux sudo systemctl reboot 5. 升级系统
升级系统非常简单且安全:
sudo rpm-ostree upgrade sudo systemctl reboot 如果升级后发现问题,只需运行 sudo rpm-ostree rollback 即可回滚。
第四部分:容器化管理 (Podman)
在 Silverblue 上,我们不建议直接在基座系统安装 Web 服务器(如 Nginx)或数据库(如 PostgreSQL)。我们应该使用 Podman 运行容器。
1. 运行一个 Nginx 容器
让我们快速启动一个 Web 服务。
# 拉取镜像 podman pull docker.io/library/nginx # 运行容器(后台运行,映射端口) podman run -d --name my-web -p 8080:80 docker.io/nginx # 检查状态 podman ps 现在访问 http://服务器IP:8080,你应该能看到 Nginx 的欢迎页面。
2. 使用 Systemd 管理容器 (自启动)
服务器重启后,容器不会自动启动。我们需要生成一个 Systemd 单元文件来管理它。Podman 提供了非常方便的命令。
# 生成 systemd 单元文件 # --files: 生成文件 # --name: 容器名称 # --new: 尝试在启动时重新创建容器(如果不存在) mkdir -p ~/.config/systemd/user/ podman generate systemd --name my-web --files --new # 重新加载 systemd 配置 systemctl --user daemon-reload # 启用并启动服务 systemctl --user enable --now container-my-web.service 重要提示: 如果你是以普通用户运行的,上述命令使用的是用户级 systemd 服务。如果希望服务在系统启动时运行(即使没有用户登录),你需要配置 Lingering:
sudo loginctl enable-linger <username> 这样,即使注销用户,用户的 systemd 实例也会一直运行。
3. 持久化容器数据
容器默认是临时的。为了保存数据(如数据库数据),我们需要挂载卷。由于 Silverblue 的主目录通常是 Btrfs,这很适合存储。
# 创建一个目录用于存储数据 mkdir -p ~/containers/postgres_data # 运行 Postgres 并挂载卷 podman run -d --name my-postgres -e POSTGRES_PASSWORD=mysecretpassword -v ~/containers/postgres_data:/var/lib/postgresql/data -p 5432:5432 docker.io/library/postgres 第五部分:进阶技巧 - 编写自定义 Systemd 服务 (使用 Ansible 或脚本)
在不可变系统上,如果你想运行一个自定义的启动脚本(例如在启动时挂载某个特定的网络存储或生成配置文件),直接修改 /etc 是不行的。
解决方案:使用 Systemd 临时文件或挂载点。
但在服务器场景下,最推荐的做法是使用 Ansible 或 Ignition(CoreOS 的方式,但 Silverblue 可以通过变通方式使用)来在首次启动时进行配置。
这里我们介绍一种简单的方法:使用 tmpfiles.d。
如果你需要在 /var/lib/myapp 下创建一个目录供容器使用,你可以创建一个 systemd-tmpfiles 配置。
- 创建配置文件(这需要 Layering 一个包含配置文件的 RPM,或者通过脚本在运行时创建)。
- 更简单的方法:在 Podman 启动脚本中处理。
最佳实践: 尽量让容器自己处理配置(通过环境变量),或者使用 podman run 的 --volume 挂载宿主机的配置文件。如果宿主机没有配置文件,可以在宿主机上创建一个位于 /var/lib/containers 下的目录(这个目录通常可写),然后挂载进去。
第六部分:故障排除与维护
1. 空间不足
Silverblue 的镜像会占用空间。如果空间不足,可以清理旧的部署:
# 清理旧的部署(保留最近 2 个) sudo rpm-ostree cleanup -p 2 2. 调试容器
如果容器启动失败:
# 查看日志 podman logs my-web # 进入容器内部 podman exec -it my-web /bin/bash 3. 修复损坏的部署
如果系统无法启动,可以通过 GRUB 菜单选择旧的部署进入,然后在系统内执行:
sudo rpm-ostree rollback 总结
Fedora Silverblue 为服务器管理带来了革命性的体验。通过本指南,你已经掌握了:
- 不可变系统的本质:通过
rpm-ostree进行原子更新和回滚。 - 系统定制:使用 Layering 安装必要的系统工具。
- 容器化部署:使用 Podman 运行应用,并通过 Systemd 实现持久化和自启动。
虽然初期可能需要适应“不能随意安装软件”的思维,但一旦习惯,你会发现这种架构带来的稳定性是传统系统无法比拟的。你的服务器将变得像容器一样可预测、可复制且极其健壮。
支付宝扫一扫
微信扫一扫