CHROOT(2)

명칭
chroot - 루트 디렉토리를 변경한다

프로그램 라이브러리
libc

서식
<unistd.h> int chroot(const char *dirname)

해설
dirname (은)는, ASCII 의 눌 캐릭터로 종료하는 디렉토리의 패스명의 주소입니다. chroot() (은)는, dirname (을)를 루트 디렉토리, 즉, ‘/’ 그리고 개시하는 패스명의 패스 검색의 개시점으로 합니다.

디렉토리가 루트 디렉토리가 되기 위해서(때문에)는, 프로세스에 그 디렉토리에의 실행 (검색) 허가가 없으면 안됩니다.

chroot() (은)는 프로세스의 현재의 디렉토리에 영향을 주지 않는 것에 주의할 필요가 있습니다.

이 함수를 호출할 수 있는 것은 슈퍼 유저만입니다.

디렉토리를 참조하는 오픈 파일 기술자가 존재하는 경우, chroot() 호출은 sysctl 변수 ‘kern.chroot_allow_open_directories’ 의 설정에 따라, 다음과 같이 실패합니다:

‘kern.chroot_allow_open_directories’ 하지만 0 으로 설정되어 있는 경우, 디렉토리가 오픈되고 있으면 chroot() (은)는 항상 EPERM 그리고 실패합니다.

‘kern.chroot_allow_open_directories’ 하지만 1 에 세트 되고 있는 경우 (디폴트), 디렉토리가 오픈되고 있어, 그 프로세스가 chroot() 호출의 영향을 받는 경우, EPERM 그리고 실패합니다.

‘kern.chroot_allow_open_directories’ 하지만 다른 값의 경우, 오픈 디렉토리의 체크는 되지 않습니다.

정상적으로 완료하면(자), 값 0 이 돌려주어집니다. 그렇지 않은 경우는, 값 -1 이 돌려주어 에러를 나타내기 위해서(때문에) errno 하지만 설정됩니다.

에러
chroot() (은)는, 다음의 경우, 처리에 실패해, 루트 디렉토리는 변경되지 않습니다.

[ENOTDIR]
    패스의 원가요소중에 디렉토리 이외의 것이 포함되어 있습니다.

[EPERM]
    실효 유저 ID 가 슈퍼 유저가 아닙니다. 또는 디렉토리가 1 개(살) 이상의 파일 기술자에 의해 오픈되고 있습니다.

[ENAMETOOLONG]
    패스명의 원가요소가 255 캐릭터를 넘고 있는지, 또는 패스명 전체가 1023 캐릭터를 넘고 있습니다.

[ENOENT]
    지정의 디렉토리가 존재하지 않습니다.

[EACCES]
    지정된 패스에는, 검색이 허가되어 있지 않은 디렉토리가 포함되어 있습니다.

[ELOOP]
    패스명을 변환할 경우에 검출된 기호 연결이 너무 많습니다.

[EFAULT]
    path (은)는, 프로세스에 할당할 수 있었던 address 공간의 범위외를 가리키고 있습니다.

[EIO]
    파일 시스템에 읽고 쓰기하고 있는 동안에 입출력 에러가 발생했습니다.

관련 항목
chdir(2), jail(2)

역사
chroot() 함수는 4.2BSD 그리고 등장했습니다.