Skip to content

数据备份同步及共享

WSB(windows server backup)

windows server系统自带的备份和还原工具

多设备之间文件同步

Windows:192.168.0.15
centos:192.168.0.20
WindowsE:\AAvscode\AAown目录备份到linux/dnc20/www/目录下

法1:使用rsync+SMB/CIFS共享

1、在Windows中设置共享目录
WindowsE:\AAvscode\AAown目录设置共享

2、挂载共享目录
安装cifs-utils(如果未安装),并挂载Windows共享目录到本地路径,例如/mnt/windows

bash
sudo yum install -y cifs-utils
sudo mount -t cifs -o username=<你的共享用户>,password=<你的共享密> //192.168.0.15/<共享> /mnt/windows

sudo vim /etc/smb-user
username=USERNAME
password=PASSWORD

sudo chmod 600 /etc/smb-user

sudo vim /etc/fstab    //在文件末尾添加以下内容
//192.168.0.15/<共享名> /mnt/windows cifs credentials=/etc/smb-user,uid=1000,gid=1000,iocharset=utf8,vers=3.0 0 0

sudo mount -a    //如果没有报错,说明挂载配置正确,系统重启后会自动挂载。

<共享名> 是Windows上配置的共享名称。
iocharset=utf8用于支持中文等特殊字符。
不指定uidgid时,挂载的共享目录默认归属于root用户,普通用户可能无法访问或修改其中的内容。
vers=3.0表示使用SMBv3协议(适用于较新的Windows系统),不确定可以不写。

3、使用rsync实现同步
使用rsync/mnt/windows中的内容实时同步到/dnc20/www/

bash
sudo yum install -y rsync
rsync -avz --delete /mnt/windows/ /dnc20/www/

4、设置定时任务实现实时备份

使用 inotify-tools(监听文件变化并实时同步)或 cron(定时同步)。

bash
sudo yum install -y inotify-tools
sudo vim /usr/local/bin/real_time_sync.sh

#!/bin/bash

# 定义源目录和目标目录
SRC_DIR="/mnt/windows"      # Windows 挂载目录
DEST_DIR="/dnc20/www/"      # 同步到的目标目录
LOCK_FILE="/tmp/rsync.lock" # 临时文件锁
LOG_FILE="/var/log/real_time_sync.log" # 日志文件

# 检查是否已有其他脚本实例在运行
if [ -f "$LOCK_FILE" ]; then
    echo "$(date): Another instance is running. Exiting." >> "$LOG_FILE"
    exit 1
fi

# 创建锁文件,防止并发运行
touch "$LOCK_FILE"

# 捕获退出信号,清理锁文件
trap "rm -f $LOCK_FILE; exit" INT TERM EXIT

# 检测是否有最近 1 分钟修改过的文件
if find "$SRC_DIR" -type f -mmin -1 | grep -q .; then
    echo "$(date): Files are being modified. Skipping sync." >> "$LOG_FILE"
else
    # 如果没有最近修改的文件,执行 rsync 同步
    echo "$(date): Starting rsync." >> "$LOG_FILE"
    rsync -avz --delete --temp-dir=/tmp "$SRC_DIR/" "$DEST_DIR/" >> "$LOG_FILE" 2>&1
    echo "$(date): Sync completed." >> "$LOG_FILE"
fi

# 删除锁文件
rm -f "$LOCK_FILE"

脚本功能说明

bash
find "$SRC_DIR" -type f -mmin -1

-type f:只查找普通文件(忽略目录)。
-mmin -1:查找最近 1 分钟内被修改的文件。
如果有任何文件满足条件,则跳过同步任务,并记录日志。

bash
if find "$SRC_DIR" -type f -mmin -1 | grep -q .; then
    echo "$(date): Files are being modified. Skipping sync." >> "$LOG_FILE"
else
    rsync ...
fi

grep -q .:检测find是否输出内容,表示是否有最近修改的文件。
如果有内容,记录日志并退出同步流程。
如果没有文件在最近1分钟内被修改,执行rsync同步

bash
rsync -avz --delete --temp-dir=/tmp "$SRC_DIR/" "$DEST_DIR/"

--temp-dir=/tmp:使用临时目录存放传输中的文件,传输完成后才覆盖目标文件,避免生成不完整的文件。

5、手动运行脚本进行测试

bash
sudo chmod +x /usr/local/bin/real_time_sync.sh
/usr/local/bin/real_time_sync.sh

6、设置为后台运行
可以使用nohupscreen将脚本放入后台

bash
nohup /usr/local/bin/real_time_sync.sh > /var/log/real_time_sync.log 2>&1 &

2>&1:将标准错误输出(stderr)重定向到标准输出(stdout)。
也就是说,任何错误信息都会一起写入/var/log/real_time_sync.log

&:将命令放入后台运行。
如果不加&,命令会在前台运行,你需要等到命令完成后才能继续操作。

7、使用systemd管理服务
systemd是现代Linux系统推荐的服务管理工具,配置后更灵活且易于调试。

bash
sudo vim /etc/systemd/system/real_time_sync.service

[Unit]
Description=Real-Time Sync Service
After=network.target

[Service]
ExecStart=/usr/local/bin/real_time_sync.sh
Restart=always
StandardOutput=file:/var/log/real_time_sync.log
StandardError=file:/var/log/real_time_sync.log

[Install]
WantedBy=multi-user.target

ExecStart: 指定运行的脚本路径。
Restart=always: 如果脚本异常退出,自动重启。
StandardOutput/StandardError: 日志输出路径。

bash
sudo systemctl daemon-reload
sudo systemctl enable real_time_sync.service
sudo systemctl start real_time_sync.service
sudo systemctl status real_time_sync.service

法2:使用同步工具(如Syncthing)

1、安装Syncthing

WindowsCentOS上都安装Syncthing,到syncthing官网下载安装,并进行配置。

2、在Syncthing Web界面中,添加WindowsCentOS设备。
设置文件夹同步关系,将WindowsE:\AAvscode\AAown同步到CentOS/dnc20/www/