Shawn's Blog

一个伪程序员的伪技术博客

0X00 背景

前两段属于并不那么重要的“故事”部分,如果切实需要一些数据恢复的经验和方法的话可以直接跳到0X02部分,给个一键三连就好(哦不对这不是B站视频,那你白嫖好了)。

故事大概是这样的,之前我有一台 Synology 的成品 NAS 用来存储我自己的照片、视频、音乐、电脑数据备份和喜欢的电影,不过因为它是单盘位的用了大概三年之后它就几乎满了,我也就开始准备升级 NAS。后来经过一番调研发现自己的需求其实不太适合用 Synology 的成品,因为它性价比低的同时附带的很多软件功能我都不需要,相比于自建 NAS 所需要的计算机知识我也正好具备,就选择自己搭建一台 TrueNAS 出来。准备的配置是CPU Intel G6400 + RAM 8G X 2 + SSD 120G + SSD 240G + HDD 8T X 3 + HDD 4T,其中双核四线程的 CPU 给这台 NAS 用已经是完全没有问题了,同时因为使用 ZFS 也就配备了 16G 的内存,8T X 3 作为主要数据存储并且搭配了 240G 的缓存盘;另外那块 4T 是从老群晖上拆下来的,作为独立存储使用;最后最小的 SSD 用来装系统。当时还整理了一篇博客来记录这件事(最近有一点点小改动)。

本来我那个 4T 的盘拆下来之后就一直没用,直到前几天我突然想把它也塞到我现在的NAS里去,正好把 OMV 换成 TrueNAS,再加一个缓存盘,重构一下自用 NAS 的架构从此就不再管它了。然后我就把重要数据打包一股脑塞到了那个小硬盘里准备重建 NAS(此时我自己的照片、视频、备份文件全部都在这个小硬盘里)。等了几天需要用的 PCI-E 转 m.2 的扩展卡和 PCI-E 转 SATA 的扩展卡都到了之后就开始重新装机。

把扩展卡和 SSD 之类的都装好之后,我特意把小硬盘的线给拔了,防止在重装系统或者其他的时候误伤到它。然后开始一路顺利的安装好了 TrueNAS 并且配置好了 3 X 8T 的存储池之后关机,准备接上小硬盘电源开始往大存储池里恢复数据。

0X01 事发

拆开机箱盖、拆开侧面版、给小硬盘插上线、装好侧面版、装好机箱盖、插上电源网线、开机、坐到笔记本前、打开 Firefox 开发者版、打开 TrueNAS 管理页面、输入用户名密码、登陆、找到存储池、格式化刚刚接入的硬盘…… woc,woc,woc 我干了啥!!!

当我意识到我格式化了装满了重要数据的 4T 硬盘之后,本来整个人都很困,结果一秒钟之内就像喝了一百杯 Espresso 一样清醒了。当时脑子里的意识流差不多就是“卧槽完了、卧槽没了、卧槽出大事情了”,愣了几秒钟之后意识到了一个重要的事“刚刚格式化的是机械硬盘”,然后第一时间卸载了挂好的硬盘并且关机断电拆机拔线。

拔掉线之后冷静了一下觉得数据应该还能找回来,赶紧开始想办法。想办法的过程中又想到“我磁盘分区貌似是 xfs 来着,这个估计还难搞”,想到难搞之后整个人又是一愣🤣

然后我开始东找找西找找,看看有没有什么好办法可以恢复数据的。当时第一时间是想到找线下的数据恢复公司,但是找数据恢复公司的话就非常贵了,而且又非常麻烦,就打算想想办法有没有可能自己把数据恢复回来。又想到 DiskGenius 可以恢复,但是去官网看了一下这玩意儿好像还有点贵(官网售价 468 元人民币),当然如果肯定可以恢复回来 468 还是值得的,不过我还是想去找找看有没有便宜一点的方案。然后也陆续找了一些其他软件,要么就是没听过的小公司搞的,要么就是特别特别贵的。就在打算去买 DiskGenius 的时候发现了一个叫做 万兴恢复专家 的软件,当时第一反应是“这种名字一般都不靠谱,就像 21 天精通CPP一样不靠谱”。不过在调查了一下这个软件和公司之后,我发现背后的这家“万兴科技”是上市公司,且旗下有亿图和墨刀两大将,就打算去试试看了。

软件下载下来之后扫描了很长时间,虽然我费尽心思下载到的46G让子弹飞这种都没有扫描到,但是我最最最最重要的照片们几乎都扫描到了,然后我就眼睛都没眨的付费买了永久授权的这个软件,因为才160+块钱对于这么多重要数据来说真的不值一提,然后用了很长一段时间把数据恢复了回来。不过值得说的是,我的几十部电影无一幸存,但是自己拍的照片的幸存率超出 90%(估计的),这个我也没搞明白是为什么。

现在我已经把重要的数据都整理出来了,所以才有心情来整理这篇文章。说是一篇文章,但是前面这段可能对于看官来说都是废话,我也只是想记录一下这么个经历才把它写出来的。最后来总结一下遇到类似情况的时候应该怎么做吧。

0X02 总结

首先,首先,首先,数据恢复的最佳时机永远是在数据丢失之前做,换句话说就是 不要把自己的重要数据搞丢 。然后如果数据万一真的丢了,那么我总结了几点这次的经验也许对大家有那么一丢丢的帮助

  1. 还是强调不要删掉自己的重要数据,在删除东西之前最好 冷静 几秒钟,格式化磁盘之前最好 冷静 几分钟
  2. 如果万一删除了或者格式化了,请第一时间先弹出、卸载磁盘,保证 不要再像磁盘中写入任何数据
  3. 找到一个你信得过的数据恢复软件,接上存储设备先扫描看看(大多数收费的数据恢复软件扫描也是不要钱的,所以你可以先看看究竟能恢复出来多少数据,可以根据这个数量决定是不是要付费购买软件)
  4. 使用数据恢复软件将数据恢复出来 不要放在恢复的磁盘里 ,应该单独找个地方存储这些恢复出来的数据

什么?你说盗版软件?这种事情就不至于还用盗版软件了吧,别人的软件帮你找回了你最重要的数据,如果是万兴的年费版的话才99块钱,难道你最重要的数据连 99 块钱都不值?

最后需要注意的几个小问题

  1. 如果是误删和“快速格式化”的话,找回来的几率都还比较大
  2. 如果是复写性质的格式化,那基本上也就别想恢复的事儿了
  3. 即使数据恢复回来了,通常情况下文件名也都彻底乱掉了
  4. 如果误删或者格式化之后又写入过文件,写的越多越没戏
  5. 如果你有 100 个文件,恢复率 99% 的话可能会丢一个
  6. 如果 100 个文件压缩保存,恢复率 99% 的话就彻底废了

最后的最后还有嘿嘿,如果你想要彻底毁掉你的硬盘,不想给别人拿着你硬盘恢复数据的机会的话

  1. 格式化的时候不要选择“快速格式化”
  2. 使用专门的工具全盘复写几次
  3. 上一条做不到的话就往磁盘里塞电影,塞满删掉塞满删掉连续个三四次

(毕竟你卖二手电脑,二手相机的时候肯定不会想成为下一个冠希哥吧

好了,我能想到的就只有这些内容了,最后希望大家永远永远永远不会用到这里面数据恢复相关的经验~

0X00 前言

首先声明这篇博客针对的是中级 Linux 用户,如果你还不清楚 Linux 中的基本权限机制 user/group/otherrwx 的话需要先去了解一下对应的基础内容才行。既然标题上写了是“不那么基础的权限”,也就能看出来虽然内容不是很基础,但是也不会很高深。

另外,这篇博客里提到的好多内容都是并不复杂的东西,但是非常零碎,也许你用了十年 Linux 还是不知道其中的一些小知识点,不过也没什么,毕竟这些知识点的使用率真的很低。

如果你看完了这篇博客有那么一点点收获,那我也算是完成目标了;如果你看完后发现所有的内容都是你以前就知道的,那我只能说你对 Linux 权限这部分的掌握超过了大多数人。因为我确实给周围好多人分享过这些内容,从刚实习的朋友到比我工作经历多很多综合实力也强很多的人,几乎没有谁是完全了解这些内容的。(所以说虽然这篇博客并不难,并不是什么高深的知识,但是我比较有信息让你从中获得那么一点点的收获)

本博客不涉及某个命令的具体用法,只起到一个让你“知道自己哪里不知道”的作用。如果想要仔细了解某个命令或者某个机制,可以自行搜索相关资料。

0X01 root 究竟是谁

“root是谁?”这个问题听起来很蠢,但是实际上好多人并没有思考过这个问题。我们都知道 Linux 中有一个叫做 uid 的东西,其实 root 用户指的就是 uid为0的用户,而非用户名为root的用户,我们可以通过 id 命令来查看用户的 uid。

而且值得注意的一点是 uid 是会被回收利用的。也就是说你创建了一个用户,系统分配了 1002 这个 uid 后,如果删掉这个用户紧接着再创建一个新用户是会敷用 1002 这个 uid 的。假设你删掉了系统中的一个老用户,又创建了个新的用户,那么万一 uid 是重复的就有可能导致这个新用户拥有之前老用户的权限,这是一种很危险的操作。

阅读全文 »

0X00 前言

在正式开始之前我们先要搞明白一个事情,那就是「函数」和「方法」到底有什么区别。首先来看一下在 Python官方文档里的定义。

函数:可以接受零个或几个参数并向调用者返回一些值的一系列语句。

function: A series of statements which returns some value to a caller. It can also be passed zero or more arguments which may be used in the execution of the body.

方法:在类里定义的函数。

method: A function which is defined inside a class body. If called as an attribute of an instance of that class, the method will get the instance object as its first argument (which is usually called self).

但是一般大家并不会很认真的区分「函数」与「方法」,而且就算不区分也并不会对平时的交流甚至编码造成任何影响(起码我没有因为不认真区分它们导致交流出现分歧或者代码出现 bug 的时候)。所以这里列出来也只是提个醒,防止有人并不是很清楚这两个名词表示的含义。其实我就是因为要写这篇博客才去搜了一下它们到底有什么区别,以前都是管 Python 里的叫「方法」,管 C 里的叫「函数」,不知道有没有人也是有这种不良习惯的🤣

既然搞清楚了,那么这篇文章后面就用「函数」来称呼好了,因为这些特性与是否定义在类里没有任何关系。(估计这是我第一次也是最后一次认认真真区分这两个东西了 hhhhh)

阅读全文 »

0X00 背景

本来家里有一台群晖的 DS118 单盘位机器装了一块 4TB 红盘,用了三年后存储空间已经告急了。再加上买了相机,有很多照片需要存储;还有两台 MacBook 的 Time Machine 需要备份,而且还有不少下载的电影时不时想要回顾一下,空间就非常紧张了。虽然这台群晖的体验确实是挺好的,不过因为我这款性能太弱了,每次上传照片的时候创建索引都会卡死很久,期间几乎所有操作都是无效的,而且因为是单盘位既没有数据冗余也不能扩展空间,就想着是时候给家里的 NAS 升个级了。毕竟再过不了多久这块磁盘也就被塞满了,到时候再研究迁移就会导致中间断层一段时间,还是不太好。

一般来说自己家里的 NAS 有几种方案,这些方案各有其优劣,都有适合和不适合的群体,可以根据自己的实际情况进行选择。

上下文提到的 FreeNAS 同时表示 FreeNAS 和 TrueNAS

  1. 群晖:简单易用、几乎不需要任何计算机专业知识、体积小功耗还低、软件套件强大、软套件强大、软件套件强大,但是比较贵。群晖就有点像是电脑届的苹果:你花了更多的钱不需要付出什么额外的东西就能获得 80 分的使用体验,但是如果你对它不满意想要改造一下以便获取 90 分乃至 100 分的体验,那是很难的。就比如你想给群晖升级硬件配置,几乎是不可能的(有些机型允许升级内存)。系统虽然提供了 ssh 连接,但是由于定制化过高也导致我们不敢进去改一些配置;
  2. 黑群晖:不推荐,没有别的理由,只是因为盗版;
  3. 威联通等:比群晖便宜,易用性可能比群晖弱一点,不过也很适合不怎么具备专业知识的用户。如果想省心还想省钱,可以考虑用威联通之类的来替换群晖;
  4. 自建 TrueNAS:需要自己购买硬件攒机,需要自己安装操作系统进行配置,各种基础存储以外的功能都需要自己手动安装配置。所以不适合没有计算机专业知识储备的同学(当然你也可以先在虚拟机里尝试一下)。而且需要注意的是 FreeNAS 基于 FreeBSD,并不是Linux、并不是Linux、并不是Linux,所以即使有一些专业知识储备的同学也要注意到这一点。不过正式因为 FreeNAS 基于 FreeBSD 所以也就带来了完整且原生的 ZFS 支持。硬件方面毕竟是自己攒机装系统,性价比什么的当然就很高了;
  5. 自建 openmediavault:同样需要自己攒机装系统,所以性价比依旧很高。但是 OMV(openmediavault) 是基于 Debian 的,所以普适性更强一些。虽然系统性能上貌似不如 FreeNAS 不过用起来也还不错,因为我自己对 Linux 比较熟悉就也选择了这个方案;
  6. 自建纯 Linux:这个自由度是最高的,但是也是最折腾的。不仅要自己装机装系统,还得配置各种服务,其他方案上一键的 Samba 服务在自建 Linux 下都要配置一会儿。不过纯 Linux 的自由度是最高的,也能选用自己最熟悉的发行版本;
  7. Windows server:不推荐,理由和黑群晖相同,除非你愿意出钱买 Windows server 授权($501)
  8. 路由器插硬盘:这种方式适合对数据安全性要求低且功能要求更低的用。因为几乎只支持上传下载,而且可定制的功能还特别少,不过好在成本最低。如果只是插上去用其他设备看个电影什么的,路由器插硬盘的方案还是可以试试的

综合下来最后我选择了自建 openmediavault,因为群晖给我的很多功能我都用不上,比如说在线 Office 和 Video Station 等,反倒是性能太弱有点接受不了;TrueNAS 的话毕竟是 BSD 我没什么把握在出问题的时候可以修复它;纯 Linux 太折腾了,不想花那么多时间在上面。

阅读全文 »

0X00 什么是 ARP

首先纠正一种说法,ARP就是“地址解析协议”,所以严格来说不应该说“ARP 协议”,因为ARP Address Resolution Protocol就已经包含了Procotol了,说“ARP 协议”就相当于是“地址解析协议协议”,很鬼畜。

我们知道网络中寻找其他机器需要用到对方的 ip 地址,但是在局域网内两台机器之间通信是不用 ip 地址直接通信的,而是要用到 mac 地址。而且我们一般说的交换机也是二层交换机,现在假设两台电脑插到一个交换机上去,通过 ip 能找到对方吗?显然不能。因为交换机只支持到链路层,然而对于链路层来说它并不知道 ip 是个什么,ip 需要到再上一层的“网络层”才能发挥作用,所以在这种情况下就需要用到 mac 地址来通信了。

当一个数据包需要被发送到某一 ip 地址的机器上去时,最后一步就需要找到 ip 地址对应机器(严格来说是网口)的 mac 地址,从而进行通信。那么在这一步里“通过 ip 地址找到 mac 地址”的解析协议就被称之为:地址解析协议,也就是ARP: Address Resolution Protocol了。

0X01 ARP 的工作

我们知道 arp 是将 ip 和 mac 地址进行转换映射的,那肯定不是每次都要去转换的,要留个缓存的嘛。我们可以使用 arp -a 来检查当前机器上的 arp 高速缓存表,命令在 Linux 和 macOS 上可用,Windows 上不确定各位可以试试看。我这里是防止隐私问题把一部分数据给人工打码了,正常输出的就是缓存表里每个 ip 对应的 mac 地址。

1
2
3
4
? (192.xxx.xxx.1) at 4:xx:xx:xx:xx:0 on en0 ifscope [ethernet]
? (192.xxx.xxx.103) at (incomplete) on en0 ifscope [ethernet]
? (224.xxx.xxx.251) at 1:xx:xx:xx:xx:fb on en0 ifscope permanent [ethernet]
? (239.xxx.xxx.250) at 1:xx:xx:xxx:xxx:fa on en0 ifscope permanent [ethernet]

网络拓扑

ARP 的工作流程也是很简单的,当机器 A 想给 10.0.0.4 发一条数据的时候的时候:

  1. 检查自己的高速缓存表,发现没找到(有点类似与 DNS 先找 /etc/hosts 的操作)
  2. 机器 A 发出广播“你们谁是 10.0.0.4, 告诉我你的 mac 地址”
  3. 因为是广播,所以 BCD 都会收到此条数据
  4. CD 因为不是 10.0.0.4 所以忽略
  5. B 发现是在找自己,回消息“我是 10.0.0.4,我的 mac 地址是 1:0:2:7f:af:fa
  6. A 收到了回馈,并将 10.0.0.4 -> 1:0:2:7f:af:fa 记入自己的缓存表

所以 ARP 概括成一句话就是“广播一条消息:如果你是这个 ip 地址的拥有者,那么请回答你的 mac 地址”。

阅读全文 »
0%