포트 시스템


최준호 <cjh@openbird.com> 저.


포트 시스템의 개요와 간단한 사용법에 대해 알아보자. FreeBSD에서 기본적으로 제공하지 않는 패키지를 사용하기 위해서는 포트에 대한 이해와 사용이 필수적이다.

FreeBSD의 ports 시스템은 1995년에 FreeBSD에 처음 채택되어 약간 변형된 형태로 NetBSD에서는 pkgsrc라는 이름으로 받아들였고(NetBSD에서 포트라고 하면 각 플랫폼별로 시스템을 포팅한 것을 의미한다), OpenBSD에서도 별도의 ports 트리를 운영하고 있다.


개요


포트(ports)는 FreeBSD의 기본 시스템을 제외한 나머지 서드파티 프로그램을 설치할 수 있는 프레임워크를 제공한다. 포트는 다음의 단계를 거쳐서 프로그램을 설치한다. ports라는 말은 컴퓨터에 달린 직렬이나 병렬포트를 의미할 수도 있지만 여기서는 한 프로그램을 다른 플랫폼에 이식하는 작업(포팅; porting)에서 나온 말이다.



  1. 배포 사이트에서 소스 파일을 다운로드하고 미리 기록된 체크섬과 비교: fetch 배포가 불가능한 경우 미리 /usr/ports/distfiles 디렉토리에 복사해 둔다. 체크섬 검사는 위조 여부를 검사하기 위함이다.
  2. 소스를 작업 디렉토리에 풀어넣음: extract
  3. 소스에 대한 패치: patch

    패치에는 두가지가 있다. FreeBSD용에서 컴파일을 위하거나 FreeBSD만의 특별한 사항을 적용하기 위한 패치와, 다른 사이트에서 제공하는 비공식 패치 등이다.


  4. 설정: configure

    GNU autoconf를 쓴다면 configure 스크립트, imake를 쓴다면 xmkmf 등의 빌드 환경(Makefile 등) 생성용 프로그램이 실행된다.


  5. 컴파일: build 대부분은 소스 디렉토리에서 make하는 것이다.
  6. 설치: install

    빌드된 프로그램 바이너리와 관련 파일을 설치한다.


이외 패키징의 경우 다음 단계가 추가된다.



  • 패키지 생성: package

    .tgz 형식의 패키지 바이너리를 설치된 시스템에서 생성해낸다.


포트를 써야 하는 이유는 무엇일까? 여러가지 이유가 있을 수 있다면 필자는 다음과 같은 것을 생각하고 싶다.



  • 기본 시스템이 아닌 서드파티 프로그램의 설치 방법 제공
  • FreeBSD 패키지 정책에 맞는 프로그램 설치
  • 설치된 패키지의 관리
  • 자연스러운 업그레이드 방법 제공
  • 원하는 프로그램을 일일이 설정해서 설치하기 귀찮을 때
  • 필요한 프로그램과 그에 필요한 패키지들을 모두 묶어서 설치하고 싶을 때

패키지는 FreeBSD 용어로 하면 포트에서 설치된 패키지를 나중에 포트에서 컴파일 없이도 다시 설치할 수 있도록 바이너리 형태로 묶어놓은 것을 의미한다. 패키지는 보통 tar+gz 형식으로 압축되므로(최근에는 bzip2 압축도 지원한다) .tgz 확장자를 가지며, 포트와는 달리 pkg_* 명령어군으로 제어한다. 리눅스라면 .rpm이나 .deb 패키지와 비슷한 것이라고 생각하면 된다.

포트는 보통 하나의 프로그램에 대해 정의되어 있으며, 해당 프로그램의 소스를 받아와 패치해서 설치하는데 필요한 절차와 관련 패치 파일, 설명 문서등만을 포함하고 있으며 원본 소스를 포함하지 않는다(물론 예외는 있지만 그 경우는 매우 작고 FreeBSD 전용인 패키지에 한정된다). 따라서 포트는 작은 크기에 비해서는 내부적으로 아주 많은 일을 한다.

rpm의 경우 src.rpm이라는 비슷한 형태가 있는데, 보통 소스 RPM(SRPM)은 파일 내에 원본 소스와 관련 패치를 모두 포함하고 있어서 덩치가 매우 클 수 있다. 포트는 원본 소스는 원래 배포처에서 받도록 하므로 그러한 문제가 없다. (RPM 계열 리눅스 중에서도 일본의 Kondara MNU/Linux처럼 SRPM에서도 소스를 따로 떼어내고 spec파일과 패치만을 배포하는 경우도 있다)

포트의 좋은 점을 하나 더 들자면 설치시에 여러가지 옵션을 주어서 유연한 설치가 가능하다는 것이다. 가령 php를 설치한다면 mysql과 연동할지, postgresql과 연동할지, gd 라이브러리도 연동할지를 정해줄 수 있다. 설치되는 위치도 보통은 /usr/local이나 /usr/X11R6이지만 그것도 원한다면 바꿀 수 있다. 그외 바이너리 패키지로는 달성할 수 없는 여러가지 옵션을 부여할 수 있다.

그리고 4.3 릴리즈와 더불어 이전에 단점으로 지적되던 패키지 보안(PGP키에 의한 사인)과 업그레이드 문제(pkg_update와 sysutils/portupgrade 포트)가 해결되었다.

물론 아직 단점도 있다. 포트를 사용하기 위해서는 우선 네트워크에 연결된 환경이(그것도 큰 소스 파일을 받기 위해서는 빠른 회선이) 필요하다. 아마도 모뎀 환경을 이용한다면 아마도 CD에서 제공하는 바이너리 패키지를 이용하는 것이 최선일 것이다. 또한 전체 포트 트리를 유지하려면 디스크 공간이 약 100M정도 필요하다. 그리고 DEB나 RPM와 같이 관련있는 패키지를 하나의 카테고리로 묶는 provides라든가, 패키지간의 충돌을 감지해 주는 conflicts등의 개념을 제공하지 않으므로 모든 패키지는 사용자의 책임 하에서 설치해야 한다.





포트는 원래 ports 라고 쓰므로 "포츠"라고 해야 맞는 읽기가 될 것이다. 여전히 포트라고 쓰이는 것은 필자를 비롯하여 많은 사람들이 처음부터 그렇게 읽었기 때문이다. 하지만 이미 관용적으로 굳어졌으므로 고치는 것이 더 부자연스럽지 않을까.




포트 배포본 설치


포트는 사용하기에 앞서 자신의 시스템에 설치해야 한다. 포트는 다음과 같은 구성 요소로 되어 있다.



  • 포트의 근간이 되는 BSD make 스크립트와 관련 도구 (ports/{Mk,Tools,Templates})
  • 각 카테고리와 그 안의 포트 스켈레톤

보통은 설치시에 포트를 설치할 것인지에 대한 여부를 물어보므로 이때 YES를 선택해주면 된다.




그림: 배포본에서 ports 설치


따라서 기본적으로는 BSD make와 포트용 스크립트가 필요하다. BSD make는 GNU make와 약간 문법이 다른데, FreeBSD에서는 기본 시스템에서 제공하니까 FreeBSD가 깔려있다면 걱정 안해도 된다. 그 다음은 각 포트에 대한 파일들인데, 설치되어 있는지를 알려면 /usr/ports 디렉토리가 다음과 같이 되어 있는지 살펴본다.

% ls /usr/ports
INDEX cad/ games/ misc/ ukrainian/
LEGAL chinese/ german/ net/ vietnamese/
Makefile comms/ graphics/ news/ www/
Mk/ converters/ hebrew/ palm/ x11/
README databases/ irc/ picobsd/ x11-clocks/
Templates/ deskutils/ japanese/ print/ x11-fm/
Tools/ devel/ java/ russian/ x11-fonts/
archivers/ distfiles/ korean/ science/ x11-servers/
astro/ editors/ lang/ security/ x11-toolkits/
audio/ emulators/ mail/ shells/ x11-wm/
benchmarks/ french/ math/ sysutils/
biology/ ftp/ mbone/ textproc/

만약 파일이 없다면 배포본 CD-ROM에서 다시 설치하자. /stand/sysinstall 명령으로 sysinstall을 다시 불러서 Configure - Distribution 메뉴에서 ports만을 다시 설치하는 것이 가장 쉬운 방법이다. 또는 FTP에서 ports 배포본만을 받아와서 설치해도 된다. 4.3-RELEASE의 경우라면 ftp://ftp.kr.freebsd.org/pub/FreeBSD/releases/i386/4.3-RELEASE/ports/ports.tgz 파일을 받아서 /usr에서 풀어넣으면 된다. 한번에 하려면 root 권한으로 다음과 같이 한다.

# cd /usr
# fetch ftp://ftp.kr.freebsd.org/pub/FreeBSD/releases/i386/4.3-RELEASE/ports/ports.tgz
# tar xzvf ports.tgz
# rm ports.tgz

또 다른 방법은 cvsup을 사용하는 업그레이드 방법인데 다음 기회에 다루기로 하자.



포트의 구조


포트는 대략 카테고리와 그 안의 어플리케이션으로 나누어져 있다.

/usr/ports/카테고리/어플리케이션명
이 되는데, 하나의 포트는 실제로 두개 이상의 포트에 속할 수 있지만 주 위치는 하나로만 정해져 있다. 카테고리에는 앞서 /usr/ports 디렉토리를 나열했을 때 보이는 실제 카테고리(즉 디렉토리와 그 안의 포트가 존재하는)와, 실재하는 카테고리는 아니지만 가상적으로 존재하는 가상 카테고리가 있다. 카테고리의 종류는 상당히 많은데, 실제 카테고리와 가상 카테고리를 합치면 다음과 같다.
afterstep archivers astro audio benchmarks biology cad chinese comms converters databases deskutils devel editors elisp emulators french ftp games german gnome graphics hebrew ipv6 irc japanese java kde korean lang linux mail math mbone misc net news offix palm perl5 picobsd plan9 print python ruby russian science security shells sysutils tcl76 tcl80 tcl81 tcl82 tcl83 textproc tk42 tk80 tk82 tk83 tkstep80 ukrainian vietnamese windowmaker www x11 x11-clocks x11-fm x11-fonts x11-servers x11-toolkits x11-wm zope
대부분의 카테고리는 이름만 보면 어떤 내용인지 알 수 있으므로 자세한 내용은 생략하겠다. 일반인에게 익숙하지 않을 카테고리 몇가지만 들어보면 다음과 같다.




































astro 천문학 관련 패키지
comms 통신 관련 패키지
ipv6 IPv6를 지원하는 패키지
mbone MBone 멀티캐스팅을 지원하는 패키지
misc 어떤 카테고리에도 속하지 않는 패키지
offix Offix 수트(X에서 드래드-앤드-드롭을 지원하는 등의 오피스 관련 기능에 대한 일련의 프로그램군) 패키지
picobsd PicoBSD(1장짜리 라우터 기능을 수행할 수 있는 특별한 FreeBSD 버전) 관련 패키지
plan9 AT&T의 Plan9 운영체제 패키지가 유닉스에 포팅된 것
ruby 마쯔모토 유키히로의 ruby 언어 관련 패키지. 최근 급성장하고 있다. ruby는 perl/python과 유사한 객체지향 스크립트 언어이다.
tkstep80 tkstep은 Tk를 NeXTStep 스타일로 보여주는 보조 라이브러리이다.
zope Zope 플랫폼 관련 패키지. Zope는 Python으로 작성된 웹 어플리케이션 서버이다.

카테고리 안에는 포트 스켈레톤이라 부르는 한 패키지에 대한 포트가 있다. 전형적인 포트의 구조는 다음과 같다.























korean/ami/Makefile 포트 설치를 위한 Makefile
korean/ami/distinfo 소스에 대한 체크섬이 기록된다.
korean/ami/pkg-comment 패키지에 대한 한줄짜리 설명
korean/ami/pkg-descr 패키지에 대한 여러줄짜리 설명
korean/ami/pkg-plist 설치될 파일 목록
korean/ami/files/patch-aa FreeBSD에서 빌드와 설치를 위한 패치
korean/ami/files/patch-ca

이외 scripts 디렉토리가 있는 경우도 있는데, 포트 설치시에 특별히 사용하는 설정 스크립트 등이 여기에 속한다.

보통은 Makefile에 이 포트가 설치하는 패키지 이름, 소스의 위치, 빌드 방법, 설치 방법 등이 기술되어 있다. 포트의 Makefile은 포트 단계의 각 타겟을 정의해 놓은 /usr/port/Mk/*.mk 를 항상 포함하고 있으므로, 기본 절차 이외에 달라지는 부분만 기술하면 된다.



기본적인 사용법


포트 시스템은 make의 예술이라 할 정도로 복잡하고 다양한 기능을 수행하는 makefile로 구성되어 있다. 즉 모든 동작을 별도의 기능을 갖는 바이너리가 아니라(deb이나 rpm같은 별도 명령이 아닌) make만으로 모두 할 수 있다. 실제 구조에 대해 알고 싶다면 /usr/ports/Mk 디렉토리 아래를 보자.

포트에서 패키지를 설치하기 위해서는 보통 다음과 같이 한다.

# cd /usr/ports/www/apache13
# make install clean

이는 www 카테고리의 apache13 포트(apache-1.3.x 버전)을 "설치"(install)하고 작업 파일을 삭제하는 등의 "정리"(clean)한다. 보통 대부분의 어플리케이션은 이렇게 설치하면 된다. 줄이면 한줄로도 설치할 수 있다. install뒤의 clean을 쓰지 않아도 되지만 그렇게 하면 소스를 풀어놓은 내용이 계속 남아있게 되므로 디스크를 낭비하게 된다. 되도록이면 지우도록 하자.

# cd /usr/ports/www/apache13 && make install clean
> apache_1.3.19.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
>> Attempting to fetch from http://httpd.apache.org/dist/httpd/.
Receiving apache_1.3.19.tar.gz (1928677 bytes): 100%
1928677 bytes transferred in 8.4 seconds (224.77 kBps)
===> Extracting for apache-1.3.19_1
>> Checksum OK for apache_1.3.19.tar.gz.
===> Patching for apache-1.3.19_1
===> Applying FreeBSD patches for apache-1.3.19_1
===> Configuring for apache-1.3.19_1
Configuring for Apache, Version 1.3.19
+ using installation path layout: FreeBSD (/usr/ports/www/apache13/files/FreeBSD.layout)
Creating Makefile
Creating Configuration.apaci in src

+--------------------------------------------------------+
| You now have successfully built and installed the |
| Apache 1.3 HTTP server. To verify that Apache actually |
| works correctly you now should first check the |
| (initially created or preserved) configuration files |
| |
| /usr/local/etc/apache/httpd.conf
| |
| and then you should be able to immediately fire up |
| Apache the first time by running: |
| |
| /usr/local/sbin/apachectl start
| |
| Thanks for using Apache. The Apache Group |
| http://www.apache.org/ |
+--------------------------------------------------------+
===> Generating temporary packing list
Installing /usr/local/etc/rc.d/apache.sh startup file.
===> Compressing manual pages for apache-1.3.19_1
===> Registering installation for apache-1.3.19_1
===> SECURITY NOTE:
This port has installed the following startup scripts which may cause
network services to be started at boot time.
/usr/local/etc/rc.d/apache.sh

If there are vulnerabilities in these programs there may be a security
risk to the system. FreeBSD makes no guarantee about the security of
ports included in the Ports Collection. Please type 'make deinstall'
to deinstall the port if this is a concern.

For more information, and contact details about the security
status of this software, see the following webpage:
http://www.apache.org/
===> Cleaning for apache-1.3.19_1



위 작업이 성공적으로 끝났다면 이제 여러분의 시스템에는 apache 웹 서버가 설치되었을 것이다. 위 포트의 예는 아주 간단했는데, 왜냐하면 이 포트는 별도의 의존성이 없기 때문이다. 하지만 의존성이 복잡하게 필요한 포트들도 위와 동일한 방법으로 설치한다. 가령

# cd /usr/ports/print/ghostscript6 && make install clean

은 ghostscript 6.x 버전을 설치하는데, jpeg과 png 라이브러리가 있는지 찾아서 없다면 그것부터 설치한 후 나머지 과정을 계속한다. korean/netscape47-communicator와 같은 복잡한 포트를 설치할 때에도 마찬가지로 의존성에 의해 필요한 패키지를 먼저 설치하고 나머지 포트 빌드 작업을 계속하게 된다. 의존하는 패키지를 알기 위해서는 다음과 같이 한다.

/usr/ports/korean/netscape47-communicator# make package-depends
imake-4.0.3
ko-baekmukfonts-bdf-2.0_3
netscape-remote-1.0_1
netscape-wrapper-2000.07.07
netscape-communicator-4.76
XFree86-clients-4.0.3
XFree86-libraries-4.0.3_1
XFree86-aoutlibs-3.3.3

필자는 XFree86 4를 쓰고 있어서 출력이 위와 같았는데 기본 설치의 경우 imake가 없고, XFree86-4가 XFree86-3.3.6으로 나올 것이다. 시험삼아 여러가지 패키지를 설치해 보자.



패키지 이름


FreeBSD 패키지의 이름은 다음과 같은 규칙으로 지어진다.

${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}(_${PORTREVISION},${PORTEPOCH})
상당히 어렵게 보이는데 대략 다음과 같다.



${PKGNAMEPREFIX}
패키지 이름에 붙는 접두사이다. 보통은 언어별 패키지에 붙는다. 가령 한국어 패키지는 모두 ko-로 시작하게 되며, 리눅스 에뮬레이션으로 동작하는 패키지는 linux-로 시작하게 된다.
${PORTNAME}
실제 패키지명. emacs, XFree86, hanterm 등이다.
${PKGNAMESUFFIX}
패키지명에 붙는 접미사. 보통은 컴파일 조건에 대한 것으로, 가령 gnome을 위해 특별한 옵션을 지원하는 경우 그것을 켜고 컴파일한 경우는 -gnome, 프로그램이 qt/gtk를 모두 지원하는데 gtk로 컴파일하는 경우에는 -gtk 등이 붙는다.
-${PORTVERSION}
패키지의 버전. 보통은 배포되는 소스에 붙어있는 버전이 그대로 적용된다. 1.0, 2.0.13 등이다.
_${PORTREVISION}
리비전은 원 소스가 변경되지 않은 채 포트 자체에 변경이 있었음을 의미한다. 가령 포트 자체에 대한 버그 수정(패키징시 빼먹은 파일이 있었다든가, 패키징을 잘못 했다든가)이나 기능 추가 (기존에 쓰지 않던 옵션을 주어서 컴파일하는 경우 등)의 경우에 하나씩 증가하는 방향으로 올라간다. 기본값은 0인데, 이 경우에는 _0으로 표현하지 않고 표시하지 않는다.
,${PORTEPOCH}
이 값은 패키지의 버전 비교할 때 문자열 비교가 불가능한 경우 순서를 정해주기 위해서 사용한다. 가령 mozilla-M18이라는 버전과 mozilla-0.9를 비교하는 경우, 문자열 비교에 의하면 M18이 0.9보다 나중의 것이 된다. 실제로 그렇지 않으므로, 이 값을 증가시켜서 나중 버전이라는 것을 명시적으로 표시하게 한다. 기본값인 0은 표시하지 않는다.

몇가지 예를 들어보자.

ko-hanterm-3.1.5

이것은 접두사, 패키지명, 버전만 쓴 것이다.

mozilla-0.8.1_1,1

이것은 mozilla-0.8.1 포트가 생성된 후 한번 내용이 바뀌었으며, PORTEPOCH가 1이므로 이전 버전보다 항상 높다는 것을 의미한다. 가령 이전 버전 중의 하나인 mozilla-M18(PORTEPOCH값은 0)과 비교할 경우, PORTEPOCH값이 더 큰 0.8.1,1쪽이 항상 우선권을 갖게 된다.

ko-ami-gnome-1.0.10

이것은 한국어용 어플리케이션인 ami를 의미하며, -gnome 접미사는 gnome환경에 알맞게 컴파일되었음을(여기서는 gnome applet 모드를 포함하여 컴파일된) 의미한다.



설치된 어플리케이션 사용


이미 설치되어 있는 포트에 대해서는 대부분 해당 패키지에서 제공하는 규칙을 따르지만, 대략 FreeBSD 용 패키지라면 지키고 있는 암묵적인 구조가 있다. 이러한 것들에 대해 조금 알아보자.



  • 서버인 경우 시작/종료 스크립트

    apache, dhcp, samba 등의 서버 패키지의 경우 시작과 종료를 나타내는 스크립트들이 별도로 존재한다. FreeBSD는 System V 스타일의 서비스 시작 방식을 채택하지 않은 관계로 /etc/init.d 와 같은 디렉토리가 없지만, 나름대로의 규칙은 존재한다.

    이러한 서버들의 시작/종료 스크립트는 /usr/local/etc/rc.d 또는 /usr/X11R6/etc/rc.d 아래 놓인다.

     /usr/local/etc/rc.d> ls
    010.pgsql.sh* canna.sh* rplayd.sh* samba.sh.sample*
    apache.sh* ko-msdosfs.sh* rtc.sh* sshd.sh.sample*

    시스템 실행시에 자동적으로 실행되려면 위에서 언급한 두 디렉토리 중 하나에 놓이고, .sh 이라는 이름으로 끝나는 실행 파일이며, 첫번째 인수로 start 또는 stop을 받아서 각각 시스템 시작과 종료 처리를 해 주면 된다. 가령 apache를 재시작하고 싶으면 기존의 방법대로 apachectl 명령을 사용해도 되지만,

    # /usr/local/etc/rc.d/apache.sh stop
    # /usr/local/etc/rc.d/apache.sh start

    로 재시작해 줄 수 있다(restart는 제공하지 않는다). 많은 재시작 스크립트들이 경로명을 검사하므로 반드시 .sh 파일의 전체 경로명을 주도록 하자.

    samba와 같이 선택 가능하거나 설정 파일을 사이트에 맞게 조정해야만 동작하는 서버의 경우 .sh 대신 .sh.sample이라는 이름으로 되어 있는 것이 보통이다. 그런 경우에는 해당 서버의 설정 파일을 알맞게 고친 후, 시작해 주면 된다.

    # cd /usr/local/etc/rc.d
    # mv samba.sh.sample samba.sh
    # /usr/local/etc/rc.d/samba.sh start

    이런 식으로 대부분의 대몬을 재시작할 수 있다. FreeBSD에서 기본적으로 제공하는 많은 대몬(inetd, portmap, sendmail 등)은 대부분 SIGHUP(1) 시그널을 주면 재시작하도록 되어 있으므로 그런 경우에는 kill이나 killall 명령을 사용하면 된다. 가령 inetd를 재시작하려면

    # killall -1 inetd

    라고 해 주면 된다.

  • 설정 파일

    패키지의 설정 파일은 모두 설치된 PREFIX(보통 /usr/local이나 /usr/X11R6)아래에 들어가도록 되어 있다. 따라서 보통 /etc 안에 들어가야 할 설정 파일도 모두 /usr/local/etc나 /usr/X1R6/etc에 들어있음에 주의하자. 이것은 기본 시스템 업그레이드시에 패키지가 영향받지 않도록 한다.

    가령 apache의 경우 설정파일은 모두 /usr/local/etc/apache 안에 있고, samba의 경우 /usr/local/etc/smb.conf이다.

    또, 기본 설정 이외에 사이트에서 설치후 추가 조작이 필요한 경우와, 기본 설정을 업그레이드 이후에도 보존하기 위해 많은 포트는 설정 파일을 설치할때 설정 파일명 뒤에 .example이나 .sample, .default 확장자를 붙인다. 가령 apache 웹 서버를 설치했다면 처음 /usr/local/etc/apache 디렉토리에는

    % ls /usr/local/etc/apache/
    access.conf magic srm.conf
    access.conf.default magic.default srm.conf.default
    httpd.conf mime.types
    httpd.conf.default mime.types.default

    이렇게 .default가 붙은 것과 붙지 않은 것이 존재한다. 처음 설치했을 때에는 두 파일의 내용은 같고, 사용자는 .default가 붙지 않은 진짜 설정 파일을 고치면 된다. 나중에 apache 버전이 올라서 새 버전을 설치해야 하는 경우, 업데이트 후에도 .conf 파일은 건드리지 않으므로 업그레이드시에 설정 파일을 보존할 수 있다.

    FreeBSD에서는 패키지의 설정을 사용자 임의로 바꿀 수는 있지만 처음부터 좋은 기본 설정 파일을 제공하는 경우는 드문 관계로 새로운 어플리케이션을 설치하는 경우에는 한번쯤 그 어플리케이션의 문서를 읽어보는 편이 좋을 것이다.


  • 문서와 예제

    패키지에 딸려오는 문서는 보통 /usr/local/share/doc이나 /usr/X11R6/share/doc 디렉토리에서 패키지 이름으로 된 디렉토리를 찾아보면 된다.

    # ls /usr/local/share/doc
    RealPlayer8/ ja-onew-canna/ samba/
    apache/ jade/ semi/
    apel/ java/ templates/
    bitmap/ jbig/ tidy/
    bzip2/ jpeg/ tiff/
    cvs2cl/ lcms/ ttfm/
    elib/ libungif/ unzip/
    fetchmail/ libxml2/ vmware/
    flim/ pcl-cvs/ w3m/
    ghostscript/ pgsql/ wanderlust/
    ja/ py-gtk/
    ja-jvim-3.0.j2.1b/ rinetd/

    이 위치에 있지 않은 경우도 종종 있기는 하지만 최근에는 거의 이 위치로 통일되어 있다.

    마찬가지 방법으로, 예제 파일은 /usr/local/share/examples이나 /usr/X11R6/share/examples 디렉토리에서 찾을 수 있다. 예제는 설정 파일 예제나 프로그래밍 예제 등이 포함된 것이다.

    이들은 원래의 FreeBSD 시스템 구조에서 /usr/share/doc, /usr/share/examples 디렉토리 등의 구조에 따르는 것이다. FreeBSD의 시스템 디렉토리 배치가 어떻게 되어 있는지는 hier(7)의 매뉴얼 페이지를 보도록 하자.




기본 설치 유형이 아닌 패키지


포트는 소스와 분리되어 있기 때문에 원본 소스의 저작권과는 관련이 없다. 따라서 여러 상용 프로그램을 FreeBSD에서 사용하기 위한 포트들도 여럿 존재한다.

이러한 경우는 보통 소스가 되는 파일(반드시 소스가 아니라 바이너리 파일도 포함해서)을 인터넷에서 직접 다운받을 수 없거나, 다운받을 수 있다고 해도 별도의 사용자 등록을 해야 하는 경우가 많다. 이런 경우는 미리 원본 파일을 받아서 /usr/ports/distfiles 디렉토리에 넣고 빌드를 계속해야 한다.

일례로 리눅스용 리얼플레이어 포트를 들어 보자.

/usr/ports/audio/linux-realplayer# make
===> linux-realplayer-8.cs1 may not be automatically fetched due to licensing restrictions.
You MUST manually fetch the Linux RPM version after reading and agreeing to the license at:
http://www.real.com/player/ - once rp8_linux20_libc6_i386_cs1_rpm has been downloaded,
move it to /usr/ports/distfiles and then restart this build..

이렇게 포트 설치시 메시지가 별도로 나오는 경우에는 반드시 그 메시지를 잘 읽고 따라하도록 하자. 위 경우에는, 리얼플레이어 바이너리를 다운받기 위해서 http://www.real.com/player/의 다운로드 링크를 선택해서 사용자 등록 후 다운로드받은 바이너리를 /usr/ports/distfiles에 복사해 주면 된다.

# mv rp8_linux20_libc6_i386_cs1_rpm /usr/ports/distfiles/

이제 다시 make해 보자.

/usr/ports/audio/linux-realplayer# make
===> Extracting for linux-realplayer-8.cs1
>> Checksum OK for rp8_linux20_libc6_i386_cs1_rpm.
===> linux-realplayer-8.cs1 depends on executable: rpm2cpio - found
===> Patching for linux-realplayer-8.cs1
===> Configuring for linux-realplayer-8.cs1

make 뒤에 아무 인수를 주지 않으면 기본적으로 make build단계까지만 수행한다. 이제 make install을 하면 리얼플레이어를 설치해 줄 것이다.

이러한 방식으로 이용할 수 있는 상업 소프트웨어의 포트는 editors/wordperfect, editors/staroffice52 등 여러가지가 있다. 일부는 CD-ROM에서 직접 설치하는 것도 지원한다.

보통 이러한 소프트웨어는 설치는 가능하지만 패키지를 만들거나, 그 패키지를 재배포하는 것을 금지하고 있다. 이러한 유형은 다음과 같다.



  • 패키지를 만들어 FTP에는 배포할 수 있으나 CD-ROM으로 배포는 금지 (보통 상업적 재배포를 허가하지 않는 소프트웨어)
  • 패키지를 만들 수 없는 포트 (재배포를 허용하지 않고 소스만을 공개하는 소프트웨어. 또는 빌드하는 시스템에 따라 바이너리가 달라질 수 있는 가능성이 있는 소프트웨어. e.g. net/smbfs, korean/msdosfs)

이러한 소프트웨어들은 /usr/ports/LEGAL 파일에 나열되어 있으므로 살펴보도록 하자.



포트에서 패키지 삭제


설치한 포트를 지우려면 make deinstall 타겟을 사용하면 된다.

/usr/ports/korean/netscape47-communicator# make deinstall

단 설치한 포트의 버전과 지우려는 포트의 버전이 정확하게 일치해야 한다. 물론 pkg_delete나 포트에 있는 sysutils/pkg_remove로도 지울 수 있으며, 그쪽이 더 유연한 옵션을 제공한다.


설치된 패키지의 정보 보기


포트에 의하거나 바이너리 패키지에 의해 설치된 패키지 목록은 pkg_info 명령으로 볼 수 있다.

# pkg_info
ImageMagick-5.3.1 Image processing tools (interactive optional--misc/display
Mesa-3.4.1 A graphics library similar to SGI's OpenGL
ORBit-0.5.7 High-performance CORBA ORB with support for the C language
XFree86-4.0.3_3 X11R6.4/XFree86 core distribution (complete)
XPostitPlus-2.3 PostIt (R) messages onto your X11 screen
a2ps-a4-4.13 Formats an ascii file for printing on a postscript printer
acroread4-4.05 View, distribute and print PDF documents
apache-1.3.19_1 The extremely popular Apache http server. Very fast, very
apel-emacs20-10.3 A Portable Emacs Library for emacs20

pkg_info는 한 패키지에 대한 자세한 설명을 볼 때에도 활용할 수 있다.

# pkg_info ko-hanterm-xf-19
Information for ko-hanterm-xf-19:
Comment:
An X11R6-based xterm hacked for managing Korean languages

Description:
hanterm-xf
----------

It is one of many variants of hanterm, a well-known program for managing
Korean language in X11. This version supports the features
such as automatic fonts detection, johab844 font support, and based on
XFree86's xterm code. The scrollbar is displayed in right.

--
CHOI Junho
WWW: http://www.kr.FreeBSD.org/~hwang/hanterm/index.html


pkg_info는 다양한 패키지 확인 기능을 할 수 있다. 그 몇가지 예를 들어 보자. 아래 몇가지 옵션은 4.2 이후에 추가된 것이므로 4.3에서만 되는 것들도 있다.

# pkg_info -g apache-1.3.19_1

설치된 패키지와 설치 파일에 대한 체크섬을 비교해서 바뀐 파일을 찾아낸다. 임의로 변조된 설치 파일을 찾을 수 있지만 패키지 데이터베이스(/var/db/pkg)가 위조된 경우에는 안전을 보장할 수 없다.

# pkg_info -f apache-1.3.19_1

설치 파일 목록과 실행 순서를 보여준다. 설치 목록에는 설치되는 파일뿐 아니라 간단한 실행 명령도 들어 있는데, 이런 것도 같이 보여준다. 파일 목록만 보고자 한다면 -L 옵션을 쓰면 된다.

# pkg_info -R png-1.0.10

해당 패키지를 필요로 하는 다른 패키지의 목록을 표시한다.

# pkg_info -x apache

보통 패키지 이름은 정확하게 주어야 하나, -x 옵션 뒤에서는 정규식으로 주면 되므로 패키지명의 일부로도 패키지 정보를 볼 수 있다.

# pkg_info -W apachectl
# pkg_info -W /usr/local/etc/a2ps.cfg

해당 실행파일 또는 파일명이 속한 패키지를 찾는다.

설치된 패키지 데이터베이스는 보통의 디렉토리로 관리되므로, /var/db/pkg 디렉토리를 보면 설치된 패키지 목록을 볼 수 있다.



빌드가 안될 경우


보통 포트가 빌드 안되는 경우는 다음의 몇가지 원인으로 나누어 볼 수 있다.



  • 포트에서 받아올 소스를 못찾는 경우

    소스를 받아오는 위치는 Makefile에 기록되어 있는데, 이 위치에 파일이 없어지거나 바뀐 경우에는 소스를 받아오지 못하는 경우가 있다. 이런 경우에는 패키지로 설치하거나, 소스가 어디 있는지 찾아보도록 하자. 보통 pkg-descr 파일의 WWW:로 시작하는 부분을 찾아보면 패키지에 대한 홈페이지 등이 나오므로 그곳에서 찾아보는 것이 좋을 것이다. 소스를 찾으면 /usr/ports/distfiles에 넣고 다시 빌드하면 된다.


  • 포트의 에러로 빌드가 안되는 경우

    포트가 온전하지 못한 경우가 종종 있다. 현재의 오픈오피스 포트가 그러한데 이런 경우에는 미리 메시지가 나오거나 하는 경우가 대부분이다. 포트에 문제가 있다면 ports@freebsd.org 메일링 리스트에 보고하도록 하자. 아예 포트가 빌드 못하도록 금지되어 있는 경우도 있는데, 그러한 경우에는 다음과 같은 메시지를 낸다.

    /usr/ports/editors/openoffice# make
    ===> openoffice-6.0.a609 is marked as broken: work in progress -- does not work yet.

    broken이라고 되어 있는 경우는 포트 자체에 문제가 있는 것이다.


  • 일정 조건을 만족하지 못하는 경우

    패키지 중 특정 FreeBSD 버전을 요구하는 경우가 있다. 가령 staroffice52 포트는 FreeBSD 4.1 이후 버전에서만 설치가 된다. 이런 경우에도 마찬가지로 에러 메시지가 나게 되므로 알 수 있다.



위와 같은 문제는 포트를 업그레이드하는 것으로 해결할 수 있는 경우도 있다. 포트 업그레이드 등의 문제에 대해서는 다음에 다루기로 하자.



끝으로


지금까지 포트 시스템에 대한 간단한 설명과 함께 사용법과 주의사항에 대해 알아 보았다. 포트를 잘 사용하기 위해서 알아야 할 사항은 이보다 훨씬 많지만 앞으로 연재에서 시간이 나는대로 계속 설명하도록 하겠다.

포트는 실로 다양한 어플리케이션을 원하는 때에 편리하게 설치할 수 있도록 해 준다. 물론 바이너리 패키지를 설치하는 것도 나름대로 편리하겠지만, 컴파일하는 것을 지켜보고 있노라면 왜인지 믿음이 가는 것이 필자만의 생각은 아니기를 바란다.

포트시스템

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다