使用rsync通过USB自动复制备份

我一直在使用复制品三星SIII I9300两年多了。我以前写过使用rsync备份电话但最近我按如下所述自动化了我的设置。这项工作是由我的手机屏幕意外导致的,我注意到我没有进行定期备份。这次我没有丢失任何数据,因为通常我在设备上创建的所有内容都会立即同步到我的云。照片由ownCloud应用程序,SMS备份+将短信和通话记录保存到IMAP服务器,我使用DAV阵列用于将联系人、日历和任务列表与我的实例同步ownCloud公司。尽管如此,我仍然坚信应该定期备份所有内容,所以现在是时候实现自动化了。

就我而言,只要我把手机连接到笔记本电脑上,就可以备份手机。我通常至少每隔一天把它连接到笔记本电脑上充电。我的笔记本电脑都在运行Debian公司,但这应该适用于大多数现代GNU/Linux系统。虽然您需要一个root电话,但这不是特定于复制副本的。我原以为自动化很简单,但我还是学会了systemd和udev在这个过程中,这最终占据了一个晚上的大部分时间。

我开始添加一个udev规则和一个小脚本,以为可以从udev规律调用备份过程。然而,rsync在运行几秒钟后就会神奇地死亡。经过一段令人尴尬的长时间调试会话,最后我发现有人有类似的问题这让我对这个话题写了一篇很好的文章在udev事件上运行长时间运行的服务。我创建了一个文件/etc/udev/rules.d/99-android备份规则包含以下内容:

ACTION==“add”,SUBSYSTEMS==“usb”,ENV{ID_SERIAL_SHORT}==“323048a5ae82918b”,TAG+=“systemd”,ENV{systemd_WANTS}+=“android-backup@$ENV{ID_SERIAL_SHORTneneneep.service”ACTION==“add”,SUBSYSTEMS==“usb”,ENV{ID_SERIAL_SHORT}==“4df9e09c25e75f63”,TAG+=“systemd”,ENV{systemd_WANTS}+=“android-backup@$ENV{ID_SERIAL_SHORT{.service”

序列号对应于我要备份的两个设备的设备序列号。这个adb设备命令将为您打印它们,您需要用手机中的值替换我的值。接下来,我创建了一个systemd服务来描述一个oneshot服务。文件/etc/systemd/system等/android备份@.service具有以下内容:

[服务]类型=一次性ExecStart=/usr/local/sbin/android-backup%I

服务文件名中的at-sign(“@”)表示这是一个接受参数的服务。我还不够一个udev/systemd的人用适当的术语解释这两个文件,但至少你可以进行模式匹配并遵循它们的基本思想:udev规则匹配我感兴趣的设备(我不希望这种情况发生在我连接的所有随机安卓设备上,因此匹配已知的序列号),它会启动带有参数的systemd服务。systemd服务文件描述要运行的脚本,并传递参数。

现在是有趣的部分,脚本。我有/usr/local/sbin/android备份内容如下。

#!/垃圾桶/垃圾桶DIRBASE=/var/backups/androidexport ANDROID_SERIAL=“$1”exec 2>&1|记录器如果!test-d“$DIRBASE-$ANDROID_SERIAL”;然后echo“找不到目录:$DIRBASE-$ANDROID_SERIAL”出口1fi(菲涅耳)集合-xadb等待设备adb根adb等待设备adb shell printf“address 127.0.0.1\nuid=root\ngid=root\n[root]\n\tpath=/\n”\>/mnt/secure/rsyncd.confadb shell rsync--守护程序--no-detach--config=/mnt/secure/rsyncd.conf&adb转发tcp:6010 tcp:873睡眠2rsync-av--删除--排除/dev--排除/acct--排除/sys--排除/procrsync://localhost:6010/root/$DIRBASE-$ANDROID_系列/:rc$?adb转发--删除tcp:6010adb外壳rm-f/mnt/secure/rsyncd.conf

这个脚本需要更详细的解释。备份放在下面,例如。,/var/backups/android-323048a5ae82918b/用于以后的非现场备份(您确实会备份您的笔记本电脑,对吗?)。您必须手动创建此目录,这是一个安全措施,可以避免将数据大量rsync到不存在的目录中。该脚本使用syslog记录所有内容,因此运行tail-F/var/log/syslog&设置时。如果愿意,可以减少rsync的冗长性(替换rsync-av具有rsync-a). 脚本运行adb等待设备你猜对了,它会等待设备稳定下来。下一步adb根调用以获取设备上的root用户(从系统读取所有文件自然需要root用户)。切换需要一些时间,因此需要另一个等待设备调用。接下来,在中创建一个小型rsyncd配置文件/mnt/secure/rsyncd.conf在电话里。该文件告诉rsync do listen on localhost,以root身份运行,并使用/作为路径。默认情况下,rsyncd是只读的,因此主机将无法通过rsync上传任何数据,只能读取数据。下一个rsync在电话上启动。这个adb转发command将笔记本电脑上的端口6010转发到手机上的端口873(873是默认的rsyncd端口)。不幸的是,设置TCP转发似乎需要一些时间,并且adb等待设备不会等待它完成,因此是一个丑陋的睡眠2此时。接下来是rsync调用本身,它只调用从手机到笔记本电脑的所有内容,排除了一些常见的可疑内容。有点神秘:rc$?只需将rsync进程的退出代码记录到syslog中。最后,我们清理TCP转发并删除临时创建的rsyncd.conf文件。

这个设置对我来说似乎很稳定。我可以插入手机,然后进行备份。我甚至可以同时插入两个设备,它们将同时运行。如果我拔下设备,脚本或rsync将出错,systemd将进行清理。

如果有人知道如何避免丑陋的临时性rsyncd.conf文件还是丑陋的睡眠2,我很感兴趣。如果不必执行“adb root”舞蹈,而是让手机在以某种方式连接到我的笔记本电脑时启动rsync守护进程,那也会很好。TCP转发在多用户系统上可能会很麻烦,但我的笔记本电脑不会。在电话上关闭rsync可能也是一个好主意。如果您有关于如何解决任何此问题、其他反馈或问题的想法,请告诉我!