双系统环境下重装 Windows10

 技术  双系统  Linux  Windows 󰈭 4040字

因为 Win11 开机后经常会在使用 Chrome 等应用时卡死的问题并未得到修复, 最终在某一天 Windows 的崩溃问题终于扩散到了同一块磁盘上的 Linux 分区: 在一次 Windows 卡死并蓝屏后, 自动运行的 Dell 自动修复清空了我的 EFI 分区, 导致我的 Linux 系统也无法正确引导了.. 当时我仍然以为是 Windows 系统的问题, 因此尝试在维持 Linux 分区数据的同时, 重装 Win10 系统.

问题背景

最开始的一些问题背景和后续解决方案在这里: Win11 开机后 Chrome 卡死: BIOS RAID 模式问题排查记录

在重装了 Win11 以及 Chrome 后, 问题仍然在频繁发生. 后续又发现有时候会在打开battle.net或leigod甚至是clash的时候卡死, 同时开机后如果切换wifi过快也会卡死… 太怪了… 可能是误会了ms对chrome有偏见了

尽管一直以来都跟频繁卡死的 Win11 勉强相处, 出现问题就强制重启.. 直到某天的证书报错问题..

证书报错问题

昨天礼拜五, 晚上带了电脑回来准备鸭子杀, 刚开机就有不详的感觉, 哪有名字叫self-signed的证书 自己认证自己… 更加让人觉得是中毒了… 不过这个其实是和clash有关..

不管了, 因为这就是它的遗照了:

因为在卡死后玩鸭子杀心切, 只能继续强制重启, 导致系统终于烂了…

一打开windows就立刻蓝屏 根本进不去系统了… 贴心的Dell检测到我的系统出现了问题帮助我自动尝试修复… 结果就是其修复了我的EFI引导分区, 导致我的grub直接被删除, 只保留了其创建的全新的且唯一一个windows的bootloader…

实在不能忍耐了… 三番两次搞我 这次我也是铁了心重新要从 Win11 回滚到 Win10, 心中仍然怀疑是 Win11 的问题 (我们先进的windos10已经完全超过了老旧的windows11)

机器现状

目前的情况大概是:

  • 磁盘数据分区完整, 包括无法引导的 Windows 系统

  • bootloader全灭, 无法启动任何一个已有的分区(windows无法启动, grub 被删除)

  • 手里有个archlinux ISO的u盘

  • 有个移动硬盘上有老的archlinux系统

其实比较麻烦, 因为目前完全不能自举, 所以第一步先让本地的linux能启动起来, 其关键在于恢复Grub到efi分区中.

修复过程

恢复 Grub 与 EFI 分区

通过u盘进入archlinux系统中, 由于不确定原EFI分区到底怎么样了, 这里我决定直接删除并重新分区, 当然后面因此要注意fstab进行对应修改. 由于fdisk的操作比较熟悉了(实在折腾太多次了)就不多赘述了.

随后将//boot挂载好, arch-chroot到本地arch的根目录下. 最开始不知道怎么恢复grub… 瞎弄了半天, 其实直接通过grub-install好像就行:

Text
1grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB

可以微调以前的grub.cfg文件, 也可以grub-mkconfig -o /boot/grub/grub.cfg自动创建新的grub配置.

这里要提一嘴内核参数:

Text
1linux	/vmlinuz-linux root=UUID=c1b2e9ff-9b56-4100-8056-16868a44422a rw  loglevel=3 quiet ibt=off snd_hda_intel.dmic_detect=0

Dell G5520 (Nvidia GeForce 3060) 十分需要最后两个参数:

  • ibt=off才能让系统成功启动(关乎nvidia独立显卡), 去年上半年就出现的问题了

  • 后一个则控制了声卡, 没有的话则没有声音

再提一嘴默认控制grub-mkconfig的内核参数可以通过修改/etc/default/grub文件, 因为这个文件不是grub前缀因此容易忘记找不到. 在这个文件中通过:

  • GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet ibt=off snd_hda_intel.dmic_detect=0" 设置默认内核选项

  • GRUB_DISABLE_OS_PROBER=false 允许启用os-prober

安装grub后还要再把linux kernel(vmlinuz-linux)塞到/boot里, 我当时没记起来是什么指令, 就用了pacman -S linux总归可以

(但不要更新linux版本!! 不然可能linux-headers什么版本不匹配!! 可以用pacman -U /var/cache/pacman/pkg/....重装以前的包 当时这个也反复折腾了很久).

更好的指令是 mkinitcpio.

这样大概就能让系统启动起来. 但实战中我在引导完内核后卡在了进入图形界面之前…

启动 Linux 系统

最开始我很没有耐心, 没到一分钟就尝试用Ctrl+Alt+Delete重启, 但是 systemd 居然卡住了不让我关, 提示说是个什么waiting for process 441 systemd udevd.

气坏了之后上网查阅一番, 关键词为这条报错信息, 看到 very slow boot (6m), how to force change systemd-udevd timeout to 5s?, 恍然大悟, 又去grub里加了debug的内核参数, 再次启动后看到:

信息提示是没有找到label为ESP的分区… 那回想起来了因为把EFI自己重新格了.. 没有为他分配标签.. 那自然找不到了…

另外分配标签的指令为:

Text
1 7274  2023-02-17 18:30  sudo e2label /dev/nvme0n1p8 "HOME"
2 7275  2023-02-17 18:30  sudo e2label /dev/nvme0n1p7 "ROOT(ArchLinux)"
3 7278  2023-02-17 18:31  sudo e2label /dev/nvme0n1p10 "ROOT(LFS)"
4 7279  2023-02-17 18:31  sudo e2label /dev/nvme0n1p100 "SWAP"

修改/etc/fstab通过分区号索引即可成功引导本地的linux系统.

备份 Linux 系统

因为决定大刀阔斧的干了, 就害怕上次dell os recovery把我2T盘全格了的情况, 这次必须先全盘备份.

把旧SSD连上后, 参考 LFS 7.13. Cleaning up and Saving the Temporary System 给出的指令备份. 上次是用的rsync, 也能保留日期、权限什么的, 但是懒得去找具体指令参数了, 就参考LFS的tar指令一用.

可以看到, 几个运行时文件夹为{sys,proc,run,dev}, 这些需要exclude掉, tar的几个参数含义为:

  • -c: Create a new archive. Arguments supply the names of the files to be archived.

  • -J: -J, –xz

  • -p: extract information about file permissions (default for superuser)

  • -f: Use archive file or device ARCHIVE.

实际测试了一下, 加了-J之后特别特别慢… 就删了.. 不然我这120G的要拷贝的猴年马月…

最后的指令命令为:

Text
 1#!/bin/zsh
 2
 3TAR_FLAGS="-cvpf"
 4PREFIX="/mnt/ArchLinux"
 5
 6cd /
 7
 8# tar $TAR_FLAGS $PREFIX/boot.tar boot 
 9# tar $TAR_FLAGS $PREFIX/home.tar home
10# tar $TAR_FLAGS $PREFIX/data.tar data
11tar --exclude={sys,proc,run,dev,boot,data,home,mnt} $TAR_FLAGS $PREFIX/root.tar .

中间遇到几个坑:

  • 最开始的tar命令把--exclude放在了更后的位置, 导致每次都exclude失败, 特别是很多是高赞回答.. 至少在我的这台arch的这个zsh上, --exclude必须放在第一个, 具体讨论在 Shell command to tar directory excluding certain files/folders 喔其实第一个就说了要放在第一个, 那是我当时看的不仔细了md

  • exclude少了{boot,data,home,mnt}… 前几个都还行感觉不会死… 但是少了mnt差点吓死我.. 因为目标目录就在mnt下, 不知道会不会疯狂自循环或者怎么样…

  • 老旧的ssd经不住120G的文件的拷贝… 过一会就得休息一下… 不然之间io错误(当时非常担心会不会拷贝进去了但是硬盘就已经不经用了…)

整个过程也非常的慢, 可能弄了1,2个小时…

制作 Windows 启动盘

linux制作windows启动盘, 最开始上了 这个人的当

你不会真的是扯淡吧?????

这样结果完全是无法引导的…

dd 为什么无法刻录 Windows ISO?

dd 刻录只适用于 Linux ISO, Windows ISO 不能直接 dd

原因:

  • Linux ISO 是 “hybrid ISO”(混合模式), 既支持光盘启动也支持 USB 启动

  • Windows ISO 只能用于光盘, dd 到 U 盘后 BIOS/UEFI 认不出启动扇区

更简单的方法: 直接使用 Ventoy 即可 https://www.ventoy.net/

改用这个人的办法 Create A Bootable Windows 10 USB Using Linux¶, 非常的可靠, 因而摘录一下:

  • pacman -S ms-sys ntfs-3g rsync

  • fdisk /dev/sdc创建启动分区, 再通过t修改为HPFS/NTFS/exFAT(7), 最后长这样:

    Text
     1Disk /dev/sdc: 7.47 GiB, 8011120640 bytes, 15646720 sectors
     2Disk model: USB Flash Drive
     3Units: sectors of 1 * 512 = 512 bytes
     4Sector size (logical/physical): 512 bytes / 512 bytes
     5I/O size (minimum/optimal): 512 bytes / 512 bytes
     6Disklabel type: dos
     7Disk identifier: 0x16a59ab8
     8
     9Device     Boot Start      End  Sectors  Size Id Type
    10/dev/sdc1        2048 15646719 15644672  7.5G  7 HPFS/NTFS/exFAT
    11
    12Filesystem/RAID signature on partition 1 will be wiped.
  • mkfs.ntfs /dev/sdc1 在我的u盘上特别慢, 平均速度只有10MB, 靠近1h才结束.

  • mkdir /mnt/{iso,usb}

  • mount ~/Downloads/Win10_1909_English_x64.iso /mnt/iso and mount /dev/sdc1 /mnt/usb

  • rsync -avrP /mnt/iso/* /mnt/usb/ or cp -avr /mnt/iso/* /mnt/usb/

  • ms-sys -7 /dev/sdc && sync

  • umount并清除usb和iso文件夹

这样一个健康的windows启动盘就做好了, 但在此之前, 因为有过经验, 貌似默认情况下是读不到任何驱动器的, 这与irst(intel11,12)有关

尝试去dell官网找驱动, 但是g5520官方只支持win11+ubuntu 印象里是会报错说版本不对… 绝, 便又去intel官网找, 结果在这里 Intel® Rapid Storage Technology Driver for Windows® 10 64-bit and Windows 11* for Intel® NUC12WS products. 下载zip后也塞到windows引导盘中.

安装 Windows10

上一步安装的驱动可用, 安装后即可看到所有的分区, 保留所有我的linux分区, 将windows的几个答辩全部删掉(前512G 主系统分区和后面几百M的 Windows 恢复分区), 再把前512G分配给windows, 点击下一步即可安装.

这一步十分顺利.

驱动问题: 傻逼的是, 这次安装后居然几乎没有任何驱动, 包括无限网卡驱动… 好在我保留了有线网.. 前往实验室后补全驱动. 先后用了鲁大师和驱动精灵, 全都是答辩, 前者不全后者收费… 尝试安装了 Dell assitance, 结果在win10上效果也意外的好, 可以处理所有驱动安装问题.

拆分 Windows EFI 分区

解决了驱动后下一个问题是efi分区… 默认win10安装后居然没有单独的efi分区, 貌似全部都塞在一个分区里… 咋办捏…

查了下后发现可以通过 shift+f10 在安装界面就进入一个cmd, 随后可以通过 diskpart 进行分区操作.

但在实际操作中, 我是先预留了512M的空间在磁盘前面, 因为在diskpart上生成的新分区默认在我的linux分区后面, 导致磁盘前面出现一个空洞…(奇怪的强迫症)

由于生成的是主分区, 因而需要再用diskpart修改分区为efi, 指令为:

Text
1select part 1
2set id=c12a7328-f81f-11d2-ba4b-00a0c93ec93b override

随后进入windows后再用cmd写入efi文件到预留的分区中, 具体的分区和盘符就不多说了, 核心重建efi boot指令为:

Text
1# bcdboot c:\Windows /s G: /f UEFI

收尾工作

在修好的windows上再次将u盘写入为archlinux的启动盘, 进入arch后再次重装grub, 配置grub, 借助os-prober即可处理所有系统的启动.

至此, 就完成了整个的恢复与重装工作了.

参考教程

嗨! 这里是 rqdmap 的个人博客, 我正关注 GNU/Linux 桌面系统, Linux 内核 以及一切有趣的计算机技术! 希望我的内容能对你有所帮助~
如果你遇到了任何问题, 包括但不限于: 博客内容说明不清楚或错误; 样式版面混乱; 加密博客访问请求等问题, 请通过邮箱 rqdmap@gmail.com 联系我!
修改日志
  • 2026-03-01 20:03:19 优化 Windows 卡死问题排查相关博客内容
  • 2025-11-26 01:13:52 统一博客图片引用格式为短码格式
  • 2024-10-13 01:47:22 博客内容适配 inkwell 主题
  • 2024-04-07 16:45:38 更新 Windows 卡死问题解决方案
  • 2023-05-29 23:05:14 博客结构与操作脚本重构
  • 2023-05-08 21:44:36 博客架构修改升级
  • 2023-02-19 13:37:13 windows+archlinux重安装: 完善了最后一段内容
  • 2023-02-19 01:20:23 Windows10+ArchLinux重安装