昨天当了回脚本小子也是在开售 30ms 内成功拿下了阿里云的 HK 轻量服务器,1G 内存的实例在使用上是绰绰有余,但并未提供 NixOS 镜像。众所周知 NixOS 在构建时会占用 1.5G 左右的内存。虽然可以使用内存压缩与 swap 技术解决这个问题,但 NixOS Anywhere 使用 kexec 重建系统时,也会占用部分内存存放内核镜像,而且似乎不会利用 swap 空间, 这就给重装带来了麻烦。这篇文章记录一下在重装过程中使用到的一些黑魔法。

2024-07-27T15:19:59.png

DD 与 Grub

Unix 中,我们知道 dd 可以 raw 写入磁盘,也就是当我们有 OS 文件系统时,直接写入 /dev/*da 文件便可以完成系统的重装,但直接这么用会存在一些问题:

  • 现有的 OS 运行在此磁盘上
  • 原数据可能在磁盘中,自己把自己覆盖了

vps2archnixos anywhere 中可以看到采用的是 kexec 方式,手动重装有些麻烦,但在昨天碰巧遇到了下面这个新的方案:

reinstall 利用了 Grub 作为主流 OS bootloader 的特性,新增了一个 alpine 引导项并用参数的方式传入需要 dd 的 img 镜像的地址,好处如下:

  • OS 启动后镜像与 ramfs 已被加载进内核,因此可以安全地对 /dev/*da 磁盘进行写入。
  • img 存于互联网,采用 curl xxx | dd of=/dev/vda 之类的方式,保证 raw disk 超过内存大小也能写 ^_^

NixOS Bootstrap

对于 NixOS Bootstrap 镜像的制作,主要参考了祖师爷蓝天的文章,你也可以使用我的 flakes 来一键生成适用于 aliyun 的配置。命令如下:

nix build .#image -L
cp result/main.raw nixos-bootstrap
xz nixos-bootstrap
scp nixos-bootstrap <your-endpoint>

记得改 hosts/bootstrap/default.nix 中的公钥,否则你连不上。

System Install

这个脚本只支持 gz 和 xz 压缩
curl -O https://raw.githubusercontent.com/bin456789/reinstall/main/reinstall.sh
bash reinstall.sh dd --img='https://<your-endpoint>/nixos-bootstrap.xz'

Reference

Last modification:August 12, 2024
如果觉得我的文章对你有用,请随意赞赏