본문 바로가기

리눅스

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

반응형

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

Unison은 파일 및 디렉토리 동기화를 위한 도구로 두 개의 디렉토리를 동일하게 유지할 수 있습니다.

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

테스트 환경

호스트 이름 아이피 주소 동기화 디렉토리 비고
node1 192.168.10.111 /app/www unison, inotify-tools 패키지 설치
node2 192.168.10.114 /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

id_rsa와 id_rsa.pub 복사

scp /root/.ssh/id_rsa root@192.168.10.114:/root/.ssh/
scp /root/.ssh/id_rsa.pub root@192.168.10.114:/root/.ssh/

authorized_keys 파일 생성

ssh-copy-id root@192.168.10.111

---

ssh-copy-id root@192.168.10.114

Unison 설정 파일 생성

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

 

node1 서버에서 설정 파일 작성

sudo mkdir ~/.unison

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

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

데이터 디렉토리 생성

sudo mkdir -p /app/www
cd ~/.unison
vim default.prf
# Unison profile

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

# 원격 디렉토리
root = ssh://root@192.168.10.114//app/www

# 동기화 옵션
auto = true
batch = true
confirmbigdel = false

# 동기화 시 출력되는 로그
log = true
logfile = /var/log/unison/unison.log
  • root = /app/www : A 서버의 로컬 디렉토리.
  • root = ssh://root@192.168.0.114//app/www : node2 서버의 원격 디렉토리. root는 node2 서버의 사용자 이름입니다.
  • auto = true : 자동으로 동기화를 수행합니다.
  • batch = true : 사용자 확인 없이 동기화합니다.
  • confirmbigdel = false : 많은 파일이 삭제될 때 확인을 생략합니다.
  • log = true : 동기화 작업의 로그를 기록합니다.

node2 서버에서 설정 파일 작성

sudo mkdir ~/.unison
sudo mkdir -p /var/log/unison/backupdir
sudo mkdir -p /app/www
cd ~/.unison
sudo vim default.prf
# Unison profile

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

# 원격 디렉토리
root = ssh://root@192.168.10.111//app/www

# 동기화 옵션
auto = true
batch = true
confirmbigdel = false

# 동기화 시 출력되는 로그
log = true
logfile = /var/log/unison/unison.log
  • root = ssh://root@192.168.10.111//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

# 기본 설정
DEFAULT_PROFILE="default.prf"
DEFAULT_LOGFILE="/var/log/unison/unison.log"
SYNC_DIR="/app/www"

# 로그 파일 디렉토리 생성 (없을 경우)
mkdir -p "$(dirname "$DEFAULT_LOGFILE")"

# 동기화 상태 추적 파일
SYNC_STATUS_FILE="/tmp/unison_sync_status.lock"

# 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" >> "$DEFAULT_LOGFILE"

    # 동기화 상태 파일 확인
    if [ -e "$SYNC_STATUS_FILE" ]; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') - Unison already running, skipping sync." >> "$DEFAULT_LOGFILE"
        continue
    fi

    # 동기화 상태 파일 생성
    touch "$SYNC_STATUS_FILE"

    # Unison 동기화 실행
    if ! unison "$DEFAULT_PROFILE" >> "$DEFAULT_LOGFILE" 2>&1; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') - Unison failed." >> "$DEFAULT_LOGFILE"
    fi

    # 동기화 상태 파일 삭제
    rm -f "$SYNC_STATUS_FILE"
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

# 기본 설정
DEFAULT_PROFILE="default.prf"
DEFAULT_LOGFILE="/var/log/unison/unison.log"
SYNC_DIR="/app/www"

# 로그 파일 디렉토리 생성 (없을 경우)
mkdir -p "$(dirname "$DEFAULT_LOGFILE")"

# 동기화 상태 추적 파일
SYNC_STATUS_FILE="/tmp/unison_sync_status.lock"

# 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" >> "$DEFAULT_LOGFILE"

    # 동기화 상태 파일 확인
    if [ -e "$SYNC_STATUS_FILE" ]; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') - Unison already running, skipping sync." >> "$DEFAULT_LOGFILE"
        continue
    fi

    # 동기화 상태 파일 생성
    touch "$SYNC_STATUS_FILE"

    # Unison 동기화 실행
    if ! unison "$DEFAULT_PROFILE" >> "$DEFAULT_LOGFILE" 2>&1; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') - Unison failed." >> "$DEFAULT_LOGFILE"
    fi

    # 동기화 상태 파일 삭제
    rm -f "$SYNC_STATUS_FILE"
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 restart unison-sync
sudo systemctl status unison-sync

 

참고URL

- GitHub repository : Unison File Synchronizer

- GitHub repository : Unison Release

 

728x90
반응형