PKG_ADD(1)

명칭
pkg_add - 소프트웨어 배포 package 를 인스톨 하는 프로그램

서식
pkg_add [-vInfrRMS] [-t template] [-p prefix] pkg-name [pkg-name ...]

해설
pkg_add 명령은, pkg_create(1) 명령에 의해 작성된 package (역주: FreeBSD 의 package system 에 있어서의 패키지를 가리키는 경우에 이렇게 표기합니다) (을)를 전개하는데 이용됩니다.

경고
pkg_add 명령은 package 파일에 포함되는 스크립트나 프로그램을 실행하는 일이 있으므로, 당신의 시스템은, 위험한 배포 파일을 만드는 극악인으로부터의 “트로이의 목마” (이)나 다른 교묘한 공격등을 받는다 가능성이 있습니다.

package 파일을 제공하는 인물의 능력과 신원을 확인하면(자) 좋을 것입니다. 보다 진행된 안전을 위해서(때문에)는, package 를 전개하는데 -M 플래그를 이용해 그 내용과 스크립트가 시스템에 해를 미지 않는가를 확인합니다. +INSTALL, +POST-INSTALL, +DEINSTALL, +REQUIRE, +POST-INSTALL, +REQUIRE, +MTREE_DIRS 의 각 파일에는 특별히 주위를 기울여, +CONTENTS 파일의 @cwd, @mode (setuid 를 체크), @dirrm, @exec, @unexec 지시문을 조사해 주세요. package 파일을 조사하는데는 pkg_info(1) 명령도 사용할 수 있습니다.

옵션
이하의 명령행 옵션이 제공되고 있습니다:

pkg-name [pkg-name ...]
    지정된 package 가 인스톨 됩니다. - (이)라는 이름이 지정되면(자), pkg_add (은)는 stdin 로부터 읽어들입니다. package 가 커런트 디렉토리에 발견되지 않으면 pkg_add 하 PKG_PATH 그리고 지정된 각 디렉토리를 찾습니다.

-v  요설인 출력으로 전환합니다.

-I  package 에 인스톨용 스크립트 (pre-install 또는 post-install) 하지만 존재해도, 그것을 실행하지 않습니다.

-n  실제로는 인스톨을 실시하지 않고, 인스톨 했을 경우에 실행될 것이다 스텝을 표시합니다.

-R  package 의 인스톨 결과를 기록하지 않습니다. 이 옵션은, 다음에 언인스톨하는 것을 불가능하게 하기 위한(해), 자신이 무엇을 하고 있는지를 이해하고 있는 사람만 사용해 주세요.

-r  리모트 페치 기능을 사용합니다. 적절한 오브젝트 형식과 릴리스를 결정하고 나서, package 를 취득해 인스톨 합니다.

-f  미리 필요한 package 가 인스톨되어 있지 않기도 하고, requirements 스크립트가 실패했을 경우에도 강제적으로 인스톨 합니다. 이것은 pkg_add 하지만 발견되지 않는 필요한 package 를 찾아 자동적으로 인스톨 하는 것을 멈추는 것은 아니고, 발견되지 않는 경우에서도 중단하지 않게 합니다.

-p prefix
    package 로부터 파일을 전개하는 디렉토리의 앞에 prefix (을)를 붙입니다. package 가 디폴트 디렉토리를 보관 유지하고 있는 경우에는, 이 옵션으로 변경할 수 있습니다. pkg_add (은)는 디렉토리 설정이 상대적으로 행해지고 있는지, 절대적으로 행해지고 있을까 (을)를 알 방법이 없기 때문에, 최초의 @cwd 지시문만이 변경되는 것에 주의해 주세요. 여러 차례의 디렉토리 변경을 하는 것은 보기 드뭅니다만, 실제로 있었을 경우, 모든 디렉토리 변경을 제어하고 싶어진다 그렇지. 이 경우, MASTER 모드, SLAVE 모드의 사용을 검토해 보세요 (옵션 -M (와)과 -S (을)를 참조).

-t template
    “작업 area” (을)를 작성할 때에, mktemp(3) 에의 입력으로서 template (을)를 이용합니다. 이것은 디폴트에서는 /var/tmp/instmp.XXXXXX 그렇다고 하는 캐릭터 라인입니다만, /var/tmp 디렉토리의 용량이 제한되고 있는 것 같은 상황에서는 변경할 필요가 있을지도 모릅니다. mktemp(3) 하지만 일의의 ID 를 이용하기 위해서(때문에) 필요한 `X'의 캐릭터를 몇개인가 남겨 둔다 일을 잊지 말아 주세요.

    작업 area template (을)를 package 파일이 인스톨 되는 디렉토리와 같은 디스크 파티션으로 설정하는 것에 의해, 퍼포먼스를 높이는 것이 가능합니다 (대체로는 /usr ).

-M  MASTER 모드로 실행합니다. 이것은 pkg_add 의 매우 특수한 실행 모드이며, SLAVE 모드와 함께 실행하지 않으면 안됩니다. 이 모드로 실행되면(자), pkg_add (은)는 일시적인 작업 area ( -t 옵션을 참조)에 package 를 전개하는 이상는 하지 않고, 현재의 작업 area 디렉토리명을 머리에 부가한 packing list 를 표준 출력에 출력합니다(표준 출력은 sed(1) (와)과 같은 프로그램에 필터 되고 있을지도 모릅니다). SLAVE 모드와 함께 이용하면(자), 내용을 처리하기 전에 package 구조에 큰 변경을 더하는 것이 가능하게 됩니다.

-S  SLAVE 모드로 실행합니다. 이것은 pkg_add 의 매우 특수한 실행 모드이며, MASTER 모드와 함께 실행하지 않으면 안됩니다. 이 모드로 실행되면(자), pkg_add (은)는 package 의 내용이 벌써 작업 area에 전개되어 그 자리소가 표준 입력으로부터 캐릭터 라인으로서 입력되는 것을 상정합니다. 완전한 packing list 도 stdin 로부터 읽혀 그 후 내용이 통상 대로 처리됩니다.

하나 이상의 pkg-name 인수를 지정하는 것이 가능해, 그것들은 package 를 포함한 파일명 (통상 확장자(extension) “.tgz” 그리고 끝납니다)인가, ftp 사이트에 있는 파일을 가리키는 URL 의 어딘가에 됩니다. 따라서, anonymous ftp 로부터 직접 파일을 전개하는 것이 가능합니다 (예를 들면 pkg_add ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/packages/shells/bash-1. 14.7.tgz) 주의: 만약 상기와 같은 전송으로 이용하는 ftp 로 passive mode (을)를 이용하고 싶으면, 환경 변수 FTP_PASSIVE_MODE 에 어떠한 값을 설정할 필요가 있습니다. 그렇지 않으면, 보다 일반적인 ACTIVE 모드가 이용됩니다. 만약 잘 동작하고 있는 것을 알 수 있고 있는 사이트로부터 package 를 얻으려고 pkg_add 하지만 항상 실패하는 경우, 당신이 passive mode 의 ftp 를 사용할 필요가 있는 파이어 월(fire wall)가운데에 있는 것이 원인인 경우가 있습니다.

기술 상세
pkg_add 유틸리티는 극히 단순합니다. 각 package 의 "packing list" 를 특별한 작업 디렉토리에 전개해, 내용을 해석해, 내용을 완전하게 전개하기 위해서 이하의 순서를 실행합니다:

1.  package 가 벌써 인스톨 되고 있다, 라고 기록되고 있는지 어떤지를 체크합니다. 만약 그러면 인스톨을 중단합니다.

2.  @pkgdep 지시문 ( pkg_create(1) (을)를 참조)에 의한다 package 의 모든 의존관계(dependencies)를 체크해, 각각이 존재하는지 어떤지를 확인합니다. 만약 존재하지 않으면, 부족한 package 를 찾아내 자동적으로 인스톨 하려고 합니다. 만약 발견되지 않으면, 인스톨을 중단합니다.

3.  package 가 어떻게 시스템에 추가되는지를 제어한다 @option 지시문을 검색합니다. 이 메뉴얼 페이지를 쓰고 있는 시점에서는, 실장되고 있는 옵션은 @option extract-in-place 뿐여, 이것은 /tmp 안의 작업 area를 경유하지 않고, package 를 최종적인 디렉토리에 직접 전개하도록(듯이) 합니다.

4.  @option extract-in-place 하지만 지정되어 있으면, package 는 최종적인 장소에 직접 전개되어 그렇지 않으면 작업 영역내에 전개됩니다.

5.  package 가 require 파일 ( pkg_create(1) (을)를 참조)를 포함하고 있는 경우, 그 파일을 이하의 인수를 붙여 실행합니다:
    pkg-name INSTALL

    여기서 pkg-name (은)는 문제로 하고 있는 package 의 이름이며, INSTALL 키워드는 인스톨의 requirements 체크인 것을 가리키고 있습니다 (이것은 복수의 기능을 제공하는 하나의 스크립트를 이용하려고 하는 경우에 유용합니다).

6.  package 에 pre-install 스크립트가 존재하는 경우, 이하의 인수를 붙여 실행됩니다:
    script pkg-name PRE-INSTALL

    여기서 pkg-name (은)는 대상의 package 명이며, PRE-INSTALL (은)는 이것이 인스톨전의 국면인 것을 나타내는 키워드입니다.

    주: ( -i 및 -I 의 플래그를 pkg_create(1) 에 사용하는 것으로써) package 작성시에 pre-install 과 post-install 의 스크립트가 따로 따로 주어지는 경우에는, PRE-INSTALL 키워드는 등장하지 않습니다.

7.  @option extract-in-place 하지만 지정되어 있지 않은 경우, packing list ( +CONTENTS 파일)이 작업 area로부터 최종적인 장소에 파일을 이동 (필요하면 카피)하기 위해서 참조됩니다.

8.  package 가 mtreefile 파일 ( pkg_create(1) (을)를 참조)를 포함한 경우, mtree 가 이하의 인수를 붙여 실행됩니다:
    mtree -u -f mtreefile -d -e -p prefix

    여기서 prefix 하 -p 플래그가 지정되어 있으면 그 prefix, -p 플래그가 지정되어 있지 않은 경우에는 이 package 의 최초의 @cwd 지시문의 디렉토리명이 prefix 가 됩니다.

9.  package 에 post-install 스크립트가 포함되는 경우,
    script pkg-name POST-INSTALL

    (으)로서 실행됩니다. 여기서 pkg-name (은)는 대상의 package 명이며, POST-INSTALL (은)는 이것이 인스톨 후의 국면인 것을 나타내는 키워드입니다.

    주: ( -i 및 -I 의 플래그를 pkg_create(1) 에 사용하는 것으로써) package 작성시에 pre-install 과 post-install 의 스크립트가 따로 따로 주어지는 경우에는, POST-INSTALL 키워드는 등장하지 않습니다.

    POST-INSTALL 및 PRE-INSTALL 의 키워드를 건네주는 배경에는, “인스톨의 전과 인스톨 후의 양쪽 모두” 의 수속을 해내는 하나의 install 스크립트를 이용하는 것을 가능하게 하는 일이 있습니다. 그렇지만, 메인트넌스의 관점으로부터는, 기능을 분리하는 (분)편이 유리하고 용이합니다.

10. 인스톨이 종료하면(자), 다음에 pkg_delete(1) 그리고 사용하기 위해서(때문에) packing list, deinstall 스크립트, description, display 의 각 파일이 /var/db/pkg/<pkg-name> 에 카피됩니다. package 의 의존관계(dependencies)는, 다른 package 의 /var/db/pkg/<other-pkg>/+REQUIRED_BY 파일 (PKG_DBDIR 환경 변수가 설정해 두는 경우, 상기의 /var/db/pkg/ 하지만 옮겨놓을 수 있습니다)에 기록됩니다.

11. 마지막으로, 작업 area가 삭제되고 프로그램은 종료합니다.

모든 스크립트는 환경 변수 PKG_PREFIX 에 인스톨시의 prefix ( 전술의 -p 옵션을 참조)가 설정된 상태로 실행됩니다. 이것에 의해, package 의 저자는 pkg_add 의 -p 플래그에 의해 package 가 인스톨 되는 디렉토리가 변경되어도, 제대로 대접하는 스크립트를 쓰는 것이 가능하게 됩니다.

환경 변수
PKG_PATH 의 값은, 지정된 package 가 발견되지 않을 때에 이용됩니다. 환경 변수는 코론으로 단락지어진 일련의 엔트리입니다. 각 엔트리는 디렉토리명으로부터 됩니다. 커런트 디렉토리는 공난의 디렉토리명으로 암묵중으로 지정되는지, 하나의 피리어드로 명시적으로 지정합니다.

환경 변수 PKG_DBDIR (은)는, 인스톨 된 package 에 대한 데이타베이스의 위치를 지정합니다.

pkg_add 하지만 작업 area의 생성을 시도하는 작업용 디렉토리의 이름은, 환경 변수 PKG_TMPDIR (와)과 TMPDIR (이)라든지들 (이 순서로) 놓칩니다. 이러한 변수가 존재하지 않는지, 지정된 디렉토리에 충분한 빈 용량이 없는 경우, pkg_add (은)는, /var/tmp, /tmp, /usr/tmp 중에서, 충분한 빈 용량을 가지는 최초의 디렉토리를 사용합니다.

환경 변수 PACKAGEROOT (은)는, pkg_add 하지만 취득을 실시하는 대체 위치를 지정합니다. 취득에 사용하는 URL 는, 본환경 변수와 -r 옵션 사용시에 pkg_add 하지만 자동적으로 디렉토리를 결정하는 논리로, 구축됩니다. 설정예는 "ftp://ftp3.FreeBSD.org" 입니다.

환경 변수 PACKAGESITE (은)는, pkg_add 하지만 취득을 실시하는 대체 위치를 지정합니다. 이 변수를 사용하면(자), -r 옵션 사용시에 pkg_add 하지만 자동적으로 디렉토리를 결정하는 논리가 파괴됩니다. 따라서, 이것은 리모트 패키지 파일에의 완전한 URL 인 것이 필요합니다.

관련 파일
/var/tmp
    환경 변수 PKG_TMPDIR (와)과 TMPDIR 의 어느쪽이나 적절한 디렉토리를 지정하지 않는 경우에, 작업 area를 작성하기 위해(때문에) 에 이용하는 작업용 디렉토리.
/tmp
    /var/tmp 하지만 존재하지 않는지, 충분한 빈 용량을 가지지 않는 경우, 그 다음으로 선택된다 디렉토리.
/usr/tmp
    /var/tmp (와)과 /tmp 의 어느쪽이나 작업 area를 작성하기에는 적절하지 않은 경우, 마지막에 선택된다 디렉토리.
/var/db/pkg
    인스톨 된 package 에 대한 데이타베이스의 디폴트의 위치.

관련 항목
pkg_create(1), pkg_delete(1), pkg_info(1), pkg_update(1), pkg_version(1), mktemp(3), sysconf(3), mtree(8)

저자
Jordan Hubbard

협력자
John Kohl <jtk@rational.com>

버그
배포물의 파일간의 하드 링크는, (1) 작업 area가, 파일에의 모든 링크의 최종적인 디렉토리와 같은 파일 시스템의 경우 혹은, (2) 파일에의 모든 링크가 contents 파일내에서 @cwd 지시문으로 괄라고 있는 경우에게만 보존됩니다. 한층 더 게다가, 링크명은 단일의 tar 명령 ( sysconf(_SC_ARG_MAX) 에 의해 돌려주어지는 값에 의존하는 실행시의 인수의 길이의 제한에 의해, 복수의 실행에는 분할할 수 없습니다)로 전개되지 않으면 안됩니다.

버그는 그 밖에도 있을 것입니다.