起因
在安装NixOS的时候把Windows引导干了,意思是,把整个ESP分区格了,所以想要救回来。
思路
既然是把ESP格了,感觉就只能重建了,找了找也没有在linux重建windows引导的工具,所以只能想办法做PE系统。
Step1 制作WinPE修复盘
希望使用dd刻录
起初想的是能找个ISO镜像然后dd刻录进U盘就好,搜了下虽然网上看起来有ISO镜像,但是下载均需要xx网盘客户端,所以就没什么好办法,还得是Windows才能拯救Windows
启用kvm/libvirtd/virt-manager
既然没有办法很方便的在Linux下制作winpe,只能转换思路,使用windows做了,步骤大概如下:
- 开启虚拟机管理程序,参照wiki
- 安装windows guest系统,这个到处都有教程,可以参考how-to-set-up-a-kvm-qemu-windows-10-vm
- 直通USB,可以参考QEMU 多 USB 设备直通
- 使用wepe工具箱制作PE盘
Step2 进入PE后的操作
意外事件
我的电脑有两块物理存储设备,我们将其称为磁盘A和磁盘B,磁盘A是我安装操作系统的地方。 打开DiskGenius发现自己的NixOS引导竟然是放在了磁盘B的ESP分区,原来自己安装的时候选错了,然后就在想是不是可以直接从磁盘B的ESP复制到磁盘A的ESP就可以用,然后再使用引导修复工具修复磁盘A的ESP的Windows EFI。如上操作之后,发现并不行,原因是
- 直接复制不行 复制之后系统并不能识别出来NixOS的EFI了
- 两块盘的情况下 神奇的Windows引导修复工具只能认出来一个ESP 感觉是bug(
重新来过
既然没有什么好办法去修,那就推倒重来
- 使用DG删除所有的ESP分区
- 使用DG在磁盘A重建ESP/MSR
- 使用Windows引导修复工具修复Windows引导
至此,Windows恢复正常运行了,接下来是NixOS的引导重建。
Step3 重建NixOS引导
重建boot
这里有官方wiki,但是按照教程上的走还会有一些问题
- 制作NixOS Live CD,进入启动盘
- 挂载根目录和boot目录
mount /dev/nvme0n1p5 /mnt
mount /dev/nvme0n1p1 /mnt/boot
- 使用nixos-enter命令进入已经安装的系统环境
# 问题1 这里在我的环境下不使用sudo会失败
sudo nixos-enter
# 问题1解决 使用sudo nixos-enter进入
# 但是使用sudo之后 需要 unset SUDO_USER 否则一会儿nixos-rebuild的时候就会失败
# 参考 https://discourse.nixos.org/t/nixos-rebuild-failing-while-chrooted/40176/5
unset SUDO_USER
# 然后执行构建引导的命令
NIXOS_INSTALL_BOOTLOADER=1 /nix/var/nix/profiles/system/bin/switch-to-configuration boot
重建hardware-configuration.nix
虽然引导是重建了,但是还有一条比较隐晦的错误,也就是hardware-configuration.nix默认会挂载/boot分区,但是我们移动了ESP,所以这个文件也需要重新修改并且rebuild
# 使用如下命令基本可以确定自己的ESP分区ID是多少
lsblk
blkid
# 修改 hardware-configuration.nix
这里修改配置文件
# 重建nixos配置 因为我使用的是flakes 命令应该如下 如果没使用flakes 应该直接nixos-rebuild switch就可以(大概
cd nix-config
nixos-rebuild switch --flake . #nixos-workstation
至此NixOS引导也重建完成