解释一下为什么我上上周连续骂了一天的微软和戴尔

原因就是丢失了部分数据,以及好几天都搭在这破系统上了。
原标题:垃圾 Win10 搞出的数据丢失和各种 Bug 以及垃圾戴尔的 DSA-2021-088/CVE-2021-21551 安全漏洞整出来的一堆妖蛾子
B站专栏标题字数限制40……标题都得改
本文首发于: https://blog.catscarlet.com/202105273949.html
(注:本文引用了大量的之前写过的文章内容,如果没有读过我之前写过的这些文章的话,可能会看花眼。因B站无法引用非B站的资源,无法引用外链,故所有文章均使用文字+链接表示。排版已经崩掉了,至于有没有漏图,我很确定肯定是漏了很多图。我是建议阅读原文,而不是看这个B站崩溃版)

最了解自己的是自己,最不了解自己的也是自己。
曾经有人说过,微软自家的软件当然是跑在微软自家的系统上功能最稳定性能最好。
这个人大概是想把微软当孔乙己拜奉了,毕竟是跪族嘛……
你要说 荒木懂个毛的jojo,zun懂个毛的东方,咱还能乐一乐;
你要说 微软懂个自家的Windows,戴尔懂自家的电脑,那大概就能掀起一场网友互喷的浪潮,整个社交平台都得充满了快活的空气。
贴个 Win10 经典 Bug:


一、垃圾Win10造成的数据丢失
这个要接着《垃圾Win10》(https://blog.catscarlet.com/202101203846.html)和《关于安卓手机直播手游方案的研究》(https://blog.catscarlet.com/202102203871.html)说起。
挖出 Win10 的这么多坑之后,我早已将所有工作全部都移动到 Linux 下了,所以其实没被 Win10 坑到多少次。说简单点,在 Linux 下也就打游戏比较费劲,同时因为 Intel 挖的坑,所以在 Linux 下直播也比较困难,当然这个话题可以放一放,以后有机会写一篇文章专门喷喷 Intel 在开源界的作恶。
(我也的确成功的在这破本上开启了 Linux 下的 Quick Sync Video,参见 《至今为止这个戴尔破笔记本上 Linux Mint 的使用经历》(https://blog.catscarlet.com/202010063801.html) 文章中的 游戏性能 章节)
但问题是游戏咱还是得玩是不是?
现在的做法就是双系统,板载硬盘只有一个 Windows 分区(C:),其他文件全部使用之前主机的硬盘,一块工作盘和一块备份盘用USB口接到主机上。以前这套 Windows 分区我是设计好的,大部分软件都是绿色化免安装的,可以直接插到另外主机上之后设置好盘符就行了,连绝对路径的问题都没有。

使用起来,在软件层面上没什么问题,毕竟这几年在公司电脑上也是靠这种方法用一张U盘同步文件的。
直到出现莫名其妙的文件系统损坏!
我之前已经写过一次文件损坏的内容了(参见《我的台式机坏了-续1:向垃圾笔记本上迁移硬件》(https://blog.catscarlet.com/202007143746.html))。当时以为是因为要反复操作导致不小心断电或者供电不足导致文件系统损坏了,现在看来就是 Win10 的锅。
我刚才说了,一块工作盘和一块备份盘用USB口接到主机上。用法就是每次开Win10后两块盘全开启,每个分区做文件同步。现在有三个备份分区,所以几乎是三天备份一次。这个备份策略是我在2011年设计的,当时是从一块160G向一块1T进行备份。2014年后因为更换主机,改为从一块3T向一块1T备份,工作盘明显比备份盘大太多了,所以不再是全盘备份,只备份自认为比较重要的文件,比如正在用的工作资料,照片,游戏存档啥的,都是些世界上独一无二或者很稀有的个人重要文件。
也就是说如果出现不正常的文件变动,那么我在三天的这个周期内可以立刻察觉。而我是相当不信任 Win10 的这个操作系统的!
而且我的不信任的到了回报!
首先就是文件的莫名其妙消失!毫无正着,毫无预警,毫无理由。
首先这就是个我存放歌曲的目录,他就这么没了,而我在这三天周期内不仅从未读取过这个分区,更别说写入和删除了。而且我每次都会主动点击微软所谓的弹出设备,如果弹出失败我就直接关机,从不强制拔盘。当然是个人都知道微软那弹出设备做得相当垃圾,大部分时间是弹不出来的,至于为什么,微软从不告诉你,都是统一用正在使用的这个借口,并把锅甩给你使用过的软件,而实际上则是一堆微软自带的用途不明的应用强制绑定在了你的存储设备上。
反正整个目录就这么消失了。因为我的文件非常非常多,所以如果不是有这么个定期备份的习惯的话,什么时候丢的文件我都不知道。
另外还有一种情况,是突然报目录损坏,之后整个系统卡死,一会过后又缓过来,之后部分文件就消失不见。

这种情况可以用 CHKDSK 跑一遍,结果又分为两种情况。
情况1,是啥都没发现。但是文件就是没了。
情况2 是会发现文件系统错误,之后啪哒啪哒报一堆修复,但是文件还是没了(称之为情况2.1)。

情况2 之下,还有一种可能,是所谓的被修复文件会被丢到分区根目录下的 found.000 文件夹下(称之为情况2.2)。问题是你还没权限访问。

你可以尝试改一堆权限设置之后访问到里面的文件,但是非常困难。或者你可以直接在 Linux 下直接访问 found.000 文件夹,Linux 才不管你什么 Windows 的权限管理。
如果你丢失的文件不是什么特定日期拍的照片或者对文件内容没印象的话,你还得解决这到底是哪个文件夹丢的哪个文件。
总之这是我有记录的丢失过的文件记录:
多个音乐目录(有备份)
一个工作过的公司的代码仓库的部分问津(有备份,且.git目录没丢,所有数据都可以从.git恢复)
多个私人照片目录(有备份。但有一次有一个文件还到备份周期,丢失)
一个外包项目的代码目录(非.git仓库,无备份)(这个是彻底丢了,不过重要性不高,这项目估计不会再接,就算再接也是直接扒新代码)
个人网站的单个插件目录(有备份,且还有整站增量备份)
有一次有一个文件还未备份,就遇到了 CHKDSK 情况2.1。因为 CHKDSK 报错出来的文件名都是 8.3文件名,有时候甚至跟原文件一点关系都没有,比如我的目录下文件都是 DSC_+数字+.JPG 命名格式(照相机用的经典文件命名法),但是CHKDSK却报出此目录下有一个 SC+数字+.PNG 格式的文件丢失(刚好是截图文件的命名格式),导致我根本不明白到底丢的是一个照片,还是一张截图,而 found.000 文件夹下又是空荡荡。总之没了就是没了。

我还进行了全盘搜索,也没有能匹配文件名开头是SC0636且扩展名为PNG的文件。
这现象奇葩的在于:毫无规律。
按理来讲,如果是真的由于异常情况导致的文件系统损坏,应该都是损坏正在读写的目录才对。但我遇到的情况,丢失的全部都是些冷文件,可能一年甚至是几年甚至是一辈子都不会再访问一次的文件,但是这些文件有得真的非常重要。
你能想象可能等你老了,哪一天突然想翻出相册,看看以前拍过的照片,结果竟然找不到!
总之要不是因为有备份文件的习惯,到底会丢失多少文件,真的不敢想象。
(不过也是由于其毫无规律的特点,多张盘同时丢失同一个目录文件的可能性也比较低,用两张盘备份还算靠谱,只要祈祷 Win10 不要哪天突然把分区表给干了就型)
总之等我有钱了,一定要搞一台Linux NAS(然而btrfs在raid模式下又有bug)。
反正Windows我是不敢信了,毕竟 CHKDSK 自己都没事就报个拒绝访问。

(能搞出 8.3文件名 就已经很奇葩了好不好,Win10 的 CHKDSK 难道是用的 Win9x 的代码吗!)
二、垃圾Win10造成的性能问题
也像上文说的一样,现在 Win10 系统我只用来打游戏。但是这破机器的性能渣得恐怖(参见《我的台式机坏了-续2:这 Dell Inspiron 7380 破本的散热问题》(https://blog.catscarlet.com/202007203759.html)),所以勉强打点最低画质的游戏就凑合了(2010年的星际争霸2都只能最低画质,即韩宗画质,而且仍然掉帧)。当然像FC这种连当年486机器都能模拟的模拟器应该是没问题的吧?
想得美!
我之前在《垃圾Win10》(https://blog.catscarlet.com/202101203846.html)中讲过的关于 Windows Update 的性能占用,我后面拍了一个视频,顺序记录了一下Win10自带软件的抽风情况:

按顺序,分别是:
资源管理器
Intel核显控制中心
图片
SysMain(SuperFetch)
兼容性遥测
Dell驱动
Windows Event Log
Windows Update
wsappx(AppXSvc)
最大户有两个,SysMain(SuperFetch) 和 Windows Update + wsappx(AppXSvc)
1. SysMain(SuperFetch)
这一段请参见我上一篇文章:《鸡肋一般的SuperFetch(SysMain)》(https://blog.catscarlet.com/202105223941.html)
2. Windows Update + wsappx(AppXSvc)
wsappx(AppXSvc)其实是应用商店,我没用过,是他自己抽风。
选手自己爆炸这种事我现在可是看多了。
解决的办法就是用网上传的方法,
如果 wsappx 抽风且已安装 Microsoft Store ,就卸载 Microsoft Store
如果 wsappx 抽风且未安装 Microsoft Store ,就安装 Microsoft Store
因为如果你手动卸载了 Microsoft Store 后,仍会有很多微软应用去调用 Microsoft Store,于是进入死循环,最后仍消耗完资源。
什么JB玩意。
三、垃圾戴尔 DSA-2021-088/CVE-2021-21551 安全漏洞导致的损失
说真的反反复复被 Win10 折腾也就算了,毕竟还没遭受什么太大的损失不是。等以后有钱了重新组回台式机,传闻独显在 Linux 下性能也不错(我其实就是为了稳定性才选的核显笔记本,结果反被 Intel 坑了)。
那万一数据没活到那一天呢?
5月15日那天,我原准备做一期游戏视频,所以需要进入 Windows 玩一段游戏录屏准备素材,结果在 SysMain 和 Windows Update 都没有大抽风的情况下,整台机器直接卡住,卡得连 Windows Update 页面都载入不能了。
我打开任务管理器,看到的是这个。
CPU已经全部被吃得一干二净。
接下来就比较恐怖了,我的机械硬盘IO直接100%。
我的第一反应是:中毒了!而且还是 勒索病毒 !现在这个过程就是扫我的硬盘并把我的数据都加密的过程!
“弹出设备”,失败。使用火绒强制弹出,有进程占用:
直接拔盘,直接长按电源键强制关机。
进入 Linux 与备份盘对比一下,文件没有变化。瘫到凳子上,长出一口气。
他妈的不对劲!
做起来,重新看一眼照片,他妈的这不是戴尔的驱动嘛!
哦草我想起来了,这他妈的不是戴尔埋了12年才发现的 DSA-2021-088/CVE-2021-21551 嘛!
CVE-2021-21551 Detail on National Vulnerability Database
CVE-2021-21551 Detail on mitre.org
Dell DBUtil_2_3.sys IOCTL Memory Read / Write
DELL dbutil_2_3.sys 2.3 Arbitrary Write / Privilege Escalation
DSA-2021-088: Dell Client Platform Security Update for an Insufficient Access Control Vulnerability in the Dell dbutil Driver
首先,跑起来并占用CPU和硬盘100%的罪魁祸首是这个:Dell Security Advisory Update - DSA-2021-088,或者是这个:Dell Security Advisory Update - DSA-2021-088,前者是基础版,后者是豪华版(for enterprise customers)。但是我并没有主动安装过这个玩意,这玩意应该是戴尔的哪个驱动偷偷后台运行下载下来的,其行为是全盘扫描 dbutil_2_3.sys 这个文件。
戴尔你他妈自己的程序漏洞,你他妈的扫我的 Steam 游戏库做什么?你扫我的工作文档干什么?
我记得好像国外有那么一个法案,说未经用户授权允许,不得擅自扫描用户磁盘中的内容。看来是我记错了,不然像微软戴尔这种垃圾公司早就被搅碎投到太平洋喂鱼了。
四、重装系统
1. 安装 Win10
反正这系统是不能要了,开机肯定还是得抽风。干脆选择重装系统。
首先还是先在戴尔的官网上过一遍,没发现除了 Dell Security Advisory Update - DSA-2021-088 之外的任何更新。好家伙也就是说装驱动时还是会先把漏洞装上之后再用工具全盘扫描?有病啊。
按照惯例,准备两U盘,一个 Linux live-cd 用来在 Windows 系统安装之后恢复 grub 引导(结果没用上,下文叙),另一张用来做 Windows 安装盘。

干掉 Windows 的分区。此时用 update-grub 仍然能检测到 Windows 启动项,因为他的引导信息是写在 EFI 分区中的。不是什么大事,反正只要 Linux 还能启动,一切都不是事。注意别把 EFI 分区也搞没了,不然会把 Linux 也搞得启动困难,就真只能用 live-cd 搞了。

重启并用 Windows 安装U盘引导。劈头盖脸就是一句 install.wim 文件找不到。
奇幻的妖蛾子我就不整了。根本原因是 install.wim 文件大小超4G了所以 FAT32 支持不了,而 UNetbootin 在复制的时候竟然不报错直接复制了一节子就糊弄过去了,且 UNetbootin 不支持 exfat 文件系统。
解决办法是:install.wim 就是个 Windows 的 LZX 格式压缩文件,且支持分片。直接把这个文件分片就行了。在 Linux 下装个 wintools,按自己心情将这个文件分片成4G以下的大小,之后把U盘上那个半喇的 install.wim 删了,把分片的.swm文件复制过去就行了。
接下来就是比较烦人的 Windows 安装时间了。很烦人,中途会突然用很大的音量嚎一大段“我是小娜”,因为是笔记本甚至还没办法把音箱拆下来。我正好是在深夜修这个系统,没被邻居砍死真是走运。
装完系统就见弹窗+报错,是有多少腾讯和奇虎的流氓员工跳槽成功到微软。

趁着机会检查两件事,第一件:检查 Program Files\WindowsApps 目录下有多少垃圾
(PS:截图是我在启动 Linux 之后截的,当时忘了)
好家伙,一堆没卸载干净的垃圾文件
第二件:检查电源管理
这回可以确定之前的疑惑了。我的电脑装完系统后,就是没有与硬盘和USB相关的电源管理选项,是微软的锅,而不是戴尔驱动的。这个问题会导致外接机械硬盘频繁的断电重启,会导致系统特别的卡。
2. 恢复 grub
关机,准备恢复 grub 引导。操作太快忘记插盘,引导选择界面提示可以用 UEFI 引导
选择之后直接进入 grub 界面。好家伙开来 Windows 是过分的自大了, UEFI 都不更新直接默认认为世界上就只有 Windows Boot Manager。
回到 Linux 下,运行 Boot-Repair ,如果没装就装一个。有兴趣的就研究,没兴趣的就直接点 Recommended repair。
双系统就算搞定了。
五、无法实现的 Windows 备份/镜像
其实这时候我还考虑了以下关于系统备份的事情。
Linux 的系统备份我已经完全实现了,可以实现瞬间回复到指定的备份时刻,且备份是纯增量的,完全不多占用硬盘空间。
几天前刚刚把系统恢复到二月份的某时刻,把这几个月稀里糊涂装到系统上的用不着的垃圾软件都抹掉了,解放了3G的空间。回头看看,其实现在也就跟二月份刚安装 Linuxmint 20.1 的时候多占用了 200M 的空间而已,都是软件更新。
我的这个 Linux 的系统备份,是基于 Btrfs 文件系统的 写入时复制 实现的,比 LVM 方案要简单容易得多,且用起来也很方便,用户体验像虚拟机快照一样,但是却是在实体主机上实现。关于 Linux 的系统备份的更多资料,请参考这篇文章:《使用 Btrfs 来让 Linux 支持快照功能》(https://blog.catscarlet.com/201912043576.html)
Windows 呢,NTFS同样是写入时复制文件系统,但是从其诞生,到利用写入时复制存在又消失的卷影功能,Windows 从来就未曾提供过像样的备份功能,我在 Win7下用了好多年卷影备份,的确旧回来不少文件,但是升级到 Win10 后,卷影功能就没有成功运行过,而且还把我以前的卷影备份给删除了。
哦是的,他的确还有一个非常臃肿的全盘备份功能,不仅要有一个同等大小的额外存储,而且,我还被坑过:备份是备份出来了,但是还原的时候就说不是合法的备份文件,耍猴呐!
所以这次的思路比较原始,直接在 Linux 下 备份 Windows 的 NTFS 分区。
思路一:文件备份
这个办法要是备份基于 Linux 的系统和文件系统为FAT的操作系统是行得通的。系统嘛,其实就是一堆文件。
但是在 NTFS 系统上不行。
原因在于 NTFS 在多个位置都使用了快捷方式(.lnk),而 NTFS 快捷方式的指向基于根为分区序列号的,每次格式化硬盘重建分区,分区序列号都会变,就会导致快捷方式全灭。
虽然 Linux 也有到处使用软链接和硬链接,但是他们的根指向基于的是真正的根,一个 Linux 系统的根永远是唯一的。FAT 系统的快捷方式指向的则是文本层次的绝对路径或相对路径,没有问题。
虽然本身 Windows 的 WIM 就是一个压缩文件而已,但是没人想用他那玩意。
思路二:分区镜像文件
这个思路在 Linux 下也是可行的,知名的树莓派就是这么安装系统,官方提供一个 Image 文件,用户写到 SD 卡上,加电开机,系统自动将分区扩展到 SD 卡最大空间。
这个思路,大概……其实我不知道这么做能不能保证正常,因为在实现过程中卡死了。
首先,DUMP一个分区不是难事,用dd,或者用 Linux Mint 的 Disks 工具就可以。
问题是DUMP出来的 Image 文件是整个分区的信息,大小和分区大小是一样的。我为 Windows 预留的分区是68G,DUMP出来的文件就也是68G。太不值了,新安装未压缩的 Win10 也就 10G 左右,而且那么多重复文件,价值完全没有5G。我还尝试压缩成 .xz 压缩格式,结果文件并没有缩小多少。理由很简单,分区中没有文件的空间并不是涂的00或FF,而是索引已经删除的垃圾数据,顶多在做数据恢复的时候才有价值。这些垃圾数据占用的空间会在需要的时候才涂掉并写入新文件。所以单纯的压缩 DUMP 出来的 RAW Image 没意义。
一个思路是使用 ntfsresize 对 DUMP 出来的 Image 进行 Shrinkage,之后直接改写分区表,对分区进行重新分区,再重新 DUMP 出来,这时 DUMP 出来的 Image 就是最小化的了。
太复杂了。
先不说fdisk直接就懵逼了。
Shrinkage 咔嚓咔嚓大半天,68G 的 Image 还是 68G,再对一个 Image 文件进行盲分区(仅分区,不创建文件系统)。
我甚至在想要不要 shrinkage 之后直接 xz 打包算了(因为Disks可以直接像盘里面写img.xz格式),但是这也意味着以后 Windows 分区必须大于 68G 才能用。
妈蛋谁爱研究谁研究吧,我才不想对个垃圾 Win10 付出这么多。
六、安装驱动
首先说明,我机器是插了有线网卡的,装系统全过程中都要把网线拔掉,以免 Windows 在安装过程中突然联网抽风。
麻烦的就在这,因为装驱动经常提示需要重启系统,部分比较关键的驱动我是会主动选择重启的(不然后患无穷),而我又总时不时切到 Linux 下上网,结果有一次插着网线就启动了 Win10 了,结果当然是,一堆硬件再装完驱动后不能正常识别。害得我最后决定全部返工重做(顺便验证了下基于文件备份Win10不可行)。
第二次完全没插网线,把所有驱动都装完后,才插上网线,激活 Windows,手动启用自动更新。这个过程我甚至跳过了IME驱动,结果IME还是被装上了。
至于垃圾戴尔的安全漏洞,我在装驱动时避开了所有戴尔相关的奇葩软件,只安装了硬件相关的驱动。安装完成后全盘扫描了一遍,没发现有叫 dbutil_2_3.sys 的文件。
后来搜到了这么个文章:Dell修補存在12年的驅動程式高風險漏洞,发现这个漏洞只包含在:
Dell Command Update
Dell Update、Alienware Update
Dell System Inventory Agent
Dell Platform Tags
BIOS 更新
Thunderbolt 更新
TPM 更新
Dock 更新
好家伙戴尔自己开发的东西全灭,而我一个都没装。(BIOS更新是在BIOS界面更新的)
真爱生命,远离垃圾。
后记1
我啊,骂了这么多年垃圾 Win10,垃圾戴尔。
说真的我不是看不起 Windows,我20多年钱就开始接触电脑相关知识,光是对着个亲戚公司扔了不要的比我年龄还大的486的CRT大脑袋我就用了DOS和Win95多少年,Win95 Win98 WinXP Win7这个顺序一直用到去年。Win10 垃圾是有种特别的味道,因为垃圾得很俗套:
错用旧版代码
基本功能失灵
山寨照搬照抄
像什么呢,像是我以前同事开发的。我先说明白了我可是很看不上这种同事,但是人家活得就是如鱼得水。在公司里的时候东西做得一团糟,大部分时间都是别人给他擦屁股,最后只好领导劝退。劝退之后背背题,他就进了BAT了,进了BAT,没过多久就进了比BAT还好的公司,有得就是微软。于是现在微软做出来的产品味道就真的是很怀旧,但是一点都不怀念。
是啊,这Bug是他实现的,是我修的;现在Win10这Bug是不是他实现我不知道,反正不说十分相似,但可以说一模一样。
但是他如鱼得水买房买车娶妻生娃,我却没钱没房没媳妇,连工作都没了,却还要见证整个行业质量滑坡,过个日子还要被他们继续坑。
后记2
我啊,骂了这么多年垃圾 Win10,垃圾戴尔。
我也没少遭反驳。
有一次我大骂 垃圾Win10,结果竟有人跳出来说 Linux 也不是什么好东西。
拜托,“抓捕鲁迅和我郭沫若有什么关系?”
我就很疑惑,微软是你爹啊你这么向着微软。结果没过5分钟,他内存溢出了。
微软:亲爱的用户,我是你爹。