昨天当了回脚本小子也是在开售 30ms 内成功拿下了阿里云的 HK 轻量服务器,1G 内存的实例在使用上是绰绰有余,但并未提供 NixOS 镜像。众所周知 NixOS 在构建时会占用 1.5G 左右的内存。虽然可以使用内存压缩与 swap 技术解决这个问题,但 NixOS Anywhere 使用 kexec 重建系统时,也会占用部分内存存放内核镜像,而且似乎不会利用 swap 空间, 这就给重装带来了麻烦。这篇文章记录一下在重装过程中使用到的一些黑魔法。
DD 与 Grub
Unix 中,我们知道 dd
可以 raw 写入磁盘,也就是当我们有 OS 文件系统时,直接写入 /dev/*da
文件便可以完成系统的重装,但直接这么用会存在一些问题:
- 现有的 OS 运行在此磁盘上
- 原数据可能在磁盘中,自己把自己覆盖了
在 vps2arch
与 nixos 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'