DISKLESS(8)

명칭
diskless - 네트워크를 개입시켜 시스템을 부트 한다

해설
네트워크를 개입시켜 머신을 부트 하는 능력은, diskless 혹은 dataless 머신이기 때문에나, 로컬의 파일 시스템의 재인스톨 또는 수복중에 일시적으로 이용하기 위해서 유용합니다. 이 파일은, 클라이언트가 네트워크를 개입시켜 부트 할 때에, 클라이언트와 서버와의 사이에 행해지는 통신의 일반적인 해설을 제공합니다.

조작
네트워크를 개입시켜 시스템을 부트 할 때에, 클라이언트와 서버의 사이에 3 국면의 교환이 있습니다:

1.  스테이지 1 의 bootstrap가 부트 프로그램을 읽어들입니다.
2.  부트 프로그램이 커널을 읽어들입니다.
3.  커널이 루트를 NFS mount 합니다.

이러한 각 국면에 대해, 이후에 자세하게 기술합니다.

국면 1 에서는, 스테이지 1 의 bootstrap 코드가 부트 프로그램을 읽어들입니다. 이 부트 프로그램은, 보통 네트워크 카드를 제어할 수 있습니다. 부트 프로그램을, BIOS 나, 네트워크 카드상의 BOOT ROM (PXE, etherboot, netboot)에 격납할 수도 있습니다. 또, 디스크 유니트 (etherboot, netboot 등 )로부터 로드 시킬 수도 있습니다.

국면 2 에서는, 부트 프로그램이 커널을 읽어들입니다. 이 국면의 조작은 부트 프로그램의 설계에 의존합니다. 보통, 부트 프로그램은 BOOTP 프로토콜 또는 DHCP 프로토콜을 이용해 클라이언트의 IP 주소와 그 외의 부트 정보를 취득합니다. 부트 정보는, NFS 서버, 라우터, 네임서버의 IP 주소, 로드하는 커널명을 포함합니다 (이것에 한정하지 않고 다른 정보가 포함된다 일도 있습니다). 그 후, 커널이 로드 됩니다. 이것에는, (etherboot 나 netboot 의 경우와 같이) NFS 를 사용해 직접 로드 되는 경우와 pxeboot 로 불리는 중간 로더를 통해서, TFTP 나 NFS 를 사용해 로드 된다 경우가 있습니다.

국면 3 에서는, 커널이 DHCP 나 BOOTP 를 이용해 설정 정보를 획득해, 루트 파일 시스템의 mount에 진행되어, 동작을 개시합니다. 디스크레스시스템의 개시 처리중에 행해지는 몇개의 동작은, /etc/rc.diskless1 (와)과 /etc/rc.diskless2 (와)과에 열거되고 있습니다.

설정
디스크레스크라이안트를 실행시키기 위해서(때문에)는, 다음에 나타내는 것이 필요합니다.

•   NFS 서버. 이것은, 적절한 퍼미션을 붙여 root partition와 /usr 파티션을 export 합니다. 몇개의 시스템 파일에 액세스 할 수 있도록(듯이) 하기 위해서, root partition가 -maproot=0 그리고 export 되고 있는 한, 스크립트 rc.diskless{1,2} (은)는 읽기 전용 퍼미션으로 동작합니다. 예로서 /etc/exports (은)는 다음에 나타내는 행을 포함합니다.

        <ROOT> -ro -maproot=0 -alldirs <list of diskless clients>
        /usr -ro -alldirs <list of diskless clients>

    여기서 <ROOT> (은)는, root partition의 서버상에서의 마운트 포인트입니다. 스크립트 /usr/share/examples/diskless/clone_root (을)를 사용해, 공용 가능한 읽기 전용 root partition를 생성할 수가 있습니다. 그러나, 같이 서버 자신이 사용하는 루트 디렉토리를 (읽기 전용으로) export 시킨다고 결정할 수도 있습니다.

•   BOOTP 또는 DHCP 서버. bootpd(8) 하 /etc/inetd.conf 의 bootps 행의 코멘트를 빗나가게 하는 것으로 사용 가능하게 할 수가 있습니다. /etc/bootptab 의 예는 다음과 같이 됩니다.

         .default:\
            hn:ht=1:vm=rfc1048:\
            :sm=255. 255.255. 0:\
            :sa=<SERVER>:\
            :gw=<GATEWAY>:\
            :rp="<SERVER>:<ROOT>":
        <CLIENT>:ha=0123456789ab:tc=.default

    <SERVER>, <GATEWAY>, <CLIENT>, <ROOT> 의 의미는 분명하겠지요.

•   루트로서 export 되는 파티션상에 디렉토리 /conf/default/etc (을)를 작성해, 여기에 /etc 의 내용의 카피를 둡니다. /conf/default/etc 안의 파일과 서브 디렉토리가, 디스크레스 환경의 /etc 메모 refile 시스템의 bootstrap로서 사용됩니다. 덧쓰기 설정하는 것 뿐만이 아니고, /etc 전체를 카피해 주세요.

•   더욱, /etc 안의 파일에 대한 네트워크마다 또는 호스트 마다의 덧쓰기 설정은, /conf/${i}/etc 디렉토리를 작성하는 것으로써, 가능해집니다. 여기서, i (은)는, 클라이언트의 서스네트워크 브로드캐스트 어드레스, 또는 클라이언트의 IP 주소입니다.

    /etc/rc 의 주요한 부분의 실행 (이것에는, rc.conf 의 읽기도 포함됩니다) 의 전에, /etc/rc.diskless. 1 에 의해, 파일이 위에 적은 디렉토리로부터 /etc 에 카피되고 ( /etc 에 있던 그 이전의 내용은 덧쓰기됩니다), 가장 범용의 것으로부터 개시됩니다.

    최악이어도, /conf/default/etc/fstab 에 다음의 내용을 포함할 필요가 있습니다.

        <SERVER>:<ROOT> /     nfs    ro 0 0
        <SERVER>:/usr   /usr  nfs    ro 0 0
        proc            /proc procfs rw 0 0

    또, /conf/default/etc/rc.conf (을)를 변경해, 디스크레스크라이안트용의 스타트 업 옵션을 포함하도록(듯이) 한 버젼을 준비할 필요도 있습니다.

    스타트 업 코드로 이미 설정되어 있기 (위해)때문에, hostname (이)나 ifconfig_* (을)를 지정할 필요는 우선 없을 것입니다. 한편, 서버의 로컬 스타트 업 파일을 사용하지 않게 하기 위한(해), local_startup="" (을)를 설정할 필요가 있겠지요.

    스타트 업 스크립트가 md(4) 의 파일 시스템의 /var (을)를 mount 합니다만, 사이트에 따라서는 /etc/defaults/rc.conf 에 entropy_dir="NO" (을)를 설정하는 것으로써 엔트리피의 보존을 무효화하고 싶을지도 모릅니다.

    마지막에 됩니다만, 복수의 디스크레스크라이안트로 같은 설정 파일을 공유하는 경우, `hostname` 의 값을 스윗치 변수에 사용한다 case 문장을 이용해, 머신 고유의 설정을 행하도록(듯이) 하면 좋을지도 모릅니다.

•   콘피그파일 (예 /sys/i386/conf/DISKLESS) 에 적어도 이하가 포함되는 커널을 구축합니다.

        device md
        options BOOTP
        options BOOTP_NFSROOT
        options BOOTP_COMPAT

    파이어 월(fire wall)를 사용하는 경우, 디폴트를 오픈으로 해 두지 않으면 안 되는 것은 기억해 두어 주세요. 오픈으로 해 두지 않으면 커널로 bootp 패킷의 읽고 쓰기를 할 수 없게 됩니다.

보안상의 문제
암호화되지 않는 NFS 를 사용해 root partition와 유저 파티션을 mount 하면(자), 암호화 키등의 정보가 샐지도 모르는 것에 주의해 주세요.

버그
이 메뉴얼 페이지는 아마 불완전합니다.

FreeBSD (은)는 가끔 root partition에 기입을 요구합니다. 그러니까, 스타트 업 스크립트에서는, 원의 내용을 보존하는 동안, md(4) 의 파일 시스템을 몇개의 위치 ( /etc (이)나 /var 등)에 mount 합니다. 이 처리는 모든 경우를 취급할 수 없을지도 모릅니다.

관련 항목
md(4), ethers(5), exports(5), bootpd(8), mountd(8), nfsd(8), pxeboot(8), reboot(8), tftpd(8), ports/net/etherboot