昨天礼拜五, 晚上带了电脑回来准备鸭子杀, 刚开机就有不详的感觉, 哪有名字叫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什么版本不匹配!! 可以用). 正确的指令是
mkinitcpio.pacman -U /var/cache/pacman/pkg/....
重装以前的包 当时这个也反复折腾了很久
这样大概就能让系统启动起来. 但实战中我在引导完内核后卡在了进入图形界面之前…
最开始我很没有耐心, 没到一分钟就尝试用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系统.
其他参考:
备份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), 最后长这样:Text1Disk /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
andmount /dev/sdc1 /mnt/usb
-
rsync -avrP /mnt/iso/* /mnt/usb/
orcp -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即可处理所有系统的启动.