Jachin Shen
Jachin Shen

Categories

Tags

背景

最近在 NixOS 上尝试编译 ROCm 6.2.2 时,MIOPEN 包的源代码需要很多空间,导致根目录空间不足了。于是决定给根目录扩容,结果悲剧了,扩容完文件系统损坏了,只能重装系统了。好在 NixOS 的配置文件保存在另一块盘上,正好可以利用 NixOS 的函数式定义还原系统。在网上搜索没有找到专门的教程,于是自己摸索着完成了重装,记录一下。

主要用到了 NixOS 的两个工具:

  1. nixos-install: https://nixos.wiki/wiki/NixOS_Installation_Guide
  2. nixos-enter: https://nixos.wiki/wiki/Change_root

思路

整体的思路很简单:

  1. 假装我们在安装新系统,在根目录上构建一个基础的 NixOS 系统
  2. 导入之前的配置文件,还原出定义好的系统
  3. 进入新系统,设置用户密码

步骤

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 的便利。