跳转到内容

将网盘挂载到本地并实现增量备份

时光2025/9/30 0 m

建议

我一直期待各大网盘能在 Kylin 或 UOS 系统上推出自动备份文件夹的功能,但遗憾的是,这些网盘厂商对国产操作系统的适配并不积极。目前应用商店中的百度网盘、天翼网盘几乎都是套壳的网页版,其他主流网盘更是完全没有推出适配版本。无奈之下,我只好自己动手实现这个功能,经过半个月的实际使用,效果非常理想,现在特此分享给大家。

本章将详细介绍如何通过 OpenList 将网盘挂载为本地文件夹,并实现自动手动增量备份电脑上指定文件夹的功能。无论是单个文件夹还是多个目录的备份需求,这个方法都能完美胜任。

实现原理

已折叠(点开查看)

准备工作

需要安装以下几个服务

  1. OpenList,可以参考这篇文章

  2. rclone 服务

  3. Rclone Browser 软件

  4. fuse3 服务(rclone 依赖)

打开 OpenList 的 webdav 功能

进入 openlist 主页,依次点击下方的「设置」→「用户」→「编辑」(选择角色为ADMIN的用户)

确保以下两项勾选后,点击保存

image-20250811110010448

重启 OpenList 使配置生效

注意

此处必须重启,否则后续挂载会失效。

bash
systemctl restart openlist

安装 Rclone

前往官网下载最新版本 rclone,或者跟我用同样版本(点我下载)的 rclone, 下载后双击安装即可。

安装 Rclone Browser

bash
sudo apt update && sudo apt install rclone-browser

安装 fuse3

bash
sudo apt update && sudo apt install fuse3

配置 rclone

打开终端,输入以下内容回车

bash
rclone config
bash
// 输入n
e/n/d/r/c/s/q> n
// 自定义一个挂载名称,以 openlist 为例
name> openlist
// 输入WebDAV前面的数字,这里是58
Storage> 58
// 输入alist的webdav地址,如果是按我教程来的,下面的地址直接复制粘贴即可
url> http://127.0.0.1:5244/dav
// 输入rclone WebDAV前面的数字
vendor> 7
// 输入openlist的管理员账号,我没有修改初始账号密码,如果自己修改了账号,这里要改成对应的
user> admin
// 输入y
y/g/n> y
// 输入openlist管理员密码,输入过程不显示,输完直接回车
Enter the password:
password:Uuucap7v
// 再次输入密码
Confirm the password:
password:Uuucap7v
// 出现下面内容,连续按三次回车
bearer_token>
// 输入q退出配置
e/n/d/r/c/s/q> q

验证是否挂载成功

在开始菜单中找到Rclone Browser并打开,或在终端输入以下命令启动

bash
rclone-browser

双击openlist(配置过程第一步定义的name),若能正常显示挂载的网盘内容,说明配置成功。若未显示,请参考下方详细交互日志,检查是否配置错误。

image-20250811123551429

终端详细交互日志
bash
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> n

Enter name for new remote.
name> openlist

Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
 1 / 1Fichier
   \ (fichier)
 2 / Akamai NetStorage
   \ (netstorage)
 3 / Alias for an existing remote
   \ (alias)
 4 / Amazon S3 Compliant Storage Providers including AWS, Alibaba, ArvanCloud, Ceph, ChinaMobile, Cloudflare, DigitalOcean, Dreamhost, Exaba, FlashBlade, GCS, HuaweiOBS, IBMCOS, IDrive, IONOS, LyveCloud, Leviia, Liara, Linode, Magalu, Mega, Minio, Netease, Outscale, Petabox, RackCorp, Rclone, Scaleway, SeaweedFS, Selectel, StackPath, Storj, Synology, TencentCOS, Wasabi, Qiniu and others
   \ (s3)
 5 / Backblaze B2
   \ (b2)
 6 / Better checksums for other remotes
   \ (hasher)
 7 / Box
   \ (box)
 8 / Cache a remote
   \ (cache)
 9 / Citrix Sharefile
   \ (sharefile)
10 / Cloudinary
   \ (cloudinary)
11 / Combine several remotes into one
   \ (combine)
12 / Compress a remote
   \ (compress)
13 / DOI datasets
   \ (doi)
14 / Dropbox
   \ (dropbox)
15 / Encrypt/Decrypt a remote
   \ (crypt)
16 / Enterprise File Fabric
   \ (filefabric)
17 / FTP
   \ (ftp)
18 / FileLu Cloud Storage
   \ (filelu)
19 / Files.com
   \ (filescom)
20 / Gofile
   \ (gofile)
21 / Google Cloud Storage (this is not Google Drive)
   \ (google cloud storage)
22 / Google Drive
   \ (drive)
23 / Google Photos
   \ (google photos)
24 / HTTP
   \ (http)
25 / Hadoop distributed file system
   \ (hdfs)
26 / HiDrive
   \ (hidrive)
27 / ImageKit.io
   \ (imagekit)
28 / In memory object storage system.
   \ (memory)
29 / Internet Archive
   \ (internetarchive)
30 / Jottacloud
   \ (jottacloud)
31 / Koofr, Digi Storage and other Koofr-compatible storage providers
   \ (koofr)
32 / Linkbox
   \ (linkbox)
33 / Local Disk
   \ (local)
34 / Mail.ru Cloud
   \ (mailru)
35 / Mega
   \ (mega)
36 / Microsoft Azure Blob Storage
   \ (azureblob)
37 / Microsoft Azure Files
   \ (azurefiles)
38 / Microsoft OneDrive
   \ (onedrive)
39 / OpenDrive
   \ (opendrive)
40 / OpenStack Swift (Rackspace Cloud Files, Blomp Cloud Storage, Memset Memstore, OVH)
   \ (swift)
41 / Oracle Cloud Infrastructure Object Storage
   \ (oracleobjectstorage)
42 / Pcloud
   \ (pcloud)
43 / PikPak
   \ (pikpak)
44 / Pixeldrain Filesystem
   \ (pixeldrain)
45 / Proton Drive
   \ (protondrive)
46 / Put.io
   \ (putio)
47 / QingCloud Object Storage
   \ (qingstor)
48 / Quatrix by Maytech
   \ (quatrix)
49 / SMB / CIFS
   \ (smb)
50 / SSH/SFTP
   \ (sftp)
51 / Sia Decentralized Cloud
   \ (sia)
52 / Storj Decentralized Cloud Storage
   \ (storj)
53 / Sugarsync
   \ (sugarsync)
54 / Transparently chunk/split large files
   \ (chunker)
55 / Uloz.to
   \ (ulozto)
56 / Union merges the contents of several upstream fs
   \ (union)
57 / Uptobox
   \ (uptobox)
58 / WebDAV
   \ (webdav)
59 / Yandex Disk
   \ (yandex)
60 / Zoho
   \ (zoho)
61 / iCloud Drive
   \ (iclouddrive)
62 / premiumize.me
   \ (premiumizeme)
63 / seafile
   \ (seafile)
Storage> 58

Option url.
URL of http host to connect to.
E.g. https://example.com.
Enter a value.
url> http://127.0.0.1:5244/dav

Option vendor.
Name of the WebDAV site/service/software you are using.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
 1 / Fastmail Files
   \ (fastmail)
 2 / Nextcloud
   \ (nextcloud)
 3 / Owncloud 10 PHP based WebDAV server
   \ (owncloud)
 4 / ownCloud Infinite Scale
   \ (infinitescale)
 5 / Sharepoint Online, authenticated by Microsoft account
   \ (sharepoint)
 6 / Sharepoint with NTLM authentication, usually self-hosted or on-premises
   \ (sharepoint-ntlm)
 7 / rclone WebDAV server to serve a remote over HTTP via the WebDAV protocol
   \ (rclone)
 8 / Other site/service or software
   \ (other)
vendor> 7

Option user.
User name.
In case NTLM authentication is used, the username should be in the format 'Domain\User'.
Enter a value. Press Enter to leave empty.
user> admin

Option pass.
Password.
Choose an alternative below. Press Enter for the default (n).
y) Yes, type in my own password
g) Generate random password
n) No, leave this optional password blank (default)
y/g/n> y
Enter the password:
password:
Confirm the password:
password:

Option bearer_token.
Bearer token instead of user/pass (e.g. a Macaroon).
Enter a value. Press Enter to leave empty.
bearer_token>

Edit advanced config?
y) Yes
n) No (default)
y/n>

Configuration complete.
Options:
- type: webdav
- url: http://127.0.0.1:5244/dav
- vendor: rclone
- user: admin
- pass: *** ENCRYPTED ***
Keep this "openlist" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d>

Current remotes:

Name                 Type
====                 ====
alist                webdav
aliyun               webdav
openlist             webdav

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q

通过 Systemd 服务实现开机自动挂载

创建本地挂载目录

/data/usershare/openlist为例,创建挂载目录

bash
mkdir /data/usershare/openlist

创建 Systemd 服务文件

bash
sudo touch /etc/systemd/system/rclone-mount.service
bash
sudo pluma /etc/systemd/system/rclone-mount.service
bash
sudo vim /etc/systemd/system/rclone-mount.service

根据你自己的设置,修改以下 4 行关键配置(标绿部分),完成后复制到rclone-mount.service文件并保存。

  • ExecStart=/usr/bin/rclone mount openalist: /data/usershare/openalist是挂载命令,第一个openalist为在配置 rclone中设置的name/data/usershare/openalist为刚刚创建的本地文件夹路径。
  • --cache-dir /data/usershare/alistTemp为缓存目录,可修改至挂载文件夹附近。
  • /usr/bin/fusermount -u /data/usershare/openalist中的/data/usershare/openalist为刚刚创建的本地文件夹路径。
  • User=kylin中的kylin修改为你的系统用户名。
js
[Unit]
Description=Rclone Mount for Alist
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
ExecStartPre=/bin/sleep 60
ExecStart=/usr/bin/rclone mount openalist: /data/usershare/openalist \ 
    --allow-other \
    --allow-non-empty \
    --vfs-cache-mode full \
    --cache-dir /data/usershare/alistTemp \ 
	--header "Referer:" \
	--multi-thread-streams 4 \
	--buffer-size 512M \
	--vfs-fast-fingerprint \
    --copy-links \
    --no-gzip-encoding \
    --no-check-certificate \
	--file-perms 0777 \
    --umask 000 \
    --use-mmap
ExecStop=/usr/bin/fusermount -u /data/usershare/openalist 
User=kylin 
Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target

启动挂载服务

分别执行下面 3 行命令

bash
sudo systemctl daemon-reload  # 重载服务配置
sudo systemctl enable rclone-mount.service  # 设置开机自启
sudo systemctl start rclone-mount.service  # 启动挂载服务

1 分钟后,检查挂载目录内容是否与 OpenList 显示一致,确认挂载成功。

注意

系统启动时,alist 和 rclone 服务会陆续启动,挂载命令需等待两者就绪后执行,否则可能失败。因此在服务文件中添加了sleep 60(等待 60 秒),确保挂载成功。

wechat_2025-08-12_150122_436wechat_2025-08-12_112450_710

增量备份

创建备份脚本

在桌面新建一个 sh 文件

bash
touch 增量备份.sh

授予可执行权限

bash
sudo chmod +x 增量备份.sh

按照你的设置,修改下面代码后保存到增量备份.sh文件

在用户配置区域设置好 2 项内容

  • 备份的文件夹和目标文件夹映射
  • openlist 挂载到本地的文件夹(目标基础目录)
bash
#!/bin/bash

# 美化文本输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # 无颜色
BOLD=$(tput bold)
NORMAL=$(tput sgr0)

# ===== 用户配置区域 =====
# 定义多个源目录和目标子目录的映射(格式:[源目录]=[目标目录])
declare -A SOURCE_DIRS=(
    ["/media/kylin/Elements/工作1/2025"]="天翼网盘/2025"
	["/media/kylin/Elements/工作2/2025"]="阿里云盘/2025"
	["/media/kylin/Elements/工作3/2025"]="115网盘/2025"
	["/media/kylin/Elements/工作4/2025"]="Quark/2025"
)

TARGET_BASE="/data/usershare/openlist"   # 目标基础目录(请在此处填写)

# =======================

# 检查配置
if [[ ${#SOURCE_DIRS[@]} -eq 0 || -z "$TARGET_BASE" ]]; then
    echo -e "${RED}${BOLD}[错误]${NC} 请至少配置一个源目录并设置TARGET_BASE!"
    exit 1
fi

# 发送系统通知函数
send_notification() {
    local title=$1
    local message=$2
    if command -v notify-send &> /dev/null; then
        notify-send "$title" "$message"
    fi
    echo -e "$message"
}

# 备份开始
echo -e "${BLUE}${BOLD}========================================${NC}"
echo -e "${YELLOW}${BOLD}  开始增量备份 ${NC}"
echo -e "${BLUE}${BOLD}========================================${NC}"
echo -e "${BOLD}目标基础目录:${NORMAL} $TARGET_BASE"
echo -e "${BOLD}备份任务数:${NORMAL} ${#SOURCE_DIRS[@]}"
echo -e "${BOLD}开始时间:${NORMAL} $(date +'%Y-%m-%d %H:%M:%S')"
echo -e "${BLUE}${BOLD}========================================${NC}\n"

send_notification "备份开始" "正在备份 ${#SOURCE_DIRS[@]} 个目录到 $TARGET_BASE"

# 初始化状态变量
SUCCESS_COUNT=0
FAILED_COUNT=0
FAILED_LIST=()

# 遍历所有源目录执行备份
for SOURCE_DIR in "${!SOURCE_DIRS[@]}"; do
    TARGET_SUBDIR="${SOURCE_DIRS[$SOURCE_DIR]}"
    FULL_TARGET_DIR="$TARGET_BASE/$TARGET_SUBDIR"

    echo -e "\n${YELLOW}${BOLD}正在处理:${NC} $SOURCE_DIR -> $FULL_TARGET_DIR"

	# 执行增量备份
	rclone sync "$SOURCE_DIR/" "$FULL_TARGET_DIR/" \
		--progress \

    # 检查结果
    if [ $? -eq 0 ]; then
        echo -e "${GREEN}${BOLD}[成功]${NC} $SOURCE_DIR"
        ((SUCCESS_COUNT++))
    else
        echo -e "${RED}${BOLD}[失败]${NC} $SOURCE_DIR"
        ((FAILED_COUNT++))
        FAILED_LIST+=("$SOURCE_DIR")
    fi
done

# 最终结果统计
echo -e "\n${BLUE}${BOLD}========================================${NC}"
echo -e "${YELLOW}${BOLD}  备份任务完成 ${NC}"
echo -e "${BLUE}${BOLD}========================================${NC}"
echo -e "${BOLD}成功:${NORMAL} ${GREEN}$SUCCESS_COUNT${NC}"
echo -e "${BOLD}失败:${NORMAL} ${RED}$FAILED_COUNT${NC}"

if [ $FAILED_COUNT -gt 0 ]; then
    echo -e "\n${RED}${BOLD}失败的目录:${NC}"
    for dir in "${FAILED_LIST[@]}"; do
        echo -e "${RED}- $dir${NC}"
    done

    send_notification "备份部分失败" "$FAILED_COUNT 个目录备份失败,请检查"
    exit 1
else
    echo -e "\n${GREEN}${BOLD}所有备份任务成功完成!${NC}"
    echo -e "${BOLD}结束时间:${NORMAL} $(date +'%Y-%m-%d %H:%M:%S')"


    send_notification "备份成功" "所有 ${#SOURCE_DIRS[@]} 个目录已备份到 $TARGET_BASE"
fi

echo "按任意键退出"
read -n 1

执行备份脚本

终端输出示例

bash
========================================
  开始增量备份
========================================
目标基础目录: /data/usershare/openlist
备份任务数: 4
开始时间: 2025-08-12 15:20:27
========================================

正在备份 4 个目录到 /data/usershare/openlist

正在处理: /media/kylin/Elements/工作1/2025 -> /data/usershare/openlist/天翼网盘/2025
Transferred:              0 B / 0 B, -, 0 B/s, ETA -
Checks:                79 / 79, 100%, Listed 204
Elapsed time:         1.0s
[成功] /media/kylin/Elements/工作1/2025

正在处理: /media/kylin/Elements/工作2/2025 -> /data/usershare/openlist/阿里云盘/会议2025
Transferred:              0 B / 0 B, -, 0 B/s, ETA -
Checks:               114 / 114, 100%, Listed 284
Elapsed time:         0.1s
[成功] /media/kylin/Elements/工作2/2025

正在处理: /media/kylin/Elements/工作3/2025 -> /data/usershare/openlist/115网盘/2025
Transferred:              0 B / 0 B, -, 0 B/s, ETA -
Checks:                12 / 12, 100%, Listed 26
Elapsed time:         0.0s
[成功] /media/kylin/Elements/工作3/2025

正在处理: /media/kylin/Elements/工作4/2025 -> /data/usershare/openlist/Quark/2025
Transferred:              0 B / 0 B, -, 0 B/s, ETA -
Checks:                55 / 55, 100%, Listed 120
Elapsed time:         0.0s
[成功] /media/kylin/Elements/工作4/2025

========================================
  备份任务完成
========================================
成功: 4
失败: 0

所有备份任务成功完成!
结束时间: 2025-08-12 15:20:29
所有 4 个目录已备份到 /data/usershare/openlist
按任意键退出

备份开始和结束时,系统右上角会显示通知提醒

image-20250812152753171image-20250812152827435

设置定时备份

crontab 中添加每日下午 4 点自动执行 增量备份.sh 脚本的任务

1. 打开 crontab 编辑器

在终端中运行以下命令:

bash
crontab -e

2. 添加定时任务

i 键进入编辑模式,移动光标至文件末尾,添加以下内容:

bash
0 16 * * * /path/to/增量备份.sh

参数说明:

  • 0 16 * * * 表示每天的 16:00(下午 4 点)执行。
    • 第一个 0 表示分钟(0 分)。
    • 16 表示小时(16 点,即下午 4 点)。
    • * * * 表示每天、每月、每周都执行。
  • /path/to/增量备份.sh 是你的脚本的 绝对路径(需替换为实际路径)。

3. 保存并退出

  • Esc 退出编辑模式
  • 输入 :wq 保存并退出。

4. 验证任务是否添加成功

运行以下命令查看当前用户的 crontab 任务:

bash
crontab -l

如果看到你添加的任务行,说明任务已成功设置。

VitePress Algolia Twikoo EdgeOne Copyright