实现了对Moments的异地备份
家庭相片属于一旦损坏无法重新下载的宝贵数字资产。在上文《新手必读的保姆级备份教程(四)多台群晖NAS之间实现远程异地备份》中,我们在两台NAS之间,通过Hyper Backup实现了Moments相册的异地备份。但Hyper Backup备份也存在着一定的不足:
设定了每天定时的备份计划,在两次备份之间的数据变化,不会被保留。
从整个过程看,这个备份的过程不是增量备份,一次完整的备份会占用较多的网络传输带宽与时间,造成NAS和网络的负载增大。
不支持QuickConnect ID这种对新手友好的远程连接方式。
目的地存放的备份拷贝,不是常规的文件夹、文件方式,对于想直接在文件夹中查看照片的用户,感觉不太方便。
Moments文件夹无法用Drive同步
增量同步、利用QuickConnect ID实现外网访问,完美支持这两条要求的有群晖Synology Drive ShareSync(参见上文)。在Drive ShareSync中增加一个同步任务,把Moments文件夹加进去,就能同步其中的所有照片了吧?新的问题又出现了:由于Moments文件夹位于用户的home文件夹中,不能被Drive ShareSync同步。
过去也用过BT Sync等第三方同步工具,但这样就不能使用QuickConnect ID了。于是用“Moments照片同步到另一台群晖”来搜索答案,即使在英文答案里面找,相关资料也非常稀少。终于在张大妈和某网站搜到了一个相似的答案,走的是曲线救国路线,大意是使用mount --bind命令,将一个新建的sync共享文件夹,挂载到Moments文件夹,实现两个文件夹内容的一致,然后用Drive ShareSync来同步sync文件夹。间接地实现对Moments文件夹的同步。
以前在DOS和Win系统下,也曾使用subst命令,将一个路径映射(或称挂载)为一个虚拟磁盘,用来骗过那些必须在磁盘根目录运行的setup安装软件。所以对上述原理感觉不陌生,在写完了《新手必读的保姆级备份教程(四)多台群晖NAS之间实现远程异地备份》,实现了对Moments的备份之后,关注话题又回到了怎样同步Moments上。
没想到一个晚上都踩坑里了
反复阅读了这两个答案,感觉两者区别不大,都是新建一个sync共享文件夹,然后使用mount --bind命令,挂载到Moments。核心就是一条Linux命令mount,看上去没什么难度,只是个别文字表述上有一点点差别。那就开工吧。一步步边做边学,最后写成《新手必读的保姆级备份教程(五)多台群晖NAS之间异地同步Moments照片》,应该是一件轻松的任务。
没想到,一脚踩进了个大坑。一下子从昨晚折腾到今天凌晨三点,才算有一点进展。为了让大家少走弯路,咱们还是先忠实记录一下昨晚的踩坑经历,正好也能让各路高手给指点一下。
一、新建共享文件夹Sync2020
先按照网上答案,在控制面板-共享文件夹里面,新建一个Sync2020的共享文件夹。
为避免节外生枝,只是新建,其他各方面比如权限等等,统统采用默认。跟网上答案的唯一区别就是名称按照个人习惯,改为Sync2020。注意有大小写。
创建后,可以看到存储空间2里面新增的Sync2020文件夹,最上面的homes里,保存着Moments文件夹。
二、在NAS端,启用SSH服务
在DSM桌面-控制面板-终端机和SNMP-终端机页面,勾选启动SSH功能,默认端口22不变。然后点击应用。这一步的目的,是为了后续用终端程序登录到DSM系统,这样采用使用mount命令来挂载。
三、使用PuTTY客户端登录到群晖NAS
在电脑端,使用PuTTY终端程序登录到群晖NAS服务器。
在主机名称中,填写你的群晖NAS的ip地址,本例中是内网的ip。
端口号默认22,要跟你前面在DSM中启用SSH时,指定的端口号一致。新手都保持22不变即可。
连接类型:SSH。
可以保存这个连接方案,以便下次连接同一台群晖。
关于如何下载PuTTY、SSH登录等,参见上文。
login as:第一行输入你的群晖NAS系统管理员账户。
password:输入登录密码,注意这里不会显示任何内容,尽管输入即可,错了会有提示。
如果出现了~$的提示符,说明登录成功。
输入命令: sudo -i,按回车键。
注意sudo和-i之间有空格。命令和参数之间,都是有空格的。
这个命令是获取root权限,等于得到系统的最大权限。
这里会再次要求输入管理员密码。
如果输入的密码正确,就会进入到root模式。
系统提示符也变为:root@服务器名。
我们就可以用最高权限来对系统做一些管理员级别的管理操作了。
四、用vi命令,修改rc启动文件
继续输入命令: vi /etc/rc,按回车键。
表示用vi编辑软件,来修改rc启动文件。
上图的背景,是我找到的网上答案。前景的黑色窗口,是我用PuTTY终端程序,正在输入上述命令。
进入vi编辑器的界面,用PgDn翻页键一直往后翻,找到左边黄箭头指示的最后一行exit 0。
用上下左右的方向键,将光标移动到这一行前面,按i键(insert插入键也可以),进入编辑模式。注意屏幕左下角,会出现--INSERT-- ,提示我们当前模态。作为新手,不要再按照平时的操作系统,须知现在是Linux界面。
可以按回车键,插入一个空行,然后插入我们的一行mount命令。
右边的黄箭头,指向的是当前光标(图中绿色方块)的位置,即613行,76列。
输入无误的话,按Esc键,退出编辑模式,INSERT消失。
按:(冒号),注意观察的话,会看到右下角有提示,在等待我们继续输入命令。
继续输入wq,按回车,表示写入并退出(write quit两个单词的首字母)。
这样就完成了对rc文件的修改和保存。
另一种退出的办法是:
按Esc键,退出插入模式,INSERT消失。
按两次大写的Z,保存并退出vi编辑器。
在提示符后面,输入exit,退出root用户
再次输入exit,退出PuTTY终端程序。
五、关键的一行mount命令
我们需要输入的命令是:
sudo mount --bind /volume1/sync/ /volume1/homes/username/Drive/Moment
我实际输入的命令是:
sudo mount --bind /Volume2/Sync2020 /Volume2/home/username/Drive/Moments
解释一下:前面已经说了Sync2020、homes文件夹,都保存在存储空间2上,所以这里要把volume1改为volume2。两个参数里面都要改。
sudo表示以管理员权限执行mount命令,照抄即可。
usename不要照抄,在上图中我也用标注了,要改成你的登录名。严格地说,这个Moments文件夹属于哪个用户,就应该改成哪个用户名,比如用户名是lifeisgood。
在命令和每一个参数之间,都要加空格。还要注意大小写。
其实,如果我们刚才在命令行模式,直接输入这条命令,也可以完成挂载。之所以修改rc启动文件,是为了在每次群晖启动后,让这个命令生效,不必再每次手动输入。
各种踩坑和排错全记录
如果你注意看截图右下角的话,不知不觉,已经是晚上十一点了,进展不算很快哈。因为重启群晖NAS之后,在Sync2020文件夹中,并没有如愿看到Moments文件夹里面的子文件夹和照片,你立刻明白,要开始调试和排错了。
1、命令的书写错误
显然,整个过程中,重点要检查的就是这条命令:sudo mount --bind /Volume2/Sync2020 /Volume2/home/username/Drive/Moments
很快就发现,Volume2应为小写开头的volume2。
正确的命令是:sudo mount --bind /volume2/Sync2020 /volume2/home/username/Drive/Moments
对新手来说,可以在控制面板-共享文件夹中,查看某个文件夹的属性。箭头所指就是它的位置。
2、修改rc?还是修改rc.local?
发现了第二个问题,就是改rc不知为何,总是没有让命令执行似的。经过一番搜索,发现有openwrt教程里面是修改rc.local这个启动文件。于是登录到系统,输入vi /etc/rc.local。重复上面的修改内容。
严格地说,每次在Sync2020中看不到照片,不一定都是rc文件中的该命令没有执行。因为已是深夜,疲劳状态下,思路也不是很清晰了。所以就按照教程,每次都修改rc.local了。当然,要记得把前述rc文件里新增的那行命令注释掉。
3、枯燥且单调的调试
调试的过程是很枯燥的:
要登录ssh、vi修改启动文件、保存退出,重启群晖NAS;
或者在命令行方式下,直接输入命令来测试效果;
然后进入File Station,观察Sync2020里面是否出现了Moments的文件夹和照片。
每次满怀希望点进去,总是空空如也,Sync2020只有一个回收站。
你仔细对照网上答案和你的操作步骤,找不到任何问题。
然后开始在网上去搜索各种教程,时间飞速流逝,就到了深夜。可以看到我搜索mount --bind命令详解时,已经是凌晨1点20分了。
4、终于发现了原因
翻遍了各种中英文教程,配合各种创建删除子文件夹、上传拷贝照片、从备份中恢复相册等调试操作,终于在教程中发现了一个关键点。还要从mount命令的功能说起。
sudo mount --bind dir1 dir2
对于mount命令,dir1表示源地址,dir2表示目的地址。
划重点:将源地址dir1挂载到目的地址dir2时,会暂时隐藏目的地址dir2原有的内容。
换句话说,dir1挂载到dir2时,我们在dir2中看到的,其实是dir1中的内容(文件夹、文件等目录信息)。对dir2、dir1的操作,其实都是对dir1的操作。一定要理解这一点。
这是翻了大量的教程,真正对我们有用的一句话。大部分文章都是说挂载后,两者等于同一个对象,对任一目录的操作,都会同步到另一个目录,这并不完全正确。
下面我们结合Moments相册的实例,来详细解释一下:
当我们执行命令sudo mount --bind /volume2/Sync2020 /volume2/home/username/Drive/Moments时,前者是源地址,后者是目的地址。
这是第一个坑(因为我们心中想要的结果,其实是把Sync2020当作目的地址,才能实现的)。
所以此时的真正效果是,Moments中原有的内容被隐藏(包含了关键的mobile、web两个相册文件夹);同时,Sync2020的内容出现在目的地Moments中(由于Sync2020是新建的,所以两个文件夹都是空白,造成新手的困扰),这就是打开Moments看不到照片的原因,网上教程让重新索引就能看到照片,是不正确的。
对Moments的任何操作,都会映射到Sync2020文件夹;对Sync2020的任何操作,也会反映到Moments文件夹(其实这是挂载后的目的地文件夹,不是你心目中原来的Moments)。
比如你在Moments里面上传几张照片/创建一个test文件夹,立刻就能在Sync2020中看到。
根本的区别在卸载后,刚才的变化,都会保留在源地址中,即应该保留在Sync2020中,而不会在Moments中看到。卸载后的Moments,被隐藏的内容将会恢复,才是原来的Moments。
然后对新手来说,就造成了极大的困惑:一方面,上述两个文件夹的内容联动,说明mount的挂载操作似乎成功了;另一方面,由于Moments文件夹原有内容被隐藏,原来的文件夹和照片并未像预期那样出现在Sync2020中。那我们就无法利用Sync2020来作为远程同步的对象。
5、尝试正确的命令
由于网上只找到两个简短而相似的答案,两个答案对我的试验都提供了帮助。第一个提供了思路,上图中的第二个提示了要修改rc.local。但两个答案都没有让我顺利地达到自己的目标。
经过反复试验和对照,终于认定,两个答案都是有问题的(比如上图中Homes应为homes,而且Moments前面应该还有Drive),客气一点说,是跟我们的场景和需求不相符合:
由于已经在Moments中积累了多年的照片,我们需要的是将Moments映射到Sync2020,通俗地说,前者的内容在挂载后,应该出现在后者,这才是期望的结果。
于是大胆地将原先命令中的源地址和目的地址对调一下,改为:
sudo mount --bind /volume2/home/username/Drive/Moments /volume2/Sync2020
解释一下:
将源地址Moments挂载到Sync2020后,目的地Sync2020原有的内容将被隐藏(反正是新建的共享文件夹,里面本来也是空空如也的)。
此时,在Sync2020中,立刻出现了跟Moments一模一样的目录内容,比如有Mobile和Web两个文件夹,分别表示手机端和电脑端上传的照片。
为了验证前面的猜想,在挂载后,我们在Sync2020(目的地址)创建名为“ls-sync被bind2后”的文件夹;如果卸载后,该文件夹仍然存在于Moments(源地址)中,就说明我们的猜想是正确的。
果然,卸载后,在Moments(源地址)中,除了原有的Mobile和Web两个文件夹之外,还有“ls-sync被bind2后”文件夹。
卸载后,作为目的地的Sync2020文件夹呢?前面的3个文件夹都消失了。只剩下我们用错误顺序绑定时的测试文件夹。
完美证明了我们的猜想:即挂载后,目的地址原有内容被隐藏,对源地址和目的地址的任何修改,最终是反映和保留在源地址中,而不会反映在目的地址。这些效果,在卸载后,都能看到。
小结
网上搜到的答案都有所帮助,又都存在着不少的错误。一直到今天凌晨终于解决。折腾过程就不再细说了,实际上大大小小的坑踩了不少。
经过一晚上的尝试,根据我们对Moments照片同步的需求,找到了正确的方法:
用vi修改/etc/rc.local文件。
正确的命令行是:
sudo mount --bind /volume2/home/username/Drive/Moments /volume2/Sync2020
这样就达到了我们的目标:
将Moments文件夹作为源地址,挂载到Sync2020文件夹,前者的所有内容和任何变化,都立刻显示在后者。
之后,就能借助Sync2020,来间接实现两台群晖NAS之间同步Moments照片的目标了。
提醒:一定要事先做好备份,我的Moments相册,事先备份到了另一台群晖NAS中。
关于《群晖NAS非官方入门手册》达人专栏
《群晖NAS非官方入门手册》是作者Lifeisgood在张大妈首发的写作计划,以知识卡片的形式,在每篇教程分享群晖的关键技能。2018年至今,已坚持三年。Life君是本站黑群晖配置最高、白群晖闲置最多的NAS小白。从今年八月起,作者Life君应邀在张大妈创建专属达人专栏----群晖NAS非官方入门手册。
需要了解群晖全方位教程的,欢迎点击历年《群晖NAS非官方入门手册》。
先回顾一下我们这些新手的需求:1、在DSM7.0正式版推出前,继续使用Moments智能相册;2、想用Synology Drive ShareSync来进行异地同步,这样才能借助QuickConnect ID实现方便的外网访问。
折腾的过程全都是泪,详见上面卡片。本来想着上篇记录踩坑过程,下篇分享正确的方法,结果昨晚设置Drive ShareSync同步时,发现还是有一些值得讨论的小坑,正好,这也让下篇内容更丰富生动啦。于是连夜做了思维导图,准备把这个问题彻底搞明白。
这是上篇的基本思路:Moments+Drive ShareSync,中间用文件夹Sync2020做桥梁;核心命令是Mount。
在上篇中,我们其实只是通过各种踩坑和实验,熟悉和掌握了Mount命令的挂载方法;至于如何用Synology Drive ShareSync实现双机同步,则是下篇的任务。