Unison은 로컬 디렉토리와 다른 로컬 디렉토리, 또는 로컬 디렉토리와 원격 디렉토리 간에 파일을 양방향으로 동기화하는 데 사용되는 강력한 도구이다.
rsync가 단방향 동기화에 강점이 있다면,- Unison은 양쪽의 변경 사항을 모두 감지하여
- 충돌을 해결하고 일관성을 유지하는 데 특화되어 있다.
Unison을 사용하는 방법은 크게 CLI(명령줄 인터페이스) 방식과 GUI(그래픽 사용자 인터페이스) 방식이 있다.
Unison 설치
대부분의 리눅스 배포판에서 패키지 관리자를 통해 Unison을 설치할 수 있다.
Ubuntu/Debian:
1
2sudo apt update
sudo apt install unison unison-gtkunison-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).
- macos에서 GUI 버전은 따로 설치 할 수 있다 (예:
Windows:
- Unison 공식 웹사이트에서 설치 파일을 다운로드하여 설치할 수 있다. 일반적으로
unison.exe와unison-gtk.exe파일이 제공된다.
- Unison 공식 웹사이트에서 설치 파일을 다운로드하여 설치할 수 있다. 일반적으로
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
unison ~/dir1 ~/dir2
이 명령을 처음 실행하면 Unison은 두 디렉토리를 비교하고 어떤 파일이 어디에 있는지, 어떤 변경 사항이 있는지 알려줍니다. 그리고 “Save this configuration as default for roots?”와 같은 질문을 할 것입니다.
y를 입력하여 프로필을 저장하는 것이 좋습니다. 기본 프로필 이름은default가 됩니다.질문 및 응답:
- Unison은 각 파일에 대해 어떤 작업을 수행할지 묻습니다 (
->는 왼쪽에서 오른쪽으로,<-는 오른쪽에서 왼쪽으로,==는 동일함,?는 충돌). - 대부분의 경우
y를 입력하여 제안된 작업을 수락하거나,n을 입력하여 건너뛸 수 있습니다. - 충돌이 발생하면 Unison은 어떤 버전을 유지할지 선택하라고 묻습니다.
- Unison은 각 파일에 대해 어떤 작업을 수행할지 묻습니다 (
이후 동기화 (프로필 사용):
1
unison default
또는 단순히:
1
unison
(
default프로필이 있다면 자동으로 로드됩니다.)
Unison은 이전 동기화 이후의 변경 사항만 감지하여 빠르고 효율적으로 동기화합니다.
예시 2: 로컬과 원격 디렉토리 간 동기화 (SSH 사용)
로컬 ~/local_dir과 원격 서버 user@remote_host:/remote_dir를 동기화한다고 가정해 봅시다.
첫 번째 동기화 (프로필 생성):
1
unison ~/local_dir ssh://user@remote_host//remote_dir
ssh://user@remote_host/: 원격 호스트에 SSH로 연결하겠다는 의미입니다.//remote_dir: 원격 경로입니다./가 두 개입니다. 이는 원격 루트 디렉토리부터의 절대 경로임을 나타냅니다.
SSH 비밀번호 입력: SSH 연결을 위해 비밀번호를 입력하라는 메시지가 나타날 수 있습니다. SSH 키 기반 인증을 설정해두면 편리합니다.
질문 및 응답: 로컬 동기화와 마찬가지로 Unison이 각 파일에 대해 묻습니다.
이후 동기화:
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 | # ~/.unison/my_sync.prf 파일 내용 |
이렇게 프로필 파일을 만든 후에는 다음과 같이 동기화를 실행할 수 있습니다:
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 | Host myremoteserver # 이 부분은 원하는 별칭 (Alias) |
unison 프로파일에 ssh host 를 사용해서 설정한다.
1 | # 로컬 디렉토리 |