rsync, gphoto2 备份iPhone照片

用了3年的XR突然出问题了:每过20多分钟,界面就会卡死,点哪里都没有反应,然后过了几分钟之后黑屏,中间有个转动的白色菊花,然后重启。想着也用了3年了,干脆换14吧。

拿到14之后犯了愁了,根本没法把XR上的东西迁移到14上。我当然先是试了之前从6 plus迁移到XR的方法,用相机扫一个屏幕上的什么图案,然后两台机器就能配对(我猜测那个图案可能是另一台手机开的无线热点的SSID和密码的某种编码),之后就可以迁移。然而现在这种方法不行,因为传了20分钟左右XR就会卡死掉线,14上会说迁移失败,界面上只有还原这一个选项。

于是尝试了iCloud提供的免费云备份空间,可惜20分钟根本不够XR把东西全都上传上去。这个云备份的增量计算写的非常非常烂,XR重新开机之后,需要花很长很长的时间来统计还需要上传哪些东西。终于到了某个极限之后,20分钟已经不够XR活着统计完了,还没统计完,XR已经卡死重启了。

这时候对完全备份已经不抱希望了,能把照片、QQ和微信的聊天记录导出来就阿弥陀佛了。我大概有20000张照片、总共50GB。斥巨资买了iCloud 200GB,看着照片一点点像蚂蚁爬一样上传,心里踏实多了。就这样等了3天多,上传了20GB左右的照片之后,XR再也传不上去更多照片了。我怀疑也是diff算法的问题,具体表现是,照片app的最下方要么显示正在从iCloud恢复,要么显示正在上传第多少多少张照片。

没办法了,剩下的照片用AirDrop一点一点传了。没想到AirDrop也丝毫不让人省心:

  • 首先,一趟虽然能选无数张照片,但是通过AirDrop能成功传过去的上确界大概是800-1000张之间的某个数。超过这个就直接失败。

  • 此外,不能传很多躺,比如传了3趟之后,就会出现发送端和接收端照片数量不相等的问题——XR说正在等待发送800张照片和10个视频,14却说是否要从XR接收230张照片和3个视频?好在这个可以通过重启解决。

  • 最后,还有几张照片被iCloud搞坏了,在手机上是模糊的版本,并且发不过去。我怀疑是iCloud把原片上传上去了,在手机本地留下了低清晰度的版本。奇葩的是,整个一趟下来只要有这一张照片格式不对,AirDrop就会提示所有传过来的照片都无法接收,并且问你要不要用文件打开。用文件打开出来发现全都是后缀名为 .photoasset 的文件。而且AirDrop是在传完之后才提示无法接收的。

这么一套下来,我不禁对Apple quality肃然起敬👍。好在最后全都传过来了,XR也顺利退休,成为老妈的备用机了。

痛定思痛,我觉得我再也不能依赖单个设备,也不能依赖虚无缥缈毫不可靠的云服务。还是得找个方法老老实实定期把东西备份到其他设备上。我其实一直都有备份照片的习惯,一般频率大概是3个月一次,或者是近期有非常美好的经历回忆、留下了很多很重要的照片之后。我的备份方法是全量备份,把XR用线连上电脑,然后把 DCIM 文件夹整个复制到移动硬盘上。

这么做的好处是,live photo也可以备份下来。live photo是一段很短的视频,文件名和照片一模一样。比如照片叫 IMG300.JPG ,那么live photo就叫 IMG300.MOV 。我有点是个重度live photo用户,经常会反复观看live photo。视频比照片多了很多信息,记录下按下快门前后发生的事情,这样若干年后看到当时的画面、听到当时的声音,体会无声的照片无法承载的影音,感觉很有意义。不知道这么好的功能为什么没有安卓手机做。

备份一次大概需要40分钟。所以这次想着能不能提高备份频率,但这样每次要花这么多时间就很难受了。

那能不能不要全量备份,改成增量备份呢?还真可以。

首先需要一个Linux发行版,我用的是Ubuntu。Windows我暂时还没找到很好的办法,即使是用WSL。虽然能把移动硬盘暴露给WSL,但没有找到能把iPhone暴露给WSL的方法。

装上一个叫 gphoto2 的软件。这个软件用来探测数码相机 [1] 。用数据线把iPhone连上电脑之后,iPhone会把自己挂载成所谓的PTP模式,对电脑暴露成一个装满了照片的文件夹。

Ubuntu自带软件源就有这个 gphoto2

sudo apt install gphoto2

装好之后,用 gphoto2 来探测数码相机

benjamin@benjamin-Yoga-14sACH-2021:~$ gphoto2 --auto-detect
Model                          Port
----------------------------------------------------------
Apple iPhone 5 (PTP mode)      usb:001,004

当当,这就探测到了手机了。不过不知道为什么iPhone 14在这里显示的是iPhone 5。

记下后边的 Port ,然后用文件管理器打开这个 Port ,前面加上 gphoto2:// 的前缀,就像网址里的 https:// 一样。我用的是nautilus

nautilus gphoto2://[usb:001,004]

不出意外,会弹出一个窗口,里面只有一个叫做 DCIM 的文件夹。打开 DCIM ,会发现里面是按照片拍摄的月份分类的文件夹

201507__
201508_a
201508_b
...

里面就是照片啦。

到这里你完全可以用 cp -r DCIM/ xxx 来全量备份了。不过我想要差分备份,所以用了 rsync 。比如我想把 DCIM 里的东西完完整整镜像到移动硬盘上一个名为 /media/benjamin/bulk.benjamin/2022-11-16/DCIM/ 的文件夹里

rsync -aviP --delete --no-perms DCIM/ /media/benjamin/bulk.benjamin/2022-11-16/DCIM/

这个操作过后, DCIM//media/benjamin/bulk.benjamin/2022-11-16/DCIM/ 里面的文件、目录结构会完全一样。

简单解释下几个参数 [2]

  • -a 表示archive模式,尽可能完整保留文件的元数据信息,比如创建时间、修改时间、权限

  • -v 备份的时候更verbose、更啰嗦、显示更多信息(没啥卵用只是看上去很帅)

  • -i 显示为什么要传当前这个文件

  • -P 显示进度

  • --delete 表示删掉在目标目录存在、但在源目录里不存在的文件

    比方说你上次备份完了之后,删掉了手机里的某张照片 IMG300.JPG 。下次备份的时候,移动硬盘里原先存的 IMG300.JPG 也会一块儿删掉。

    也可以不加这个选项,这样也能保证“备份”的定义——只要源目录里出现的文件,在目标目录里一定存在。

  • --no-perms 不考虑权限差别

    因为移动硬盘上是NTFS文件系统,有些权限没法保存下来。

速度不是很快,如果是第一次全量备份,花费的时间比 cp 要长一点。不过之后差量备份就很快了。 rsync 在传输之前会探测到底需要传些啥,然后尽可能传不同的内容。

QQ和微信的聊天记录用了app自带的聊天记录迁移功能。这个迁移功能在局域网里传输挺快的。但因为我房间的路由器不太给力,所以用14给XR开了热点,速度能跑到8Mbyte/s左右。

2022/11/17

ArchWiki永远的神!

Canon & Baroque