[玩机滑铁卢] 记一次由Windows文件错误递归删除引起的重大事故,以及及对使用Win的Linux爱好者的忠告

前言

  我是怀着一种极为沉重的心情写下这篇记录的,仅以惨痛经验告诫后来者。倒也不是啥大问题,最多就是修修补补一年的开始菜单废了(基本是恢复不了了),两三个游戏最近几个月的存档没了 :upside_down_face:
  如果数据无法恢复,这可能我在Win上发的最后一个话题了。我终于明白我其实还是想要Linux。
  开这个话题也是想提前了解一些Linux实机安装的知识、是否应该分区和系统必须配置的内容。以及一些具体的如桌面环境的推荐,输入法、播放器一类基础的推荐,firejail这类沙盒软件的使用等等。我的初步打算是装Debian。

  如果不打算看后面的长篇故事,我的建议只有两条:

  • 在Windows中慎用 mklink 命令(PowerShell中也有对应命令),如果已经使用mklink建立符号链接 mklink /d 或者目录交接点 mklink /j 时,尽可能使用文件资源管理器进行文件操作(移动、删除),特别是删除一定要使用文件资源管理器的彻底删除(不是移到回收站)。请勿任何第三方软件特别是Linux移植软件进行文件操作,极易出现递归删除(删除同时删除源文件)
  • 如果你是正在使用Windows或者Mac的Linux爱好者,请遵循内心尽可能选择Linux。我今日的失误很大程度上尝试在Win上模拟Linux体验造成的,Linux的文件系统与Win的相差巨大,移植软件产生的问题自然是难以估量。想要Win的稳定,又想要Linux的自由,这种脚踩两条船的行为必然会遭到报应,今日的失败便是我的报应。(人在做,诚在看。珍爱生命,远离劈腿。 :innocent:

复盘

起源:

  一切要从我那天无意间点开Docker,突发奇想想学一学咋操作。然后一顿操作发现C盘(分了3个盘:110G+150G+225G)炸了,于是我就去找怎么转移镜像。然后就找到了这个故事的主角——mklink命令。成功转移到了E盘,拯救了见红的C盘。

发展:

  见到mklink命令这么好使,我就考虑这是不是可以曲线救国,实现不同盘的融合(盘已经合不了了)。因为Sandboxie装在D盘,导致D盘也快要见红,于是我把几个游戏沙盒(70G)通过 mklink /j 命令转移到了E盘(记住这个命令)。具体情况可以看这篇帖子(现在看起来当时确实挺高兴的,完全不知道接下来会发生什么):

这样成功解决了几个盘内存不均的问题,还把一些常用的lnk改成了junction(影响最大的一个决定)。

高潮

  就在一切都“蒸蒸日上”,感觉无比满足时,我开始了一系列现在看来想锤死当时自己的操作。
  首先是发现 mklink /d 命令要比 mklink /j 命令更加实用有效(之前用的都是 mklink /j ,因为一开始找到的教程用的就是 mklink /j)。然后我在Sandboxie的issue中发现是可以通过修改ini配置文件实现沙盒位置的转移,只是没有预先标识和ui集成,这种方法更加稳定兼容。
  于是,在追求完美的心理作用下。我使用官方提供的方法修改了沙盒位置,完美。又将一些常用的快捷文件夹使用 mklink /d 命令重建了软链接,可行。而那些被删除的则被移动到了回收站,无害。
  在一切结束后,完全是肌肉记忆:开始菜单>磁贴>左手第一列第四个文件夹>Bleachbit no uac>清理>确认
  然后,彻底有害。

尾声

  按下确认键的时候我还完全没有意识到做了什么,只看得清理数据越来越多,已经到了9、10G了,心想大概是之前删了两个4K电影吧,没事。然后低头看了一眼手机,再看屏幕时,清理量已经达到了60G,这时候才发现情况不对点了暂停,但一切已经晚了。

  最后的结果就是我的开始磁贴从当初的满满当当变成了残垣断壁。

  被清空的几个快捷目录如下:

  • C:\Users\user\AppData\Roaming\Microsoft\Windows\Start Menu\Programs(所有在用户权限下安装的软件lnk,我建立的10个文件夹的绿色软件、沙盒、快捷命令lnk)
  • D:\Script (所有自用的dos脚本)
  • D:\Software (所有无安装程序的绿色软件,至少有10个)
  • D:\MSYS64\home\user (MSYS2的home目录,包含所有快捷命令,vim、zsh配置)

  最开始转移的Sandboxie的游戏沙盒更不用说,数据直接少了一半,打都打不开,更别说存档了。其中包括HMCL、因为离线没有保存的文明6存档(昨天刚打的),损失最少的反而是占内存最大的Epic的生化奇兵,因为有云同步。
  后来也找过数据恢复软件,但删的文件实在太多,甚至一部分软件已经无法使用,扫出来的文件太杂,有好多都是之前删掉的垃圾文件。
  总之,一片狼藉。

反思

  整个事故中最主要的两个角色,一个是 mklink 命令,一个是清理软件Bleachbit。核心原理大概就是:被移动到回收站的被Bleachbit识别为指向源文件夹的目录,而非junction。因此,当Bleachbit执行清理程序时,删除指令被递归到了源目录。用命令来说就是 mklink /j C:\A E:\B 建立了指向源目录B的A,A被移动到回收站,正常应该执行 del 回收站\A,但Bleachbit直接执行了 rm -rf E:\B (Linux移植)。
  这样的事故其实之前遇到过,那次更加严重。我用 mklink /d D:\MSYS64\home\user C:\Users\user 将Win的用户目录链接到了MSYS2的home目录,但后来发现这样做不仅无意义而且产生了错误,于是直接执行了新学的rm命令 rm -rf /home/user。然后结果就如现在一样,删除命令直接递归到了源目录,将整个用户目录清空,所有配置文件丢失。最后只能重置电脑。当时没有明白其中原理,重置系统后没有去深究,现在明白了,只是又掉入了相同的坑。
  通过这两个事故,你会发现mklink的支持率并不高,特别是Linux移植和仿Linux操作逻辑的软件。如果你在GitHub上搜索FILE_ATTRIBUTE_REPARSE_POINT,你会发现同样的问题数不胜数。因此我建议当你使用较多具有Linux操作逻辑软件时,慎用mklink命令(PowerShell中也有对应命令),如果使用mklink建立符号链接 mklink /d 或者目录交接点 mklink /j 时,尽可能使用文件资源管理器进行文件操作(移动、删除),特别是删除一定要使用文件资源管理器的彻底删除(不是移到回收站)。请勿任何第三方软件特别是Linux移植软件进行文件操作,极易出现递归删除。

碎碎念

  就像我最开始说的,我今日的失误很大程度上尝试在Win上模拟Linux体验造成的。无论MSYS2,还是Bleachbit,都是我在Win上追求Linux体验才使用的。MSYS2就是一个mingw编译的gcc环境,Bleachbit甚至一开始搜索时就搜的是“Linux常用垃圾清理软件”。
  事实上,这次失误并没有上一次失误严重,花一天时间将软件全部装一遍就基本能恢复。但当我仔细看着我经营许久的Windows桌面,虽然已经残缺不堪,但处处都是GUN的痕迹。我突然发现,其实我真正想要的是Linux,我在Windows上模拟Linux的时间完全足够我将Linux从入门到日常使用。所以,为什么不直接去装一个Linux呢。
  所以,如果你是正在使用Windows或者Mac的Linux爱好者,请遵循内心尽可能选择Linux。
  我一开始说了,这可能是我在Windows上发布的最后一个话题了。如果三天后我买的U盘到时还没有做到完全恢复(也已经不大可能恢复了,即使恢复也会觉得有错误文件被恢复而感觉不如重置,而且我也没有精力再去粉饰这个充满Linux痕迹的Windows了),我就装Linux了。
发这贴的一个目的也是打算提前了解一些Linux实机安装的知识、是否有必要分区和系统必须配置必装的内容。或者具体的如桌面环境的推荐,输入法、播放器一类基础的推荐,firejail的使用等等。我的初步打算是装Debian。

写在最后

  感谢能看到最后,感谢能看一个刚刚失去梦想的咸鱼发牢骚。

10 个赞

感觉没那么严重,似乎只有脚本是不可复制的。其他软件之类的,重新下载和设置应该能挽救回来。
你没有用同步盘同步关键数据吗?感觉自写的脚本应该放在同步盘里才安全。

这个我明白,重要数据都在,我也说了,其实只需要一天就可以大致恢复。只不过是突然想明白了,已经不想在win上将就了,更想用Linux。这个可能是我最后的关于windows的话题了,不过一半都是在发牢骚。

没试试恢复数据么

话说 mklink 是 cmd 的命令,现在 powershell 都是用 New-Item -ItemType SymbolicLink/Junction/HardLink -Path "Link" -Target "Target"

1 个赞

WSL 更多是一个方便使用的环境,临时编译些什么或者是运行 unix-like 二进制特别好用,但缺少 systemd 之类的支持,而且 WSL 2 糟糕的跨系统 IO 性能,肯定是不能真的 All in One 的。

去搞一个 Linux 双系统吧,你对于命令很明显已经有概念了,双系统对于你而言肯定不是什么难事。Linux 上可以考虑使用 Btrfs 的文件系统格式,可以随时缩增分区大小,还可以生成快照,像你上面丢数据的操作,有快照的话随时可以恢复的。

试了,删的太多了,删之前文件操作也很频繁,扫出来的数据一半以上是垃圾数据。其实多数数据都能靠花时间重新新建,重要文件啥的也没受多大影响,游戏数据的话之前其实丢过几次。但我已经不想在这上面花这些时间栏了,说到底不想在Win上继续将就了,给了我换Linux的理由。

主要mklink好写一些,这次用的也是cmd就没再提powershell,应该是没啥区别,同样慎用。

折腾的必经之路吧。与win、linux都无关。总结经验教训就是,数据要多备份,重大数据操作要备份。不要对自己能力盲目自信。

wsl问题确实多,也是让我觉得不如装linux的一个重要原因。

打算直接装linux,双系统需要多花时间同时学习两个系统的内容。事实上我现在需要的win场景就只有上网课了,甚至qq、微信都不重要,感觉装成虚拟机就行,然后学习一下kvm直通。

发帖的目的也是将失误经验传递出来,至少我觉得看过这个帖子得人应该很难踩到相同的坑里。
事实上重大数据几乎没受影响(也没多少重大数据),即使受影响也有备份。只是在事故发生时,我第一次有时间去审视我这两年到底在Windows上搞什么。我的Win上,Linux移植软件几乎占了一半,类Linux软件也至少有3成,玩的游戏也是要么Linux上也能玩要么就是可玩可不玩。总之,我想通了,我其实就是想要Linux,这次只是给了一个重开的理由。

你這都是軟件/命令層面的,真正驚心動魄的是小白對磁盤的操作…整部電腦都要重裝!

1 个赞

问题的原因是 回收站与mklink的协调问题?

感觉你没看明白,回收站只是Bleachbit会清理,核心是Bkeachbit不识别符号链接。将视为了源文件,你用Bleachbit直接粉碎效果也是一样的。

1 个赞

小白不会mklink,也不会照着“Linux常用软件”搜Windows软件。

Bkeachbit是第三方清理工具,还是win10的回收站基本功能?
还在用win7,也基本不使用回收站(都是永久删除的),mklink倒是xp时就用junction的

是第三方清理工具的问题,严格使用win自带的回收站清理机制完全无害。之所以说最好彻底删除是,你有可能在不自觉中使用第三方软件清理。
不过仔细想来,和回收站的机制也有一定关系。junction的移动即失效,但回收站保留了原位置指向,这才让Bleachbit递归清理。

很久以前吧,我还在用瑞星的时候哦,它有一个小工具是文件粉碎的,我当时觉得删除文件不够彻底,必须要粉碎才干净呀,所以就各种粉碎,然后当我粉碎了几个 .lnk 的快捷方式之后,我发现源文件消失不见了。

1 个赞

这个问题是 Python(和对 Python 不够了解的开发者)的责任,Python 的 os.walk() 在遍历文件时,即使指定了不解析链接也会进入 junction(但不会进入符号链接),这个问题已经存在了五年半,目前还是没有修复。不过在两年前 BleachBit 就有人报告过这个 bug 了,开发者也已经修复,如果不是你的版本太旧的话建议向开发者反馈下。

不建议将这个问题归结为 Windows 与 Linux 的问题,Python 和 BleachBit 都官方提供对 Windows 的支持,文件链接也是 Windows 文件系统的正常组成部分,Windows 本身也在大量使用符号链接和 junction,不论怎么说都怪不到 Windows 头上。

4 个赞

回想这么多年,我犯过类似的错误此类错误无数,虽说近五年,我基本不怎么爱折腾linux。
其实吧,一般说来懒惰+完美主义才是技术进步的源动力,但是经常有时候我们还是要提醒自己经常备份~。mklink此类的命令,现在用的比较少了,在硬链接&符号链接刚出来那段日子简直玩的不亦乐乎。现在此类工作我习惯于在资源管理器下使用Link Shell Extension。其实这次灾难的核心问题是事前没有预料到Bkeachbit的工作机制问题。。。。不过怎么说呢,折腾其实未来还是不可避免的~ :joy: