一、 因为疫情……
实在是疫情太严重的缘故,于是把家里的机器使劲反复折腾,硬件上从蜗牛到AMD3600到i73770到gen10再到i59600kf,软件上从ESXI到PVE再到ESXI,反复折腾群晖、爱快、LEDE,从ALL IN ONE再到ALL IN ONE……最后,走的山多终遇虎,群晖的2个4T、RAID0的硬盘终于不堪折磨,报“设置数据损毁”,这下完犊子了!
二、 题外的吐槽
不得不重点提一下,群晖在转移系统的时候千万要谨慎。比如我,原来是ds3615系统,在不断切换PVE、ESXI平台的过程中,先是发现手机程序无法登录ds photo,再后网页访问总是跳回到群晖首页,搜索无解决办法时,决定将之迁移到ds3617系统(看看是否能够自动修复此问题)。要命的是在点击安装时,它竟然提示“某个盘数据将会被格式化”?不是已经选择“”保存数据“的迁移模式了吗?这太危险吧了!然后我果断怂了,还是不要了吧?当场再切换回到ds33615,不料启动时,它居然报“可转移”,而且也会格式化硬盘?什么情况?我虽然想过要出轨,但还没有实际行动啊!行吧行吧,既然你这么说,那我就出轨一次看看?再切换到3617,竟然已经“设置数据损毁”了。
以上,充分说明,群晖系统的数据处理方式有点特殊。通常我们只是想想,不到最后一步点击确认操作时,总觉得还是安全的;但群晖呢,想想都不可以,你一想它就动手给你干了。
三、 后果很严重
手贱的结果,就是只能自己含泪吃下苦果;还好有UFS Explorer Professional Recovery(必须注册版)软件。win10开机,安装UFS,打开群晖盘,开始了漫长的数据恢复拷贝过程……,20几个小时之后,所有数据成功恢复到新的群晖系统,开机访问正常,美滋滋啊!偶然打开NoteStation,咦?数据呢?捶胸顿足后:不怕不怕,虽然没有备份过,但咱本地不是还有数据吗?可以恢复回去啊!
- 1. 尝试使用本地NoteStation客户端恢复数据
打开本地NoteStation(Synology Note Station Client)客户端,这不是本地数据还都在吗?点击软件“设置“按钮,未登录打不开?那登录吧,成功登录了,数据更新了,更新结束了,本地的数据全没了、没了、了!
这个路走不通了。
- 2. 尝试旧群晖系统NoteStation安装文件夹数据恢复
咱就想着,你不就是个APP吗?那我把原来APP安装文件连同原始数据文件都覆盖过去,里面的数据不就全部恢复了吗?很多windows下的软件这么干都可以的。
说干就干,网上查了一下,还真找到NoteStation安装文件地址,在/volume1/@appstore/NoteStation目录。打开UFS,该文件实际上是位于/@syno/@appstore/NoteStation目录。复制到本地硬盘,保险起见,先压缩另存一份。
1) 打开新群晖系统,在控制面板-终端机和SNMP下,勾选“启动SSH功能”;
2) 在群晖中卸载NoteStation软件。
3) 安装WinSCP,PuTTY软件,连接到群晖系统。
4) 在WinSCP中点击打开PuTTY终端界面,管理员登录,执行如下命令,授权/volume1/@appstore目录可以修改。
sudo chmod -R 777 /volume1/@appstore
5) 在WinSCP中,将本地的NoteStation整个目录复制到群晖的/volume1/@appstore目录下。
6) 重新到群晖中安装NoteStation软件。
大功告成!打开客户端,成功登录,傻眼了:为什么数据还不出现呢?
- 3. 尝试直接修改NoteStation数据库文件恢复
在WinSCP中反复查看NoteStation目录,虽然重新安装了APP,但这个目录下的数据还是和我本地拷贝过去的数据一样,没有变化啊!目录下有个DB文件夹,打开看,里面有3个数据库文件,和本地的3个对应文件对比,大小、修改时间都一样,那它怎么就不行呢?
既然如此,不是有数据库文件吗?那我直接修改数据库里面的数据总可以了吧。
在win10中安装Navicat Premium软件,打开fts.db数据库(sqlite),果然是它(因为它比较大),总共有10个数据表。打开notestation_content表,没错,就是它!所有的日志数据都在呢!热泪盈眶啊,这下数据有救了!!!
仔细研究了一下,主要的表有3张,notestation(日志标题信息)、notestation_content(日志信息表,含内容)、perm_user(日志与用户关系表)。
如上,发现perm_user记录的用户ID(user_id),在不同的群晖系统里面可能会不一样(虽然创建了相同的群晖帐户)。我上一个群晖系统的用户ID是1027,但新的系统用户ID变成1026了。但不要在意细节,把所有1027编号的,调整为1026就是了。
于是施展SQL大法,将对应的3个表perm_user、notestation、notestation_content涉及到用户ID的,全部调整为新的用户ID(其实,数据不多手工改改也可以)。
打完收工。因为/volume1/@appstore/NoteStation/db文件夹里面的数据无法覆盖,执行命令也不行,必须先把文件改名上传上去,再执行cp命令覆盖。
sudo chmod -R 777 /volume1/@appstore/NoteStation/db
cp -r /volume1/@appstore/NoteStation/db/fts1.db /volume1/@appstore/NoteStation/db/fts.db
覆盖完毕,刷新一下,看到现有系统里面的fts.db文件修改时间、大小已经变更了。这说明覆盖成功了。满怀信心打开Note客户端,登录,更新――泥马,为什么还是没有?再同步?还是没有?!不死心,重新下载fts.db,重新打开细细观察,没有问题啊,已经修改成功了,可为什么还是不行呢?
- 4. 尝试直接覆盖@SynoDrive文件夹恢复
这下子抓瞎了。本来以为十拿九稳的,这都修改数据库了,咋人家还不认可呢?没道理啊。想了半天,做了好多尝试,发现已有的数据,你直接在数据库中修改了但在客户端里面并没有显示修改;但如果在客户端修改了,数据库中也会跟着修改。那么估计是客户端写入后,后台有个钩子之类的程序,把数据写到其他地方再进行显示。换句话说,客户端显示的数据,实际上不是从数据库中直接提取出来的,它有个中间存储位置。
话是这么说,但咱对linux不熟啊,对这个APP也不熟。一句话,难呐。
没有办法,到处转转看。在/volume1目录下,看到好多APP的文件,什么video、photo、music啊什么的,都安装在这里,一个一个点进去看看。终于点到@SynoDrive,咦?里面居然还有一个NoteStation目录?再点进去,天哪,数据原来藏在这里面?
化成灰我都认得你!这里面的前4位ID不就是用户ID吗?后面的编号不就是日志ID吗?急忙对照了一下数据库,果然如此(小样的,你以为你藏得深一点我就不认得你了?)!打开文件夹,进入/version/text目录,打开文件逐一看过去(好几个文件),没错,日志内容果然是记录在这里!
尝试着把对应用户的数据删除掉,然后登录客户端一看,果然也不见了!
马上行动!
1) 打开UFS,把事故盘里面/@syno/@SynoDrive/NoteStation整个目录拷到本地硬盘。
2) 打开PuTTY终端,输入以下命令取得目录控制权:
sudo chmod -R 777 /volume1/@SynoDrive/NoteStation
3) 打开WinSCP,将拷出的文件覆盖到新系统同一目录下。
4) 打开Note客户端,登录,同步,更新――哦耶,数据出来了!
等等?数据是有了,但不是我的数据啊!前面说了,我旧系统的用户ID是1027,但新系统用户ID变成了1026,这登录进去,数据是有了,但不是我的数据啊!
- 5. 终极解决办法:数据导出、导入恢复
眼看着革命就快成功了,说啥也不能倒在这个关头啊!眼看着肉就在嘴边,但这个是别人的嘴啊,总不能每次都用别人的嘴吃吧?
我突然想起来了,Note不是有个导入导出的功能吗?那我用别人的帐户登录进去,先把数据导出,再切换到自己的帐户导入,这不就了啦?(我真是太英明了)
于是,用其他帐户登录,导出;再用自己的帐户登录,导入,同步(双手合十ing)……,离我而去许久的数据,终于回到了我的怀抱(速效救心丸预备)!
四、 总结经验教训
其实很简单,就一句话:“不折腾不会死!”。
非得再加一句,那就:“作死之前请系好安全带”。
万一还是出事了,那就只能事先多学习一点求生技能吧。
以下总结救援步骤:
- 准备好WinSCP,PuTTY,UFS Explorer Professional Recovery 三个救援工具。
- 将事故盘目录拷贝到本地:/@syno/@SynoDrive/NoteStation 。
- 卸载群晖系统中的NoteStation,并选择“永久删除数据库”。
- 通过PuTTY执行以下命令取得/volume1/@SynoDrive/修改权。
sudo chmod -R 777 /volume1/@SynoDrive/
- 用WinSCP将本地事故盘备份的NoteStation目录拷贝到群晖/volume1/@SynoDrive/目录下。
- 群晖系统中重新安装NoteStation。
- 创建与原群晖系统相同的帐户,但同名帐户反映到NoteStation中的用户ID可能会不相同,这个只能自己试验(提示:结合Note客户端添加记录,查看/volume1/@SynoDrive/NoteStation里面增加的记录)
- 使用对应的帐户登录Note客户端(有大概率用户ID号会变化),导出Note备份文件。
- 用自己的号重新登录Note客户端,导入备份文件。然后记得点击“更新”(注意要等一会儿,根据日志数量一到几分钟不等)