Arm架构KyLinV10 基于 inotify + rsync 文件双向同步

安装 inotify(两个节点均要编译安装)

  • github地址:https://github.com/inotify-tools/inotify-tools/
  • 3.14下载地址:https://codeload.github.com/inotify-tools/inotify-tools/zip/refs/tags/v3.14

安装编译依赖

1
yum -y install gcc make automake libtool

解压

1
unzip inotify-tools-3.14.zip

创建安装目录

1
mkdir /app/user1/inotify

编译安装

1
2
3
4
5
6
7
# 切换目录
cd inotify-tools-3.14
# 生成构建文件
./autogen.sh
# 编译安装
./configure --prefix=/app/user1/inotify
make && make install

测试

1
/app/user1/inotify/bin/inotifywait  --help

配置 ssh 免密(所有节点均配置)

  • 两个节点均需将对方的公钥存储在自己.ssh目录下的授权文件

生成公私钥

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 生成key,交互信息按需填写
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/app/user1/.ssh/id_rsa): /app/user1/.ssh/sync_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /app/user1/.ssh/sync_rsa
Your public key has been saved in /app/user1/.ssh/sync_rsa.pub
The key fingerprint is:
SHA256:e0RJLVOpA3UIRuW2ZuaDDax5YC4UANrhmWhhSjt8jBI user1@iZ2ze7bklij42hatrh8jn6Z
The key's randomart image is:
+---[RSA 3072]----+
|E=o    .++++o.   |
|*===   ..o+oo    |
|=*=o.    .=+     |
|o o  . . oo.     |
|    . o S *.     |
|   . o + @       |
|    . + + =      |
|     . . . .     |
|                 |
+----[SHA256]-----+

将节点的公钥配置到对端服务器认证文件中

  • 查看公钥文件
1
2
$ cat .ssh/sync_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC54fNyxqiQndRoFpFQ5Uv6tbgXo6NjrDmvRnXyoqyHJ6pgoZyP+KvlChxXn8NQgW5SP+orPKY95A1VHIAUi314oV9m2hxZrH208bAfCLE2/t2PyKmnmjaduS2Jw8Ox1/ddm4Q1nzdjAg2a+CgMnkcFzTYYP8pJq6yAayHAjcUnRmx89SG8T2WErB1/CZY7g64HawilpgoyaZoIpMmyZIJ8gmhAhXqe7ms9qYF9W05aaQ9JrHQXWkIZYBsGtnKR3ehznZoWlxHBz/u2GFqiD3cVFieZlZE2FOjBvus/FdAGBz1CeIF5V6A1RmbjacmYAzM3ZfnHVEJyHbTg5yQHZGjJW8VDcpkawj6KjJt4qFL2wazkMMwGdeaIaTjPgLNm1K4SAdnxLZB/Wq9zS6aMG/biP2HFPsuww8xdrrWQnaIaD7Xdgqk6VCh1yetb43YXY9uShT6FpVfQNAoyezN+UdTIqfMCSLFCITzZrSdhKlSWJ8yuwKjmLGLU3GGQnEzmp90= user1@iZ2ze7bklij42hatrh8jn6Z
  • 对端服务器配置认证
1
2
3
4
5
6
# 切换目录
cd ~/.ssh
# 创建文件
touch authorized_keys
# 增加公钥信息,公钥是上面查到的
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC54fNyxqiQndRoFpFQ5Uv6tbgXo6NjrDmvRnXyoqyHJ6pgoZyP+KvlChxXn8NQgW5SP+orPKY95A1VHIAUi314oV9m2hxZrH208bAfCLE2/t2PyKmnmjaduS2Jw8Ox1/ddm4Q1nzdjAg2a+CgMnkcFzTYYP8pJq6yAayHAjcUnRmx89SG8T2WErB1/CZY7g64HawilpgoyaZoIpMmyZIJ8gmhAhXqe7ms9qYF9W05aaQ9JrHQXWkIZYBsGtnKR3ehznZoWlxHBz/u2GFqiD3cVFieZlZE2FOjBvus/FdAGBz1CeIF5V6A1RmbjacmYAzM3ZfnHVEJyHbTg5yQHZGjJW8VDcpkawj6KjJt4qFL2wazkMMwGdeaIaTjPgLNm1K4SAdnxLZB/Wq9zS6aMG/biP2HFPsuww8xdrrWQnaIaD7Xdgqk6VCh1yetb43YXY9uShT6FpVfQNAoyezN+UdTIqfMCSLFCITzZrSdhKlSWJ8yuwKjmLGLU3GGQnEzmp90= user1@iZ2ze7bklij42hatrh8jn6Z" >> authorized_keys
  • 连接测试,如果能正常连接则配置正确
1
2
# 使用证书文件尝试连接对端服务器
ssh -i .ssh/sync_rsa user2@XX.XXX.XXX.XX

配置同步脚本(所有节点均配置)

  • 创建脚本目录
1
2
mkdir ~/scripts
cd ~/scripts
  • 创建脚本
 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
28
29
30
#!/bin/bash
#set -eux
## 源目录
src_path="/app/user1/webroot/img_static/"
## 目标目录
dest_path="/app/user2/webroot/img_static/"
dest_user="user2"
dest_ip="XX.XXX.XXX.XX"
log_path="/app/user1/scripts/sync.log"

if [ ! -e "$(dirname $log_path)" ]; then
        mkdir -p "$(dirname $log_path)"
fi

/app/user1/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M:%S' --format '%T|%w%f|%e' -e close_write,delete,create,attrib $src_path | while read file; do
        f_name="$(echo $file | awk -F '|' '{print $2}')"
        if [[ $(basename "$f_name") =~ ^\..* ]]; then
                continue
        fi

        if [ -f "$f_name" ]; then
                file_dest_path="$(dirname $f_name)/"
                relative_path="${f_name#$src_path}"
                rsync -vzrtopgR -e "ssh -i /app/user2/.ssh/sync_rsa" "${src_path}./${relative_path}" $dest_user@$dest_ip:$dest_path >>"$log_path" 2>&1
                echo "file ${file} was rsynced" >>"$log_path"
        else
                rsync -vzrtopg -e "ssh -i /app/user2/.ssh/sync_rsa" "$src_path" $dest_user@$dest_ip:$dest_path >>"$log_path" 2>&1
                echo "dir ${file} was rsynced" >>"$log_path"
        fi
done
  • 启动脚本
1
nohup  bash /app/user1/scripts/sync.sh &
  • 保险起见,添加定时任务,每两个小时进行一次全量同步
1
0 */2 * * * rsync -vzrtopg --progress "/app/user1/webroot/img_static/" user2@XX.XXX.XXX.XX:/app/user3/webroot/img_static/ >>"/app/user1/scripts/sync.log" 2>&1

其他问题说明

无法配置 crontab

  • 报错信息:
1
2
3
$ crontab -e
You (user1) are not allowed to use this program (crontab)
See crontab(1) for more information
  • 解决方案

    • 方案1:增加用户至允许文件
    1
    
    echo "user1" >> /etc/cron.allow
    
    • 方案2:关闭所有限制
    1
    
    mv /etc/cron.allow /etc/cron.allow.bak