무(無)디스크 노드

From Gentoo Wiki
Jump to: navigation, search
This page is a translated version of the page Diskless nodes and the translation is 100% complete.

Other languages:
English • ‎español • ‎français • ‎русский • ‎中文(中国大陆)‎ • ‎日本語 • ‎한국어

이 설명서는 젠투 리눅스에 무(無) 디스크 노드 설정을 만들고 설정하는 방법을 도와줍니다.

도입부

이 설명서 정보

이 설명서는 젠투 리눅스 배포판을 기반으로 무(無) 디스크 워크스테이션 설정을 도와줍니다. 이 안내서에서는 경험자의 경우 무(無) 디스크 노드 및 네트워크와 관련된 여러 설명서에 쉽게 적응할 수 있지만, 우리 모두는 각각의 입장에 있는 편이기에, 리눅스 초짜들에게 가능한한 친숙하게 작성하여 제공하려 하며, 이 안내서가 흥미있는 사람이든, 덕후든 아니든간에 쉽게 설치할 수 있도록 도움이 되길 바랍니다.

무(無) 디스크 머신이란게 뭔가요?

무디스크 머신은 하드 디스크, 플로피 드라이브, CD-ROM 같은 보통 사용하는 부팅 장치가 없는 PC입니다. 무티스크 노드는 네트워크를 통해 부팅하며, 저장공간을 로컬 하드 디스크처럼 제공하는 서버가 필요합니다. 이제 우리는 이 서버를 마스터라 하고, 무디스크 머신을 슬레이브라 하겠습니다(이름으로 둡니다). 슬레이브 노드는 PXE 부팅 또는 이더부트 기능을 제공하는 네트워크 어댑터가 필요합니다. 지원 목록은 Etherboot.org를 확인하세요. 대부분 최신 카드에서는 PXE를 지원하며, 수많은 마더보드 내장 어댑터에서도 동작합니다.

시작하기 전에

마스터 노드에 젠투를 설치해야 하고, 제공할 슬레이브 노드의 파일 시스템을 저장할 충분한 용량을 마스터 노드에 확보해야 합니다. 또한 로컬 영역 연결에서 한 인터페이스는 인터넷에 연결했는지 확인해야 합니다.

Configuration

마스터, 슬레이브 설정

커널 설명

커널은 하드웨어와 머신에 불러온 모든 다른 소프트웨어 사이에 놓인 프로그램이며, 커널 기반 운영체제의 핵심입니다. 컴퓨터를 시작하면 BIOS는 하드 드라이브의 예약 부팅영역의 기계어 명령을 실행합니다. 이 기계어 명령은 커널을 불러드리는 부트로더 입니다. 커널을 불러오고 나면 모든 프로세스를 커널이 처리합니다.

커널과 커널 설정에 대한 더 많은 내용은 커널 HOWTO를 확인해보십시오.

마스터 커널 설정

마스터 커널은 원하는대로 사용자 설정을 한 만큼 커질 수 있지만 선택해야 할 커널 옵션은 극히 일부입니다. 다음을 입력하여 커널 설정 화면으로 이동하십시오:

root #cd /usr/src/linux
root #make menuconfig

/usr/src/linux/.config 파일을 직접 설정하는 안전한 대안책으로 회색에 시퍼런 색이 곁들인 화면이 떠야합니다. 커널이 잘 동작한다면 GUI를 빠져나가서 다음을 입력하여 현재 설정 파일을 저장하시는 것이 좋습니다:

root #cp .config .config_working

하위 메뉴를 따라가서 아래 항목을 내장 항목(그리고 모듈 아님)으로 표시했는지 확인하십시오. 아래 옵션은 2.6.10 버전의 커널부터 볼 수 있습니다. 다른 버전을 사용한다면 나타난 글씨나 순서가 다를 수도 있습니다. 최소한 아래 나타난 항목만 선택했는지 확인하십시오.

커널 마스터 커널 옵션
[*] Networking support --->
  Networking options --->
    <*> Packet socket
    <*> Unix domain sockets
    [*] TCP/IP networking
    [*]   IP: multicasting
    [ ] Network packet filtering (replaces ipchains)
  
File systems --->
  Network File Systems  --->
    <*> NFS server support
    [*]   Provide NFSv3 server support

마스터 노드 또는 보안 방화벽을 통해 인터넷망을 쓸 경우 iptables 지원을 추가했는지 확인하십시오:

커널 iptables 지원 활성화
  [*] Network packet filtering (replaces ipchains)
  IP: Netfilter Configuration  --->
    <*> Connection tracking (required for masq/NAT)
    <*> IP tables support (required for filtering/masq/NAT)

패킷 차단 기능이 필요하면, 다음 나머지 부분을 모듈로 추가하십시오. 젠투 보안 핸드북 방화벽 정보에서 어떻게 방화벽을 제대로 설정할 수 있는지 읽어보십시오.

참고
이 커널 설정 옵션은 시스템 설정 옵션에 따라서만 추가할 수 있으며 커널 설정을 완벽하게 바꾼다는 의미는 아닙니다.

마스터 커널을 재설정한 후, 다음과 같이 다시 빌드하십시오:

root #make && make modules_install
root #cp arch/i386/boot/bzImage /boot/bzImage-master

어떤 부트로더를 사용하느냐에 따라 lilo.conf또는 grub.conf에 새 커널 설정 항목을 추가하시고, 새 커널을 기본 항목으로 지정하십시오. 이제 새 bzImage 파일을 boot 디렉터리에 복사했으며, 여러분이 앞으로 해야 할 모든 일은 시스템을 재부팅하여 새 옵션을 불러오는 것입니다.

슬레이브 커널 알아보기

슬레이브 커널을 어떤 모듈도 포함하지 않고 컴파일 하는 것을 추천하지만, 원격 부팅을 통해 불러오고 설정하는 과정을 어렵고 필요하지 않은 과정입니다. 게다가, 슬레이브 커널은 작아야 하며, 네트워크로부터 효율적으로 부팅 과정을 수행하기 위해 가능한한 최소화해야 합니다. 이제, 마스터에서 설정한 동일한 위치에 슬레이브의 커널을 컴파일하겠습니다.

혼동을 막고 시간을 절약하기 위해 마스터의 설정 파일을 다음 명령을 입력하여 백업하시는게 좋습니다:

root #cp /usr/src/linux/.config /usr/src/linux/.config_master

이제 마스터 커널을 설정한 동일한 방식으로 슬레이브 커널을 설정하겠습니다. 새 설정 파일로 시작하려 한다면, 다음 명령을 입력하여 기본 /usr/src/linux/.config 파일로 언제든 되돌릴 수 있습니다.

root #cd /usr/src/linux
root #cp .config_master .config

이제 다음 명령을 입력하여 설정 화면으로 이동하십시오:

root #cd /usr/src/linux
root #make menuconfig

다음 옵션을 커널 모듈이 아닌 내장 항목으로 선택했는지 확인하십시오:

커널 슬레이브 커널 옵션
[*] Networking support --->
  Networking options --->
    <*> Packet socket
    <*> Unix domain sockets
    [*] TCP/IP networking
    [*]   IP: multicasting
    [*]   IP: kernel level autoconfiguration
    [*]     IP: DHCP support
  
File systems --->
  Network File Systems  --->
    <*> file system support
    [*]   Provide NFSv3 client support
    [*]   Root file system on NFS
참고
DHCP 서버의 대안책은 BOOTP 서버입니다.
중요
네트워크 어댑터를 노드 커널에 추가(모듈 아님)하는 것이 중요합니다. 무디스크 노드에서 모듈을 사용하는 것은 보통 문제를 일으키지 않습니다.

이제 슬레이브 커널을 컴파일해야 합니다. (어쩌다가) 마스터 커널을 빌드할 때 모듈을 덮어쓰거나 꼬이게 하고 싶진 않기에 여기서는 매우 조심해야 합니다:

root #cd /usr/src/linux
root #make

이제 마스터에 슬레이브의 파일과 필요한 시스템 파일을 저장할 디렉터리를 만드십시오. 여기선 /diskless를 사용하겠지만, 어디든 원하는 디렉터리를 여기서 선택하십시오. 이제 슬레이브의 bzImage 파일을 /diskless 디렉터리에 복사하십시오:


참고
다른 아키텍처를 사용한다면 .config_arch에 저장하는 것이 좋습니다. 이미지에도 같은 조치를 취하십시오: /disklessbzImage_arch 같은 방식으로 저장하십시오.


root #mkdir /diskless
root #cp /usr/src/linux/arch/i386/boot/bzImage /diskless

슬레이브 파일 시스템 기반 설정

마스터 파일 시스템과 슬레이브 파일 시스템은 상당 부분을 주물러 바꿀 수 있습니다. 바로 지금 우리는 적당한 설정 파일의 기반 파일 시스템을 설정하고 마운트 지점을 지정하는 것입니다. 먼저 우리가 해야 할 일은 첫 슬레이브 머신에 대한 /diskless 디렉터리에 디렉터리를 만드는 것입니다. 각각의 슬레이브에서는 자신의 루트 파일 시스템이 필요한데 각각의 시스템 파일을 공유하면 권한 문제가 생길 수 있으며, 최악의 경우는 복구하기 어렵게 깨질 수도 있습니다. 이 디렉터리를 관리자가 적절하다고 생각하는 어떤것이든 불러올 수 있지만, 저자는 슬레이브의 유일하며 혼동되지 않는 IP 주소 사용을 제안합니다. 첫번째 슬레이브에 할당할 정적 IP는 예를 들어 192.168.1.21과 같다면:

root #mkdir -p /diskless/192.168.1.21/etc

/etc의 다양한 설정 파일은 슬레이브에서 작업하도록 바꿔야 합니다. 마스터의 /etc 디렉터리를 새로운 슬레이브 루트에 다음 명령을 입력하여 복사하십시오:

root #cp -r /etc/* /diskless/192.168.1.21/etc/

이 파일시스템은 더 많은 마운트 지점과 디렉터리가 필요하기 때문에 아직 준비되지 않았습니다. 이들을 만들려면 다음 명령을 입력하십시오:

root #mkdir /diskless/192.168.1.21/home
root #mkdir /diskless/192.168.1.21/dev
root #mkdir /diskless/192.168.1.21/proc
root #mkdir /diskless/192.168.1.21/tmp
root #mkdir /diskless/192.168.1.21/mnt
root #chmod a+w /diskless/192.168.1.21/tmp
root #mkdir /diskless/192.168.1.21/mnt/.initd
root #mkdir /diskless/192.168.1.21/root
root #mkdir /diskless/192.168.1.21/sys
root #mkdir /diskless/192.168.1.21/var
root #mkdir /diskless/192.168.1.21/var/empty
root #mkdir /diskless/192.168.1.21/var/lock
root #mkdir /diskless/192.168.1.21/var/log
root #mkdir /diskless/192.168.1.21/var/run
root #mkdir /diskless/192.168.1.21/var/spool
root #mkdir /diskless/192.168.1.21/usr
root #mkdir /diskless/192.168.1.21/opt

대부분의 이 "내용"은 여러분이 알아볼 수 있어야 합니다. /dev, /proc, /sys 같은 것들을 슬레이브 장치가 시작할 때 실려갑니다. 다른 디렉터리는 그 다음에 마운트합니다. 또한 /diskless/192.168.1.21/etc/conf.d/hostname 파일의 내용을 바꿔 슬레이브 호스트 이름을 반영해야 합니다. 바이너리, 라이브러리, 기타 파일은 슬레이브 부팅을 시도하기 전 이 설명서에서 이 과정 다음에 배포합니다.

/devudev에서 실어가겠지만, console 항목을 만들어야 합니다. 그렇지 않으면 "unable to open initial console(초기 콘솔을 열 수 없습니다)"라는 오류를 만납니다.

root #mknod /diskless/192.168.1.21/dev/console c 5 1

DHCP 서버 설정

DHCP 서버 알아보기

DHCP는 동적 호스트 설정 프로토콜(Dynamic Host Configuration Protocol)의 약자입니다. DHCP 서버는 PXE 부팅을 시작할 때 가장 먼저 통신할 컴퓨터입니다. DHCP 서버의 주된목적은 IP 주소 할당입니다. DHCP 서버는 호스트의 이더넷 MAC 주소를 기반으로 IP 주소를 할당할 수 있습니다. 슬레이브에서 IP 주소를 받으면, DHCP 서버는 초기 파일 시스템과 커널이 어디있는지 슬레이브에게 알려줍니다.

시작하기 전에

시작하기 전에 제대로 동작하는지 확인해야 할 몇가지가 있습니다. 먼저 네트워크 연결을 확인하십시오:

root #ifconfig eth0 multicast
root #ifconfig -a

"eth0" 장치가 실행 중임을 확인합니다. 결과는 다음과 같이 나와야합니다:

코드 eth0 장치가 올바르게 동작하는 모습
eth0      Link encap:Ethernet  HWaddr 00:E0:83:16:2F:D6
          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:26460491 errors:0 dropped:0 overruns:2 frame:0
          TX packets:32903198 errors:0 dropped:0 overruns:0 carrier:1
          collisions:0 txqueuelen:100
          RX bytes:2483502568 (2368.4 Mb)  TX bytes:1411984950 (1346.5 Mb)
          Interrupt:18 Base address:0x1800

MULTICAST라는 메시지가 나와야 합니다. 안나오면 multicast support를 포함하도록 커널을 다시 컴파일해야 합니다.

DHCP 서버 설치

네트워크에 DHCP 서버가 없다면 이걸 설치해야합니다:

root #emerge --ask dhcp

네트워크에 DHCP 서버가 있다면, PXE 부팅 기능이 제대로 동작하도록 설정 파일을 편집해야 합니다.

DHCP 서버 설정

DHCP 서버를 시작하기 전에 여러분이 설정해야 할 설정 파일은 /etc/dhcp/dhcpd.conf 하나밖에 없습니다. 제공해드린 예제 파일을 복사하고 편집하십시오:

root #cp /etc/dhcp/dhcpd.conf.sample /etc/dhcp/dhcpd.conf
root #nano -w /etc/dhcp/dhcpd.conf

의도한 방식 대로의 파일의 일반 구성은 다음과 같습니다:

코드 예제 dhcpd.conf 구성
# global options here
ddns-update-style none;
shared-network LOCAL-NET {
  # shared network options here
  subnet 192.168.1.0 netmask 255.255.255.0 {
    # subnet network options here
    host slave{
        # host specific options here
    }
    group {
        # group specific options here
    }
  }
}

shared-network 블록은 추가 항목이며, 동일한 네트워크 구성에 따라 여러분이 원하는 대로 할당하려는 IP에 대해 사용해야합니다. 최소한 subnet 을 선언해야 하며, 선택적인 group 블록에서는 항목간 옵션을 묶을 수 있습니다. dhcpd.conf의 바람직한 예제는 다음과 같습니다:

코드 dhcpd.conf 예제
#
# Sample dhcpd.conf for diskless clients
#
  
# Disable dynamic DNS
ddns-update-style none;
  
# Assume one default gateway for IP traffic will do
option routers 192.168.1.1;
  
# Provide DNS info to clients
option domain-name-servers 192.168.1.1;
option domain-name "mydomain.com";
  
# Specify the TFTP server to be used
next-server 192.168.1.1;
  
# Declare a vendor-specific option buffer for PXE clients:
# Code 1: Multicast IP address of boot file server
# Code 2: UDP port that client should monitor for MTFTP responses
# Code 3: UDP port that MTFTP servers are using to listen for MTFTP requests
# Code 4: Number of seconds a client must listen for activity before trying
#         to start a new MTFTP transfer
# Code 5: Number of seconds a client must listen before trying to restart
#         a MTFTP transfer
  
option space PXE;
option PXE.mtftp-ip               code 1 = ip-address;
option PXE.mtftp-cport            code 2 = unsigned integer 16;
option PXE.mtftp-sport            code 3 = unsigned integer 16;
option PXE.mtftp-tmout            code 4 = unsigned integer 8;
option PXE.mtftp-delay            code 5 = unsigned integer 8;
option PXE.discovery-control      code 6 = unsigned integer 8;
option PXE.discovery-mcast-addr   code 7 = ip-address;
  
# Declare the subnet where our diskless nodes will live
subnet 192.168.1.0 netmask 255.255.255.0 {
  
  # Provide PXE clients with appropriate information
  class "pxeclient" {
    match if substring(option vendor-class-identifier, 0, 9) = "PXEClient";
    vendor-option-space PXE;
  
    # At least one of the vendor-specific PXE options must be set in
    # order for the client boot ROMs to realize that we are a PXE-compliant
    # server.  We set the MCAST IP address to 0.0.0.0 to tell the boot ROM
    # that we can't provide multicast TFTP.
  
    option PXE.mtftp-ip 0.0.0.0;
  
    # This is the name of the file the boot ROMs should download.
    filename "pxelinux.0";
  }
  
  # Provide Etherboot clients with appropriate information
  class "etherboot" {
    match if substring(option vendor-class-identifier, 0, 9) = "Etherboot";
    filename "vmlinuz_arch";
  }
  
  # Add one host declaration for each diskless host
  host slave21 {
    hardware ethernet 00:02:A5:04:3B:66;
    fixed-address 192.168.1.21;
  }
}
참고
PXE 부팅 기능과 Etherboot 기능을 함께 사용하도록 허용하는 경우는 없습니다. 위의 코드 예제는 드문 예제입니다. 문제에 직면했다면 DHCPd 문서의 도움을 받으십시오.

next-server 다음의 IP 주소는 지정 filename 파일에 요청합니다. 이 IP 주소는 tftp 서버의 IP여야 하며, 보통 마스터의 IP주소와 같습니다. filename/diskless 디렉터리에 상대적입니다(tftp 서버의 특정 옵션이 이 디렉터리를 찾기 때문입니다). host 블록에는 hardware ethernet옵션에서 맥 주소를 지정하고, fixed-address 에서 고정 IP 주소를 각각의 MAC 주소에 대해 할당합니다. dhcpd.conf에 대한 상당히 좋은 맨 페이지에 이 설명서의 범위를 능가하는 옵션의 설명이 곁들여져있습니다. 다음 명령을 입력하면 멘 피이지를 볼 수 있습니다:

user $man dhcpd.conf

DHCP 서버 시작하기

dhcp 초기화 스크립트를 시작하기 전에 /etc/conf.d/dhcp 파일을 편집하여 다음과 같은 모양새가 되도록 하십시오:

코드 /etc/conf.d/dhcp 예제
IFACE="eth0"
# Insert any customizations needed

IFACE 변수는 DHCP 서버를 구동할 장치이며, 이 경우 eth0입니다. IFACE에 더 많은 인자를 추가하면 여러대의 이더넷 카드를 사용하는 복잡한 네트워크 구성에 유용합니다. dhcp 서버를 시작하려면, 다음 명령을 입력하십시오:

root #/etc/init.d/dhcpd start

dhcp 서버를 시작 스크립트로 추가하려면 다음 명령을 입력하십시오:

root #rc-update add dhcpd default

DHCP 서버 문제 해결

노드가 부팅하는지 보려면 /var/log/messages에서 찾아 보십시오. 노드가 성공적으로 부팅한다면, messages 파일의 아랫줄에는 다음과 같은 내용이 있어야 합니다:

코드 dhcp가 만든 기록 파일 목록 예제
DHCPDISCOVER from 00:00:00:00:00:00 via eth0
DHCPOFFER on 192.168.1.21 to 00:00:00:00:00:00 via eth0
DHCPREQUEST for 192.168.1.21 from 00:00:00:00:00:00 via eth0
DHCPACK on 192.168.1.21 to 00:00:00:00:00:00 via eth0
참고
이 기록 파일은 슬레이브 맥 주소를 찾아볼 때도 도움이됩니다.

다음의 메시지가 나타났다면 설정 파일에서 무엇인가가 잘못되었을지 모르지만 DHCP 서버에서 올바르게 IP 주소를 뿌려줌을 의미합니다.

코드 dhcp 서버 오류 예제
no free leases on subnet LOCAL-NET

설정 파일 내용을 바꿀 때마다 DHCP 서버를 다시 시작해야 합니다. 서버를 다시 시작하려면 다음 명령을 입력하십시오:

root #/etc/init.d/dhcpd restart

TFTP 서버와 PXE 리눅스 부트로더 또는 Etherboot 설정

TFTP 서버 알아보기

TFTP는 단순 파일 전송 프로토콜(Trivial File Transfer Protocol)을 의미합니다. TFTP 서버는 슬레이브의 커널과 초기 파일 시스템을 실어나릅니다. 모든 슬레이브 커널과 파일 시스템은 TFTP 서버에 저장하기 때문에, 마스터를 TFTP 서버로 만드는 것이 바람직합니다.

TFTP 서버 설치

가장 추천하는 tftp 서버는 tftp-hpa 패키지입니다. 이 tftp 서버는 SYSLINUX를 만든 사람이 만들었으며 pxelinux와 가장 잘 동작합니다. 설치하려면 다음과 같이 간단하게 입력하십시오:

root #emerge --ask tftp-hpa

TFTP 서버 설정

/etc/conf.d/in.tftpd를 편집하십시오. INTFTPD_PATH에 tftp 루트 디렉터리를 지정해야 하며, INTFTPD_OPTS에 명령행 옵션을 지정해야 합니다. 결과는 다음과 같아야 합니다:

파일 /etc/conf.d/in.tftpd
INTFTPD_PATH="/diskless"
INTFTPD_OPTS="-l -v -s ${INTFTPD_PATH}"

-l 옵션은 이 서버가 독립 실행 상태로 동작함을 나타내므로, inetd를 실행할 필요가 없습니다. -v 는 로그/오류 메시지를 자세하게 나타내야 함을 나타냅니다. -s /diskless 옵션은 tftp 서버의 루트를 지정합니다.

TFTP 서버 시작하기

tftp 서버를 시작하려면 다음 명령을 입력하십시오:

root #/etc/init.d/in.tftpd start

이 명령은 /etc/conf.d/in.tftpd 파일에 지정한 옵션대로 tftp서버를 시작합니다. 이 서버를 부팅할 때 자동으로 시작하려면 다음 명령을 입력하십시오:

root #rc-update add in.tftpd default

PXELINUX 알아보기

이 장은 Etherboot를 활용한다면 필요치않습니다. PXELINUX는 LILO 또는 GRUB과 같은 네트워크 부트로더이며 TFTP를 통해 전달합니다. 커널과 초기 파일 시스템이 어디있는지 알려주는 작은 명령 집합으로 핵심적으로 구성되어있으며, 다양한 커널 옵션을 제공합니다.

시작하기 전에

H. Peter Anvin이 만든 SYSLINUX 패키지에 딸려오는 pxelinux.0 파일을 복사해야 합니다. 다음 명령을 입력하면 설치할 수 있습니다:

root #emerge --ask syslinux

PXELINUX 설정

참고
Etherboot는 필요하지 않습니다.

tftp 서버를 시작하기 전에 pxelinux를 설정해야 합니다. 먼저 pxelinux 바이너리를 /diskless 디렉터리에 넣으십시오:

root #cp /usr/share/syslinux/pxelinux.0 /diskless
root #mkdir /diskless/pxelinux.cfg
root #touch /diskless/pxelinux.cfg/default

이 과정에서 기본 부트로더 설정 파일을 만듭니다. 16진수 클라이언트 IP 주소로 된 파일이 있는지 pxelinux.0 바이너리에서 pxelinux.cfg 디렉터리를 찾아봅니다. 파일이 없다면 파일 이름의 가장 오른쪽 자리를 지우고, 숫자가 바닥날 때까지 계속 찾습니다. 2.05 이상의 syslinux에서는 먼저 MAC 주소 다음의 파일 이름에 대해 검색을 수행합니다. 찾은 파일이 없다면, 앞서 언급한 발견 루틴을 따라갑니다. 발견한 파일이 없다면 default 파일을 사용합니다.

코드 pxelinux.cfg/에서 순서대로 보이는 PXE 검색용 파일
## (Leading 01 means Ethernet, next bytes match our slave's MAC address)
01-00-40-63-c2-ca-c9
  
## (Assigned IP in hexadecimal)
C0A80115
C0A8011
C0A801
C0A80
C0A8
C0A
C0
C
  
default
참고
모두 소문자로 입력해야 합니다.

default 파일로 시작해보겠습니다:

코드 pxelinux.cfg/default 예제
DEFAULT gentoo
LABEL gentoo
LINUX /bzImage
APPEND ip=dhcp root=/dev/nfs nfsroot=192.168.1.1:/diskless/192.168.1.21

DEFAULT 태그는 앞서 컴파일한 커널 bzImage를 pxelinux가 찾도록 지시합니다. APPEND 태그는 커널 초기화 옵션을 붙입니다. 슬레이브 커널에 NFS_ROOT_SUPPORT를 넣었기 때문에 nfsroot를 여기에 지정합니다. 첫번째 IP는 마스터의 IP이고 두번째 IP는 /diskless에 있는 디렉터리 이름이며, 여기에는 슬레이브 초기 파일 시스템이 들어갑니다.

Etherboot 알아보기

참고
PXE 부팅을 활용한다면 필요하지 않습니다.

Etherboot는 네트워크 부팅 이미지를 TFTP 서버에서 가져와서 부팅합니다. PXE 에서와 같이 LILO나 GRUB와 동일합니다. mknbi 유틸리티는 다양한 옵션을 활용하여 여러가지 이미지를 만들 수 있도록 합니다.

시작하기 전에

mknbi(태그를 붙여 네트워크 부팅할 때사용할 커널 이미지를 만드는 유틸리티) 패키지를 가져와서 Etherboot 이미지를 만들어야 합니다. 이 도구는 기존 커널에서 미리 설정한 커널로 만듭니다. 여기에는 한참 아래에서 보여드릴 부팅 옵션도 있습니다.

root #emerge --ask mknbi

Etherboot 설정

이 장에서는 간단한 Etherboot 이미지를 만들겠습니다. DHCP 서버가 클라이언트 경로를 dhcp.conf에서 "option root-path"로 주기 때문에, 여기에 넣을 필요가 없습니다. 더 자세한 내용은 mknbi 설명서에서 찾아볼 수 있습니다.

user $man mknbi

부팅 이미지를 만들겠습니다. DHCP에서 전달할 수 있는 ELF 부팅 이미지를만들고 커널의 루트 경로에 넣겠습니다. 또한 커널에서 네트워크 상의 DHCP 서버를 탐색하도록 커널에 지시합니다.

root #mkelf-linux -ip=dhcp /diskless/bzImage > /diskless/vmlinuz
참고
아키텍처별 이미지에 대해bzImage_archvmlinuz_arch로 입력하십시오.

네트워크 부팅 과정 문제 해결

네트워크 부팅 과정의 문제를 추적하는데 할 수 있는 일은 얼마 없습니다. 먼저 tcpdump라고 하는 도구를 사용할 수 있습니다. tcpdump를 설치하려면 다음 명령을 입력하십시오:

root #emerge --ask tcpdump

이제 다양한 네트워크 트래픽을 살펴보고 클라이언트/서버간의 대화가 동작하는지 확인할 수 있습니다. 무엇인가가 동작하지 않는다면 여러분이 확인하려는 요소는 줄어듭니다. 먼저 클라이언트/서버가 물리적으로 제대로 연결되었는지, 네트워크 케이블이 끊어지지 않았는지 확인하십시오. 클라이언트/서버가 각각의 포트에서 요청을 받지 않는다면 방화벽의 방해가 있는지 확인하십시오. 두 컴퓨터간의 교류가 있는지 확인하려면 다음 명령을 입력하십시오:

root #tcpdump host_client_ip and server_ip

tcpdump 명령을 다음과 같이 입력하여 tftp 포트 같은 각각의 포트에서 대기하도록 설정할 수 있습니다:

root #tcpdump port 69

보통 확인할 수 있는 오류는 "PXE-E32: TFTP open time-out" 입니다. 아마도 방화벽 문제일지도 모릅니다. TCPwrappers를 사용한다면 /etc/hosts.allowetc/hosts.deny를 점검하고, 올바르게 설정했는지 확인하십시오. 클라이언트는 서버에 연결할 수 있어야합니다.

NFS 서버 설정

NFS 서버 알아보기

NFS는 네트워크 파일 시스템(Network File System)입니다. NFS 서버는 디렉터리를 슬레이브에 전달할 때 사용합니다. 이 부분은 나중에 개별적으로 설정할 수 있지만, 지금은 디스크 없이 슬레이브 노드를 부팅할 수 있게 준비하는 과정입니다.

포트매퍼 알아보기

여러 클라이언트/서버 서비스에서는 각각의 포트에 대한 포트를 감청하지 않지만 RPC(원격 프로시저 호출)에 의존합니다. 서비스를 초기화하면 임의의 포트를 감청하며 이 포트를 포트매퍼 유틸리티에 할당합니다. NFS는 RPC에 의존하기 때문에 NFC를 시작하기 전에 포트매퍼를 실행해야 합니다.

시작하기 전에

NFS 서버는 커널 차원의 지원이 필요하기에, 커널에 이 항목이 없다면 마스터의 커널을 다시 컴파일해야합니다. 마스터 커널 설정을 다시 확인하려면 다음 명령을 입력하십시오:

root #grep NFS /usr/src/linux/.config_master

커널을 올바르게 설정했는지 확인한다면 다음과 같은 내용이 나와야합니다:

커널 마스터 커널 설정에서의 적절한 NFS 관련 옵션
CONFIG_PACKET=y
# CONFIG_PACKET_MMAP is not set
# CONFIG_NETFILTER is not set
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
# CONFIG_NFS_V4 is not set
# CONFIG_NFS_DIRECTIO is not set
CONFIG_NFSD=y
CONFIG_NFSD_V3=y
# CONFIG_NFSD_V4 is not set
# CONFIG_NFSD_TCP is not set

NFS 서버 설치

다음 명령을 입력하면 포티지를 통해 NFS 패키지를 설치할 수 있습니다:

root #emerge --ask nfs-utils

이 패키지는 포트매핑 유틸리티, NFS 서버, NFS 클라이언트 유틸리티를 이머지하며, 의존성 초기화를 자동으로 처리합니다.

NFS 서버 설정

편집해야 할 주된 설정 파일에는 세가지가 있습니다:

코드 NFS 설정 파일
/etc/exports
/diskless/192.168.1.21/etc/fstab
/etc/conf.d/nfs

/etc/exports 파일은 어떻게 누구에게 무얼 NFS를 통해 내보낼 것인지 지정합니다. 슬레이브의 fstab의 내용이 바뀌어서 마스터가 내보내는 NFS 파일 시스템에 마운트할 수 있게 됩니다.

보통 마스터의 /etc/exports는 다음과 같습니다:

파일 /etc/exportsmaster exports 파일
# one line like this for each slave
/diskless/192.168.1.21   192.168.1.21(sync,rw,no_root_squash,no_all_squash)
# common to all slaves
/opt   192.168.1.0/24(sync,ro,no_root_squash,no_all_squash)
/usr   192.168.1.0/24(sync,ro,no_root_squash,no_all_squash)
/home  192.168.1.0/24(sync,rw,no_root_squash,no_all_squash)
# if you want to have a shared log
/var/log   192.168.1.21(sync,rw,no_root_squash,no_all_squash)

첫번째 내용은 내보낼 디렉터리고, 다음 내용은 누구에게 어떻게 내보낼 것인지를 나타냅니다. 이 내용은 각각의 디렉터리에 누가 마운트할 수 있어야 하는지, 마운트한 클라이언트가 파일 시스템에서 할 수 있는 일은 무엇인지 두 부분으로 나뉩니다. ro는 읽기 전용을 의미하고 rw는 읽기/쓰기를 의미합니다. no_root_squashno_all_squash 옵션은 디스크에 기록하는 무 디스크 클라이언트에 중요하므로 입출력 요청이 나타나면 "압축"하지 않습니다. 슬레이브의 /diskless/192.168.1.21/etc/fstab 파일은 다음과 같아야 합니다:

코드 fstab 슬레이브 예제
# these entries are essential
master:/diskless/192.168.1.21   /         nfs     sync,hard,intr,rw,nolock,rsize=8192,wsize=8192    0 0
master:/opt                     /opt      nfs     sync,hard,intr,ro,nolock,rsize=8192,wsize=8192    0 0
master:/usr                     /usr      nfs     sync,hard,intr,ro,nolock,rsize=8192,wsize=8192    0 0
master:/home                    /home     nfs     sync,hard,intr,rw,nolock,rsize=8192,wsize=8192    0 0
none                            /proc     proc    defaults                                     0 0
# useful but superfluous
master:/var/log                 /var/log  nfs     hard,intr,rw                                 0 0

이 예제에서 "마스터"는 그냥 마스터의 호스트이름이지만, 쉽게 마스터의 IP 주소가 될 수 있습니다. 첫번째 내용은 마운트 할 디렉터리를 나타내며 두번째 내용은 어디인지를 나타냅니다. 세번째 내용은 파일 시스템을 의미하며 NFS 마운트 디렉터리를 나타내기 위해 NFS가 되어야 합니다. 네번째 내용은 마운팅 과정에서 사용할 다양한 옵션을 나타냅니다(마운트 옵션을 보려면 mount(1) 참고). 어떤 사람은 소프트 마운트 지점의 개념에 어려움을 느끼기 때문에 모두 하드 마운트 지점으로 취급하겠습니다만, 클러스터를 효율적인 수단으로 만들려면 다양한 /etc/fstab 옵션을 살펴보셔야 합니다.

편집할 마지막 파일은 NFS를 초기화 했을 때 몇가지 언급 옵션을 다룰 /etc/conf.d/nfs 이며, 다음과 같아야 합니다:

코드 /etc/conf.d/nfs 마스터 예제
# Config file for /etc/init.d/nfs
  
# Number of servers to be started up by default
RPCNFSDCOUNT=8
  
# Options to pass to rpc.mountd
RPCMOUNTDOPTS=""

네트워크의 무디스크 노드가 몇대인지 RPCNFSDCOUNT 값을 바꾸어야 합니다.

NFS 서버 시작하기

다음 명령을 입력하여 /etc/init.d의 초기화 스크립트로 nfs 서버를 시작해야합니다:

root #/etc/init.d/nfs start

시스템을 부팅할 때 이 스크립트를 시작하려면 간단하게 다음 명령을 입력하십시오:

root #rc-update add nfs default

슬레이브 파일 시스템 완성하기

빠진 파일 복사

마스터와 같은 슬레이브 파일 시스템을 만들고, 슬레이브의 특정 파일을 보존하면서 필요한 바이너리를 넣겠습니다.

root #rsync -avz /bin /diskless/192.168.1.21
root #rsync -avz /sbin /diskless/192.168.1.21
root #rsync -avz /lib /diskless/192.168.1.21
참고
cp 대신 rsync -avz를 사용하는 이유는 심볼릭 링크와 권한을 유지하기 위함입니다.

무디스크 네트워크 설정

네트워크 초기화 스크립트가 NFS 서버와의 연결을 죽이는 현상을 막으려면, 무디스크 클라이언트 파일 시스템의 /etc/conf.d/net에 옵션을 추가해야 합니다.

코드 /etc/conf.d/net 편집
config_eth0=( "noop" )
참고
더 많은 정보는 /usr/share/doc/openrc-*/net.example.bz2를 읽어보십시오

초기화 스크립트

무 디스크 노드에서 필요한 서비스에 대해 슬레이브의 초기화 스크립트는/diskless/192.168.1.21/etc/runlevels 에 위치합니다. 각 슬레이브는 설정하고 개별화하 수 있으며 모든 요소는 어떤 슬레이브가 무얼 하느냐에 따라 달려있습니다.

경고
마스터에 로그인한 후 스크립트를 추가 삭제할 목적으로 슬레이브 런레벨에서 rc-update 프로그램을 사용하지 마십시오. 마스터 런레벨을 바꿀 것입니다. 링크를 직접 만들거나 ssh를 활용하여 슬레이브를 접속하든지 스크린, 키보드를 슬레이브에 연결해야 합니다.
코드 전형적인 슬레이브 런레벨
/diskless/192.168.1.21/etc/runlevels/:
total 16
drwxr-xr-x    2 root     root         4096 2003-11-09 15:27 boot
drwxr-xr-x    2 root     root         4096 2003-10-01 21:10 default
drwxr-xr-x    2 root     root         4096 2003-03-13 19:05 nonetwork
drwxr-xr-x    2 root     root         4096 2003-02-23 12:26 single
  
/diskless/192.168.1.21/etc/runlevels/boot:
total 0
lrwxrwxrwx    1 root     root           20 2003-10-18 17:28 bootmisc -> /etc/init.d/bootmisc
lrwxrwxrwx    1 root     root           19 2003-10-18 17:28 checkfs -> /etc/init.d/checkfs
lrwxrwxrwx    1 root     root           17 2003-10-18 17:28 clock -> /etc/init.d/clock
lrwxrwxrwx    1 root     root           22 2003-10-18 17:28 domainname -> /etc/init.d/domainname
lrwxrwxrwx    1 root     root           20 2003-10-18 17:28 hostname -> /etc/init.d/hostname
lrwxrwxrwx    1 root     root           22 2003-10-18 17:28 localmount -> /etc/init.d/localmount
lrwxrwxrwx    1 root     root           19 2003-10-18 17:28 modules -> /etc/init.d/modules
lrwxrwxrwx    1 root     root           18 2003-10-18 17:28 net.lo -> /etc/init.d/net.lo
lrwxrwxrwx    1 root     root           20 2003-10-18 17:28 netmount -> /etc/init.d/netmount
lrwxrwxrwx    1 root     root           21 2003-10-18 17:28 rmnologin -> /etc/init.d/rmnologin
lrwxrwxrwx    1 root     root           19 2003-10-18 17:28 urandom -> /etc/init.d/urandom
  
/diskless/192.168.1.21/etc/runlevels/default:
total 0
lrwxrwxrwx    1 root     root           23 2003-10-18 17:28 consolefont -> /etc/init.d/consolefont
lrwxrwxrwx    1 root     root           19 2003-10-18 17:28 distccd -> /etc/init.d/distccd
lrwxrwxrwx    1 root     root           19 2003-10-18 17:28 keymaps -> /etc/init.d/keymaps
lrwxrwxrwx    1 root     root           17 2003-10-18 17:28 local -> /etc/init.d/local
lrwxrwxrwx    1 root     root           16 2003-10-18 17:28 sshd -> /etc/init.d/sshd
lrwxrwxrwx    1 root     root           21 2003-10-18 17:28 syslog-ng -> /etc/init.d/syslog-ng
lrwxrwxrwx    1 root     root           17 2003-10-18 17:28 vixie-cron -> /etc/init.d/vixie-cron
  
/diskless/192.168.1.21/etc/runlevels/nonetwork:
total 0
lrwxrwxrwx    1 root     root           17 2003-10-18 17:28 local -> /etc/init.d/local
  
/diskless/192.168.1.21/etc/runlevels/single:
total 0

이제 슬레이브에 부팅할 때가 되었습니다. 잘 되었으면 좋겠군요 :-P 동작하나요? 허허, 축하합니다. 무디스크 노드가 생긴걸 자랑스러워하시겠군요.


This page is based on a document formerly found on our main website gentoo.org.
The following people contributed to the original document: Michael Andrews, Kristian Jerpetjoen, Xavier Neys
They are listed here because wiki history does not allow for any external attribution. If you edit the wiki article, please do not add yourself here; your contributions are recorded on each article's associated history page.