Windows10+ArchLinux重安装

 windows 󰈭 3804字

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

书接上文

最开始的一些问题背景和初步解决方案(但失败了)在这里: win11下第一次启动chrome卡死

事实上还是很坏, 实际可能是误会了ms对chrome的偏见了, 这个系统本质上好像是对某些网络设备有问题, 但为啥如此我不知道. 因为在事件查看器中也确实出现过啥TLS凭证失败的消息, 并且后续又发现有时候会在打开battle.net或leigod甚至是clash的时候卡死, 同时开机后如果切换wifi过快也会卡死… 太怪了…

终于在昨天晚上卡死后我鸭子杀心切, 只能继续强制重启, 导致系统终于烂了 一打开windows就立刻蓝屏 根本进不去系统了… 贴心的Dell检测到我的系统出现了问题帮助我自动尝试修复… 结果就是其修复了我的EFI引导分区, 导致我的grub直接被删除, 只保留了其创建的全新的且唯一一个windows的bootloader…

实在不能忍耐了… 三番两次搞我 这次我也是铁了心重新要使得我们先进的windos10已经完全超过了老旧的windows11…

机器现状

目前的情况大概是:

  • 磁盘数据分区没烂, 包括无法引导的windows系统

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

  • 手里有个archlinux ISO的u盘

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

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

恢复grub

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

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

1grub-install --target=x86_64-efi --efi-directory=/dev/nvme0n1p1 --bootloader-id=GRUB

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

这里要提一嘴内核参数:

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.

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

最开始我很没有耐心, 没到一分钟就尝试用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自己重新格了.. 没有为他分配标签.. 那自然找不到了…

另外分配标签的指令为:

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系统.


其他参考:

以官方Wiki的方式安装ArchLinux - 吴迪的博客

安装指南 - Arch Linux 中文维基

GRUB - ArchWiki

备份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的要拷贝的猴年马月…

最后的指令命令为:

 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启动盘, 最开始上了这个人的当

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

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

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

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

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

     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引导盘中.

安装window10

这个驱动可用, 安装后即可看到所有的分区, 保留所有我的linux分区, 将windows的几个答辩全部删掉(前512G和后几百M), 在前512G分配给windows, 点击下一步即可安装.

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

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

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

不过实际上我是先预留了512M的空间在磁盘前面, 因为在diskpart上生成的新分区默认在我的linux分区后面, 导致磁盘前面出现一个空洞…(奇怪的强迫症), 由于生成的是主分区因而再用diskpart修改分区为efi, 指令(参考How to sign an existing partition to EFI partition with diskpart)为:

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

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

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

其他参考:

https://superuser.com/questions/1629295/windows-no-efi-partition

https://superuser.com/questions/1308324/create-efi-partition-before-installing-windows-10

https://woshub.com/how-to-repair-deleted-efi-partition-in-windows-7/

https://woshub.com/how-to-repair-uefi-bootloader-in-windows-8/

收尾工作

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

嗨! 这里是 rqdmap 的个人博客, 我正关注 GNU/Linux 桌面系统, Linux 内核, 后端开发, Python, Rust 以及一切有趣的计算机技术! 希望我的内容能对你有所帮助~
如果你遇到了任何问题, 包括但不限于: 博客内容说明不清楚或错误; 样式版面混乱等问题, 请通过邮箱 rqdmap@gmail.com 联系我!
修改记录:
  • 2024-04-07 16:45:38更新 Windows 卡死问题解决方案
  • 2023-05-29 23:05:14大幅重构了python脚本的目录结构,实现了若干操作博客内容、sqlite的助手函数;修改原本的文本数 据库(ok)为sqlite数据库,通过嵌入front-matter的page_id将源文件与网页文件相关联
  • 2023-05-08 21:44:36博客架构修改升级
  • 2023-02-19 13:37:13windows+archlinux重安装: 完善了最后一段内容
  • 2023-02-19 01:20:23Windows10+ArchLinux重安装
Windows10+ArchLinux重安装