企業環境常需在多台伺服器間實現檔案即時同步,尤其跨平台同步需求日益增長。本文詳細記錄使用 Rsync + Inotify 架構,在兩台 Linux 主機間部署即時雙向同步的完整流程,並說明關鍵配置細節與常見坑點。
mkdir -p /opt/image
# Gentoo
emerge rsync
# CentOS/RHEL
yum install rsync
# Ubuntu/Debian
apt-get install rsync
vi /etc/rsyncd.conf
# 全域設定
uid = root
gid = root
use chroot = no
max connections = 10
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsync.log
# 模組設定
[images]
path = /opt/image/
read only = no
auth users = rsyncuser
secrets file = /etc/rsyncd.secrets
echo "rsyncuser:Password01" > /etc/rsyncd.secrets
chmod 600 /etc/rsyncd.secrets
rsync --daemon --config=/etc/rsyncd.conf
echo "rsync --daemon --config=/etc/rsyncd.conf" >> /etc/rc.local
chmod +x /etc/rc.local
mkdir -p /opt/rsync
# Gentoo
emerge rsync inotify-tools
# CentOS/RHEL
yum install rsync inotify-tools
# Ubuntu/Debian
apt-get install rsync inotify-tools
echo "Password01" > /etc/rsyncd.secrets
chmod 600 /etc/rsyncd.secrets
vi /root/InotifyRsync.sh
#!/bin/bash
# 即時同步腳本:監聽本地變更並推送至遠端
HOST="192.168.254.201"
SRC="/opt/rsync/"
DST="images"
USER="rsyncuser"
PASSFILE="/etc/rsyncd.secrets"
# inotifywait 參數說明:
# -m 持續監聽 -r 遞迴 -q 安靜模式
# --timefmt 時間格式 --format 輸出格式
# -e 監聽事件:modify(修改) delete(刪除) create(建立) move(移動) attrib(屬性變更)
inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' \
-e modify,delete,create,move,attrib "$SRC" | \
while read TIME FILE; do
echo "[$TIME] 偵測變更:$FILE"
rsync -avzP --delete --password-file="$PASSFILE" "$SRC" "$USER@$HOST::$DST"
echo "[$TIME] 同步完成:$FILE"
done
exit 0
chmod +x /root/InotifyRsync.sh
/root/InotifyRsync.sh &
echo "/root/InotifyRsync.sh &" >> /etc/rc.local
chmod +x /etc/rc.local
| 事件 | 觸發條件 |
|---|---|
| IN_ACCESS | 檔案被讀取 |
| IN_MODIFY | 檔案被寫入(內容修改) |
| IN_ATTRIB | 檔案屬性變更(chmod、chown、touch) |
| IN_CLOSE_WRITE | 可寫檔案被關閉 |
| IN_CLOSE_NOWRITE | 不可寫檔案被關閉 |
| IN_OPEN | 檔案被開啟 |
| IN_MOVED_FROM | 檔案被移出監聽目錄 |
| IN_MOVED_TO | 檔案被移入監聽目錄 |
| IN_CREATE | 目錄下建立新檔案/子目錄 |
| IN_DELETE | 檔案/目錄被刪除 |
| IN_DELETE_SELF | 監聽目錄本身被刪除 |
| IN_MOVE_SELF | 監聽目錄本身被移動 |
| IN_UNMOUNT | 檔案系統被卸載 |
常用組合事件:IN_CLOSE = IN_CLOSE_WRITE | IN_CLOSE_NOWRITE、IN_MOVE = IN_MOVED_FROM | IN_MOVED_TO
Inotify 可能在短時間內產生大量事件(如大檔案寫入過程)。建議在腳本中加入去抖動邏輯:
# 簡易去抖動:累積事件 2 秒後再同步
inotifywait ... | while read TIME FILE; do
echo "$FILE" >> /tmp/sync_queue
sleep 2
# 批次處理佇列
if [ -s /tmp/sync_queue ]; then
rsync ...
> /tmp/sync_queue
fi
done
rsync -a --delete --numeric-ids 避免 UID/GID 解析開銷--inplace 避免建立暫存檔(需評估風險)--bwlimit 限制頻寬避免佔滿網路# 增加 inotify 監聽上限(預設 8192,大目錄易不足)
echo "fs.inotify.max_user_watches=524288" >> /etc/sysctl.conf
sysctl -p
# 增加 inotify 佇列長度
echo "fs.inotify.max_queued_events=16384" >> /etc/sysctl.conf
配置 logrotate 處理 /var/log/rsync.log 避免磁碟爆滿。
Windows 端可使用 cwRsync(Rsync Windows 移植版)搭配 WinInotify 或排程任務定時同步。或改用 FreeFileSync、Syncthing 等 GUI 工具實現跨平台即時同步。
Rsync + Inotify 是 Linux 即時檔案同步的經典組合,具備輕量、高效、可靠特性。生產環境部署時,請務必關注:認證安全(SSH 金鑰優於密碼)、頻率控制(去抖動)、系統限制調整、監控告警(同步失敗通知)。掌握核心配置與優化技巧,即可構建穩定的多節點檔案同步體系。