最近又想折腾折腾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技术,系统就像一个只读的镜像。更新系统不是下载包,而是直接拉取一个新的“版本快照”。
官方不建议在系统层安装开发工具,一般推荐使用Toolbx 或 Distrobox 或 Flatpak 。开发环境的容器无缝挂载在home目录,体验非常干净。
Distrobox 允许你在 Fedora 里面跑一个完整的、互通的 Ubuntu 等环境。可以用来安装只有deb包的软件。
toolbx
toolbox create 创建一个容器
toolbox enter 进入容器
在容器中,可以使用dnf install命令进行安装各种环境
1# 创建一个名为 "laravel-dev" 的实验室2toolbox create -c laravel-dev3
4# 进入这个实验室5toolbox enter -c laravel-devvscode可以使用 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)。
- 必须随系统启动的工具: 比如
tmux或htop(如果你希望任何时候 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 特有的系统状态:
1rpm-ostree statusState: idle(表示系统正常)和 Deployments(显示你当前运行的版本镜像哈希值),busy 正在执行任务,有可能是系统更新。
查看详细的硬件与系统概览:
1hostnamectl基础的发行版说明:
1cat /etc/os-release1# 启动 SSH 服务2sudo systemctl enable --now sshd切换系统源 (rpm-ostree / dnf)
操作步骤:
- 进入配置目录:
1 cd /etc/yum.repos.d/- 备份原文件(防止万一):
1sudo mkdir backup2sudo cp fedora*.repo backup/- 使用命令行替换地址(以清华源为例):
1sudo 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个文件不存在
- 刷新缓存: 提示命令不存在
1rpm-ostree cleanup --metadata切换应用源 (Flatpak / Flathub)
你平时在“软件商店”下载的东西大多来自 Flathub。默认源在国内极慢,建议切换到 上海交大 (SJTU) 或 上海科技大学 的镜像。
操作步骤:
- 添加国内镜像远程库:
1# 以交大镜像为例2sudo flatpak remote-modify flathub --url=https://mirror.sjtu.edu.cn/flathub- 验证是否生效:
1flatpak remotes -d你会看到 flathub 的 URL 已经变成了国内地址。
切换开发环境源 (Toolbx / Container)
- 进入容器:
toolbox enter - 执行与前面类似的
sed命令,或者直接安装dnf-plugins-core并使用dnf config-manager。
常用工具
1sudo rpm-ostree install fish btop tmux distrobox grubby fastfetch安装Homebrew
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.fish5 echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv fish)"' >> /var/home/[your_user_name]/.config/fish/config.fish6 eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv fish)"7- Install Homebrew's dependencies if you have sudo access:8 sudo dnf group install development-tools9 For more information, see:10 https://docs.brew.sh/Homebrew-on-Linux11- We recommend that you install GCC:12 brew install gcc13- Run brew help to get started14- Further documentation:15 https://docs.brew.shhomebrew 换源
fish,非bash,将核心库切换至中科大镜像(USTC):
1# 修改 brew 核心程序源2git -C (brew --repo) remote set-url origin https://mirrors.ustc.edu.cn/brew.git3
4# 修改 homebrew-core 源5# git -C (brew --repo)/Library/Taps/homebrew/homebrew-core remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git6
7# 创建配置目录(如果不存在)8mkdir -p ~/.config/fish9
10# 将环境变量写入 config.fish11echo '12# Homebrew 镜像配置13set -gx HOMEBREW_INSTALL_FROM_API 114set -gx HOMEBREW_API_DOMAIN "https://mirrors.ustc.edu.cn/homebrew-bottles/api"15set -gx HOMEBREW_BOTTLE_DOMAIN "https://mirrors.ustc.edu.cn/homebrew-bottles"6 collapsed lines
16set -gx HOMEBREW_BREW_GIT_REMOTE "https://mirrors.ustc.edu.cn/brew.git"17set -gx HOMEBREW_CORE_GIT_REMOTE "https://mirrors.ustc.edu.cn/homebrew-core.git"18' >> ~/.config/fish/config.fish19
20# 立即在当前会话生效21source ~/.config/fish/config.fishvi ~/.config/fish/config.fish 在文件顶部添加:
1# 自动初始化 Homebrew 环境变量 (无论在宿主机还是容器)2if test -d /home/linuxbrew/.linuxbrew3 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/sbin7 # 初始化 Homebrew 环境变量8 # 这行代码会自动设置 PATH, MANPATH 等9 # eval (/home/linuxbrew/.linuxbrew/bin/brew shellenv)10end这样你只需安装一次,以后不管在哪个容器里,直接输入 fastfetch 都能用。
不行 需要安装软件后,穿透别名才行
1# --- Silverblue 命令穿透方案 ---2
3# 1. 定义核心运行函数 (指向你安装了 Brew 的容器名)4function tb5 toolbox run --container laravel10 $argv6end7
8# 2. 建立常用工具的“映射”9# 这样你在宿主机输入这些命令时,系统会自动去容器里跑10alias brew='tb brew'11# alias fastfetch='tb fastfetch'12alias tldr='tb tldr'13alias fnm='tb fnm'14alias yazi='tb yazi'15
2 collapsed lines
16# 3. 别名补全 (让 Tab 键更好用)17complete -c tb -w toolboxHomebrew安装常用工具
1brew install yazi ffmpeg sevenzip jq poppler fd ripgrep fzf zoxide fnm tldr neovim2tldr --update在 Linux (Silverblue) 内部“填零”
Linux 删除文件只是在文件系统层面标记为“已删”,底层数据还在。我们需要用 fstrim 告诉 Hyper-V 哪些空间是真正没用的。
1sudo fstrim -avtailscale
https://tailscale.com/docs/install/linux
1# 直接使用 curl 下载仓库配置文件2sudo curl -Lo /etc/yum.repos.d/tailscale.repo https://pkgs.tailscale.com/stable/fedora/tailscale.repo3
4# 安装 tailscale5sudo rpm-ostree install tailscale6
7systemctl reboot8
9# 启动并设置开机自启10sudo systemctl enable --now tailscaled11
12# 登录并连接(这会给你一个认证链接)13sudo tailscale up腾讯云 OpenCloudos 发行版,参考这个centos7的操作 可以安装
https://tailscale.com/docs/install/centos/centos-7
宿主机能访问容器中的网页,但是其他tailscale网络中的机器无法访问
package.json中的命令,监听0.0.0.0的ip
1php artisan serve --host=0.0.0.0 --port=8000如果网页能打开,但是样式全乱了或者报错,那是 Vite 的问题。Vite 默认只在 localhost 运行。
vite.config.js
1export default defineConfig({2 server: {3 host: '0.0.0.0', // 允许外部访问4 hmr: {5 host: '100.x.y.z' // 这里填你虚拟机的 Tailscale IP6 },7 },8});silverblue运行:
1# 1. 将 tailscale 接口加入到信任区域(或允许其端口)2sudo firewall-cmd --permanent --add-service=http # 实际这一步就足够了3sudo firewall-cmd --permanent --add-port=8000/tcp4sudo firewall-cmd --permanent --add-port=5173/tcp5
6# 2. 关键:允许来自 tailscale 网段的流量(如果上面不生效)7sudo firewall-cmd --permanent --zone=public --add-interface=tailscale08
9# 3. 刷新配置10sudo firewall-cmd --reloadtoolbox容器安装laravel10环境
创建并进入环境
1toolbox create -c laravel102toolbox enter laravel10换源
1sudo 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等。
1sudo dnf install fish fastfetch lrzsz设置默认shell为fish
1vi ~/.bashrc在文件的最顶部添加以下逻辑:
1# 如果当前在交互式模式,且存在 fish 命令,且不在 fish 进程中2if [[ $- == *i* ]] && command -v fish >/dev/null 2>&1 && [[ $(ps -p $PPID -o comm=) != "fish" ]]; then3 export SHELL=$(command -v fish) # 强制更新环境变量4 exec fish5fi原理: exec 命令会用 Fish 进程替换掉当前的 Bash 进程。这意味着当你退出 Fish 时,容器窗口会直接关闭,而不会退回到 Bash,非常干净。
homebrew与前面的安装相同 yazi也同上
Docker命令映射
1rpm-ostree install podman-docker2# 容器中安装 podman-docker 插件,它会自动创建一个 docker 别名指向 podman3sudo dnf install podman-docker降级安装PHP 8.1
使用Remi 配置包降级
1# 如果你是 Fedora 412sudo dnf install -y https://rpms.remirepo.net/fedora/remi-release-41.rpm3
4# 如果你是 Fedora 425sudo dnf install -y https://rpms.remirepo.net/fedora/remi-release-42.rpm6
7# 或8sudo dnf install -y https://rpms.remirepo.net/fedora/remi-release-$(rpm -E %fedora).rpm安装remi后才能使用dnf module命令
1# 重置模块状态2sudo dnf module reset php -y3# 启用remi的8.1模块4sudo dnf module enable php:remi-8.1 -y5# 安装PHP8.16sudo 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
1# 在容器内执行2curl -sS https://getcomposer.org/installer | php3sudo mv composer.phar /usr/local/bin/composer4
5# 验证版本和关联的 PHP6composer --version7# 确保输出中显示的 PHP 版本是 8.1.x安装sail(可选)
https://docs.golaravel.com/docs/10.x/sail
在已有项目中安装:
1composer require laravel/sail --dev生成配置文件(交互式)
1php artisan sail:install.env 环境变量
1SAIL_PHP_VERSION=8.1启动sail
1./vendor/bin/sail up -d别名
1alias sail='bash vendor/bin/sail'Fast Node Manager (fnm)
安装
1curl -fsSL https://fnm.vercel.app/install | bash配置fish
~/.config/fish/config.fish
1# fnm2set PATH "$HOME/.local/share/fnm" $PATH3fnm env --use-on-cd | source使用
1fnm install 20 # 安装最新的 v202fnm install 18.16.0 # 安装精确版本3fnm use 20 # 切换到 v204# 其他5fnm list # 查看已安装6fnm list-remote # 查看远程可用7fnm uninstall 20 # 卸载版本8fnm default 20 # 设置默认值Podman安装Mariadb数据库
Silverblue 中(不进入Toolbox) 推荐后面的Quadlet方式
- 创建并启动MariaDB容器:
1# 创建数据存放目录(确保重启不丢数据)2mkdir -p ~/.local/share/mariadb3
4# 启动容器5podman 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- 将容器变成“系统服务” (实现开机自启) systemd方式
1# 创建用户级别的 systemd 配置目录2mkdir -p ~/.config/systemd/user/3
4# 生成服务文件5cd ~/.config/systemd/user/6podman generate systemd --name mariadb_db --files --new7
8# 重新加载并启用服务9systemctl --user daemon-reload10systemctl --user enable --now container-maria_db.serviceQuadlet方式
Quadlet 方式 与上面的systemd的方式2选1即可
1# 创建数据存放目录(确保重启不丢数据)2mkdir -p ~/.local/share/mariadb3
4mkdir -p ~/.config/containers/systemd/5
6nvim ~/.config/containers/systemd/maria_db.container1[Unit]2Description=MariaDB Local Database3After=network-online.target4
5[Container]6Image=docker.io/library/mariadb:latest7ContainerName=maria_db8PublishPort=3306:33069Environment=MARIADB_ROOT_PASSWORD=your_password10Environment=MARIADB_DATABASE=laravel_db11Volume=%h/.local/share/mariadb:/var/lib/mysql:Z12Label=io.containers.autoupdate=image13
14[Install]15# 这一行确保开机自启1 collapsed line
16WantedBy=default.target生效配置
1# 先删除旧的手动运行容器2podman rm -f local-db3
4# 让 systemd 识别 Quadlet5systemctl --user daemon-reload6
7# 启动服务 quadlet的方式不需要enable8# systemctl --user enable --now maria_db.service9# 直接启动服务10systemctl --user start maria_db.service查看是否生效
1systemctl --user status maria_db.service2# 显示 active (running) 为正常- 确保用户未登录时也能运行 默认情况下,用户级别的 systemd 会在退出登录时停止。我们需要开启“常驻”
1sudo loginctl enable-linger $USER1# 停止服务2systemctl --user stop maria_db.service3# 再次启动4systemctl --user start maria_db.service创建新的数据库
使用数据库管理工具 或: silverblue执行
1# 进入正在运行的本地数据库容器并打开命令行2podman exec -it local-db mariadb -u root -p输入你设置的密码后,在 MariaDB 命令行里输入:
1CREATE DATABASE some_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;2-- 重复上面的命令可以创建更多库3EXIT;Podman安装Redis
Quadlet模式
1mkdir -p ~/.local/share/local_redisnvim ~/.config/containers/systemd/local_redis.container
1[Unit]2Description=Redis Service3
4[Container]5Image=docker.io/library/redis:alpine6ContainerName=local_redis7PublishPort=6379:63798# 如果需要数据持久化,可以挂载卷9Volume=%h/.local/share/local_redis:/data:Z10
11[Install]12WantedBy=default.target1systemctl --user daemon-reload2# systemctl --user enable --now local-redis.service3systemctl --user start local_redis.service4
5sudo loginctl enable-linger $USER安装claude code codex
进入toolbox容器
1node -v2npm -v3
4# 安装 Claude Code5npm install -g @anthropic-ai/claude-code6# 安装完成后,直接输入以下命令并按照提示进行身份验证(需要 Anthropic API Key)7claude