夜火笔记

fedora silverblue 配置笔记

2026-04-08
笔记 linuxfedorasilverblue
18分钟
3563字

最近又想折腾折腾linux了,之前折腾debian,manjaro 都没什么头绪,或者说是遇到自身能力无法解决的问题,于是这次试试fedora。

之前都是在vmware里尝试,这次试试hyper-v。

了解与安装

分区

本来还纠结如何分区,后来了解到fedora不需要处理这个,它有动态互通的功能,就是btrfs的”共用存储池“的特性,即多个子卷共享同一个磁盘分区,空间动态互补,不需要像传统分区那样预先分配固定大小。fedora是目前将btrfs子卷管理玩的最出色的发行版之一。

fedora默认将根目录 / 和家目录 /home 分为两个子卷。它们共享整个 VHDX 的空间。如果在 /home 下载了大量文件,/ 可用的空间就会自动减少,反之亦然。这种“自适应”是全自动的,无需任何额外配置。在安装时,直接默认就行,开箱即用。

wsl的底层技术就是用的hyper-v,那么相应的也应该有与宿主机之间的读写速度慢的问题,AI告诉我说推荐使用在windows上开SMB的方式,或者vscode远程开发的方式,不同的是一个源码放在win,一个源码放在linux。

了解silverblue

本来了解到这里就可以了,但是突然想起网上好多人推荐的silverblue,不可变发行版,对于我这种一个系统跑起来就不想再去动,不想让它轻易崩溃的懒人来说,太合适。于是又开始了解silverblue。

silverblue 系统根目录等是只读的,使用rpm-ostree技术,系统就像一个只读的镜像。更新系统不是下载包,而是直接拉取一个新的“版本快照”。

官方不建议在系统层安装开发工具,一般推荐使用ToolbxDistroboxFlatpak 。开发环境的容器无缝挂载在home目录,体验非常干净。

Distrobox 允许你在 Fedora 里面跑一个完整的、互通的 Ubuntu 等环境。可以用来安装只有deb包的软件。

toolbx

toolbox create 创建一个容器

toolbox enter 进入容器

在容器中,可以使用dnf install命令进行安装各种环境

Terminal window
1
# 创建一个名为 "laravel-dev" 的实验室
2
toolbox create -c laravel-dev
3
4
# 进入这个实验室
5
toolbox enter -c laravel-dev

vscode可以使用 Dev Containers 插件,SSH连接系统后,直接选择容器操作。

关于迁移

Silverblue 的设计初衷就是解耦。它的系统是一个镜像,你的配置在容器(Toolbx)和家目录(Home)里。

  • 平滑度:极高。
  • 迁移逻辑: 你只需要备份你的 /home 文件夹和导出 Toolbx 容器列表。在物理机装好 Silverblue 后,把 /home 还原,再重新运行一下容器构建脚本,你的整个开发环境(包括 NeoVim 配置、PHP/Python 环境)会瞬间恢复,且与虚拟机里一模一样。
  • 优势: 因为系统层是只读且标准化的,物理机和虚拟机的“系统环境”几乎没有差异。你不需要担心物理机的某个驱动安装会污染你的开发环境。

rpm-ostree

Silverblue 不使用 dnf,而是使用 rpm-ostree。它在命令行里比 dnf 更严谨:

  • 安装系统级插件: rpm-ostree install tmux(比如你想在系统层装个终端复用器)。
  • 查看系统状态: rpm-ostree status

    这里的输出会像 Git 的提交历史一样,告诉你当前系统在哪个版本,你之前“叠加”安装了哪些包。

  • 回滚系统: rpm-ostree rollback

    如果你装完某个驱动后系统进不去了,在命令行输入这个,系统会立刻变回安装驱动前的样子。

各种软件安装层级 到底哪些需要安装到toolbx中

1. 第一层:系统底座 (用 rpm-ostree 安装)

原则:只有“让硬件跑起来”或“最基础的系统工具”才装在这里。 这些软件需要重启才能生效,因为它们被“焊”在了系统镜像上。

  • 驱动程序: 如 NVIDIA 显卡驱动、打印机驱动。
  • 虚拟化工具:libvirt, virt-manager (如果你要在 Fedora 里跑 Win 虚拟机)。
  • 系统底层插件: 如特殊的输入法框架、ZSH/Fish 壳程序、VPN 客户端(如 Tailscale)。
  • 必须随系统启动的工具: 比如 tmuxhtop(如果你希望任何时候 SSH 进去都能直接用)。
2. 第二层:日常办公应用 (用 Flatpak 安装)

原则:所有带“图形界面”的成品软件。 这些软件运行在独立的沙盒里,互不干扰,也不会弄脏系统。

  • 浏览器: Chrome, Firefox。
  • 通讯/办公: 微信、飞书、Discord、LibreOffice。
  • 图形化的开发工具: VS Code、Sublime Text、Postman、Navicat。
  • 媒体播放: VLC, Spotify。
3. 第三层:开发实验室 (在 Toolbx 里安装)

原则:所有涉及“编程语言”、“编译器”、“数据库”和“频繁变动的工具”。 这是你最常敲命令的地方,也是为了保护系统不被各种 runtime(运行时)搞乱。

  • 编程语言运行时: PHP (Laravel 必备), Python (交易机器人必备), Node.js, Go, Rust。
  • 包管理器: Composer, npm, pip。
  • 命令行编译器: gcc, make。
  • 特定项目的命令行工具: Laravel Installer, AWS CLI, Docker-compose。

配置笔记

安装时,都是图形化向导,没什么好说的,而且分区也是默认的,一路选选选,下一步就安装好了,过程很快,10分钟左右。

查看 Silverblue 特有的系统状态:

Terminal window
1
rpm-ostree status

State: idle(表示系统正常)和 Deployments(显示你当前运行的版本镜像哈希值),busy 正在执行任务,有可能是系统更新。

查看详细的硬件与系统概览:

Terminal window
1
hostnamectl

基础的发行版说明:

Terminal window
1
cat /etc/os-release
Terminal window
1
# 启动 SSH 服务
2
sudo systemctl enable --now sshd

切换系统源 (rpm-ostree / dnf)

操作步骤:

  1. 进入配置目录:
Terminal window
1
cd /etc/yum.repos.d/
  1. 备份原文件(防止万一):
Terminal window
1
sudo mkdir backup
2
sudo cp fedora*.repo backup/
  1. 使用命令行替换地址(以清华源为例):
Terminal window
1
sudo sed -e 's|^metalink=|#metalink=|g' \
2
-e 's|^#baseurl=http://download.example/pub/fedora/linux|baseurl=https://mirrors.tuna.tsinghua.edu.cn/fedora|g' \
3
-i fedora.repo fedora-updates.repo fedora-modular.repo fedora-updates-modular.repo

执行的时候,提示后2个文件不存在

  1. 刷新缓存: 提示命令不存在
Terminal window
1
rpm-ostree cleanup --metadata

切换应用源 (Flatpak / Flathub)

你平时在“软件商店”下载的东西大多来自 Flathub。默认源在国内极慢,建议切换到 上海交大 (SJTU)上海科技大学 的镜像。

操作步骤:

  1. 添加国内镜像远程库:
Terminal window
1
# 以交大镜像为例
2
sudo flatpak remote-modify flathub --url=https://mirror.sjtu.edu.cn/flathub
  1. 验证是否生效:
1
flatpak remotes -d

你会看到 flathub 的 URL 已经变成了国内地址。

切换开发环境源 (Toolbx / Container)

  1. 进入容器:toolbox enter
  2. 执行与前面类似的 sed 命令,或者直接安装 dnf-plugins-core 并使用 dnf config-manager

常用工具

Terminal window
1
sudo rpm-ostree install fish btop tmux distrobox grubby fastfetch

安装Homebrew

Terminal window
1
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
2
# 按提示操作
3
- Run these commands in your terminal to add Homebrew to your PATH:
4
echo >> /var/home/[your_user_name]/.config/fish/config.fish
5
echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv fish)"' >> /var/home/[your_user_name]/.config/fish/config.fish
6
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv fish)"
7
- Install Homebrew's dependencies if you have sudo access:
8
sudo dnf group install development-tools
9
For more information, see:
10
https://docs.brew.sh/Homebrew-on-Linux
11
- We recommend that you install GCC:
12
brew install gcc
13
- Run brew help to get started
14
- Further documentation:
15
https://docs.brew.sh

homebrew 换源

fish,非bash,将核心库切换至中科大镜像(USTC):

Terminal window
1
# 修改 brew 核心程序源
2
git -C (brew --repo) remote set-url origin https://mirrors.ustc.edu.cn/brew.git
3
4
# 修改 homebrew-core 源
5
# git -C (brew --repo)/Library/Taps/homebrew/homebrew-core remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git
6
7
# 创建配置目录(如果不存在)
8
mkdir -p ~/.config/fish
9
10
# 将环境变量写入 config.fish
11
echo '
12
# Homebrew 镜像配置
13
set -gx HOMEBREW_INSTALL_FROM_API 1
14
set -gx HOMEBREW_API_DOMAIN "https://mirrors.ustc.edu.cn/homebrew-bottles/api"
15
set -gx HOMEBREW_BOTTLE_DOMAIN "https://mirrors.ustc.edu.cn/homebrew-bottles"
6 collapsed lines
16
set -gx HOMEBREW_BREW_GIT_REMOTE "https://mirrors.ustc.edu.cn/brew.git"
17
set -gx HOMEBREW_CORE_GIT_REMOTE "https://mirrors.ustc.edu.cn/homebrew-core.git"
18
' >> ~/.config/fish/config.fish
19
20
# 立即在当前会话生效
21
source ~/.config/fish/config.fish

vi ~/.config/fish/config.fish 在文件顶部添加:

Terminal window
1
# 自动初始化 Homebrew 环境变量 (无论在宿主机还是容器)
2
if test -d /home/linuxbrew/.linuxbrew
3
set -gx HOMEBREW_PREFIX "/home/linuxbrew/.linuxbrew"
4
set -gx HOMEBREW_CELLAR "/home/linuxbrew/.linuxbrew/Cellar"
5
set -gx HOMEBREW_REPOSITORY "/home/linuxbrew/.linuxbrew/Homebrew"
6
fish_add_path -m /home/linuxbrew/.linuxbrew/bin /home/linuxbrew/.linuxbrew/sbin
7
# 初始化 Homebrew 环境变量
8
# 这行代码会自动设置 PATH, MANPATH 等
9
# eval (/home/linuxbrew/.linuxbrew/bin/brew shellenv)
10
end

这样你只需安装一次,以后不管在哪个容器里,直接输入 fastfetch 都能用。
不行 需要安装软件后,穿透别名才行

Terminal window
1
# --- Silverblue 命令穿透方案 ---
2
3
# 1. 定义核心运行函数 (指向你安装了 Brew 的容器名)
4
function tb
5
toolbox run --container laravel10 $argv
6
end
7
8
# 2. 建立常用工具的“映射”
9
# 这样你在宿主机输入这些命令时,系统会自动去容器里跑
10
alias brew='tb brew'
11
# alias fastfetch='tb fastfetch'
12
alias tldr='tb tldr'
13
alias fnm='tb fnm'
14
alias yazi='tb yazi'
15
2 collapsed lines
16
# 3. 别名补全 (让 Tab 键更好用)
17
complete -c tb -w toolbox

Homebrew安装常用工具

Terminal window
1
brew install yazi ffmpeg sevenzip jq poppler fd ripgrep fzf zoxide fnm tldr neovim
2
tldr --update

在 Linux (Silverblue) 内部“填零”

Linux 删除文件只是在文件系统层面标记为“已删”,底层数据还在。我们需要用 fstrim 告诉 Hyper-V 哪些空间是真正没用的。

Terminal window
1
sudo fstrim -av

tailscale

https://tailscale.com/docs/install/linux

Terminal window
1
# 直接使用 curl 下载仓库配置文件
2
sudo curl -Lo /etc/yum.repos.d/tailscale.repo https://pkgs.tailscale.com/stable/fedora/tailscale.repo
3
4
# 安装 tailscale
5
sudo rpm-ostree install tailscale
6
7
systemctl reboot
8
9
# 启动并设置开机自启
10
sudo systemctl enable --now tailscaled
11
12
# 登录并连接(这会给你一个认证链接)
13
sudo tailscale up

腾讯云 OpenCloudos 发行版,参考这个centos7的操作 可以安装
https://tailscale.com/docs/install/centos/centos-7

宿主机能访问容器中的网页,但是其他tailscale网络中的机器无法访问

package.json中的命令,监听0.0.0.0的ip

Terminal window
1
php artisan serve --host=0.0.0.0 --port=8000

如果网页能打开,但是样式全乱了或者报错,那是 Vite 的问题。Vite 默认只在 localhost 运行。 vite.config.js

Terminal window
1
export default defineConfig({
2
server: {
3
host: '0.0.0.0', // 允许外部访问
4
hmr: {
5
host: '100.x.y.z' // 这里填你虚拟机的 Tailscale IP
6
},
7
},
8
});

silverblue运行:

Terminal window
1
# 1. 将 tailscale 接口加入到信任区域(或允许其端口)
2
sudo firewall-cmd --permanent --add-service=http # 实际这一步就足够了
3
sudo firewall-cmd --permanent --add-port=8000/tcp
4
sudo firewall-cmd --permanent --add-port=5173/tcp
5
6
# 2. 关键:允许来自 tailscale 网段的流量(如果上面不生效)
7
sudo firewall-cmd --permanent --zone=public --add-interface=tailscale0
8
9
# 3. 刷新配置
10
sudo firewall-cmd --reload

toolbox容器安装laravel10环境

创建并进入环境

Terminal window
1
toolbox create -c laravel10
2
toolbox enter laravel10

换源

Terminal window
1
sudo sed -e 's|^metalink=|#metalink=|g' \
2
-e 's|^#baseurl=http://download.example/pub/fedora/linux|baseurl=https://mirrors.tuna.tsinghua.edu.cn/fedora|g' \
3
-i /etc/yum.repos.d/fedora.repo /etc/yum.repos.d/fedora-updates.repo

常用工具

silverblue宿主上的一些命令并不能带进toolbox容器环境中,需要再行安装,如fish,yazi,fastfetch等。

Terminal window
1
sudo dnf install fish fastfetch lrzsz

设置默认shell为fish

Terminal window
1
vi ~/.bashrc

在文件的最顶部添加以下逻辑:

Terminal window
1
# 如果当前在交互式模式,且存在 fish 命令,且不在 fish 进程中
2
if [[ $- == *i* ]] && command -v fish >/dev/null 2>&1 && [[ $(ps -p $PPID -o comm=) != "fish" ]]; then
3
export SHELL=$(command -v fish) # 强制更新环境变量
4
exec fish
5
fi

原理: exec 命令会用 Fish 进程替换掉当前的 Bash 进程。这意味着当你退出 Fish 时,容器窗口会直接关闭,而不会退回到 Bash,非常干净。

homebrew与前面的安装相同 yazi也同上

Docker命令映射

Terminal window
1
rpm-ostree install podman-docker
2
# 容器中安装 podman-docker 插件,它会自动创建一个 docker 别名指向 podman
3
sudo dnf install podman-docker

降级安装PHP 8.1

使用Remi 配置包降级

Terminal window
1
# 如果你是 Fedora 41
2
sudo dnf install -y https://rpms.remirepo.net/fedora/remi-release-41.rpm
3
4
# 如果你是 Fedora 42
5
sudo dnf install -y https://rpms.remirepo.net/fedora/remi-release-42.rpm
6
7
# 或
8
sudo dnf install -y https://rpms.remirepo.net/fedora/remi-release-$(rpm -E %fedora).rpm

安装remi后才能使用dnf module命令

Terminal window
1
# 重置模块状态
2
sudo dnf module reset php -y
3
# 启用remi的8.1模块
4
sudo dnf module enable php:remi-8.1 -y
5
# 安装PHP8.1
6
sudo dnf install -y php-cli php-common php-mbstring php-xml php-zip php-curl php-mysqlnd php-bcmath php-gd php-intl php-opcache php-pdo

安装composer

Terminal window
1
# 在容器内执行
2
curl -sS https://getcomposer.org/installer | php
3
sudo mv composer.phar /usr/local/bin/composer
4
5
# 验证版本和关联的 PHP
6
composer --version
7
# 确保输出中显示的 PHP 版本是 8.1.x

安装sail(可选)

https://docs.golaravel.com/docs/10.x/sail
在已有项目中安装:

Terminal window
1
composer require laravel/sail --dev

生成配置文件(交互式)

Terminal window
1
php artisan sail:install

.env 环境变量

Terminal window
1
SAIL_PHP_VERSION=8.1

启动sail

Terminal window
1
./vendor/bin/sail up -d

别名

Terminal window
1
alias sail='bash vendor/bin/sail'

Fast Node Manager (fnm)

安装

Terminal window
1
curl -fsSL https://fnm.vercel.app/install | bash

配置fish ~/.config/fish/config.fish

Terminal window
1
# fnm
2
set PATH "$HOME/.local/share/fnm" $PATH
3
fnm env --use-on-cd | source

使用

Terminal window
1
fnm install 20 # 安装最新的 v20
2
fnm install 18.16.0 # 安装精确版本
3
fnm use 20 # 切换到 v20
4
# 其他
5
fnm list # 查看已安装
6
fnm list-remote # 查看远程可用
7
fnm uninstall 20 # 卸载版本
8
fnm default 20 # 设置默认值

Podman安装Mariadb数据库

Silverblue 中(不进入Toolbox) 推荐后面的Quadlet方式

  1. 创建并启动MariaDB容器:
Terminal window
1
# 创建数据存放目录(确保重启不丢数据)
2
mkdir -p ~/.local/share/mariadb
3
4
# 启动容器
5
podman run -d \
6
--name maria_db \
7
--label "io.containers.autoupdate=image" \
8
-e MARIADB_ROOT_PASSWORD=your_password \
9
-e MARIADB_DATABASE=laravel_db \
10
-p 3306:3306 \
11
-v ~/.local/share/mariadb:/var/lib/mysql:Z \
12
docker.io/library/mariadb:latest
  1. 将容器变成“系统服务” (实现开机自启) systemd方式
Terminal window
1
# 创建用户级别的 systemd 配置目录
2
mkdir -p ~/.config/systemd/user/
3
4
# 生成服务文件
5
cd ~/.config/systemd/user/
6
podman generate systemd --name mariadb_db --files --new
7
8
# 重新加载并启用服务
9
systemctl --user daemon-reload
10
systemctl --user enable --now container-maria_db.service

Quadlet方式

Quadlet 方式 与上面的systemd的方式2选1即可

Terminal window
1
# 创建数据存放目录(确保重启不丢数据)
2
mkdir -p ~/.local/share/mariadb
3
4
mkdir -p ~/.config/containers/systemd/
5
6
nvim ~/.config/containers/systemd/maria_db.container
1
[Unit]
2
Description=MariaDB Local Database
3
After=network-online.target
4
5
[Container]
6
Image=docker.io/library/mariadb:latest
7
ContainerName=maria_db
8
PublishPort=3306:3306
9
Environment=MARIADB_ROOT_PASSWORD=your_password
10
Environment=MARIADB_DATABASE=laravel_db
11
Volume=%h/.local/share/mariadb:/var/lib/mysql:Z
12
Label=io.containers.autoupdate=image
13
14
[Install]
15
# 这一行确保开机自启
1 collapsed line
16
WantedBy=default.target

生效配置

Terminal window
1
# 先删除旧的手动运行容器
2
podman rm -f local-db
3
4
# 让 systemd 识别 Quadlet
5
systemctl --user daemon-reload
6
7
# 启动服务 quadlet的方式不需要enable
8
# systemctl --user enable --now maria_db.service
9
# 直接启动服务
10
systemctl --user start maria_db.service

查看是否生效

Terminal window
1
systemctl --user status maria_db.service
2
# 显示 active (running) 为正常
  1. 确保用户未登录时也能运行 默认情况下,用户级别的 systemd 会在退出登录时停止。我们需要开启“常驻”
Terminal window
1
sudo loginctl enable-linger $USER
Terminal window
1
# 停止服务
2
systemctl --user stop maria_db.service
3
# 再次启动
4
systemctl --user start maria_db.service

创建新的数据库

使用数据库管理工具 或: silverblue执行

Terminal window
1
# 进入正在运行的本地数据库容器并打开命令行
2
podman exec -it local-db mariadb -u root -p

输入你设置的密码后,在 MariaDB 命令行里输入:

1
CREATE DATABASE some_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2
-- 重复上面的命令可以创建更多库
3
EXIT;

Podman安装Redis

Quadlet模式

Terminal window
1
mkdir -p ~/.local/share/local_redis

nvim ~/.config/containers/systemd/local_redis.container

1
[Unit]
2
Description=Redis Service
3
4
[Container]
5
Image=docker.io/library/redis:alpine
6
ContainerName=local_redis
7
PublishPort=6379:6379
8
# 如果需要数据持久化,可以挂载卷
9
Volume=%h/.local/share/local_redis:/data:Z
10
11
[Install]
12
WantedBy=default.target
Terminal window
1
systemctl --user daemon-reload
2
# systemctl --user enable --now local-redis.service
3
systemctl --user start local_redis.service
4
5
sudo loginctl enable-linger $USER

安装claude code codex

进入toolbox容器

Terminal window
1
node -v
2
npm -v
3
4
# 安装 Claude Code
5
npm install -g @anthropic-ai/claude-code
6
# 安装完成后,直接输入以下命令并按照提示进行身份验证(需要 Anthropic API Key)
7
claude
本文标题:fedora silverblue 配置笔记
文章作者:夜火/xloong
发布时间:2026-04-08
Copyright 2026
站点地图