이 HOWTO문서는 여러분이 Gentoo Linux 배포판을 기반으로 하는
diskless machine이란 하드 디스크, 플로피 드라이브나 CD-ROM과 같은 일반적으로
사용되는 부트 디바이스를 가지고 있지 않은 PC를 뜻한다. diskless node는
네트워크를 통해 부팅되며, 로컬 하드 디스크처럼 사용할 수 있는 저장 공간을
제공하는 서버를 필요로 한다. 지금부터 우리는 서버를
여러분은 master node에 Gentoo가 설치되어 있어야 되고, 여러분이 host하고 싶은 slave node의 파일시스템을 저장할만한 충분한 공간이 master상에 있어야 한다. 여러분이 근거리 연결(local area connection)과 분리된 인터넷 인터페이스를 가지고 있는지도 확인하라.
커널이란 하드웨어와 시스템에 설치한 그 밖의 모든 소프트웨어 사이에 존재하는 소프트웨어이며, 커널의 중심부는 필수적으로 운영체제의 기반을 구성한다. 여러분이 컴퓨터를 켰을 때, BIOS는 하드 디스크의 지정된 부트 공간에 있는 instruction을 실행한다. 커널이 로드된 후에, 모든 프로세스는 커널에 의해 제어된다.
커널과 커널 설정에 관한 자세한 정보가 필요하면
master 커널은 여러분이 원하는만큼 커질 수도 있고, 알맞게 만들 수도 있지만, 여러분이 꼭 선택해야만 하는 몇가지의 커널 옵션이 있다. 아래와 같이 명령을 입력하여 커널 설정 메뉴를 실행한다.
# cd /usr/src/linux # make menuconfig
여러분은
# cp .config .config_working
아래와 같이 부메뉴로 들어가서 나열된 항목들이 built-in으로 체크되어 있는지
확인하라. (modular가
Code maturity level options ---> [*] Prompt for development and/or incomplete code/drivers Networking options ---> <*> Packet socket [ ] Packet socket: mmapped IO < > Netlink device emulation [ ] Network packet filtering (replaces ipchains) [ ] Socket Filtering <*> Unix domain sockets [*] TCP/IP networking [*] IP: multicasting File systems ---> [*] /proc file system support [*] /dev file system support (EXPERIMENTAL) [*] Automatically mount at boot Network File Systems ---> <*> NFS server support [*] Provide NFSv3 server support여러분이 마스터 노드를 통해 인터넷에 접속하고 싶거나 보안 방화벽을 만들고 싶다면 iptables 지원을 추가하라. [*] Network packet filtering (replaces ipchains) IP: Netfilter Configuration ---> <*> Connection tracking (required for masq/NAT) <*> IP tables support (required for filtering/masq/NAT)
패킷 필터링을 쓰고 싶다면, 여러분은 나머지를 나중에 모듈로 추가할 수 있다.
이를 어떻게 적절히 설치할 수 있는지에 대한
master의 커널을 재설정한 다음, 아래와 같이 rebuild하라.
# make dep # make clean bzImage modules modules_install(복사하기 전에 /boot가 마운트 되었는지 확인한다) # cp arch/i386/boot/bzImage /boot/bzImage-master # cp System.map /boot/System.map-master
그런 다음, 여러분이 사용하는 부트로더에 따라
slave 커널은 모듈없이 컴파일하는 것을 추천한다. 왜냐하면 원격 부팅을 통해 모듈을 로드하고 설정하는 것은 어렵고, 불필요한 작업이다. 게다가, slave 커널은 네트워크를 통해 효과적으로 부팅하기 위해서 최대한 작고 간단해야 한다. 우리는 master 커널이 설정되었던 공간에서 slave 커널을 컴파일할 것이다.
시간을 낭비하지 않고 혼란을 막기 위해 아래와 같이 명령을 실행하여 master 커널의 설정을 백업해 놓는 것은 좋은 생각이다.
# cp /usr/src/linux/.config /usr/src/linux/.config_master
이제 우리는 master 커널을 설정한 것과 같은 방법으로 slave 커널을 설정할 것이다.
여러분이 새로운 설정 파일을 이용하여 시작하고 싶다면,
아래와 같이 명령을 실행하여 기본 설정 파일인
# cd /usr/src/linux # cp .config_master .config
아래와 같이 명령을 실행하여 GUI 환경의 설정 화면으로 들어간다.
# cd /usr/src/linux # make menuconfig
아래의 옵션들을 module이
Code maturity level options ---> [*] Prompt for development and/or incomplete code/drivers Networking options ---> <*> Packet socket [ ] Packet socket: mmapped IO < > Netlink device emulation [ ] Network packet filtering (replaces ipchains) [ ] Socket Filtering <*> Unix domain sockets [*] TCP/IP networking [*] IP: multicasting [*] IP: kernel level autoconfiguration [*] IP: DHCP support (NEW) File systems ---> [*] /proc file system support [*] /dev file system support (EXPERIMENTAL) [*] Automatically mount at boot Network File Systems ---> <*> file system support [*] Provide NFSv3 client support [*] Root file system on NFS
지금부터 slave 커널을 컴파일해야 한다. master 커널을 컴파일할 때 만든 모듈을 망가뜨리고 싶지 않다면 지금부터 조심해야 한다.
# cd /usr/src/linux # make clean dep bzImage
slave의 파일과 필요한 파일을 저장해 놓을 디렉토리를 master상에 만들어 놓는다.
우리는
# mkdir /diskless # cp /usr/src/linux/arch/i386/boot/bzImage /diskless
master와 slave의 파일시스템은 얼마든지 조정되고 바뀔 수 있다.
지금부터 우리는 오로지 적당한 설정 파일과 마운트 포인트가 담길
준비적인 파일시스템을 만드는 데 집중할 것이다.
우선 첫번째 slave를 위한 디렉토리를
# mkdir /diskless/192.168.1.21
# cp -r /etc /diskless/192.168.1.21/etc
아직 파일시스템은 준비되지 않은 상태이다. 왜냐하면 파일시스템은 여러 마운트 포인트와 디렉토리를 필요로 하기 때문이다. 그것들을 만들기 위해 아래와 같이 명령을 실행한다.
# mkdir /diskless/192.168.1.21/home # mkdir /diskless/192.168.1.21/dev # mkdir /diskless/192.168.1.21/proc # mkdir /diskless/192.168.1.21/tmp # mkdir /diskless/192.168.1.21/mnt # chmod a+w /diskless/192.168.1.21/tmp # mkdir /diskless/192.168.1.21/mnt/.initd # mkdir /diskless/192.168.1.21/root # mkdir /diskless/192.168.1.21/var # mkdir /diskless/192.168.1.21/var/empty # mkdir /diskless/192.168.1.21/var/lock # mkdir /diskless/192.168.1.21/var/log # mkdir /diskless/192.168.1.21/var/run # mkdir /diskless/192.168.1.21/var/spool # mkdir /diskless/192.168.1.21/usr # mkdir /diskless/192.168.1.21/opt(openMosix 만) # mkdir /diskless/192.168.1.21/mfs
대부분의 "stubs"는 여러분이 알아볼 수 있어야 한다.
DHCP는 Dynamic Host Configuration Protocol의 약자이다. DHCP서버는 slave 컴퓨터가 PXE 부팅했을 때, 처음으로 연결하는 컴퓨터이다. DHCP 서버의 주 목적은 IP 주소를 할당하는 것이다. DHCP 서버는 ethernet의 MAC 주소를 바탕으로 IP주소를 할당한다. slave가 주소를 할당받으면, DHCP 서버는 slave에게 초기화 파일시스템과 커널이 어디 있는지 알려준다.
시작하기 전에 확인해야할 몇가지가 있다. 첫째로 네트워크의 연결을 확인해야 한다.
# ifconfig eth0 enable multicast # ifconfig -a
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
가장 중요한 부분은
네트워크에 DHCP 서버가 아직 설치되어 있지 않다면, DHCP 서버를 설치해야 한다.
# emerge dhcp
네트워크에 DHCP가 설치되어 있다면, PXE 부팅이 제대로 작동하기 위해서 설정을 해야 한다.
DHCP 서버를 시작하기 전에 고쳐야 할 설정파일은
# cp /etc/dhcp/dhcpd.conf.sample /etc/dhcp/dhcpd.conf # nano -w /etc/dhcp/dhcpd.conf
설정 파일의 일반적인 윤곽은 아래와 같이 의도적으로 정해진 방법을 따른다.
# 전체 옵션은 여기에 ddns-update-style none; shared-network LOCAL-NET {# 공유 네트워크 옵션은 여기에 subnet 192.168.1.0 netmask 255.255.255.0 {# 서브넷 네트워크 옵션은 여기에 host slave{# 호스트에 해당되는 옵션은 여기에 } group {# 그룹에 해당되는 옵션은 여기에 } } }
The
# DHCP configuration file for DHCP ISC 3.0 ddns-update-style none; # Definition of PXE-specific options # 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; subnet 192.168.1.0 netmask 255.255.255.0 { class "pxeclients" { match if substring (option vendor-class-identifier, 0, 9) = "PXEClient"; option vendor-class-identifier "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 (address 0.0.0.0 means no # address). option PXE.mtftp-ip 0.0.0.0; # This is the name of the file the boot ROMs should download. filename "pxelinux.0"; # This is the name of the server they should get it from.# 마스터의 IP를 쓰라 next-server 192.168.1.1; }# 여러분이 특정한 이미지를 사용하지 않고 etherboot를 사용한다면 다음을 쓴다 class "etherboot" { if substring (option vendor-class-identifier, 0, 9) = "Etherboot" { filename "/diskless/vmlinuz"; } } pool { max-lease-time 86400; default-lease-time 86400;# 다음 줄은 원하지 않는 기계가 IP를 얻는 것을 막는다 deny unknown clients; } host slave21 {# 슬레이브의 MAC 주소 hardware ethernet 00:40:63:C2:CA:C9;# 슬레이브의 정적 IP fixed-address 192.168.1.21; server-name "master";# 필요하다면 게이트웨이 IP option routers 192.168.1.1;# 필요하다면 DNS IP option domain-name-servers 192.168.1.1; option domain-name "mydomain.com";# 슬레이브 호스트 이름 option host-name "slave21";# MAC에 해당하는 이미지로 etherboot나 pxe boot를 할 경우 쓴다 option root-path "/diskless/192.168.1.21"; if substring (option vendor-class-identifier, 0, 9) = "Etherboot" { filename "/vmlinuz_arch"; } else if substring (option vendor-class-identifier, 0,9) ="PXEClient" { filename "/pxelinux.0"; } } }
# man dhcpd.conf
dhcp의 초기화 스크립트를 실행하기 전에
IFACE="eth0"# 필요한 다른 옵션들을 집어넣는다
# /etc/init.d/dhcp start
아래와 같이 명령을 실행하여 start-up 스크립트에 dhcp 서버를 추가한다.
# rc-update add dhcp default
제대로 부팅되었는 지 확인하기 위해
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 서버는 제대로 broadcasting하고 있다는 것을 뜻한다.
no free leases on subnet LOCAL-NET
설정 파일을 변경하고 그 변경된 내용을 적용할 때마다 DHCP 서버를 재시작해야 한다.
# /etc/init.d/dhcpd restart
TFTP는 Trivial File Transfer Protocol의 약자이다. TFTP 서버는 slave에게 커널과 초기화 파일시스템을 제공할 것이다. slave 커널과 파일시스템 모두는 TFTP 서버에 저장될 것이다. 그래서 master를 TFTP 서버로 만드는 것은 좋은 생각이다.
가장 추천하는 tftp 서버는 tftp-hpa 패키지에서 구할 수 있다. 이 tftp 서버는 SYSLINUX 제작자가 만든 것이고, pxelinux와 잘 작동할 것이다. 아래와 같이 명령을 실행하여 설치할 수 있다.
# emerge tftp-hpa
INTFTPD_PATH="/diskless" INTFTPD_OPTS="-l -v -s ${INTFTPD_PATH}"
다음과 같이 명령을 실행하여 tftp서버를 시작한다.
# /etc/init.d/in.tftpd start
위 명령은 여러분이
# rc-update add in.tftpd default
여러분이 이더부트만 사용한다면 이 절은 건너뛰어도 된다. PXELINUX는 TFTP를 통해 제공될 LILO나 GRUB과 같은 기능을 하는 네트워크 부트로더이다. PXELINUX는 client에게 커널과 초기화 파일시스템이 어디에 위치하는 지를 알려주며 여러가지 커널 옵션을 지정할 수 있게 해주는 instruction으로 이루어진 필수적인 작은 묶음이다.
여러분은 H. Peter Anvin이 만든 SYSLINUX 패키지에 포함된 pxelinux.0 파일을 준비해야 한다. 아래와 같이 명령을 실행하여 패키지를 설치할 수 있다.
# emerge syslinux
tftp 서버를 시작하기 전에 pxelinux를 설치해야 한다.
우선
# cp /usr/lib/syslinux/pxelinux.0 /diskless # mkdir /diskless/pxelinux.cfg # touch /diskless/pxelinux.cfg/default
위 작업은 기본 부트로더 설정 파일을 생성할 것이다.
(16진수로 지정된 IP) C0A80115 C0A8011 C0A801 C0A80 C0A8 C0A C0 C(처음의 01은 이더넷을 의미하고, 다음 바이트들은 슬레이브의 MAC 주소와 일치한다.) 01-00-40-63-c2-ca-c9 default
DEFAULT /diskless/bzImage APPEND ip=dhcp root=/dev/nfs nfsroot=192.168.1.1:/diskless/192.168.1.21
Etherboot는 TFTP 서버의 네트워크 부트 이미지를 이용해 부트한다.
PXE와 같이 이것도 LILO나 GRUB과 동등하다.
여러분은 Etherboot 이미지를 만들기 위해
# emerge mknbi
이 절에서 우리는 단순한 Etherboot 이미지를 만들 것이다. dhcp 서버가 클라이언트에게 dhcp.conf의 "option root-path"에 있는 root-path를 제공하기 때문에, 우리는 이를 여기에서 설명하지 않을 것이다. 더 자세한 내용은 mknbi 매뉴얼에서 찾을 수 있다.
# man mknbi
부트 이미지를 만들어야 한다. dhcp와 rootpath를 커널에 넘길 수 있는 부트 가능한 ELF 이미지를 만들 것이다. 또한 커널에게 네트워크에서 dhcp 서버를 찾도록 강제해야 한다.
# mkelf-linux -ip=dhcp /diskless/bzImage > /diskless/vmlinuz
여러분이 네트워크 부트 프로세스를 디버그할 수 있는 몇가지가 있다.
첫째로 여러분은
# emerge tcpdump
이제부터 여러분은 여러가지 네트워크 트래픽을 탐지할 수 있고, 여러분의 client/server간의 통신이 제대로 이루어지는 지 확인할 수 있다. 제대로 작동하지 않는 것들이 있을 때, 여러분이 체크할만한 몇가지가 있다. 우선 확인해야 할 것은 client/server가 물리적으로 적절히 연결되어 있는 지와 네트워크 케이블이 손상되지 않았는 지이다. client/server가 특정 포트에서 요청을 받아들이지 못한다면, 방화벽에 의한 간섭이 없는 지 확인해라. 두 컴퓨터 사이의 통신을 확인하기 위해서 아래와 같이 명령을 실행해라.
# tcpdump hostclient_ip andserver_ip
아래와 같이 명령을 실행하여
# tcpdump port 69
보통 "PXE-E32: TFTP open time-out"와 같은 에러가 생길 것이다.
이 에러는 방화벽에 관련된 에러이다.
NFS는 Network File System의 약자다. NFS 서버는 slave에게 디렉토리를 제공하기 위해 사용될 것이다. 이부분은 나중에 조금씩 개인적으로 변경될 수 있다. 지금 다루려는 공통된 부분은 미리 준비된 slave node가 diskless 부팅을 하는 것이다.
여러가지 client/server 서비스는 특정 포트를 탐지하지 못하고 대신 RPCs(Remote Procedure Calls)에 의존한다. 서비스가 초기화될 때, 서비스는 임의의 포트를 탐지하고 Portmapper 유틸리티를 이용하여 그 포트를 등록한다. NFS는 RPCs에 의존적이어서 NFS가 시작되기 전에 Portmapper가 실행되어 있어야 한다.
NFS 서버는 커널레벨 지원이 필요하며, 여러분의 커널이 지원하지 못하면 master 커널을 다시 컴파일하여야 한다. 아래와 같이 명령을 실행하여 master 커널을 다시 한번 확인하라.
# grep NFS /usr/src/linux/.config_master
커널이 제대로 설정되었다면, 아래와 같은 결과를 보게 될 것이다.
# CONFIG_ROOT_NFS is not set CONFIG_NFSD=y CONFIG_NFSD_V3=y # CONFIG_NFSD_TCP is not set # CONFIG_NCPFS_NFS_NS is not set
portage를 통해 NFC 패키지를 설치하려면 아래와 같은 명령을 실행한다.
# emerge nfs-utils
이 패키지는 portmapping utility, nft sserver, nfs client utilities를 설치하고, 자동으로 의존성을 구성해준다.
여러분은 세가지 주요 설정 파일을 고쳐야 한다.
/etc/exports /diskless/192.168.1.21/etc/fstab /etc/conf.d/nfs
전형적인 master의
# 각 슬레이브에 대해 다음과 같은 줄을 하나씩 /diskless/192.168.1.21 192.168.1.21(sync,rw,no_root_squash,no_all_squash)# 모든 슬레이브에 공통 /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)# 공유 로그를 쓰고 싶은 경우 /var/log 192.168.1.21(sync,rw,no_root_squash,no_all_squash)
첫번째 필드는 export될 디렉토리를 가리키며, 다음 필드는 대상과 방법을 가리킨다.
이 필드는 두 부분으로 나누어 볼 수 있다.
누가 특정한 디렉토리에 마운트할 수 있도록 허락되었는지와
마운트하는 client가 파일시스템에 무엇을
(
# 이 항목들은 필수다 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# 유용하지만 필요하지는 않다 master:/var/log /var/log nfs hard,intr,rw 0 0(openMosix 클러스터를 설치할 때만) none /mfs mfs dfsa=1 0 0
이 예에서,
여러분이 수정해야할 마지막 파일은
# 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=""
여러분은
여러분은 아래와 같이 명령을 실행하여
# /etc/init.d/nfs start
만약 시스템이 부팅될 때 nfs 서버를 시작하기 위해 이 스크립트를 실행하려면 아래와 같이 명령을 실행해라.
# rc-update add nfs default
지금부터 master의 파일시스템에 맞춰서 slave의 파일시스템을 만들고, 구체적인 몇몇 파일을 보존하면서 필요한 바이너리를 넣을 것이다.
# rsync -avz /bin /diskless/192.168.1.21 # rsync -avz /sbin /diskless/192.168.1.21 # rsync -avz /lib /diskless/192.168.1.21
기본 스크립트는 여러분의 slave node에는 맞지 않는
(다음 부팅을 위해 /fastboot 파일 만들기) # touch /diskless/192.168.1.21/fastboot(부팅할 때마다 /fastboot 파일 만들기) # echo "touch /fastboot" >> /diskless/192.168.1.21/etc/conf.d/local.start
여러분의 diskless node에서 필요한 서비스에 해당하는 초기화 스크립트를 디렉토리 안에 넣어 놓아야 한다. 이 작업은 여러분의 slave가 무엇을 할지에 따라 결정된다.
/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 23 2003-10-18 17:28 consolefont -> /etc/init.d/consolefont lrwxrwxrwx 1 root root 20 2003-10-18 17:28 hostname -> /etc/init.d/hostname lrwxrwxrwx 1 root root 19 2003-10-18 17:28 keymaps -> /etc/init.d/keymaps lrwxrwxrwx 1 root root 22 2003-10-18 17:28 localmount -> /etc/init.d/localmount 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 19 2003-10-18 17:28 portmap -> /etc/init.d/portmap lrwxrwxrwx 1 root root 21 2003-10-18 17:28 rmnologin -> /etc/init.d/rmnologin lrwxrwxrwx 1 root root 18 2003-10-18 17:28 serial -> /etc/init.d/serial 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 17 2003-10-18 17:28 clock -> /etc/init.d/clock lrwxrwxrwx 1 root root 19 2003-10-18 17:28 distccd -> /etc/init.d/distccd lrwxrwxrwx 1 root root 17 2003-10-18 17:28 local -> /etc/init.d/local lrwxrwxrwx 1 root root 19 2003-10-18 17:28 metalog -> /etc/init.d/metalog lrwxrwxrwx 1 root root 22 2003-10-18 17:28 ntp-client -> /etc/init.d/ntp-client lrwxrwxrwx 1 root root 16 2003-10-18 17:28 ntpd -> /etc/init.d/ntpd lrwxrwxrwx 1 root root 16 2003-10-18 17:28 sshd -> /etc/init.d/sshd lrwxrwxrwx 1 root root 17 2003-10-18 17:28 vcron -> /etc/init.d/vcron /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
지금이야 말로 여러분의 slave를 부팅하고 행운을 빌기에 좋은 시간이다. 작동하는가? 축하한다. 여러분은 diskless node의 소유자로서 스스로 자랑스럽게 여겨도 좋다. :)