引言:为什么选择 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 临时文件或挂载点。

但在服务器场景下,最推荐的做法是使用 AnsibleIgnition(CoreOS 的方式,但 Silverblue 可以通过变通方式使用)来在首次启动时进行配置。

这里我们介绍一种简单的方法:使用 tmpfiles.d

如果你需要在 /var/lib/myapp 下创建一个目录供容器使用,你可以创建一个 systemd-tmpfiles 配置。

  1. 创建配置文件(这需要 Layering 一个包含配置文件的 RPM,或者通过脚本在运行时创建)。
  2. 更简单的方法:在 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 为服务器管理带来了革命性的体验。通过本指南,你已经掌握了:

  1. 不可变系统的本质:通过 rpm-ostree 进行原子更新和回滚。
  2. 系统定制:使用 Layering 安装必要的系统工具。
  3. 容器化部署:使用 Podman 运行应用,并通过 Systemd 实现持久化和自启动。

虽然初期可能需要适应“不能随意安装软件”的思维,但一旦习惯,你会发现这种架构带来的稳定性是传统系统无法比拟的。你的服务器将变得像容器一样可预测、可复制且极其健壮。