用 termux + rclone + adb 给 android 做文件增量备份

# 用 termux + rclone + adb 给 android 做文件增量备份

刚开始只是为了 做自动同步照片,测试了一些文件管理器,也就 Solid Explorer 表现还不错,但总体来说都需要人为操作,然后突发奇想,Android 也是 Linux ,是否可以用 rclone 做增量 同步?那么说干就干

# 一、在 MacOS 上,安装 adb (Android Debug Bridge)命令行工具。首先,安装 Android Platform Tools,其中包含了 adb 工具。请按照以下步骤操作:

  1. 安装 Homebrew(如果尚未安装):
1
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  1. 使用 Homebrew 安装 Android Platform Tools:
1
brew install android-platform-tools
  1. 确保你的 Android 设备已连接到电脑,并启用 USB 调试模式。要启用 USB 调试,请按照以下步骤操作:
    a. 打开设备上的 “设置” 应用。
    b. 如果你还没有启用 “开发者选项”,请转到 “关于手机”>“软件信息”>“版本号”,然后连续点击 “版本号” 7 次以启用 “开发者选项”。
    c. 返回 “设置”>“开发者选项”,启用 “USB 调试”。

  2. 在终端中,运行以下命令,检查设备是否已连接:

1
adb devices

你应该看到类似以下的输出,其中列出了已连接的设备:

1
2
List of devices attached
<device_id> device
  1. 可以使用以下命令将 Android 设备上的 DCIM/Camera 目录下的照片拷贝到电脑上的指定目录(例如:桌面):
    仅展示命令,不推荐这个方法
1
adb pull /sdcard/DCIM/Camera ~/Desktop/AndroidPhotos

# 二、在 Android 手机上安装 Termux

  1. https://github.com/termux/termux-app/releases 上下载合适的 apk 版本
    我下载的是 termux-app_v0.118.0+github-debug_arm64-v8a.apk 这个版本

  2. 安装 termux 到手机
    上面步骤已经安装好 adb 了,就直接通过 adb 安装

1
adb install ~/Downloads/termux-app_v0.118.0+github-debug_arm64-v8a.apk
  1. 给 termux 添加 系统文件夹权限
    运行 termux-setup-storage 命令:
1
termux-setup-storage

这会向您请求存储权限。同意后,Termux 将创建一些符号链接,使您能够访问 Android 设备上的共享存储目录。这些链接位于 Termux 的 ~/storage 目录下。

以下是 ~/storage 目录下的一些常见符号链接:

  • ~/storage/shared :这是设备的共享存储(例如,内部存储或 SD 卡)。
  • ~/storage/dcim :这是设备上的照片和视频目录。
  • ~/storage/downloads :这是设备上的默认下载目录。
  • ~/storage/music :这是设备上的音乐目录。
  • ~/storage/movies :这是设备上的电影目录。
  • ~/storage/pictures :这是设备上的图片目录。

请注意,Termux 无法访问 /storage 下的其他目录,因为 Android 的沙盒限制。要访问其他目录,您需要使用具有 root 权限的文件管理器应用。

# 三、安装 SSHD 并使用 MacOS 连接到 Termux

  1. 在 Android 设备上安装并打开 Termux。

  2. 运行以下命令以更新软件包列表并安装 openssh

1
2
pkg update && pkg upgrade
pkg install openssh
  1. 启动 SSH 服务器:
1
sshd
  1. 当前 SSH 服务器的端口号(默认为 8022)

  2. 在系统设置里查看 WIFI IP 地址

  3. 查看当前用户名

1
whoami
  1. 设置一个简单的密码(后面会处理)
1
2
3
passwd
xxxxxx
xxxxxx
  1. 手机敲命令非常难受,敲过以上几个命令就够了,准备用 Macos SSH 连接 Termux 解放双手

  1. 以上的操作可以得到一条完整的 ssh 命令,并连接到 Termux
1
2
ssh -p 8022 <username>@<ip>:<port>
xxxxxx
  1. 配置使用 MacOS 公钥访问 Termux
1
2
3
4
5
6
# macos
cat ~/.ssh/id_rsa.pub
# termux
vim ~/.ssh/authorized_keys
# 粘贴到这里,保存
# 再 ssh 到 termux 时 就不需要密码了
  1. 设置强密码,也可以关掉 ssh 的密码访问,我选了前者
1
2
3
4
5
6
7
8
9
# macos
brew install pwgen
pwgen 16 1
# 得到一个强密码,请在某一个不为人知的地方记住这个密码,当然不记也行(在可以通过 pub key 访问的前提下)

# termux
passwd
<强密码>
<强密码>
  1. 这样 macos 就能安全访问 termux 进行后续操作了

  2. 追加 + 1,其实我还更改了默认的 8022 端口

1
2
3
4
5
# termux
vim $PREFIX/etc/ssh/sshd_config
# 新增一行
Port 2222
# 保存退出
  1. 追加 + 1, 给 SSHD 添加开机启动
1
2
3
4
5
6
pkg install termux-services
# 重启 termux
# 添加 sshd 开机启动
sv-enable sshd
# 当前启动 sshd,也可以重启 termux 试试看,sshd 是否开机启动了
sv-enable up sshd

# 四、配置 rclone 做增量同步

rclone 是一个命令行程序,用于同步文件和目录。它支持多种云存储服务,但也可以在本地和远程设备之间同步文件。

  1. 在 macOS 上安装 rclone 。使用 Homebrew 安装:
1
brew install rclone
  1. 生成 rclone 加密秘钥
1
2
3
# 这里填写之前 sshd 设置的密码
rclone obscure <password>
# 得到一个 encrypt_password
  1. 直接写配置文件(敲命令生成配置很烦)
1
2
3
4
5
6
7
8
9
10
11
12
vim ~/.config/rclone/rclone.conf
[adr]
type = sftp
port = 2222
host = <ip>
user = <username>
pass = <encrypt_password>
shell_type = unix
md5sum_command = none
sha1sum_command = none

# 保存退出
  1. 测试看看
1
2
3
4
rclone lsd adr:
-1 2024-02-01 17:49:28 -1 .ssh
-1 2024-02-01 19:23:03 -1 .termux
-1 2024-02-01 17:38:19 -1 storage
  1. 使用以下命令将 Android 设备上的 DCIM/Camera 目录下的照片同步到电脑上的指定目录(例如:桌面):
1
rclone sync adr:storage/dcim/Camera ~/Desktop/AndroidPhotos --progress

这将执行增量同步。只有在源目录中有变化时, rclone 才会传输文件。这将节省时间和带宽。

请注意,无线调试可能不如 USB 调试稳定,因此在进行大量文件传输时,请确保网络连接稳定。

# 五、做到这里有没有发现什么问题,adb 安装来是干啥的,难道就只是为了 adb install termux 吗

为了加快备份的传输速度,用公司的 wifi 测试只有 10M/s,几十个 G 的照片要传很久,虽然这种很久是一次性的,后续增量同步只有很少的数据需要传输
但是我还是很难等待这个过程,所以准备利用 USB 线加快 rclone 的备份速度

  1. 首先用线连上手机

  2. 使用 adb forward,转发 sshd 端口到 本地

1
2
3
# macos
adb forward tcp:2222 tcp:2222
adb forward --list
  1. 配置 rclone adl(与 adr 的区别是:android remote、android local)
1
2
3
4
5
6
7
8
9
10
11
12
vim ~/.config/rclone/rclone.conf
[adl]
type = sftp
port = 2222
host = localhost
user = <username>
pass = <encrypt_password>
shell_type = unix
md5sum_command = none
sha1sum_command = none

# 保存退出
  1. 接下来试试传输速度
1
rclone sync adl:storage/dcim/Camera ~/Desktop/AndroidPhotos --progress

起飞,比 WIFI 快得不是一点,爽

# 六、衍生想法

还想过做:Macos 检测手机连上 USB 之后,自动执行 rclone 同步
也可以做:Macos 检测手机连上 家里 WIFI 之后,自动执行 rclone 同步
也可以做:在 termux 上安装 rclone,定时或触发条件,主动向 macos 同步数据(我的 macos 连了一个 NAS 存储,24 小时开机,配有公网 IP 和 DDNS 解析)

以上几个方案我觉得都可以,也都不难,这里就不展开写了