unison 사용 (feat. gemini)

Unison은 로컬 디렉토리와 다른 로컬 디렉토리, 또는 로컬 디렉토리와 원격 디렉토리 간에 파일을 양방향으로 동기화하는 데 사용되는 강력한 도구이다.

  • rsync가 단방향 동기화에 강점이 있다면,
  • Unison은 양쪽의 변경 사항을 모두 감지하여
  • 충돌을 해결하고 일관성을 유지하는 데 특화되어 있다.

Unison을 사용하는 방법은 크게 CLI(명령줄 인터페이스) 방식과 GUI(그래픽 사용자 인터페이스) 방식이 있다.


Unison 설치

대부분의 리눅스 배포판에서 패키지 관리자를 통해 Unison을 설치할 수 있다.

  • Ubuntu/Debian:

    1
    2
    sudo apt update
    sudo apt install unison unison-gtk
    • unison-gtk는 GUI 버전
  • Fedora/CentOS/RHEL:

    1
    sudo dnf install unison unison-gui
    • unison-gui는 GUI 버전
  • macOS (Homebrew):

    1
    brew install unison
    • macos에서 GUI 버전은 따로 설치 할 수 있다 (예: brew install --cask unison).
  • Windows:

    • Unison 공식 웹사이트에서 설치 파일을 다운로드하여 설치할 수 있다. 일반적으로 unison.exeunison-gtk.exe 파일이 제공된다.

Unison 사용 시 고려사항 및 팁:

중요: 동기화하려는 양쪽 시스템(로컬 및 원격)에 동일한 버전의 Unison이 설치되어 있어야 한다. 버전이 다르면 오류가 발생할 수 있다.

  • 동일한 버전: 동기화하려는 양쪽 시스템의 Unison 버전이 반드시 같아야 한다.
  • SSH 키 인증: 원격 동기화 시 매번 비밀번호를 입력하는 번거로움을 줄이려면 SSH 키 기반 인증을 설정하는 것이 좋다.
  • 충돌 관리: Unison은 파일 내용이 양쪽에서 동시에 변경될 때 “충돌(conflict)”을 감지되고 이 경우 사용자가 수동으로 어떤 버전을 유지할지 결정해야 한다. --prefer 옵션을 사용하면 충돌 시 특정 방향을 자동으로 선호할 수 있지만, 데이터 손실 위험이 있으므로 주의해야 한다.
  • 백업: 중요한 데이터를 동기화하기 전에 항상 백업을 해두는 것이 좋다.
  • ~/.unison 디렉토리: Unison은 이 디렉토리에 동기화 상태, 프로필 파일, 로그 등을 저장한다. 문제가 발생하면 이 디렉토리의 내용을 확인하거나 삭제하여 초기화할 수 있다.
  • 성능: 대량의 파일을 처음 동기화할 때는 시간이 오래 걸릴 수 있지만, 이후에는 변경된 부분만 동기화하므로 빠르게 처리된다.

CLI (명령줄 인터페이스)로 Unison 사용하기

CLI 방식은 스크립트 작성이나 자동화에 유용합니다.

기본 사용법:

명령 형식:

unison 명령으로 특정 폴더를 지정해 동기화 할 수 있다.

1
unison [옵션] [root1] [root2]

또는 Unison은 “프로필”이라는 개념을 사용하여 동기화 설정을 저장하고 관리한다. 프로필을 사용하면 복잡한 옵션을 매번 입력할 필요 없이 간단하게 동기화를 실행할 수 있다.

1
unison [프로필_이름] [옵션]

예시 1: 로컬 디렉토리 간 동기화

두 개의 로컬 디렉토리 ~/dir1~/dir2를 동기화한다고 가정해 보자.

  1. 첫 번째 동기화 (프로필 생성):

    1
    unison ~/dir1 ~/dir2

    이 명령을 처음 실행하면 Unison은 두 디렉토리를 비교하고 어떤 파일이 어디에 있는지, 어떤 변경 사항이 있는지 알려줍니다. 그리고 “Save this configuration as default for roots?”와 같은 질문을 할 것입니다. y를 입력하여 프로필을 저장하는 것이 좋습니다. 기본 프로필 이름은 default가 됩니다.

  2. 질문 및 응답:

    • Unison은 각 파일에 대해 어떤 작업을 수행할지 묻습니다 (->는 왼쪽에서 오른쪽으로, <-는 오른쪽에서 왼쪽으로, ==는 동일함, ?는 충돌).
    • 대부분의 경우 y를 입력하여 제안된 작업을 수락하거나, n을 입력하여 건너뛸 수 있습니다.
    • 충돌이 발생하면 Unison은 어떤 버전을 유지할지 선택하라고 묻습니다.
  3. 이후 동기화 (프로필 사용):

    1
    unison default

    또는 단순히:

    1
    unison

    (default 프로필이 있다면 자동으로 로드됩니다.)
    Unison은 이전 동기화 이후의 변경 사항만 감지하여 빠르고 효율적으로 동기화합니다.

예시 2: 로컬과 원격 디렉토리 간 동기화 (SSH 사용)

로컬 ~/local_dir과 원격 서버 user@remote_host:/remote_dir를 동기화한다고 가정해 봅시다.

  1. 첫 번째 동기화 (프로필 생성):

    1
    unison ~/local_dir ssh://user@remote_host//remote_dir
    • ssh://user@remote_host/: 원격 호스트에 SSH로 연결하겠다는 의미입니다.
    • //remote_dir: 원격 경로입니다. /가 두 개입니다. 이는 원격 루트 디렉토리부터의 절대 경로임을 나타냅니다.
  2. SSH 비밀번호 입력: SSH 연결을 위해 비밀번호를 입력하라는 메시지가 나타날 수 있습니다. SSH 키 기반 인증을 설정해두면 편리합니다.

  3. 질문 및 응답: 로컬 동기화와 마찬가지로 Unison이 각 파일에 대해 묻습니다.

  4. 이후 동기화:
    default 프로필로 저장했다면:

    1
    unison

중요한 옵션:

  • -batch 또는 -auto: 충돌이 없으면 사용자 입력 없이 자동으로 동기화를 진행합니다. 스크립트에서 유용합니다.
  • -auto -force [root]: 특정 루트(예: root1)의 파일을 다른 루트에 강제로 덮어씌웁니다. 충돌 시 유용할 수 있지만, 주의해서 사용해야 합니다.
  • -ignore [패턴]: 특정 파일이나 디렉토리를 동기화에서 제외합니다. (예: -ignore "Thumbs.db" 또는 -ignore "*/.git/*")
  • -prefer [root]: 충돌이 발생했을 때 특정 루트의 버전을 선호합니다. (예: -prefer newer는 더 최근에 수정된 파일을 선호).
  • -silent: 터미널 출력을 최소화합니다.
  • -perms 0: 파일 권한 동기화를 비활성화합니다. (Windows와 Linux/macOS 간 동기화 시 유용)
  • -times: 파일 수정 시간을 동기화합니다. (기본적으로 활성화되어 있지만, 명시적으로 지정할 수 있습니다.)

프로필 파일 직접 생성 및 편집

Unison은 프로필을 $HOME/.unison 디렉토리에 .prf 확장자를 가진 파일로 저장합니다. 예를 들어, my_sync.prf라는 프로필을 만들고 싶다면:

1
2
3
4
5
6
7
8
9
10
# ~/.unison/my_sync.prf 파일 내용
root = /home/사용자이름/dir1
root = ssh://user@remote_host//remote_dir

# 예시 옵션
ignore = Path Thumbs.db
ignore = Name *~
ignore = Name *.bak
prefer = newer
batch = true

이렇게 프로필 파일을 만든 후에는 다음과 같이 동기화를 실행할 수 있습니다:

1
unison my_sync

사용

Unison은 두 디렉토리의 내용을 비교하고, 어떤 파일이 어느 쪽에만 있거나 변경되었는지 보여줍니다.

1
unison ~/my_wsl_project /mnt/e/WindowsProjects/MyProject

실해을 하면 “Save this configuration as default for roots?” 와 같은 질문이 나오면 y를 입력하여 프로필을 저장하는 것이 좋습니다. 이렇게 하면 다음부터는 단순히 unison 또는 unison default로 실행할 수 있습니다.

  • 각 파일에 대해 -> (왼쪽에서 오른쪽으로 복사), <- (오른쪽에서 왼쪽으로 복사), ? (충돌) 등의 제안이 표시됩니다. y를 눌러 수락하거나, n을 눌러 건너뛸 수 있습니다.

ssh 사용

Unison 프로필에서 SSH 키 파일을 사용하는 방법은 SSH 클라이언트 설정과 Unison 프로필 설정을 함께 이용하는 것입니다.

Unison이 SSH 키 파일을 자동으로 인식하고 사용하여 원격

로컬에서 원격 서버에 ssh-key 를 생성해 공개키를 ssh 키 공유를 위해 복사한다

1
ssh-keygen -t rsa -b 4096

원격 서버에 로컬 공개키를 복사한다.

1
ssh-copy-id user@remote_host

~/.ssh/config 에 호스트별 키 파일을 지정한다.

~/.ssh/config 파일을 열거나 새로 생성하고 다음 내용을 추가합니다:

1
2
3
4
5
6
Host myremoteserver             # 이 부분은 원하는 별칭 (Alias)
HostName 192.168.1.100 # 원격 서버의 실제 IP 주소 또는 도메인
User remoteuser # 원격 서버에 로그인할 사용자 이름
Port 22 # SSH 포트 (기본은 22, 변경했다면 여기에 입력)
IdentityFile ~/.ssh/id_rsa # 사용할 개인 키 파일의 경로
IdentitiesOnly yes # 명시된 IdentityFile만 사용하도록 강제

unison 프로파일에 ssh host 를 사용해서 설정한다.

1
2
3
4
5
6
7
8
9
10
11
12
# 로컬 디렉토리
root = /home/youruser/local_project

# 원격 WSL2 디렉토리 (myremoteserver는 ~/.ssh/config에 설정한 별칭)
root = ssh://myremoteserver//mnt/e/remote_data

# 선택적 Unison 옵션
batch = true
prefer = newer
ignore = Path .git
ignore = Name Thumbs.db
perms = 0 # Windows 드라이브 동기화 시 권한 문제 방지를 위해 유용