私人数据同步服务(&工作内容无缝链接)

服务端

rsyncd

raid一般不用于rsync远程同步,毕竟每次上传下载要增加一次唤醒磁盘阵列的次数和操作读写,日常还是以位于NVMe的work和doc为主,定期归档到raid即可。

/etc/rsyncd.conf:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
pid file = /run/rsyncd.pid
use chroot = yes
read only = false

uid={REAL_USER}
gid={REAL_USER}

auth users = {RSYNC_USER}
secrets file = /etc/rsyncd.secrets

[raid]
path = /data/raid/Sync
comment = personal data on raid

[work]
path = /home/{REAL_USER}/Workspace
comment = work data

[doc]
path = /home/{REAL_USER}/Documents
comment = documents

密码:

1
echo "{RSYNC_USER}:$(pwgen -syn1 24)" > /etc/rsyncd.secrets

crontab

root用户定时任务

1
2
3
4
5
6
# wake等待客户端数据同步(早上下拉,晚上上传)
51 8 * * * rtcwake -m no -t $(date +\%s -d "today 18:50")
51 18 * * * rtcwake -m no -t $(date +\%s -d "tomorrow 08:50")

# 测试wake效果
# */5 * * * * echo "$(date)" >>/root/wake_test.log

客户端

rsync

密码写入 $HOME/.config/rsync.secrets

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash

cd "$(dirname $0)/" || exit 1

remote="{RSYNC_USER}@{HOME_SERVER}::work"
passfile="$HOME/.config/rsync.secrets"

[ $# -lt 2 ] && {
echo -e "Usage:\n\t$0 <dirs,...> <up|down>"
exit 1
}

[[ "$2" != "up" && "$2" != "down" ]] && {
echo "must up or down"; exit 2;
}

IFS=, read -r -a dirs <<<"$1"
action="$2"

for dir in "${dirs[@]}"; do
src="$dir"
dst="$dir"

[ "$action" == "up" ] && dst="$remote/$dir" || src="$remote/$dir"

rsync -avz --mkpath --delete --password-file="$passfile" "$src/" "$dst/"
done

crontab

1
2
3
4
5
51  8 * * 1-5 /Users/{USER}/Documents/note/rsync.sh work,study down
51 18 * * 1-5 /Users/{USER}/Documents/note/rsync.sh work,study up

51 8 * * 1 /Users/{USER}/Workspace/rsync.sh {WORK} down
51 18 * * 5 /Users/{USER}/Workspace/rsync.sh {WORK} up

mac 定时唤醒

参考 在“终端”中设置 Mac 定时开关机 - 官方 Apple 支持 (中国)

repeat 比较稳,但是一个wake只能有一条,所以还是要结合schedule操作

1
sudo pmset repeat sleep F 19:20:00 wakeorpoweron MTWRF 08:50:00

crontab(root)

1
2
3
4
# 51 18 * * 1-4 pmset schedule wakeorpoweron "$(date -v +1d +\%D) 08:50:00"
# 51 18 * * 5 pmset schedule wakeorpoweron "$(date -v +3d +\%D) 08:50:00"

51 8 * * 1-5 pmset schedule wakeorpoweron "$(date +\%D) 18:50:00"

这样每个工作日早上8:50 wake,然后再通过crontab的执行安排一下当天18:50的wake,在周末前,周五19:20 sleep。

效果:

1
2
3
4
5
6
7
pmset -g sched
Repeating power events:
wakepoweron at 8:50AM weekdays only
sleep at 7:20PM Friday
Scheduled power events:
[0] wake at 03/12/23 03:34:41 by 'com.apple.alarm.user-visible-Weekly Usage Report'
[1] wakeorpoweron at 03/07/23 18:50:00 by 'pmset'

取消

1
2
sudo pmset repeat cancel
sudo pmset schedule cancel 1

参数参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SCHEDULED EVENT ARGUMENTS
pmset allows you to schedule system sleep, shutdown, wakeup and/or power on.
"schedule" is for setting up one-time power events, and "repeat" is for
setting up daily/weekly power on and power off events. Note that you may
only have one pair of repeating events scheduled - a "power on" event and a
"power off" event. For sleep cycling applications, pmset can schedule a
"relative" wakeup or poweron to occur in seconds from the end of system
sleep/shutdown, but this event cannot be cancelled and is inherently
imprecise.

type - one of sleep, wake, poweron, shutdown, wakeorpoweron
date/time - "MM/dd/yy HH:mm:ss" (in 24 hour format; must be in quotes)
time - HH:mm:ss
weekdays - a subset of MTWRFSU ("M" and "MTWRF" are valid strings)
owner - a string describing the person or program who is scheduling this
one-time power event (optional)

实际使用

完全自动化操作,万一前一次up失败,后面的down再成功,有可能丢失掉较新的数据,风险较大。考虑到一般回到家再工作和改动数据的情况不多,还是以up为主,如果哪天在家里有改动,第二个工作日手工执行下down也行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ crontab -l
#51 8 * * 1 /Users/{USER}/Workspace/rsync.sh unicom down
#51 8 * * 1-5 /Users/{USER}/Documents/note/rsync.sh work,study down

51 18 * * 1-5 /Users/{USER}/Documents/note/rsync.sh work,study up
51 18 * * 5 /Users/{USER}/Workspace/rsync.sh {WORK} up
52 18 */10 * * /Users/{USER}/Documents/macos_bak/rsync.sh up

$ sudo crontab -l
# 51 18 * * 1-4 pmset schedule wakeorpoweron "$(date -v +1d +\%D) 08:50:00"
# 51 18 * * 5 pmset schedule wakeorpoweron "$(date -v +3d +\%D) 08:50:00"

#51 8 * * 1-5 pmset schedule wakeorpoweron "$(date +\%D) 18:50:00"

$ sudo pmset repeat sleep F 19:20:00 wakeorpoweron MTWRF 18:50:00

$ pmset -g sched
Repeating power events:
wakepoweron at 6:50PM weekdays only
sleep at 7:20PM Friday
Scheduled power events:
[0] wake at 03/12/23 02:06:03 by 'com.apple.alarm.user-visible-Weekly Usage Report'