본문 바로가기

리눅스

[draft] 우분투에서 Unison을 설치하고 사용하는 방법

728x90

우분투에서 Unison을 설치하고 실시간 파일 동기화를 설정하는 방법

Unison을 사용하여 두 서버 간에 파일을 실시간으로 동기화하려면 inotify-tools를 활용하여 파일 시스템 이벤트를 감지하고 Unison을 통해 동기화 작업을 수행하는 방법을 사용할 수 있습니다.

테스트 환경

호스트 이름 아이피 주소 동기화 디렉토리 비고
node1 192.168.0.211 /app/www unison, inotify-tools 패키지 설치
node2 192.168.0.212 /app/www unison, inotify-tools 패키지 설치

Unison 설치

Unison을 설치합니다.

sudo apt-get update
sudo apt-get install -y unison

사용 예시

unison /local-directory/ ssh://user@remote-server//remote-directory/

SSH 키 기반 인증 설정

Unison은 SSH를 통해 원격 서버에 접속하여 동기화 작업을 수행합니다. SSH 키 기반 인증을 사용하면 비밀번호 입력 없이 자동으로 동기화할 수 있습니다.

 

node1 서버에서 SSH 키 생성합니다.

ssh-keygen -t rsa -b 4096

생성된 공개 키를 node2 서버에 복사합니다.

더보기

---

SSH root 접속 허용 설정(PermitRootLogin)

echo "PermitRootLogin yes" | sudo tee -a /etc/ssh/sshd_config
sudo systemctl restart sshd

---

ssh-copy-id root@192.168.0.212

Unison 설정 파일 생성

Unison의 설정 파일을 생성하여 동기화할 디렉토리와 옵션을 지정합니다.

 

node1 서버에서 설정 파일 작성

sudo mkdir ~/.unison

로그 및 아카이브 디렉토리 생성

sudo mkdir -p /var/log/unison/backupdir

데이터 디렉토리 생성

sudo mkdir -p /app/www
cd ~/.unison
vim default.prf
root = /app/www
root = ssh://root@192.168.0.212//app/www

# 양방향 동기화
auto = true
batch = true

confirmbigdel = false
backupdir=/var/log/unison/backupdir

# 동기화 시 출력되는 로그
log = true
logfile = /var/log/unison/unison.log
  • root = /app/www : A 서버의 로컬 디렉토리.
  • root = ssh://root@192.168.0.212//app/www : node2 서버의 원격 디렉토리. root는 node2 서버의 사용자 이름입니다.
  • auto = true : 자동으로 동기화를 수행합니다.
  • batch = true : 사용자 확인 없이 동기화합니다.
  • log = true : 동기화 작업의 로그를 기록합니다.

node2 서버에서 설정 파일 작성

sudo mkdir ~/.unison
sudo mkdir -p /var/log/unison/backupdir
sudo mkdir -p /app/www
cd ~/.unison
sudo vim default.prf
root = /app/www
root = ssh://root@192.168.0.211//app/www

# 양방향 동기화
auto = true
batch = true

confirmbigdel = false
backupdir=/var/log/unison/backupdir

# 동기화 시 출력되는 로그
log = true
logfile = /var/log/unison/unison.log
  • root = ssh://root@192.168.0.211//app/www : node1 서버의 원격 디렉토리. root는 node1 서버의 사용자 이름입니다.

Unison 동기화 실행

Unison을 실행하여 동기화를 시작합니다.

unison default

동기화 테스트 실행

sync1.txt 파일을 생성 후 동기화를 실행합니다.

root@node1:~$ cd /app/www
root@node1:~$ touch sync1.txt
root@node1:~$ unison default
Unison 2.51.5 (ocaml 4.13.1): Contacting server...
Connected [//node1//app/www -> //node2//app/www]
 
Looking for changes
  Waiting for changes from server
Reconciling changes
new file ---->            sync1.txt  
Propagating updates
Unison 2.51.5 (ocaml 4.13.1) started propagating changes at 15:46:47.46 on 28 Aug 2024
[BGN] Copying sync1.txt from /app/www to //node2//app/www
[END] Copying sync1.txt
Unison 2.51.5 (ocaml 4.13.1) finished propagating changes at 15:46:47.48 on 28 Aug 2024, 0.013 s
Saving synchronizer state
Synchronization complete at 15:46:47  (1 item transferred, 0 skipped, 0 failed)
root@node2:~$ ls /app/www   
sync1.txt

자동 동기화 설정(선택 사항)

Unison을 자동으로 실행하도록 설정할 수 있습니다.

 

cron을 사용하여 정기적으로 동기화를 실행하도록 설정할 수 있습니다.

  • 매시간 unison default 명령어를 실행하여 동기화를 수행합니다.
crontab -e
0 * * * * /usr/bin/unison default
728x90

inotify-tools 설치

inotify-tools는 파일 시스템 이벤트를 감지하는 도구입니다.

 

inotify-tools를 설치합니다.

sudo apt-get install -y inotify-tools

실시간 동기화를 위한 스크립트 작성

inotifywait를 사용하여 파일 시스템 이벤트를 감지하고 이벤트 발생 시 Unison을 실행하도록 설정합니다.

 

node1 서버에서 스크립트 작성

sudo vim /usr/local/bin/unison-sync.sh
#!/bin/bash

# Unison 설정 파일 위치
UNISON_PROFILE="default.prf"

# 동기화할 디렉토리
SYNC_DIR="/app/www"

# 로그 파일 경로
LOGFILE="/var/log/unison/unison.log"

# inotifywait를 사용하여 파일 시스템 이벤트 감지
inotifywait -m -r -e modify,create,delete $SYNC_DIR | while read -r directory events filename
do
    echo "$(date '+%Y-%m-%d %H:%M:%S') - Change detected: $events $filename" >> $LOGFILE
    unison $UNISON_PROFILE >> $LOGFILE 2>&1
done
sudo chmod +x /usr/local/bin/unison-sync.sh
/usr/local/bin/unison-sync.sh &

node2 서버에서 스크립트 작성

sudo vim /usr/local/bin/unison-sync.sh
#!/bin/bash

# Unison 설정 파일 위치
UNISON_PROFILE="default.prf"

# 동기화할 디렉토리
SYNC_DIR="/app/www"

# 로그 파일 경로
LOGFILE="/var/log/unison/unison.log"

# inotifywait를 사용하여 파일 시스템 이벤트 감지
inotifywait -m -r -e modify,create,delete $SYNC_DIR | while read -r directory events filename
do
    echo "$(date '+%Y-%m-%d %H:%M:%S') - Change detected: $events $filename" >> $LOGFILE
    unison $UNISON_PROFILE >> $LOGFILE 2>&1
done
sudo chmod +x /usr/local/bin/unison-sync.sh
/usr/local/bin/unison-sync.sh &

자동 실행 설정(선택 사항)

서버 재부팅 시 자동으로 스크립트를 실행하도록 하려면 systemd 서비스를 설정할 수 있습니다.

 

서비스 파일 생성

sudo vim /etc/systemd/system/unison-sync.service
[Unit]
Description=Unison Real-time Sync Service
After=network.target

[Service]
ExecStart=/usr/local/bin/unison-sync.sh
Restart=always
User=root
Group=root

[Install]
WantedBy=multi-user.target

서비스 등록 및 시작

sudo systemctl daemon-reload
sudo systemctl enable unison-sync
sudo systemctl start unison-sync
sudo systemctl status unison-sync

 

참고URL

- GitHub repository : Unison File Synchronizer

- GitHub repository : Unison Release

 

728x90