2011년 11월 29일 화요일

Rsync on Windows can handle UTF-8 file/folder. Thanks cygwin 1.7

 

image

image 

 

1. 배경

  Linux, Windows 장비가 혼재된 환경에서 rsync를 백업용으로 사용한 것은 5년 이상 되었지만, 항상 한글 처리가 가장 큰 이슈였다.

  이 문제때문에 항상 백업될 파일/폴더 이름에 ASCII가 아닌 다른 문자를 사용하고 있는지 확인하는 것이 첫번째 작업이었다. 그래서, 개발자/DBA 등 파일 데이터를 생성하는 사용자들에게 매번 협조를 구해야만 했다.  workaround로 tar와 같은 압축 프로그램을 이용해서 미리 파일/폴더명을 ASCII 로 정리해두는 꽁수(?)를 사용하기도 했지만 어쨌든 깔끔한 방법은 아니었다.

 

 

2. 원인

 

  원인은 UNIX emulation layer를 제공하는 cygwin DLL이 UTF-8을 제대로 지원하지 못하기 때문이다. 이것 때문에 별도로 패치된 cygwin DLL 파일을 구하는 경우도 있었지만, 어쨌든 권장할 만한 방법은 아니었다. rsync 뿐만 아니라 cygwin 에 의존하는 다른 오픈소스 프로그램들도 비슷한 문제를 안고 있다고 보면 된다.

 

 

3. 한글이 정상적으로 처리되지 않을 때

  구 버전의 cygwin DLL 파일과 함께 rsync를 실행해서 한글 파일, 폴더를 복사 시도했다.

 

image

- 클라이언트쪽 메시지

image

- rsync 서버쪽 로그 (서버는 정상적으로 보내주는 것을 알 수 있다)

 

 

4. 해결책

rsync 패키지에 함께 제공되는 cygwin DLL 파일을 최신버전 (1.7.9)로 덮어쓴다. 

cygwin 최신 버전을 구하려면...

  • Cygwin 공식 사이트에서 setup.exe 실행 파일을 다운로드 받고 설치한다. 그 다음에 cygwin DLL 파일만 추출한다. 또는
  • 이 포스팅 작성자가 미리 정리한 cygwin-1.7.9-1.zip  파일을 여기에서 다운로드한다.
    다운로드 받은 cygwin-1.7.9-1.zip 파일에 포함된 cygwin1.dll 파일 정보
  • 03/29/2011  05:11 PM         2,666,500 cygwin1.dll
                   1 File(s)      2,666,500 bytes

        MD5SUM: a47a6b26c566f364e71a83b789a56226 *cygwin1.dll

image


 

5. 정상적으로 진행될 때의 스크린샷 (#1)

1.7 최신 버전의 cygwin DLL 파일과 함께 rsync를 실행해서 한글 파일, 폴더를 복사 시도했다.

 

image

- 클라이언트쪽 메시지

image

- rsync 서버쪽 로그

 

  에러메시지가 좀 있지만, 한글 이름으로 된 파일/폴더 들이 잘 전송되는 것을 볼 수 있다.

  chown 파일/폴더 failed: Invalid argument (22) 에러 메시지의 경우, 대충 짐작되지만 구글링해보면 좀 더 많은 자료를 찾을 수 있다. 간단히 정리하면 rsync 옵션 –a  (archive) 때문이다.  –a 옵션은  –rlptgoD  와 동일한 옵션이며, 그 중 –p (preserve permission), –o(preserve owner), –g (preserve group) 가 문제의 에러 메시지를 발생시킨 것이다.

  즉, rsync 서버로부터 Windows machine으로 파일을 전송하고 나서 Permission, Owner, Group 정보를 원본 그대로 설정하려고 시도하다가 발생한 것이다.이는 Linux 와 환경이 근본적으로 다르기 때문이므로 옵션을 다르게 사용할 필요가 있다.

 

image

- rsync의 옵션 목록 (문제의 옵션들을 볼 수 있다)

 

 

6. 정상적으로 진행될 때의 스크린샷 (#2)

마지막으로  rsync 옵션을 변경해서 한글 파일, 폴더를 복사 시도했다.

 

image

- 클라이언트쪽 메시지 (에러 메시지들이 사라졌다)

 

앞서 사용한   –a  옵션이 아닌  –rltD 라는 다소 복잡한 옵션을 지정했다.   (-vz 옵션은 그대로 사용)  

 

깔끔하게 출력되는 모습이 보기 좋다. 성공!!!

 

 

7. 참고자료

 

댓글 없음:

댓글 쓰기