2009-04-03 4 views
4

여러 Linux 랩탑/데스크탑을 사용 중이며 홈 디렉토리를 "공유"하고 싶습니다.여러 클라이언트의 홈 디렉토리를 서버에 동기화하십시오.

NFS는 불행히도 옵션이 아닙니다. 그래서 rsync를 사용하여 bash 스크립트를 만들려고했지만 어떻게해야하는지 알 수 없습니다.

`#`!/bin/bash 

sync() { 
    rsync -azvR --exclude-from=/home/ME/.rsync_excludes --delete -e 'ssh -ax' $1 $2 
} 

sync /home/ME server.domain:/home/ME 
`#`sync server.domain:/home/ME /home/ME 

가 나는 경우에만 서버 파일을 업데이트하는 하나의 클라이언트 시스템을 사용하는 경우이 위대한 일이라고 생각 지금 내 예입니다. 옳은?

한 클라이언트에서 파일을 삭제하면 어떻게됩니까? 해당 파일은 다른 클라이언트에서 삭제되기를 원합니다 (동기화 후).

이 목적으로 rsync를 사용할 수 있습니까? 다른 프로그램을 찾아야합니까? 다행히도 아니지만 ...

편집 : 솔루션이 자동으로 일종의 솔루션이 될 것이라고 나는이 솔루션을 사용해서는 안되기 때문에.

편집 2 : 어쨌든 repo가 ​​포함 된 솔루션이 있어야 할 수도 있습니다. Subversion, Git, Mercurial 또는 someting.

답변

9

rsync은 마스터와 동기화 된 위치를 유지하는 것이 좋습니다. 또는 다른 말로하면, A를 B로 대치하십시오. 그것은 당신이하는 일이 아닙니다. rsync A에서 B로, B에서 A로해야합니다. 그러면 완전히 새로운 문제가 생깁니다. 파일이 사라진 경우 상대방을 삭제하거나 다시 rsync해야합니다? 어쩌면 그것은 다른 쪽에서 수정되었을 것입니다; 당신은 확인할 수 없습니다.

어쨌든; 이 문제에 대한 해결책은 unison의 형식으로 제공됩니다. 이것은 홈 디렉토리 또는 다른 디렉토리를 동기화 상태로 유지할 도구 (Linux, OS X, Windows, BSD, ...) (CLI 도구, GUI 도구가 있으며 cron에 멋지게 예약 할 수 있음) 및 거의 모든 종류의 갈등이나 문제를 다룰 수 있도록 만들어졌습니다. 그 사람들은 우리가 여기서 할 수있는 것보다 훨씬 나아 졌다고 생각했습니다.

또는 SCM이 있습니다. 많은 사람들이 SCM을 사용하여 홈 디렉토리를 관리합니다. Subversion은이 기능으로 유명하지만 전혀 추천하지 않습니다. 방대한 양의 공간을 소비 할뿐만 아니라 모든 것을 끔찍하게 느리게 만들고 마스터 저장소에 대한 활성 연결에 따라 동기화를 유지해야합니다. GIT와 같은 대안이 있지만 모두 단점이 있습니다.

어떤 방법 으로든 SCM 기반 솔루션은 매우 큰 SCM 규칙 중 하나를 위반합니다. 절대 큰 바이너리 데이터를 저장해서는 안됩니다. SCM은이를 위해 만들어지지 않았습니다. 사진 컬렉션, 동영상, 문서, 다운로드 및 물건을 SCM에 보관하지 마십시오. 사진을 동기화하거나 기록을 유지하려는 경우 (특히 사진/문서의 경우).

백업 유지와 동기화 유지간에 차이가 있음을 이해하는 것이 중요합니다. 백업은 원격/분리 된 위치에 보관해야하며 소유하고있는 모든 기록을 포함 할 수 있습니다. 나는 개인적으로 이것을 위해 rdiff-backup을 추천한다. 그것은 모든 것의 역사를 아름답게 유지하고, 트래픽을 최소화하기 위해 두건 아래의 rsync 알고리즘을 사용하고 백업 위치에 액세스하는 것은 백업의 가장 최근 상태처럼 보입니다. 일반 파일처럼 탐색 할 수 있습니다.

요약하면 데이터를 안전하고 안정적으로 동기화 유지하기위한 모든 방법에 unisonrdiff-backup을 결합하는 것이 좋습니다.

+0

이것은 아마 나를위한 해결책 일 것입니다. 나는 너를 위해 투표했다. 더 자세히 살펴보고 잘하면이 답변을 만들 것입니다 ... – Daniel

2

Subversion을 사용하면 어떨까요? 링크 된 기사는 소스 컨트롤을 사용하여 작성자가 동기화하고 기록을 저장하는 방법에 대해 자세히 설명합니다 (Subversion을 사용할 필요는 없습니다. 분명히 대안이 있습니다)

+0

그래, 생각이 들겠지만 "마술처럼"자동으로 끝나면 감사 하겠어. 특별히 그저 나를 사용하는 것이 아니기 때문에. 어쨌든 고마워. – Daniel

+0

로그인시 클라이언트가 'svn up'또는 유사하게 수행합니까? –

+0

예, 자동 검색 방식의 경우 rsync – kdgregory

1

당신이 한 일을 살펴보면, 작업을 마친 후에는 각 클라이언트가 서버에 동기화되도록해야합니다. 무인, 자동 동기화를 찾고 있다면

function syncDown() { 
    f=${1/\\/$/}/; 
    rsync -acuvz --exclude 'CVS' --exclude '*.class' --exclude '.classpath' server:projects/$f $f; 
    } 

function syncUp() { 
    f=${1/\\/$/}/; 
    rsync -acuvz --exclude 'CVS' --exclude '*.class' $f server:projects/$f; 
    } 

는, 당신이 그것을 얻을하지 않을거야 : 당신은 항상 경쟁을해야 내가 디렉토리별로 수동으로 호출 다음을 사용 한 클라이언트에서 작업하는 조건이지만 다른 클라이언트의 동기화로 덮어 쓰게됩니다.

rsync 만 수행 단방향 동기화 : 당신은 아마 이미 단지 앞으로이 문제를 볼 수 있습니다 사람들을 위해 점을 강조하기 위해이 알고 있지만 같은

+0

아마도 이것이 최선의 방법 일 것입니다. 나는 아마 사용자가 이것을 할 여유가 있다고 생각한다. 실제로는 몇 가지 명령 만 실행하고 repo에 파일을 추가해야합니다. 답변 해 주셔서 감사합니다. 내 두뇌가 천천히 움직입니다 (스웨덴 스톡홀름에서의 금요일 오후). :-) – Daniel

0

는 것 같습니다. 양방향 동기화가 필요하면 다른 것을 사용해야합니다. (cvs/svn/git는/등. "뭔가 다른"의 적절할 것 같다,하지만 당신은 업데이트 기록을 필요로하지 않는 경우 개정 제어 시스템은 최적의 선택이 될 수 없습니다.) 실제적인 측면에서

,이 수단 A에서 B까지 rsync ing이면 각 동기화는 B의 디렉토리가 A의 디렉토리와 똑같이 보일 것입니다 - 마지막 동기화 이후 B에서 변경 한 내용은 손실됩니다 (제외하고는 제외하고주의 사항은 rsync입니다). --delete이 지정된 경우 파일 만 삭제). 그런 다음 다른 위치로 푸시 된 신뢰할 수있는 마스터 버전을 사용하는 이러한 정렬은 대부분의 경우에 적합하지만 어떤 종류의 공동 작업도 이들 사이에 없습니다.

+0

해결책처럼 보이는 것은 일종의 repo를 사용하는 것입니다. 우리는 Perforce를 이미 사용하고 있지만 이것으로는 효과가 없습니다. :-) Git 또는 Mercurial을 살펴 보겠습니다. – Daniel

관련 문제