이 시리즈의 기사를 꾸준히 읽었다면 지금쯤은 UNIX 용어에 많이 익숙해졌을 것이다. 처음에는 낯설게 들렸을 만한 "출력을 파이프로 연결한다", "프로세스를 강제 종료시킨다", "와일드카드를 사용한다"는 등의 구문이 이제는 편하고 익숙하게 들릴 것이다.
하지만 시스템 실에서 UNIX 용어만 사용하는 것은 아니다. IBM z/OS® 및 System z/VM(z9 Virtual Machine)과 같이 "z" 계열의 IBM® 메인프레임 제품군도 있고, 임베디드 시스템 개발자의 많은 관심을 받고 있는 eCos도 있으며, Linux®, FreeBSD, Sun Solaris, Mac OS X 등의 다양한 UNIX 유형의 다양한 운영 체제도 있다. 이처럼 복잡한 오늘날의 정보 기술 환경은 그 옛날의 바벨탑을 연상시킬 정도이다.
게다가 Windows 환경의 사용자도 매우 많이 있다. 그리고 이들 대부분은 가리키고 누르기 방식에만 익숙하다는 한계를 지니고 있다. 20여 년에 걸친 변화를 통해 대부분의 Windows 사용자는 까다로운 DOS 언어를 잊어버리고 말았다.
실제로 Windows COMMAND 유틸리티는 UNIX 쉘에 비해 성능이
현저히 낮으며, 이로 인해 UNIX 사용자는 일반적으로 Windows를 실망스러운 플랫폼이라고
평가하기도 한다. 게다가 Windows는 강력하고 다양한 명령행 도구에 익숙한 UNIX 소프트웨어
개발자에게 특히 귀찮은 플랫폼이기도 하다. UNIX 개발자에게 Windows를 사용한다는 것은
낯선 외국을 방문하는 것과 비슷하다.
다행스럽게도 Cygwin(참고자료 참조)은 프랑스에서 맥도날드를 찾는 것처럼 Windows 내에서 익숙한 환경을 제공한다. (참고로, 필자는 맥도날드의 치즈 버거를 좋아한다.)
Cygwin은 Windows를 위한 UNIX 형태의 쉘 환경으로, 두 가지 구성 요소 즉, UNIX 운영 체제의 수많은 기능을 에뮬레이트하는 UNIX API 라이브러리와 익숙한 UNIX 명령행 인터페이스를 제공하는 Bash 쉘과 다양한 UNIX 유틸리티로 구성되어 있다. 첫 번째 구성 요소는 Windows DLL(Dynamic Link Library)로 제공되고, 두 번째 구성 요소는 UNIX와 동일한 소스 코드를 사용하여 Cygwin DLL을 기반으로 빌드된 개별 프로그램의 컬렉션이다. 이러한 두 가지 구성 요소를 함께 사용하면 Windows에서 UNIX 홈 디렉토리를 편안하게 사용할 수 있다.
이번 Speaking UNIX 기사에서는 Cygwin을 설치하고, CLI(Command-Line Interface)를 살펴본 다음 표준 Cygwin 배포판에 포함되어 있지 않은 오픈 소스 소프트웨어를 빌드하는 과정을 통해 UNIX 애플리케이션을 에뮬레이션 환경에 쉽게 이식할 수 있는 방법을 살펴본다.
이 기사에서 설명하는 다른 소프트웨어와는 달리 Cygwin은 Windows Installer를 사용한다. Cygwin setup.exe 파일은 소프트웨어를 다시 설치하므로 Cygwin 구성의 구성 요소를 추가, 변경 또는 업그레이드하려는 경우 언제라도 다시 사용할 수 있다.
Windows 시스템에서 브라우저를 열고 http://cygwin.com/setup.exe로 이동하여 Cygwin 설치 프로그램을 다운로드한다. 설치 프로그램을 실행한 후에 Cygwin 소프트웨어가 다운로드되도록 설계되어 있기 때문에 설치 프로그램 자체의 용량은 매우 작다(약 600KB). 다운로드가 완료되면 다음 단계를 수행하여 Cygwin을 설치한다.
- Setup 프로그램을 실행한다. 그러면 그림 1과 같은 Cygwin 시작 화면이 표시된다.
그림 1. Cygwin 설치 중에 표시되는 여러 대화 상자 중 첫 번째 대화 상자
- Next를 클릭하여 다음 화면으로 이동한 후 수행하려는 설치 유형을 선택한다.
- Install from Internet을 클릭한다.
- Next를 클릭한 다음 설치 디렉토리를 선택한다.
그림 2에서는 설치 옵션을 구성하는 창을 보여 준다.
그림 2. Cygwin 설치 옵션
대부분의 경우에는 권장 설치 옵션을 사용하는 것이 좋지만 다음과 같은 몇 가지 사항을 고려하여 사용자 정의할 수도 있다.
- Windows 시스템의 루트 디렉토리(예: C:)에 Cygwin을 설치하지 않는다.
고유한 서브디렉토리(예: C:\cygwin(기본값) 또는 C:\Program Files\cygwin)에 Cygwin을
설치하는 것이 좋다. (어느 디렉토리를 선택하던지 상관 없이 선택한 대상 디렉토리가 에뮬레이트되는
UNIX 환경의 루트 디렉토리(
/)가 된다. 예를 들어, C:\cygwin에 설치할 경우 가상 /usr/bin 디렉토리를 C:\cygwin\usr\bin에서 실제로 찾을 수 있다.) - Install For 옵션에서 Just Me를 선택하지 않는다.
- 기존 파일 및 다른 UNIX 시스템에 저장되어 있는 파일과의 호환성을 최대한으로 높이기 위해 Default Text File 유형을 Unix로 설정한다.
- Windows 시스템의 루트 디렉토리(예: C:)에 Cygwin을 설치하지 않는다.
고유한 서브디렉토리(예: C:\cygwin(기본값) 또는 C:\Program Files\cygwin)에 Cygwin을
설치하는 것이 좋다. (어느 디렉토리를 선택하던지 상관 없이 선택한 대상 디렉토리가 에뮬레이트되는
UNIX 환경의 루트 디렉토리(
- Next를 클릭한다.
표시되는 창에서 Cygwin에 필요한 데이터를 저장할 디렉토리를 선택한다. 앞 단계에서 선택한 Cygwin 디렉토리 이외의 디렉토리를 선택해야 한다. 되도록이면 1GB 이상의 여유 공간이 있는 드라이브에서 디렉토리를 작성하거나 선택한다.
- 다시 한번 Next를 클릭하고 사용할 인터넷 연결 유형을 선택한다. 일반적으로 Direct Connection을 선택하는 것이 좋다.
- 다시 한번 Next를 클릭한다.
현재 미러 사이트 목록이 다운로드된 후 목록에서 한 항목을 선택하라는 메시지가 표시된다(그림 3 참조). 신뢰할 수 있는 사이트를 모르는 경우에는 가장 가까운 사이트를 선택하는 것이 좋다.
그림 3. 신뢰할 수 있거나 가장 가까운 설치 사이트 선택
잠시 후에 사용 가능한 범주 및 패키지의 전체 목록이 표시된다. 그림 4에서는 카탈로그 중 일부를 보여 준다. 더하기 기호(
+)를 클릭하면 해당 범주가 펼쳐지며, "루프"를 클릭하면 패키지를 생략하는 Skip과 각 패키지의 사용 가능한 모든 버전이 차례대로 돌아가면서 표시된다. 여러 버전의 유틸리티가 표시될 경우에는 요구 사항에 적합한 인스턴스를 선택한다. 이 화면에서 B 열이 선택된 경우에는 2진 패키지가 다운로드되고 S 열이 선택된 경우에는 소스가 다운로드된다.
그림 4. 요구 사항에 가장 적합한 패키지 및 인스턴스 선택
Cygwin 내에 1,000개 이상의 패키지가 포함되어 있으므로 필요한 범주와 패키지만 선택한다. (Cygwin 번들 전체를 설치할 경우 800MB 이상의 디스크 공간이 필요하다.) 설치한 후 언제라도 Cygwin 설치 프로그램을 다시 실행하여 전체 범주나 단일 패키지를 추가할 수 있으며 패키지를 제거하거나 업데이트할 수도 있다. 원하는 UNIX 유틸리티를 Cygwin 내에서 사용할 수 있는지 여부를 빠르게 확인하려면 Cygwin 패키지 목록(참고자료 참조)을 검색한다.
- 원하는 도구를 선택한 후 Next를 클릭한다. 그러면 다운로드 프로세스가
시작된다.
각 패키지의 다운로드 상태, 전체 다운로드 비율 및 디스크 사용량을 보여 주는 상태 표시줄이 표시된다. 그림 5는 필자의 테스트 시스템에서 설치 작업을 수행하면서 캡처한 스냅샷이다.
그림 5. 약간의 시간이 필요한 대용량 소프트웨어 다운로드
마지막으로 Setup 애플리케이션이 소프트웨어를 설치한 후 선택적으로 시작 메뉴 및 바탕 화면에 바로 가기를 추가한다. Finish를 클릭한다.
- 시작 메뉴를 사용하거나 Cygwin 아이콘을 더블 클릭하여(바로 가기를 설치한
경우) Cygwin을 시작한다. 또는 Cygwin 디렉토리(예: C:\cygwin\Cygwin.bat)에 있는
Cygwin 스크립트를 실행할 수 있다.
그림 6에서는 Cygwin을 처음 시작할 때 수행되는 작업을 보여 준다. 이때 Cygwin이 홈 디렉토리를 작성하고, 쉘 시작 파일을 저장한 후 프롬프트를 제공한다. 이제 UNIX 명령을 실행할 수 있다.
그림 6. 드디어 Windows에서 UNIX 명령을 사용할 준비가 완료되었다.
예를 들어,
ls -a또는type touch를 실행한다. 두 번째 명령은touch가 실행 파일인 /usr/bin/touch임을 나타낸다.
Cygwin은 Windows에서 UNIX 쉘을 거의 완벽하게 에뮬레이트하는 애플리케이션이다. 실제로
Cygwin은 두 운영 체제를 훌륭하게 이어준다. 예를 들어, df -h
명령을 실행하면 "UNIX" 시스템의 디스크 여유 공간에 대한 인벤토리가 표시된다. 그림 7에서는
그 결과를 보여 준다.
그림 7. Windows 상의 UNIX 파일 시스템 또는 UNIX 상의 Windows 파일 시스템
앞에서 설명한 대로 Cygwin 설치 디렉토리는 가상 UNIX 시스템의
루트 디렉토리로서의 역할을 수행한다. Cygwin은 설치 디렉토리의 서브디렉토리를 익숙한 UNIX의
해당 디렉토리에 맵핑하며 Windows 드라이브를 개별 볼륨(예: /cygwin/c)으로 제공한다. 이러한
가상 경로를 사용하여 Windows 프로그램을 실행할 수 있다. 이제 명령행에서 /cygwin/c/Program\ Files/Internet\ Explorer/IEXPLORE.EXE를
입력하면 Windows Internet Explorer®가 실행된다. (Tab 키를 사용하여 경로의 요소를 자동으로
확장할 수도 있다.)
내장 명령인 cygpath를 사용하면 Windows 및 UNIX
경로 이름을 상대 운영 체제의 경로 이름으로 상호 변환할 수 있다. 기본적으로 cygpath는
UNIX 경로 이름을 제공하지만 -w 옵션을 사용하면 Windows
경로를 얻을 수 있다.
$ cygpath -w /cygwin/c/Program\ Files/Internet\ Explorer/IEXPLORE.EXE c:\Program Files\Internet Explorer\IEXPLORE.EXE |
다음과 같은 도구도 두 환경을 연결하는 데 유용하게 사용할 수 있다.
- Cygwin의
lpr(Windows의 LPR.EXE가 아닌 /usr/bin/lpr)을 사용하면 UNIX 에뮬레이션을 직접 인쇄할 수 있다. PRINTER 환경 변수를 Cygwin UNC(예: \\server\printer_name 또는 //server/printer_name)로 설정한다. 이 경우 슬래시 방향은 Cygwin의 다른 모든 부분에서와 마찬가지로 두 방향 모두 사용할 수 있다. - Cygwin에서
ln -s를 사용하여 작성한 기호 링크는 Windows의 바로 가기로 해석된다. 이에 상응하여 Windows 바로 가기는 기호 링크로 해석된다. 더 나아가 Windows 바로 가기를 사용하여 매개변수가 있는 UNIX 명령을 실행할 수도 있다. - 원하는 경우 완전한 Bash 쉘을 사용할 수도 있으므로 앞에서 언급한 모든
호환성 기능을 통해 UNIX 쉘 스크립트를 작성해서 Windows를 관리할 수도 있다.
예를 들어, UNIX
find를 사용하여 드라이브의 데이터를 검색할 수 있다. 여기서 한 가지 주의할 점이 있다. 즉, UNIX에서는 인수가 공백으로 구분되는 반면 Windows 파일 이름에는 공백이 포함된 경우가 자주 있으므로 전체 파일 이름을 유지하기 위해find -print0과xargs -0을 함께 사용해야 한다.
앞에서 언급한 대로 Cygwin 설치 프로그램을 실행하여 언제라도 Cygwin 범주 및 패키지를 추가, 제거 및 업데이트할 수 있다. 이제 일반적인 UNIX 시스템에서 수행하는 작업인 소스 코드를 사용하여 추가 프로그램을 빌드하는 작업을 준비하기 위해 몇 가지 소프트웨어 개발 패키지를 추가해 보자.
Cygwin setup.exe 애플리케이션을 다시 실행한 후 그림 4의 Select Packages 창이 표시될 때까지 초기 대화 상자를 수행한다. Devel 범주를 펼친 다음 재활용 컨트롤을 사용하여 다음과 같은 패키지의 최신 버전을 선택한다.
autoconf2.1automake1.10binutilsgcc-coregcc4-coregdbpcrepcre-devel
위 패키지를 모두 선택했으면(종속성을 충족하기 위한 추가 패키지가 자동으로 선택됨) Next를 클릭하여 업데이트를 시작한다. 개발 패키지의 경우 대부분 용량이 크기 때문에 앞에서와 같이 다운로드 및 설치 프로세스가 완료되는 데 시간이 걸릴 수 있다.
이제 브라우저 창을 열고 http://ftp.gnu.org/gnu/wget/wget-1.11.4.tar.gz를 입력하여
GNU wget 유틸리티의 최신 소스 코드를 다운로드한다. (wget는
거의 모든 파일을 다운로드할 수 있는 명령행 도구이다. 이 도구에 대한 자세한 정보를 보려면
참고자료를 참조한다.) Cygwin을 사용하여 파일을 Cygwin의 홈 디렉토리에
복사한 후 tar 파일을 펼친다. Listing 1에서는 tar 파일의 컨텐츠를 보여 준다.
Listing 1. wget-1.11.4.tar의 컨텐츠
$ cp /cygdrive/c/Documents\ and\ Settings/Martin/My\ Documents/wget-1.11.4.tar ~ $ tar xzvf wget-11.4.tar wget-1.11.4/ wget-1.11.4/AUTHORS wget-1.11.4/NEWS wget-1.11.4/COPYING wget-1.11.4/configure.bat wget-1.11.4/ChangeLog wget-1.11.4/ChangeLog.README wget-1.11.4/msdos/ wget-1.11.4/msdos/ChangeLog wget-1.11.4/msdos/Makefile.DJ ... wget-1.11.4/src/cookies.c wget-1.11.4/src/http.h wget-1.11.4/src/log.h wget-1.11.4/src/sysdep.h wget-1.11.4/src/alloca.c wget-1.11.4/src/getopt.c wget-1.11.4/src/gnu-md5.h wget-1.11.4/src/ftp.c wget-1.11.4/config.sub wget-1.11.4/config.guess $ |
Cygwin 다운로드 및 설치 프로세스가 완료되면 Finish를 클릭한다. 이제
소스를 사용하여 wget 유틸리티를 빌드할 수 있는 준비가
완료되었다.
$ cd wget-1.11.4 $ ./configure configure: Configuring for GNU wget 1.11.4 ... creating po/Makefile $ make gcc -I. ... $ make install ... /usr/bin/install -c -m 644 ./wget.1 /usr/local/share/man/man1/wget.1 $ type wget /usr/local/bin/wget |
새 유틸리티를 테스트하기 위해 Cygwin 내에서 새 유틸리티를 실행한 후 다음 명령을
사용하여 wget 소스 코드를 다운로드한다.
$ /usr/local/bin/wget http://ftp.gnu.org/gnu/wget/wget-1.11.4.tar.gz |
잠시 후에 새로운 소스 tar 파일이 다운로드된다. Cygwin 설치 프로그램을 사용하여 Cygwin 저장소에서 유틸리티를 가져오는 방법이 가장 쉽기는 하지만 다운로드한 소스나 사용자가 작성한 코드를 Cygwin 내에서 빌드할 수도 있다. 많이 알려져 있는 스크립트 언어를 포함한 전체 UNIX 개발 도구 스위트를 Cygwin에서 사용할 수 있다.
Microsoft Visual Studio®와 같은 도구가 없을 경우 Cygwin에 있는 UNIX 컴파일러 및 도구를 사용하여 원시 Windows WIN32 애플리케이션을 빌드할 수도 있다. (이러한 애플리케이션은 UNIX에서 실행되지 않지만 WINE을 사용하면 UNIX에서 실행되는 Windows 애플리케이션을 빌드할 수 있다. 참고자료에서 자세한 정보를 확인할 수 있다.)
Cygwin은 UNIX를 완벽하게 에뮬레이트하지는 못하지만 UNIX 대용으로 사용할 수 있는 편리한 도구임에는 틀림 없다. 곧 발표될 예정인 핵심 구성 요소에 대한 설명서를 통해 에뮬레이션 DLL의 제한 사항과 보안 위험에 대한 자세한 내용을 확인할 수 있다. 복합 UNIX 패키지를 Cygwin에 이식하려면 개발자 안내서(참고자료 참조)에서 사용자의 API에 필요한 Cygwin의 지원을 확인한다.
아마도 Cygwin의 최고 기능은 Windows와의 통합 기능일 것이다. 생산성 향상을 위해 Cygwin에서 UNIX 형태의 명령행을 사용하여 시스템 작업을 수행해 보자. 예를 들어, Windows의 Program Files 디렉토리에 있는 서브디렉토리를 포함하도록 쉘 PATH 변수를 확장한 후에는 경로에 있는 바이너리 파일의 이름을 입력하는 것만으로도 파일을 실행할 수 있다.
게다가 Cygwin을 사용하면 같은 창에서 여러 작업을 관리할 수 있다. Ctrl-Z를 눌러서
실행 중인 작업을 일시중단할 수 있고, bg와 fg를
입력하여 작업을 백그라운드와 포그라운드로 각각 실행할 수 있으며, jobs를
입력하여 작업 목록을 관리할 수 있다. 물론 Cygwin에서는 입력 및 출력을 리디렉션하는 작업과
파이프를 통해 한 명령의 출력을 다른 명령에 연결하는 작업도 수행할 수 있다.
이제 Cygwin의 뛰어난 성능을 활용하는 것은 여러분의 몫이다.
교육
-
Speaking UNIX에서는 이 시리즈의 다른 부분을 볼 수 있다.
-
Cygwin의 기능에 대해 자세히 알아보자.
-
공식 Cygwin User's Guide를 읽어보자.
-
Cygwin package list를 살펴보자.
-
Cygwin API Reference에서 UNIX와의 호환성에 대한 정보와 Cygwin으로 이식하는 방법을 확인할 수 있다.
-
UNIX shell에 대해 자세히 알아보자.
-
Windows API의 오픈 소스 구현인 WINE에 대해 자세히 알아보자.
-
developerWorks의 AIX와 UNIX 영역에서는 AIX 시스템 관리의 모든 부분과 관련된 다양한 정보를 볼 수 있다.
-
New to AIX and UNIX에서 AIX와 UNIX에 대한 자세한 정보를 볼 수 있다.
-
기술 서점에서
다양한 기술 주제와 관련된 서적을 살펴보자.
제품 및 기술 얻기
-
Windows용 Cygwin 설치 프로그램을 다운로드하자.
-
wget에 대해 자세히 알아보고 다운로드하자.
토론
-
developerWorks 포럼 & 블로그를 통해 developerWorks 커뮤니티에 참여하자.
-
AIX 및 UNIX 포럼에 참여하자.
- AIX Forum
- AIX Forum for developers
- Cluster Systems Management
- IBM Support Assistant Forum
- Performance Tools Forum
- Virtualization Forum
- 기타 AIX and UNIX Forums
- AIX Networking
Martin Streicher는 프리랜서 Ruby on Rails 개발자이며 Linux Magazine의 편집장을 역임했다. Purdue University에서 컴퓨터 과학 석사 학위를 받았으며 1986년부터 UNIX 계열 시스템을 프로그래밍하고 있다. 그리고 예술 작품과 장난감 수집을 좋아한다. 이메일 주소는 martin.streicher@gmail.com이다.