본문 바로가기

Library/Windows Programming

CygWin Portable Install

윈도우에서 가상 머신을 사용하지 않고 유닉스 환경을 사용하는 방법 중 가장 대표적인 것은 CygWin이다. CygWin은 cygwin1.dll을 사용해서 POSIX 함수들을 구현하기 때문에, 많은 유닉스 프로그램들을 그대로 컴파일해서 사용할 수 있다. CygWin와 자주 비교되는 MSYS는 사실 CygWin에서 파생된 프로젝트다. CygWin이 호환성을 최우선으로 하는 것과 달리, MSYS는 윈도우 환경에서 GNU 툴들을 사용할 수 있도록 호환성을 제공하기는 하지만, 성능을 우선하고 있다는 점이 다르다. 호환성을 중요하다면 CygWin을, 호환성을 약간 희생하고 좀 더 높은 성능을 필요로 한다면 MSYS이 적당하다.

MSYS가 CygWin보다 설치가 간단하고 성능도 괜찮지만 여전히 CygWin이 필요한 경우가 있는데, 이것은 MSYS를 사용하는 유닉스 프로그램은 MSYS에 맞춰 코드를 수정해야 하기 때문이다. MSYS 환경에서는 유닉스 프로그램들이 그대로는 컴파일되지 않는 경우가 종종 발생하며, 특정 유닉스 프로그램을 윈도우에서 컴파일해서 사용하고 싶지만, 해당 프로그램이 MSYS 포트를 제공하지 않을 경우 CygWin이 유일한 방법이다.

그러나, CygWin은 MSYS와 달리 패키지들의 복잡한 의존성 문제 때문에 직접 설치하는 것이 쉽지 않다. 그러나, MSYS보다 복잡하기는 하지만 CygWin 역시 설치 프로그램을 사용하지 않고 설치할 수 있으며, 이렇게 설치된 CygWin은 포터블(portable)하게 사용할 수 있다. 물론, CygWin 설치 프로그램을 사용해서 설치하더라도 포터블 사용이 불가능한 것은 아니지만, CygWin을 좀 더 많이 커스터마이즈 하고 싶은 사람들은 다음을 참고하라:


1. 먼저, CygWin 패키지를 제공하는 사이트에 접속하여 필수적인 패키지를 다운 받는다. 이 과정은 CygWin 설치 프로그램을 사용하여 해당 패키지만 다운 받아도 되고, 직접 ftp.jaist.ac.jp와 같은 미러 사이트에 접속하여 다운 받아도 상관없다. 최소한의 CygWin 시스템을 구축하기 위해서는 CygWin 코어, 쉘, 필수 유틸리티, 터미널 패키지가 필요하다.

2. CygWin을 설치하고자 하는 로컬 디렉토리를 만든다. 이 로컬 디렉토리는 설치할 CygWin 시스템의 루트가 된다. 이제부터 여기에 cygwin 패키지를 받아서 설치한다. 설치하는 것은 단순히 bz2 압축을 풀고 tar 묶음을 풀면 된다.

3. CygWin 코어는 cygwin, base-cygwin 패키지가 필요하다.

4. base-files 패키지를 설치한다. base-files는 bash, coreutils, findutils, sed, cygwin 패키지와 의존성 관계가 있다. bash, coreutils, findutils, sed 패키지 역시 의존성 관계가 있는 다른 패키지들을 설치해야 한다. bash는 libgcc1, libintl8, libncursesw10, libreadline7 패키지를 필요로 하며, coreutils 패키지는 libattr1, libgmp3, libiconv2, libintl8, tzcode 패키지가 필요하다. findutils는 bash, coreutils, libgcc1, libintl8 패키지와 의존성 관계가 있고, sed는 libgcc1, libintl8 패키지에 의존한다. 특히, bash, coreutils, findutils, sed 패키지는 공통적으로 CygWin 미러 사이트의 _update_info_dir 패키지가 필요하다. _update_info_dir 패키지는 /etc/postinstall 디렉토리에 설치가 끝난 뒤 실행해야 할 쉘 스크립트들을 설치한다. libgcc1 패키지는 gcc4 패키지에서 찾을 수 있고, libintl8 패키지는 gettext 패키지에서 찾을 수 있다.

5. CygWin을 bash를 사용해서 직접 작업할 것이 아니라면, mintty와 terminfo 패키지를 설치해야 한다. mintty는 bash, cygutils 패키지와 의존성 관계가 있다. cygutils는 libpopt0, libintl8, libiconv2, libgcc1, libstdc++6, dos2unix 패키지가 필요하고, terminfo는 bash, coreutils 패키지가 필요하다.

6. 여기까지 설치한 패키지들은 필수 패키지들이며, 이후의 패키지는 개인 선택에 따라 설치한다. 예를 들어, 터미널 화면을 깨끗하게 지워주는 clear 명령을 사용하려면, ncurses 패키지를 설치해야 한다. man 패키지는 bash, bzip2, coreutils, gawk, groff, gzip, less 패키지와 의존성 관계가 있으며, bzip2 패키지는 libbz2_1, libgcc1, corutils 패키지와 의존성 관계가 있다. gawk는 libintl8, libsigsegv2, libgcc1 패키지가 필요하고, groff 패키지는 libgcc1, libstdc++6 패키지가 필요하다.

7. CygWin 디렉토리를 조정한다. 이것은 cygwin1.dll의 내부 경로 의존성 때문에 CygWin의 마운트가 고정적으로 이루어지기 때문이다. mount 파일은 /usr/bin 디렉토리에 있는데, 디렉토리를 조정하지 않은 상태에서 CygWin을 실행시키면 CygWin은 루트 디렉토리를 제대로 파악하지 못한다. /usr/bin 디렉토리의 모든 파일들을 /bin 디렉토리로 복사하고, /usr/bin 디렉토리는 삭제한다. 이상하게 보이겠지만, MSYS 역시 이와 유사한 디렉토리 구조를 가지고 있다. MSYS의 패키지들은 /bin에 실행 파일들을 설치하지만 CygWin 패키지들은 이 작업을 직접 해주어야 한다. CygWin 수동 설치가 쉽지 않은 것은 이와 같은 cygwin1.dll의 내부 경로 의존성 때문이다. 엄연히 목적이 다른 /usr/bin 파일들을 /bin에 복사하는게 마음에 들지 않는 사람들도 있을텐데, CygWin의 mount는 /bin 디렉토리가 /usr/bin 디렉토리를 감춘다. fstab의 설정을 변경해도 이 문제를 잘 해결되지 않는데, CygWin이 윈도우에서 유닉스 환경을 구현하고 있기 때문에 이 제한은 어쩔 수 없다.

8. 필요하다면 CygWin의 루트 디렉토리에 /home 디렉토리를 생성한다. 윈도우 환경 변수 %USERNAME%와 같은 문자열로 자신의 홈 디렉토리를 만든다. CygWin은 대소문자를 구별하기 때문에 주의해야 한다. 자신의 홈 디렉토리가 필요없다면 이 과정은 필요없다. 추가로, /usr/tmp 디렉토리를 생성하고, /var/log, /var/run 디렉토리를 생성한다.

9. bash를 실행한다. /etc/postinstall 디렉토리에 있는 쉘 스크립트를 실행하는데, 실행 순서는 정해져 있지 않지만 terminfo 패키지를 설치했다면 coreutils.sh 스크립트는 terminfo.sh 스크립트를 실행한 이후에 실행해야 한다. 명령 프롬프트에서 bash를 직접 실행했을 때, CygWin의 /bin 디렉토리는 PATH 환경 변수에 추가되어 있어야 하며, postinstall 스크립트들이 CygWin의 /bin 디렉토리의 실행 파일들을 실행할 수 있어야 한다.

10. 홈 디렉토리를 생성했다면, /etc/defaults/etc/skel 디렉토리에 있는 rc 설정 파일들을 자신의 홈 디렉토리로 복사한다. 마지막으로, CygWin이 설치된 디렉토리의 /bin 디렉토리가 PATH 환경 변수에 추가한다. CygWin의 /bin 디렉토리를 반드시 전역 환경 변수로 설정해야 할 필요는 없지만, CygWin을 실행하는 동안에는 /bin 디렉토리는 PATH 환경 변수에 존재해야 한다.

11. CygWin의 루트 디렉토리에서 bash나 mintty를 실행시켜 CygWin이 정상적으로 동작하는지 확인한다. 자신의 홈 디렉토리에서부터 mintty를 사용하여 CygWin을 시작하기를 원한다면 'mintty -'을 입력한다. - 인자는 mintty로 하여금 현재 로그인된 사용자의 홈 디렉토리에서 터미널을 시작하도록 한다.


설치 프로그램 대신, 이와 같이 CygWin을 직접 설치한다면 CygWin을 최소의 크기로 유지할 수 있으며, CygWin을 좀 더 입맛대로 꾸며 사용할 수 있다.