Port와 PKG

This entry is part 18 of 48 in the series FreeNAS 서버 만들기
FreeNAS 의 호스트에서는 pkg 와 port 명령어를 사용해서는 안됩니다!
FreeNAS 는 어플라이언스로서 Host 에는 어떠한 변경도 가해선 안됩니다. 제 3자 소프트웨어 설치는 반드시 jail 내에서 이루어져야 합니다.
호스트를 변경하는 것은 다루지 않을 것이며, 그로 인해 생길 수 있는 문제에 대해선 책임지지 않습니다

PKG 와 Port?

pkgPort 는 FreeBSD 에서 프로그램을 설치하고 관리하기 위한 소프트웨어입니다. 데비안 계열 리눅스를 만져 봤다면 알고 있을 apt 와 같습니다.

하지만 FreeBSD 의 port 와 pkg 는 리눅스 진영의 것과는 좀 다릅니다.

port는 다른 플랫폼에 프로그램을 이식하는 porting 에서 따온 말입니다. FreeBSD 와 같은 BSD 는 리눅스 계열처럼 커널만 개발하는 것이 아니라 설치되는 프로그램 또한 관리합니다.

이렇게 관리된 프로그램들을 port 나 pkg 를 통해 설치하고 관리할 수 있는데, 몇 가지 차이점이 있습니다.

  • port 는 소프트웨어 설치시 소스를 받아와 컴파일을 하여 설치합니다.
    • 옵션을 지정해서 설치할 수 있습니다.
      예를 들어 Nginx 를 설치할 때, modsecurity3 라는 제 3자 모듈을 함께 컴파일해 Nginx 가 modsecurity3 를 지원하게 할 수 있습니다.
      이러한 설정은 컴파일 시, 또는 컴파일 전에 대화창으로 쉽게 설정이 가능하며, 설정은 저장되기 때문에 이후 설치나 업데이트 시에도 유지됩니다. 물론, 옵션을 지정하지 않고 기본값으로 설치도 가능합니다.
    • 업데이트가 쉽습니다.
      컴파일 옵션 등이 모두 저장되기 때문에 이후 업데이트 시에도 같은 옵션으로 컴파일 할 수 있습니다. 그래서 간단한 명령어로 업데이트가 가능합니다.
    • 라이센스 문제 등으로 패키지에 없는 프로그램도 설치할 수 있습니다.
      예를 들어, oracle 자바는 개인 사용 용도로만  사용할 수 있도록 제한되어 있습니다. 그래서 pkg 로는 설치할 수 없지만, porttree 에는 linux-oracle-jdk8 과 같은 port가 있습니다.
    • 설치가 느립니다.
      설치와 업데이트 과정에서 소스 파일을 다운로드 받고 컴파일을 해서 설치해야 함으로 서버에 부하가 걸리며, 설치 속도가 느립니다.
  • pkg 는 미리 컴파일 된 바이너리 파일을 설치합니다.
    • 옵션을 지정해서 설치할 수 없습니다.
      ‘기본 컴파일 옵션’ 으로 컴파일 된 바이너리 파일들을 내려받아 설치하는 것이기 때문에 옵션을 지정할 수 없습니다.
    • 업데이트가 간단합니다. 명령어 한번에 업데이트가 가능합니다.
    • 모든 프로그램은 패키지로 설치할 수 있는 것은 아닙니다.
      라이센스 문제 등으로 패키지로 설치할 수 없는 프로그램도 존재합니다.
    • 설치가 빠릅니다.
      바이너리 파일을 내려받아 설치하는 것이기 때문에 부하가 거의 걸리지 않으며 설치 속도가 빠릅니다.

FreeBSD 는 컴파일 설치와 바이너리 설치를 둘 다 지원합니다.

PKG 사용법

pkg 는 pkg 라는 명령을 통해서 사용 할 수 있습니다. 자주 사용되는 명령어만 알아보도록 하겠습니다.

pkg update : 레포를 새로고침합니다.

pkg upgrade : 설치한 패키지를 업데이트합니다.

pkg search “name” : “name” 을 레포에서 검색합니다.

pkg install name : name 패키지를 설치합니다.

pkg info name : 설치한 name 패키지에 대한 정보를 봅니다.

pkg remove name : 설치한 name 패키지를 제거합니다.

FreeBSD 특성상 해당 패키지의 종속성은 지워 주지 않기 때문에 일일히 지우거나, 아래 autoremove 명령어를 사용해 종속성을 전부 삭제해야 합니다. 가장 좋은 방법은 설치할 때 어떤 패키지를 설치하였는지 기록해두거나, 스냅샷을 찍어 뒀다가 롤백하는 것입니다.

pkg autoremove : 의존성을 모조리 삭제합니다. 필요하고 아니고를 구분하지 않고 그냥 다 날려 버리기 때문에 주의해서 사용하여야 합니다.

pkg lock name : name 패키지를 잠급니다. name 은 pkg upgrade 명령을 사용해도 업데이트 되지 않습니다.

pkg unlock name : name 패키지의 잠금을 해제합니다.

PKG 처음 사용시

pkg 명령어를 처음 사용할 경우 아래와 같은 출력이 나타날 수 있습니다.

The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]:

이는 pkg 가 설치되어 있지 않을때 나타나는 메세지입니다. 그래서 pkg 를 설치할 것이냐 묻는 것인데, y 를 눌러 주면 pkg 가 설치됩니다.

PKG 레포 바꾸기

FreeBSD 의 레포는 여러 버전이 있습니다. 기본 레포는 quarterly 인데, 긴급 업데이트가 필요하지 않은 한 1년에 4번 (각 분기 마다) 업데이트 됩니다. 검증된 레포이기 때문에 안정적이긴 하나, 업데이트가 느리다는 문제점이 있습니다.

기본 레포를 그대로 사용해도 되긴 하지만, 레포를 바꿀 수도 있습니다.

FreeBSD 의 기본 레포는 /etc/pkg/FreeBSD.conf 에 저장되어 있습니다. 하지만 이것을 수정하는 것은 권장하지 않습니다.

대신 새로운 레포 파일을 만들어 그것을 기본으로 사용하게 지정할 수 있습니다.

mkdir -p /usr/local/etc/pkg/repos
vi /usr/local/etc/pkg/repos/FreeBSD.conf

/usr/local/etc/pkg/repos 디렉토리를 만들고 FreeBSD.conf 라는 레포 설정 파일을 작성합니다.

FreeBSD: {
 url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
 enabled: yes 
}

위 설정을 작성할 시, 레포가 최신 (latest) 으로 변경됩니다. latest 레포는 업데이트 사항이 있을 때 마다 갱신됩니다.

Port 사용법

port는 pkg 에 비해 사용법이 조금 더 복잡합니다.

portsnap

port tree를 관리하는 명령어입니다.

port tree는 port의 목록입니다. /usr/ports 아래에 저장되는데, /usr/ports/www/nginx 와 같이 트리 형태를 지녀서 port tree라 합니다.

portsnap auto : portsnap fetch, portsnap extract, portsnap update 를 합한 것으로, port tree를 받아와 압축을 해제하고 port tree를 업데이트 합니다.

여담으로, 위 명령어를 실행할 시 아래와 같은 출력이 ‘엄청 많이’ 나옵니다.

(...)
/usr/ports/www/p5-RT-Extension-SLA/
/usr/ports/www/p5-RTx-Calendar/
/usr/ports/www/p5-Reaction/
/usr/ports/www/p5-Reddit-Client/
/usr/ports/www/p5-Reddit/
/usr/ports/www/p5-Role-REST-Client/
/usr/ports/www/p5-Rose-HTML-Objects/
/usr/ports/www/p5-Router-Boom/
/usr/ports/www/p5-Router-Simple-Sinatraish/
/usr/ports/www/p5-Router-Simple/
(...)

이는 받아온 porttree 의 압축을 해제함으로서 나오는 출력입니다. 좀 ‘조용하게’ 하는 옵션이 있을 만도 한데 안보이네요.

port 검색

pkg search -o “PortName”

pkg 명령을 통해 “PortName” port 를 찾습니다. 보통 이 명령어를 많이 사용합니다. pkg search -o nano 를 검색했을 때, editors/nano 라는 결과가 나온다면, nano 의 포트 위치는 /usr/ports/editors/nano 입니다.

find /usr/ports -name “PortName”

find 명령어를 이용해 port tree 가 저장된 디렉토리 에서 PortName 이라는 port를 찾습니다.

make

port 로 프로그램을 설치할 때 사용되는 명령어입니다. 설치하고자 하는 port 디렉토리에서 사용하여야 합니다.

make config : 컴파일을 하기 전에 컴파일 옵션을 설정합니다.

make config-recursive : 컴파일을 하기 전에 컴파일 옵션을 해당 port 의 종속성 port 도 재귀적으로 설정합니다. 예를 들어, py36-Fail2Ban 을 port 로 설치할 시 Fail2Ban 이라는 port 의 컴파일 옵션과 python3.6 의 컴파일 옵션을 설정합니다.

make fetch : port 의 소스 파일을 다운로드 받습니다.

make install : port를 설치합니다. 만약 소스코드가 다운로드 되어 있지 않다면 다운로드도 같이 수행합니다.

make clean : port 를 설치하는 과정에서 생긴 소스 파일이나 임시 파일 등을 정리합니다.

make install clean : 소스 파일을 다운로드하고 port 를 설치한 후 임시 파일 등을 정리합니다.

portupgrade

portupgrade : portupgrade 라는 소프트웨어를 사용하여 port를 쉽게 업데이트 할 수 있습니다. 기본 소프트웨어가 아니기 때문에 port나 pkg를 이용해 설치하여야 합니다.

portupgrade PortName : PortName 을 port를 통해 업데이트 합니다.

portupgrade -R PortName : PortName 을 종속성까지 포함해 port 를 통해 업데이트 합니다.

시리즈 네비게이션<< CloudflareNginx WAF 리버스 프록시 – 개념 설명과 환경 구성 >>

답글 남기기

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