다음 이전 차례

5. 루트 장치 바꾸기

linuxrc 가 자신의 할일을 끝내면, 루트 장치를를 변경하여, "진짜" 루트 장치에서 리눅스 시스템을 시작함으로써 계속 진행시킨다.

그 과정은 다음의 과정을 포함한다.

새로운 루트 파일 시스템을 마운트 하는 것은 쉽다: 단지 현재의 루트 아래의 디렉토리에 마운트만 되면 된다. 예를 들면:

# mkdir /new-root

# mount -o ro /dev/hda1 /new-root

루트 변경은 pivot_root 시스템 콜을 이용하여 이뤄진다. 이 시스템 콜은 pivot_root 유틸리티 ( pivot_root(8) 맨 페이지를 참조; pivot_root 는 util-linux 버전 2.10h 이상으로 배포된다 [3]) 를 통해서도 사용할 수 있다. pivot_root 는 현재의 루트를 새로운 루트 아래의 디렉토리로 변경하고, 새로운 루트를 그 자리에 위치시킨다. 이전의 루트를 위한 디렉토리는 pivot_root 를 호출하기 전에 존재해야 한다. 예를 들면:

# cd /new-root

# mkdir initrd

# pivot_root . initrd

이제 linuxrc 프로세스는 여전히 이전의 루트를 접근할 지도 모르는데, 이 경로는 실행 파일, 공유 라이브러리, 표준 입력/출력/에러, 그리고 그것의 현재 루트 디렉토리이다. 이러한 모든 참조는 다음의 명령을 이용해 제거된다.

# exec chroot . what-follows <dev/console >dev/console 2>&1

what-follow 는 새로운 루트 아래에 있는 프로그램이다. 예를 들면 /sbin/init 만약 새로운 루트 파일 시스템이 devfs 와 함께 이용될 것이고 유효한 /dev 디렉토리를 갖고 있지 않다면, devfs 는 /dev/console 을 제공하기 위해 chroot 가 불려지기 전에 마운트 되어야 한다.

주의: pivot_root 에 대한 자세한 구현 내용은 시간에 따라 바뀔수 있다. 호환성을 확실하게 하기 위해, 다음의 요소들이 관찰되어야 한다.

이제, initrd 는 언마운트되어 RAM 디스크에 할당된 메모리가 해제될 수 있다.

# umount /initrd

# blockdev --flushbufs /dev/ram0 # devfs 를 사용할 경우

NFS 마운트된 루트에 initrd 를 사용할 수도 있으며, 자세한 사항은 pivot_root(8) 맨 페이지를 참조하라.

주의: 만약 linuxrc 나 그로부터 exec 되는 어떤 프로그램이든지 어떤 이유에서 종료되면, 구식의 change_root 메커니즘이 불려진다("구식 구트 변경 메커니즘" 항목을 참조).


다음 이전 차례