Linux 数据恢复记录
基本情况
就在这几天准备搭建家里的服务器的时候,在搭建的过程中发现了数据盘突然被清空了,原因未知,可能是硬盘质量导致的,等待之后日志的查看。由于上面没有生产的服务,所以当务之急是把数据找回来。
服务器关键参数如下:
CPU:AMD-FX8000
硬盘:
SanDisk SSD PLUS 240GB
WDC WD10EARS-003BB1 (80.00A80) 1TB
WDC WD5000AADS-00S9B0 500GB
WDC WD5000AAKX-753CA1 500GB
WDC WD5000AAKX-003CA0 500GB
WDC WD5000AADS-00S9B0 500GB
突然丢失的硬盘是:
WDC WD5000AAKX-003CA0 500GB
在我们数据丢失后,我们应该第一时间卸载硬盘,等待后续的恢复的可能性。后面查看发现我是在清空后的两个小时才发现被清空的。我的数据库是挂载在这个硬盘上的,所以在被清空后所有的服务都不能正常运行了。宝塔的负载记录如下:
从而确定丢失的时间点
恢复前
首先显示卸载掉这一块硬盘,用的方法是xdrp链接服务器,然后打开disk程序,
## 开始恢复
在卸载完成后,我们安装testdisk
sudo apt install testdisk
在安装完成后,运行
kanchin@kanchin-desktop:~$ testdisk
显示如下:
TestDisk 7.1, Data Recovery Utility, July 2019
Christophe GRENIER <grenier@cgsecurity.org>
https://www.cgsecurity.org
TestDisk is free data recovery software designed to help recover lost
partitions and/or make non-booting disks bootable again when these symptoms
are caused by faulty software, certain types of viruses or human error.
It can also be used to repair some filesystem errors.
Information gathered during TestDisk use can be recorded for later
review. If you choose to create the text file, testdisk.log , it
will contain TestDisk options, technical information and various
outputs; including any folder/file names TestDisk was used to find and
list onscreen.
Use arrow keys to select, then press Enter key:
>[ Create ] Create a new log file
[ Append ] Append information to log file
[ No Log ] Don't record anything
选择Create来创建日志文件,这时候会要求你输入root的密码,输入完成后来到这个界面:
TestDisk 7.1, Data Recovery Utility, July 2019
Christophe GRENIER <grenier@cgsecurity.org>
https://www.cgsecurity.org
TestDisk is free software, and
comes with ABSOLUTELY NO WARRANTY.
Select a media (use Arrow keys, then press Enter):
Disk /dev/sda - 1000 GB / 931 GiB - WDC WD10EARS-003BB1
Disk /dev/sdb - 500 GB / 465 GiB - WDC WD5000AADS-00S9B0
Disk /dev/sdc - 500 GB / 465 GiB - WDC WD5000AAKX-753CA1
Disk /dev/sdd - 500 GB / 465 GiB - WDC WD5000AAKX-003CA0
Disk /dev/sde - 240 GB / 223 GiB - SanDisk SSD PLUS 240GB
Disk /dev/sdf - 500 GB / 465 GiB - WDC WD5000AADS-00S9B0
这里通过高亮选择我们需要的硬盘,然后回车进入,我选择的是[EFI GPT]
接着我选择了分析[Analyse]来对搜索分区,再之后再回车选择快速搜索,很快就搜索到我之前的分区了,把这个分区写入。
然后再按下q回到上一级,选择第二个[Advanced]来恢复文件,进入到如下的界面,并选择[Undelete]来恢复文件
这样我们就看得到一些被删除的文件了,但是有的文件名是乱码。我们先恢复这些文件,到新的位置。
我先是来测试一个文件是否可以恢复,所以我现在mysql这个文件夹按下了C,然后选择一个要恢复在哪里的位置,我这里放在新的硬盘上,选择到目的文件夹后再按C来放到目的文件夹,到好了之后他会显示ok,我们再到文件夹看一下,确定一下
我们可以看见,都复制下来了,于是我们可以直接回到刚刚的界面,我们这一次选择全部文件,通过按下a,这时候,全部文件都会变成绿色,在按下C,然后选择目的目录,这样我们就可以将所有的文件复制过去了。
乱码修复
在我们复制过去后,打开文件夹,发现好多文件名显示不正常,如果是在宝塔里面,那么他会直接显示不出来。但是我们用ssh连接,并输入如下
tree
会输出如下:
我们可以看到,这个名称是由\开头的,加上三位数字,我与我电脑上的仅有文件对比了一下,发现了如下规律:
乱码 | 正确码 | 乱码长度\字节 | 正确码长度\中字 | 十六进制 |
---|---|---|---|---|
\332\321\266\324\306 | 腾讯云 | 5 | 3 | CCDAD1B6D4C6 |
\306\313\343\273\372 | 计算机 | 5 | 3 | BCC6CBE3BBFA |
\372\302\353 | 代码 | 3 | 2 | B4FAC2EB |
\323\300\300\325 | 永乐 | 4 | 2 | D3C0C0D6 |
我们通过如下网站:https://www.qqxiuzi.cn/bianma/zifuji.php 转换上面乱码到十六进制并对比,发现第一个字节缺失了,所以我这里就直接把第二个字节也删除,一个中文字占俩个字节,所以也就是把第一个字给删除。
当然,我们肯定不会手动一个一个去修改,我们这里做了一个python的脚本如下:
import os
import re
import random
path = './'
pattern = re.compile(r'\\\d{3}')
def get_all_files(path):
files = os.listdir(path)
for file in files:
if os.path.isfile(path+ "/"+file):
filec=[]
for i in file:
if ord(i)-56320>0:
filec.append('\\'+str(oct(ord(i)-56320))[2:])
else:
filec.append(i)
s=''.join(filec)
res = pattern.findall(s)
if len(res) > 2:
tar = s
print("11")
s = ''.join(s[:-1].split('_')[1:])[4:]
s = s.encode('ASCII','ignore').decode('ASCII')
a = eval('b' + '\'' + s + '\'')
a = a.decode('gbk')
print(tar[:-1] + '=>' + a)
os.rename(path + "/" + file, path + "/" + a+str(random.randint(0,10)))
if os.path.isdir(path + "/" +file):
filec=[]
for i in file:
if ord(i)-56320>0:
filec.append('\\'+str(oct(ord(i)-56320))[2:])
else:
filec.append(i)
s=''.join(filec)
print(s)
res = pattern.findall(s)
if len(res) > 2:
tar = s
s = ''.join(s[:-1].split('_')[1:])[4:]
s = s.encode('ASCII','ignore').decode('ASCII')
a = eval('b' + '\'' + s + '\'')
a = a.decode('gbk','replace')
print("====文件夹=== : ",tar[:-1] + '=>' + a)
os.rename(path + "/" + file, path + "/" + a+str(random.randint(0,100)))
elif '\\' in s:
s=input()
qq=str(random.randint(0, 100))
os.rename(path + "/" + file, path + "/"+qq)
print("====文件夹=== : ", tar[:-1] + '=>' + qq)
get_all_files(path)
这里我们主要用深度优先递归目前目录下的文件,然后将文件第一个字节去掉然后转化为GBK编码,再重命名文件,这样就得到一个去掉了第一个字的文件名。执行效果如下:
虽然有一些文件名的缺失,但是好歹能够让数据显示出来了。接下来就是要想办法为什么出现了这样的情况了
留言
nice to see you in this blog
nice to see you in this blog..