Mastodon

在Linux上使用Systemd+Rclone+Backblaze B2同步视频

在Linux上使用Systemd+Rclone+Backblaze B2同步视频

涉及到的:

  1. Linux
  2. Rclone
  3. Backblaze
  4. Systemd
需要现在本地配置好rclone,使用rclone config,在backblaze创建/b2 cli创建好对应的bucket

sudo rclone config —— /root/.config/rclone/rclone.conf

rclone config —— /home/jay/.config/rclone/rclone.conf

Systemd文件

rclone mount
Mount the remote as file system on a mountpoint.

首先给出一个简单的mount文件

# /etc/systemd/system/mnt-porn.mount
[Unit]
Description=Mount for /mnt/porn
After=network-online.target
Wants=network-online.target
[Mount]
Type=rclone
What=b2:mount-porn
Where=/mnt/porn
Options=rw,_netdev,allow_other,args2env,vfs-cache-mode=writes,config=/etc/rclone/rclone.conf,cache-dir=/var/rclone

文件名为PATH的/改为.,必须遵守

  1. _netdev为systemd挂载语义,代表依赖网络挂载,远程存储必须
  2. allow_other为FUSE参数,rclone使用的就是FUSE,允许非挂载者访问该挂载点,需要先在/etc/fuse.conf修改
  3. args2env为systemd专用参数,将Options内参数转化为环境变量,因为rclone参数很多,systemd对参数很严格
  4. config=/etc/rclone/rclone.conf不是rclone的默认配置路径,默认在/home/jay/.config/rclone/rclone.conf
sudo mkdir -p /etc/rclone
sudo cp ~/.config/rclone/rclone.conf /etc/rclone/rclone.conf
  1. After=network-online.target
    Wants=network-online.target
    代表需要网络在线,在线后再启动
  2. 保险起见:sudo ln -s $(which rclone) /sbin/mount.rclone,验证:ls -l /sbin/mount.rclone

启用.mount文件

  1. 创建文件:sudo nano /etc/systemd/system/mnt-porn.mount
  2. 刷新:sudo systemctl daemon-reload
  3. 挂载:sudo systemctl start mnt-porn.mount
  4. 验证挂载:systemctl status mnt-porn.mount

正确创建/mnt下文件夹

systemd 对非 root 持有的挂载点容错更差,让root拥有/mnt/porn,所有人可进,但只有 root 能改结构,allow_other让其他用户可用

sudo mkdir -p /mnt/porn
sudo chown root:root /mnt/porn #(默认为root)
sudo chmod 755 /mnt/porn #(默认为755)

Rclone将文件同步到Backblaze

rclone sync
Make source and dest identical, modifying destination only.

基础命令:rclone sync /mnt/porn b2:mount-porn

注意 :使用 -P / --progress 标志可查看实时传输统计信息

rclone sync 的危险不在参数,而在你不清楚“谁是源”

  1. 显示传输统计信息,并发传输文件4,并发扫描检验8,--checksum检查变化,包括大小和校验和(如果可用,否则仅使用大小)

一般我网速不快,而且传大视频(GB)--transfers改成1

rclone sync /mnt/porn b2:mount-porn --progress --transfers=4 --checkers=8 --checksum
  1. --immutable只增不减
rclone sync /mnt/porn b2:mount-porn --progress --checksum --immutable

实践

sudo mkdir -p /mnt/video

sudo nano /etc/systemd/system/mnt-video.mount

# /etc/systemd/system/mnt-video.mount
[Unit]
Description=Mount for /mnt/video
After=network-online.target
Wants=network-online.target
[Mount]
Type=rclone
What=b2:mount-video
Where=/mnt/video
Options=rw,_netdev,allow_other,args2env,vfs-cache-mode=writes,config=/etc/rclone/rclone.conf,cache-dir=/var/rclone

sudo systemctl daemon-reload

sudo systemctl start mnt-video.mount

systemctl status mnt-video.mount

rclone sync /mnt/video b2:mount-video --progress --transfers=4 --checkers=8 --checksum第一次完成同步

~/media/yt-dlp/下删除三个视频,保持文件结构

find ~/media/yt-dlp -type f -name "*.mp4" -exec rm -f {} +

导出持久的youtube cookies.txt

Extractors
A feature-rich command-line audio/video downloader - yt-dlp/yt-dlp
yt-dlp --js-runtimes node -f "bestvideo[height<=1080]+bestaudio/best[height<=1080]" --merge-output-format mp4 -o "/mnt/video/ytb/%(title)s.%(ext)s" --cookies /home/jay/cli/yt-dlp/cookies.txt "https://youtu.be/CbnC626lSLY?si=U3rwTFYEEFlzpZa6"

rclone sync ~/media/yt-dlp b2:mount-video --progress --transfers=4 --checkers=8 --checksum --immutable

使用--immutable或者使用copy,不删除b2有本地没有的文件

rclone copy ~/media/yt-dlp b2:mount-video --progress --transfers=4 --checkers=8 --checksum

最后

我刚刚犯了一个错误,但是已经改过来了

我忘记了我不应该从/mnt/video上传,应该从~/media/yt-dlp上传,然后copy到b2:mount-video然后从/mnt/video tree

我通过rclone sync b2:mount-video ~/media/yt-dlp --progress --transfers=4 --checkers=8 --checksum --immutable 将视频同步了回来,然后放回了~/media/yt-dlp,再删除~/media/yt-dlp下的文件,/mnt/video和b2就都不会有影响了