使用Live ISO修复Fedora主系统
接上篇安装 Fedora 的记录。如果主系统已经进不去,或者进去之后没有网络、登录管理器配置错了,这时 Live ISO 就是最方便的救援环境。核心思路是:用 Live ISO 启动一个可用系统,再把硬盘里的主系统挂载出来,最后用 chroot 进入主系统内部修复。
AIGC:这篇文章由AI生成
Live ISO 能解决什么问题
Live ISO 启动的是一个临时系统。它使用自己的 kernel、initramfs 和用户空间,不依赖硬盘里的主系统能不能正常启动。因此主系统出现下面这些问题时,Live ISO 仍然可以作为救援入口:
- 装完系统后缺少无线网卡 firmware,进系统没有网络
greetd、GDM、SDDM 配置错误,登录界面起不来/etc/fstab、内核参数、GRUB 配置写错,导致启动失败- 需要离线修改主系统里的配置文件
- 需要在主系统里安装软件包、重建 initramfs 或重新生成引导配置
这套流程的关键命令是:
1 | mount -o subvol=root ... |
下面按顺序讲。
找到主系统分区
进入 Live ISO 后,先查看磁盘和文件系统:
1 | lsblk -f |
Fedora 默认安装经常会使用 Btrfs,并且把一个 Btrfs 文件系统拆成多个 subvolume。常见布局大概是:
1 | /dev/nvme0n1p1 vfat EFI System Partition |
具体设备名要以自己的机器为准,可能是 /dev/nvme0n1p3,也可能是 /dev/sda3。如果使用了 LUKS 加密,还需要先解锁:
1 | sudo cryptsetup open /dev/nvme0n1p3 cryptroot |
解锁后,真正要挂载的设备就变成了:
1 | /dev/mapper/cryptroot |
为什么要 mount -o subvol=root
Btrfs 的 subvolume 可以理解为同一个 Btrfs 文件系统里的多个独立目录树。Fedora 常见布局里,根目录 / 不是直接放在 Btrfs 顶层,而是放在名为 root 的 subvolume 里;用户目录 /home 则可能放在名为 home 的 subvolume 里。
所以救援时如果只写:
1 | sudo mount /dev/nvme0n1p3 /mnt |
挂到 /mnt 的不一定是主系统真正的根目录。你可能会看到一些 subvolume 名字,而不是熟悉的 /etc、/usr、/var。
正确做法是明确挂载根 subvolume:
1 | sudo mount -o subvol=root /dev/nvme0n1p3 /mnt |
如果是 LUKS 解锁后的系统,则是:
1 | sudo mount -o subvol=root /dev/mapper/cryptroot /mnt |
挂载之后检查一下:
1 | ls /mnt |
如果能看到 etc、usr、var、home、boot 等目录,说明主系统根目录已经挂载到 /mnt。
如果还需要修复用户配置,或者 /home 是单独的 subvolume,可以继续挂载:
1 | sudo mount -o subvol=home /dev/nvme0n1p3 /mnt/home |
同样,如果是加密系统,把设备名换成 /dev/mapper/cryptroot。
挂载 boot 和 EFI 分区
如果只是改 /etc/greetd/config.toml 这类普通配置,可能不挂载 /boot 和 /boot/efi 也能完成。但如果要重建 initramfs、重新生成 GRUB 配置、安装内核或修复引导,就应该把它们也挂上。
示例:
1 | sudo mount /dev/nvme0n1p2 /mnt/boot |
这里的分区编号仍然要按 lsblk -f 的结果调整。不要照抄设备名。
为什么要 mount –bind 虚拟文件系统
把主系统根目录挂到 /mnt 之后,还不能直接 chroot 完事。因为 /mnt 里虽然有主系统的文件,但缺少当前正在运行的内核提供的运行时接口。
典型的几个目录是:
| 目录 | 作用 |
|---|---|
/dev |
设备节点,例如磁盘、终端、随机数设备 |
/dev/pts |
伪终端,很多交互式程序需要它 |
/proc |
进程和内核状态接口,例如 /proc/cpuinfo、/proc/mounts |
/sys |
设备、驱动、内核模块等 sysfs 信息 |
/run |
当前启动后的运行时状态,包含网络、systemd、临时 socket 等 |
mount --bind 的作用是把 Live ISO 当前系统里的某个目录重新挂载到另一个位置。它不是复制文件,而是让两个路径看到同一棵目录树。
也就是说:
1 | sudo mount --bind /dev /mnt/dev |
会让 chroot 后的 /dev 实际指向 Live ISO 当前的 /dev。这样主系统里的命令运行时,就能看到真实设备节点。
完整操作如下:
1 | sudo mount --bind /dev /mnt/dev |
这样做的原因是:chroot 只改变进程看到的根目录,它不会帮你创建 /dev、/proc、/sys 这些运行时接口。如果不 bind mount,很多命令会出现奇怪问题,比如 dnf、dracut、grub2-mkconfig 找不到设备信息,或者脚本无法读取当前挂载状态。
chroot 进入主系统
准备好挂载点之后,就可以进入主系统:
1 | sudo chroot /mnt /bin/bash |
chroot 的意思是 change root。执行之后,当前 shell 看到的 / 就不再是 Live ISO 的根目录,而是刚才挂载到 /mnt 的主系统根目录。
因此在 chroot 里面执行:
1 | cat /etc/fedora-release |
读到的是主系统的 /etc/fedora-release,不是 Live ISO 的。执行:
1 | dnf install iwlwifi-mvm-firmware |
安装目标也是主系统,而不是 Live ISO。
这就是 Live ISO 修复主系统的核心:运行环境来自 Live ISO,但文件系统目标切换到了硬盘里的主系统。
示例一:修复缺失的 iwlwifi firmware
如果上篇提到的无线网卡问题是因为缺少 iwlwifi-mvm-firmware,可以在 chroot 里安装:
1 | dnf install iwlwifi-mvm-firmware |
如果 DNS 解析失败,可以先退出 chroot,把 Live ISO 的 DNS 配置复制进去:
1 | exit |
安装完成后,普通无线网卡 firmware 通常重启即可生效。为了稳妥,也可以重建 initramfs:
1 | dracut -f |
然后退出并重启。
示例二:修复 greetd 配置
如果 greetd 配错导致登录界面进不去,可以在 chroot 中直接编辑:
1 | nano /etc/greetd/config.toml |
例如把默认会话修成:
1 | command = "tuigreet --cmd \"dbus-run-session niri\"" |
如果需要启用 greetd:
1 | systemctl enable greetd.service |
注意,在 chroot 里一般只适合 enable、disable 这类修改开机状态的操作,不适合 start、restart 服务。因为当前真正运行的是 Live ISO 的 systemd,不是主系统的 systemd。
退出和卸载
修复完成后先退出 chroot:
1 | exit |
然后卸载挂载点。最简单的方式是:
1 | sudo umount -R /mnt |
如果提示 busy,通常是还有 shell 或程序停留在 /mnt 下面。确认所有终端都已经离开 /mnt 后再卸载。
最后重启:
1 | reboot |
总结
这一整套流程可以概括成四步:
1 | 用 Live ISO 启动一个可工作的临时系统 |
理解这几个命令之后,Live ISO 就不只是“重装系统用的 U 盘”,而是一个很实用的救援环境。很多看起来很严重的问题,其实只是需要从外部把主系统挂起来,改掉错误配置或者补齐缺失软件包。
