背景
最近在 NixOS 上尝试编译 ROCm 6.2.2 时,MIOPEN 包的源代码需要很多空间,导致根目录空间不足了。于是决定给根目录扩容,结果悲剧了,扩容完文件系统损坏了,只能重装系统了。好在 NixOS 的配置文件保存在另一块盘上,正好可以利用 NixOS 的函数式定义还原系统。在网上搜索没有找到专门的教程,于是自己摸索着完成了重装,记录一下。
主要用到了 NixOS 的两个工具:
nixos-install
: https://nixos.wiki/wiki/NixOS_Installation_Guidenixos-enter
: https://nixos.wiki/wiki/Change_root
思路
整体的思路很简单:
- 假装我们在安装新系统,在根目录上构建一个基础的 NixOS 系统
- 导入之前的配置文件,还原出定义好的系统
- 进入新系统,设置用户密码
步骤
1. 建立基础系统
按照 NixOS Wiki 的步骤,在 /mnt
上挂载根目录(我这里是 /dev/nvme0n1p5
作为例子):
sudo mount /dev/nvme0n1p5 /mnt
然后挂载其他分区:
sudo mkdir /mnt/boot
sudo mount /dev/nvme0n1p2 /mnt/boot
sudo mkdir /mnt/home
sudo mount /dev/sda1 /mnt/home
接着生成一份基础的配置文件:
sudo nixos-generate-config --root /mnt
然后安装基础系统 (默认的缓存服务器在国内很慢,可以替换成 SJTU 源):
sudo nixos-install --root /mnt --option substituters="https://mirror.sjtu.edu.cn/nix-channels/store"
稍等一会,一份基础系统就会安装到 /mnt 上了。接下来,我们就可以导入之前的配置文件了。
2. 导入配置文件
将之前的配置文件链接到 /mnt/etc/nixos
下:
sudo mv /mnt/etc/nixos /mnt/etc/nixos.bak
sudo ln -s /path/to/your/config /mnt/etc/nixos
然后使用配置文件安装之前的系统 (这里我的配置文件使用了 flake 特性,所以增加了 --flake
参数):
cd /mnt/etc/nixos
sudo nixos-install --root /mnt --flake .#<path-to-your-config>
稍等一会,之前的系统就会安装到 /mnt 上了。
3. 设置用户密码
由于我的配置文件中没有用户密码,所以还需要使用 nixos-enter
进入新系统设置密码:
sudo nixos-enter
进入之后,使用 passwd
命令设置用户密码:
passwd <your-username>
输入新密码,重启之后就可以正常使用了。
总结
得益于 NixOS 的可复现性,我们的配置文件只要还在,就可以很方便地重装系统。如果使用其他发行版,重装系统免不了要重新配置一遍,还不一定能精确还原到原本的系统,这次也是亲身体验到了 NixOS 的便利。