NFS를 통한 루트 파일 시스템 마운트하기(nfsroot)
NFS를 통한 루트 파일 시스템 마운트하기(nfsroot)
1996-1997
차현진
xunil@linuxfan.com
1999년 6월
만약에 X-터미널이나 프린터 서버같이 디스크 없는 시스템을 쓰려고 한다면 루트 파일 시스템을 디스크가 아닌 곳에 설정을 해야한다. 램디스크에다가 할 수도 있고 NFS를 통해서 할 수도 있다. 이 문서는 루트 파일 시스템을 위한 NFS를 어떻게 쓰는가에 대한 것이다. 앞으로 "클라이언트"라 함은 디스크 없는 시스템을 말하는 것이고, "서버"라 함은 NFS 서버를 말하는 것이다.
nfsroot를 쓰기 위해서는 커널 설정에서 NFS를 지원하도록 해야한다. 여기서
NFS는 모듈로 설정하면 안 된다는 것을 명심하라. 설정 스크립트는 다음으로
nfsroot를 쓸 것인지를 물을 것이고, 쓸 것이라고 한다면 어떤 자동 설정
시스템을 쓸 것인지를 물을 것이다. BOOTP나 RARP 모두 안전하다.
커널이 부트 로더(loadlin, LILO, 네트워트 부트 프로그램같은것들)에 의해
로딩이 되면 어떤 루트 파일 시스템 디바이스를 쓰는지, 서버를 어디서 찾을지,
서버에 루트로 마운트될 디렉토리의 이름은 무엇인지를 알아야 한다. 이것들은
커널 명령어 라인 파라미터들로 해결될 수가 있다.
root=/dev/nfs
이것은 가상 NFS 디바이스를 활성화 시키기 위해서 필요하다. 주의할 것은
이것은 진짜 디바이스가 아나라 단지 커널에게 진짜 디바이스 대신 NFS를
쓰라고 말해주는 것에 불과하다는 것이다.
nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
만약에 nsfroot 파라미터가 넘겨지지 않는다면 디폴트로 "/tftpboot/%s" 가
쓰일 것이다.
<server-ip> NFS 서버의 IP 주소를 알려준다.
이것이 없다면 밑에서 설명할 ip 변수에 의한 설정값이 쓰일 것이다.
이 파라미터는 RARP와 NFS를 위한 다른 서버를 쓰는 것을
허용하는 예에서 쓰인다.
<root-dir> 서버측에 루트로 마운트할 디렉토리의 이름. 여기에 "%s"가 들어가
있다면 %s는 클라이언트 IP 주소의 아스키 형태로 바뀔것이다.
<nfs-options> 기본적인 NFS 옵션들. 모든 옵션은 콤마로 구분된다. 옵션 필드가
비어 있다면 다음의 기본값이 쓰일 것이다.
port = 서버 포트맵 데몬에 의해 주어진 값
rsize = 1024
wsize = 1024
timeo = 7
retrans = 3
acregmin= 3
acregmax= 60
acdirmin= 30
acdirmax= 60
flags = hard, nointr, noposix, cto, ac
ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>
이 파라미터는 커널에게 디바이스의 IP 주소나 IP 라우팅 테이블을 어떻게 설치할
것인가를 알려준다. 이 부분은 원래 "nfsaddrs"라고 불렸으나 지금은 부트 시의
IP 설정은 NFS와는 상관없이 이루어지기 때문에 "ip"라고 바뀌었으며 옛날 이름은
호환성을 위해 alias로 남아 있다.
이 파라미터가 커널 명령어 라인에서 빠져 있다면, 모든 필드는 비었다고 가정하고,
다음에 설명할 기본값이 적용된다. 일반적으로 커널은 모든것을 RARP와
BOOTP(커널 설정시 어떤것이 세팅되었나에 달려있다.)를 이용한다는 것을 의미한다.
<client-ip> 클라이언트의 IP 주소. 만약 비었다면 RARP나 BOOTP에 의해
결정된다. 어떤 프로토콜이 쓰일 것인지는 커널 설정시 결정한
것이나 <autoconf> 파라미터에 달려있다. 비어있지 않다면
RARP나 BOOTP는 쓰이지 않는다.
<server-ip> NFS 서버의 IP 주소. 만약에 RARP가 클라이언트의 주소를 결정
했고 이 파라미터가 비어있지 않다면 오직 여기서 정한 서버만이
받아들여진다. RARP서버와 NFS서버를 다르게 하려면 RARP 서버를
여기에 써라.(혹은 빈칸으로 남겨놓던지), 그리고 NFS 서버를
"nfsroot"파라미터에 정해주면 된다. 만약 여기가 비어 있다면
RARP나 BOOTP에 응답한 서버가 NFS서버로 쓰일 것이다.
<gw-ip> 서버가 다른 서브넷에 있을때의 게이트웨이의 IP 주소.
여기가 비어 있다면 게이트 웨이는 쓰이지 않고 서버가 로컬
네트워크에 있다고 가정하거나 BOOTP가 알려준 값을 쓴다.
<netmask> 로컬 네트워크 인터페이스에 대한 넷마스크.
비어 있다면 클라이언트 IP 주소에서 추측을 한 값이 넷마스크로
쓰인다. 아님 BOOTP 응답으로 설정되거나.
<hostname> 클라이언트의 이름. 비었다면 클라이언트의 IP 주소는 아스키
표현으로 쓰이거나 BOOTP에 의한 값이 쓰인다.
<device> 쓸 네트워크 디바이스의 이름. 비었다면 RARP나 BOOTP 요청에 대해
모든 디바이스가 쓰이고 먼저 응답받은 것이 설정된다. 하나의
디바이스만 있다면 여기를 빈칸으로 남겨두어도 좋다.
<autoconf> 자동설정에 대한 방법. 여기서 설정한 RARP나 BOOTP가 쓰인다.
둘다 설정하거나 비워둔다면 커널 설정시 결정한 프로토콜이 쓰인다.
"off"는 자동설정을 안 쓴다는 것이다.
<autoconf>파라미터는 자동설정이 쓰일 때 "ip" 파라미터에 ':'없이
단독으로 쓰일 수 있다.
커널을 메모리로 올릴때 여러 방법이 쓰일 수 있는데 어떤 기능이 가능한가에
달려 있다.
항상 하던데로 dd를 써서 커널을 플로피에 쓸 수가 있다. 하지만 커널 명령어
라인을 쓸 수는 없다. 그래서, "root="파라미터를 대체하기 위해서 mknod를
이용해 메이저 넘버 0, 마이너 넘버 255짜리 더미 디바이스를 만들어야한다.
mknod /dev/boot255 c 0 255
다음에 커널, zImage 파일을 dd로 플로피에 복사해라.
dd if=/usr/src/linux/arch/i386/boot/zImage of=/dev/fd0
그리고 마지막으로 rdev를 써서 루트 디바이스를 설정해줘라.
rdev /dev/fd0 /dev/boot255
여기에 맞는 진짜 디바이스는 없기 때문에 /dev/boot255 를 지워도 된다.
다른 두개의 커널 명령어 파라미터는 rdev로 바꿀 수가 없기 때문에
RARP나 BOOTP를 쓰는 기본적인 값들이 쓰일 것이다. 만약에 RARP를 통해
응답을 받았다면 /tftpboot/<client-ip>/ 가 루트 디렉토리로
마운트될 것이고, BOOTP를 통해 응답을 받았다면 응답에 포함되어
있는 디렉토리 이름이 루트로 마운트 될것이다.
리로를 쓴다면 리로의 설정파일에서 "append="란 명령으로 필요한
모든 파라미터들을 지정할 수 있다. "root=" 명령을 쓰기 위해서는
3.1에서 설명했던 것처럼 역시 더미 디바이스를 만들어야 한다.
리로와 "append=" 명령을 쓰는 것에 대한 사항은 리로 문서를 참조하라.
자신의 하드 디스크없이 루트로 마운트하기 위해 도스 프롬프트에서
부팅을 하려고 한다면 로드린을 쓸면 된다. 이 방법이 동작한다는
얘기는 들었지만 내가 직접해보지는 않았다. 보통 리로에서 쓰는
방법처럼 커널 명령어 라인을 쓸 수가 있을 것이다. 더 알려면 로드린
문서를 참조하라.
이 방법은 디스크 없는 클라이언트를 부팅시키는 가장 세련된 방법일
것이다. 부트롬을 쓰는 방법은 TFTP 프로토콜을 써서 커널을
로딩한다. 내가 아는 한도내에서 아직 네트워크를 통한 리눅스 부팅을
지원하는 상업적인 부트롬은 없지만 sunsite.unc.edu와 미러 사이트에
공개적으로 구현된 두개의 부트롬이 있는데 "netboot-nfs"와
"etherboot"라고 한다. 둘 다는 디스크 없는 리눅스 클라이언트를
부팅시키는데 필요한 모든것을 갖고 있다.
커널의 nfsroot 코드와 RARP에 대한 지원은 Gero
Kuhlmann(gero@gkminix.han.de)이 작성했다.
IP 층에서의 자동설정 코드의 나머지는 Martin
Mares(mj@atrey.karlin.mff.cuni.cz)가 작성했다.
nfsroot의 초기화 버전을 쓰기 위해서 Jens-Uwe
Mager(jum@anubis.han.de)의 도움에 감사한다.