Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

chroot(2)

1장. chroot(2)

차례
1.1. 사용법
1.2. 설명
1.3. 반환값
1.4. 에러
1.5. 예제
1.6. 참고문헌

루트 디렉토리를 변경한다.


1.1. 사용법

#include <unistd.h>

int chroot(const char *path);
		


1.2. 설명

chroot()는 path가 지정한 곳으로 루트 디렉토리를 변경한다. 디렉토리는 "/"로 시작하는 절대경로 이름을 사용한다. 설정된 루트디렉토리는 현재 프로세스의 모든 자식 프로세스에게 상속된다.

단지 슈퍼유저만이 루트 디렉토리를 변경할 수 있다.

이 시스템 콜은 현재 작업 디렉토리를 바꾸지는 않는다. 그래서 "."은 "/"로 지정된 루트 트리 밖의 위치가 될 수도 있다.


1.3. 반환값

성공시 0이 리턴되고, 에러가 발생하면 -1이 리턴된다.


1.4. 에러

EPERM

유효 UID가 0이 아니다.

EFAULT

path가 접근할 수 없는 메모리 영역을 가리키고 있다.

ENAMETOOLONG

path가 너무 길다.

ENOENT

파일이 존재하지 않는다.

ENOMEM

커널 메모리가 충분하지 않다.

ENOTDIR

path가 디렉토리가 아니다.

EACCESS

허가가 거부되었다.

ELOOP

path를 찾아가기 위해 너무 많은 심볼릭 링크가 존재한다.

EIO

I/O 에러가 발생했다.


1.5. 예제

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()
{
    int pid;

    if (chroot("/home/mydir") != 0)
    {
        perror("chroot");
        exit(0);
    }
    if (execl("/bin/bash","bash", NULL) == -1) 
    {
        perror("error");
    }
}
		
위 코드를 컴파일 후 실행 시키면 /home/mydir가 루트(/)디렉토리가 되고 bash가 실행된다. 루트 디렉토리가 바켰으므로 /home/mydir/bin 밑에 bash쉘이 있어야 한다. 또한 bash를 실행시키기 위한 기본적인 라이브러리도 있어야 하는데 ldd 를 통해서 bash를 실행시키기 위해 필요한 라이브러리의 목록을 알아낼 수 있다. /home/mydir/lib 디렉토리 밑에 필요한 라이브러리를 복사한다음 위 프로그램을 실행하도록 하자.


1.6. 참고문헌

  1. chdir(2)

  • DeleteMe: 실제 chroot에서는 "/bin/bash"를 직접 실행하지 않고 "/bin/sh"를 실행하도록 유도되는게 맞다고 생각합니다. [yundream]님 확인부탁드려요. - [minzkn]
    • 네 이거 완성 메뉴얼이 아닙니다. 이상하게 제꺼 리눅스에서는 테스트가 안되어서요.. 버그인지 먼지는 모르겠는데.. "/bin/bash"를 자꾸 못찾는다고.. 물론 /bin/sh로 도 해봤구요.. 근데.. 다른 분은 테스트가 제대로 된다고 하고 -.-;. 아무래도 다른 테스트 되는 분이 확인을 해줘야 할것 같다는 [minzkn]님이 해주실 려나 히힛.. [minzkn] 님은 저 예제 제대로 실행 되나요 ? 놓치고 있는 무언가가 있는건지 :-?
    • 기본적으로 /home/mydir/bin/sh 또는 /home/mydir/bin/bash 가 있어야 겠지요. yundream님 복사하시고 하신거죠? 그리고 만약 복사를 하지 않아도 되도록 하려면 chroot 진입전에 해당 실행파일 이미지를 읽어놓고 chroot 진입하여 실행이미지를 임의의 위치에 저장하고 실행해야 겠네요. 그리고 /bin/sh 의 의미는 자신의 shell이 어떤것이라고 알리는 link 이고요. 때문에 정확히 yundream님의 예제 코드를 테스트해보기 위해서는 /usr/mydir/bin/bash 가 있어야 하고 /usr/mydir/bin/sh 는 ./bash 로 링크가 걸려있어야 하고요. 또한 chroot 함수는 root 유저만이 권한을 갖는 특권 명령이므로 root 유저로 실행해야 하겠고요. 그리고 chroot 실행후에 chdir("/") 함수가 호출되는게 좋다는 생각이 드네요.
      환경 적용전에 확인...
      /home/mydir/bin/bash
      /home/mydir/bin/sh -> ./bash
      /home/mydir/lib/libtermcap.so.2
      /home/mydir/lib/libdl.so.2
      /home/mydir/lib/libc.so.6
      /home/mydir/lib/ld-linux.so.2
    • 허거거거거걱.. libc와 ld-linux를 복사하지 않았네요 -.-; 마저 복사하고 나서 테스트 하니까 잘되네요 T.T - [yundream]