Bootp-Tftp HowTo

bootp & tftp

작성일 : 2001.04.04

작성자 : 안영수 (nurie@dreamwiz.com)

<제목차례>

1. Bootp란?	2

2. Bootp 설치	2

3. bootptab 설정	3

4. Bootp 실행	5

5. Bootp 동작 순서	7

6. Bootp Header	8

7. Bootp Packet 보기	8

8. tftp 설치	10

9. tftp packet	10

10. tftp 전송 순서(RRQ의 경우)	11

참고 1. Linux에서의 TCP/IP 통신	12

%% 이 문서는 wow linux 7.0 kachi version에서의 동작을 기준으로 작성하였습니다.

%% umba, adel, allix 등 redhat 계열의 다른 linux에서도 동일하게 적용됩니다.

%% 이 문서는 T&B Tronics에서 작성되었습니다. 잘못되거나 변경해야 할 사항이 있으면 연락 주시면 고맙겠습니다. (www.t-b.co.kr,

%% 문의 사항은 T&B Tronics(www.t-b.co.kr)로 문의 주시기 바랍니다.

1. Bootp란?

① Bootp는 tcp/ip상에서 자동부팅을 위한 최초의 표준으로, 디스크 장치가 없는 클라이언트를 구동시키기 위한 프로토콜로 개발되었습니다.

② 하위 프로토콜로 ip, udp 프로토콜을 사용합니다.

③ 여기서는 Tftp와 함께, Bootloader에서 Kernel과 Ramdisk Image를 Host에서 Target으로 가져오기 위해 사용합니다. Bootp는 Target이 Tftp를 사용을 위한 Target의 IP와 Host에 대한 정보를 가져오기 위해 사용합니다.

2. Bootp 설치

① bootpd를 설치하기 위해서는 inetd가 설치되어 있어야 합니다.

inetd가 설치되어 있지 않다면, inetd를 설치합니다. inetd rpm이 설치었는지는 다음의 명령어로 확인할 수 있습니다.

rpm -qa | grep inetd

rpm의 -qa 옵션은 현재 설치된 rpm의 list를 출력합니다(q:question, a:all). 이것을 pipe를 이용하여 grep을 실행하라는 명령인데, bootp라는 문자가 포함된 line을 보여 줍니다. 자세한 내용은 man rpm, man bootp를 참조하세요(일부이지만 man.kldp.org에서 한글 man page를 구할 수 있습니다. 이곳을 참조하시면, rpm 명령의 경우 한글로 된 man page를 볼 수 있습니다).

다른 방법으로 확인하시려면, /usr/sbin/inetd 파일이 있는지 확인하시면 됩니다. /usr/sbin/inetd는 Network Port를 관리하는 daemon 입니다.

설치되어 있지않다면, inetd daemon을 설치합니다. rpm 파일은 배포된 CD에 포함되어 있습니다.

② bootpd가 설치되어 있는지 확인합니다.

bootpd rpm이 설치었는지는 다음의 명령어로 확인할 수 있습니다.

rpm -qa | grep bootp

rpm의 -qa 옵션은 현재 설치된 rpm의 list를 출력합니다(q:question, a:all). 이것을 pipe를 이용하여 grep을 실행하라는 명령인데, bootp라는 문자가 포함된 line을 보여 줍니다. 자세한 내용은 man rpm, man bootp를 참조하세요(일부이지만 man.kldp.org에서 한글 man page를 구할 수 있습니다. 이곳을 참조하시면, rpm 명령의 경우 한글로 된 man page를 볼 수 있습니다).

다른 방법으로 확인하시려면, /usr/sbin/bootpd 파일이 있는지 확인하시면 됩니다. /usr/sbin/bootpd는 bootp daemon 입니다. 이미 bootp가 설치되어 있다면 다시 설치할 필요없이 /etc/bootptab에 설정을 추가하시고 사용하시면 됩니다.

③ bootp rpm을 구합니다. rpm 파일은 CD에 포함되어 있습니다.

④ bootpd가 설치되어 있지 않을 경우, rpm을 설치합니다.

설치하기 위해서는 다음의 명령을 실행합니다.

rpm -ih bootp-2.4.3-7.i386.rpm

rpm의 옵션 -ih에서 i는 install, h는 hash를 뜻합니다. 설치하면서 진행과정을 □#□으로 표시하라는 옵션입니다. 이때 inetd가 설치되어 있지 않으면, inetd가 필요하다는 에러가 출력되는데, 필요한 rpm을 먼저 설치하여야 합니다.

이미 설치된 bootpd의 Upgrade를 하시려면 -U 옵션을 사용합니다(U:upgrade).

rpm -Uh bootp-2.4.3-7.i386.rpm

참고로 설치된 rpm을 제거하는 옵션은 -e 입니다(e:erase).

rpm -e bootp-2.4.3-7

-e 옵션 뒤에 붙는 이름은 설치된 rpm의 이름입니다. rpm -qa를 실행하시면 이름을 확인하실 수 있습니다. 이 이름은 일반적으로 program 이름과 버전번호로 구성되어 있습니다.

설치가 되면 /usr/sbin/bootpd 파일이 생성됩니다.

3. bootptab 설정

bootp 요청이 있을 때 bootpd는 /etc/bootptab에 정의된 client 정보를 기반으로 bootp reply packet을 만들어 응답합니다. 그래서, bootp를 사용하기 위해서는 이 /etc/bootptab에 client의 Mac Address와 할당할 IP등의 정보가 입력되어 있어야 합니다.

bootptab 파일은 bootpd(the Internet Bootstrap Protocol Server)를 위한 환경설정 데이터베이스 파일입니다. host의 매개변수로, 대소문자를 구분하는 두 개의 문자로 된 tag symbols를 사용합니다.

hostname:tg=value:tg=value:tg=value:

hostname에는 bootp client(or a "dummy entry")의 실제 이름이 들어가고, tg는 두 개의 문자로 구성된 tag sysbol이다. 각각의 sysbol에 해당하는 값은 value에 들어갑니다.

/etc/bootptab의 각각의 인자는 다음과 같습니다(man bootptab에서 나오는 내용 중 일부에 약간의 주석만 달았습니다).

bf	Bootfile

bs	Bootfile의 크기, 512 bytes block 단위

cs	Cookie server address list

df	Merit dump file

dn	Domain name

ds	Domain name server address list. 사용할 DNS(Domain name server)의 이름을 기록합니다. 사용하지 않는다면 생략해도 됩니다.

ef	Extension file

gw	Gateway address list. gateway이 직접 연결되어 있다면, gateway의 IP를 기록합니다. closs-cable로 연결되어 있다면, 생략해도 됩니다.

ha	Host hardware address. 10Mb Ethernet의 경우 6 byte의 Mac Address 사용하므로, client의 Mac Address를 기록합니다.

hd	Bootfile home directory

hn	Send client's hostname to client

ht	Host hardware type. Network의 hardware type으로 10Mb Ethernet이면 ethernet이나 ether를, 3Mb experimemtal Ethernet이면 ethernet3이나 ehter3등을 사용할 수 있습니다. 자세한 내용은 man bootptab을 하시면, ht에 대한 설명에서 찾으실 수 있습니다.

im	Impress server address list

ip	Host IP address (Client에 할당할 IP Address입니다).

lg	Log server address list

lp	LPR server address list. 설정된 ha (Client Mac Address)에서 요청이 왔을 때, Client에 할당할 IP를 기록합니다.

ns	IEN-116 name server address list

nt	NTP (time) Server (RFC 1129)

ra	Reply address override

rl	Resource location protocol server address list

rp	Root path to mount as root

sa	TFTP server address client should use

sm	Host subnet mask (자신의 pc에 설정된 subnet mask를 기록합니다).

sw	Swap server address

tc	Table continuation (공통적으로 입력하기 위해 만들어진 Table로 대채합니다. value는 table의 이름입니다)

td	TFTP root directory used by &quot;secure&quot; TFTP servers

to	Time offset in seconds from UTC

ts	Time server address list

vm	Vendor magic cookie selector

yd	YP (NIS) domain name

ys	YP (NIS) server address

Bootptab 예.

default:sm=255.255.255.192:\

gw=211.104.101.254:

first:ht=ethernet:\

ha=0x00D0CAF12621:\

ip=211.104.101.244:\

tc=default:

second:ht=ethernet:\

ha=0x00D0CAF12623:\

ip=211.104.101.244:\

tc=default:

Ethernet을 cross-cable로 연결했을 때와 gateway에 연결했을 때 모두 사용 가능합니다.

default	: 여러개의 client 정보를 나타내고자 할 때 공통적으로 들어갈 내용을 사용하면 편합니다. 위의 예에서는 first에서 tc=default 항목이 있는데 default의 내용이 이것을 대체하게 됩니다. first는 결과적으로,

first:ht=ethernet:\

ha=0x00D0CAF12621:\

ip=211.104.101.244:\

sm=255.255.255.192:\

gw=211.104.101.254::

이 됩니다.

ht (Hardware Type)는 10Mb Ethernet을 사용하므로 ehternet, ha (Hardware Address)는 Bootp Request를 보낼 Target(Bootp Client)의 Mac Address, ip는 Target에 할당할 IP Address, sm (subnet mask)과 gw (gateway)는 Host (Bootp Server)와 동일하게 적어주면 됩니다.

%% 참고 : TBEL1110에서는 Bootloader가 실행중인 상태에서 bootp를 실행하시면, 나오는 정보중에 Mac Address가 있습니다.

4. Bootp 실행

linux에서 Network Daemon을 실행하는 방법은 두가지가 있습니다. 하나는 inetd에서 실행할 수 있도록 설정을 해주어서, 요구하는 packet이 들어오면, inetd가 필요한 daemon을 실행시키는 것이고, 다른 하나는 daemon을 미리 실행시켜 두는 것입니다. 자원의 효율적 관리 측면에서는 필요없을 때 실행되지 않는 전자가 유리하지만, 빠른 반응에는 미리 실행되어 기다리는 후자가 유리합니다. 실제 반응 속도의 차이는 사용자가 느끼지 못할 정도로 적으므로, system 자원을 낭비하지 않는 후자를 권합니다.

4.1. inetd를 통하여 bootpd를 구동할 경우

① /etc/services 파일을 확인합니다.

linux에서 port 할당은 /etc/services에서 관리하므로, bootpd를 사용하기 위해서는 /etc/services 파일의 내용중에 다음의 내용이 있는지 확인합니다(#은 이후는 주석입니다. 무시해도 됩니다).

bootps	67/tcp	# 67번 port, tcp packet을 bootps로 처리합니다.

bootps	67/udp	# 67번 port, udp packet을 bootps로 처리합니다.

bootpc	68/tcp	# 68번 port, tcp packet을 bootpc로 처리합니다.

bootpc	68/udp	# 68번 port, udp packet을 bootpc로 처리합니다.

위의 내용이 있는지 확인하고 없다면 기록합니다. 일반적으로 위의 내용은 포함되어 있습니다. 실제 host에서는 bootp server를 필요로 하며, udp를 사용하므로, 두번째 줄의 내용만 있으면 됩니다.

② /etc/inetd.conf에서 bootp를 사용할 수 있도록 설정합니다.

inetd에서 bootp request가 왔을 때, bootp daemon을 실행하려면, 이 inetd.conf에 필요한 정보가 있어야 합니다.

bootps	datagram	udp	wait	root	/usr/sbin/tcpd	bootpd

중요한 것은 bootps와 bootpd 항목인데, bootps는 /etc/services에 있던 67번 port, udp service의 이름이며, bootpd는 실제 실행될 daemon program의 이름(/usr/sbin/bootpd을 가리킵니다.)입니다. dgram은 datagram packet을 사용하며, udp는 udp packet format을 말합니다.

일반적으로 위의 줄이 주석처리 되어 있는데, 앞의 주석마크(□#□)를 제거하는 것으로 inetd에서 bootpd 설정은 끝납니다.

③ inetd를 다시 실행합니다.

inetd에 inetd.conf의 내용이 적용되기 위해서는 inetd를 다시 실행해야 합니다. 다음의 명령으로 inetd의 실행여부를 확인합니다.

ps aux | grep inetd

ps는 현재 실행중인 process의 list를 출력하는 명령입니다. 이 결과를 grep 명령으로 inetd를 포함하는 이름을 가진 process만 출력합니다. 출력되는 list 중 inetd가 있다면 inetd가 실행중인 상태입니다. inetd가 실행중이 아니라면, 아래의 과정은 생략하고, ④으로 넘어 갑니다.

이 process를 중지시켜야 하는데, 중지시키려면 다음의 명령을 실행합니다.

ps aux | killall inetd

이 명령은 실행중인 process 중 inetd를 포함하는 이름을 가진 모든 process를 실행중지 시킵니다. 편하지만 조금 위험합니다. 다른 방법으로는 kill 명령을 사용할 수 있습니다. "ps aux" 명령을 실행하면 현재 실행중인 proecess의 list가 나오는데 실행중지할 process의 PID 항목을 확인합니다. kill 명령을 -9 옵션과 함께 PID를 인자로 사용하면 process를 중지시킬 수 있습니다.

다음은 ps aux를 실행한 결과중 일부입니다.

USER     PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND

root         1   0.0    0.0    1308  68   ?         S   Apr02    0:10 init [5]

.

.

root     1485   0.0     0.1   1344  132  ?         S   Apr02    0:00  inetd

.

.

여기서는 inetd의 PID가 1485입니다. 다음의 명령을 실행하여 process를 중지시킵니다.

kill -9 1485

④ inetd를 실행합니다.

다음을 실행합니다.

/usr/sbin/inetd

daemon을 실행하는 것은 root의 권한을 가지고 있어야 합니다. 이때부터는 bootp request가 오면, inetd가 bootpd를 깨워서 반응할 수 있도록 합니다.

4.2. bootp daemon을 직접 구동할 경우

① inetd를 거치지 않기 때문에 daemon를 실행시키면 됩니다.

다음을 실행시킵니다. daemon를 실행시키는 것이기 때문에 root 권한으로 실행해야 합니다.

/usr/sbin/bootpd -s

-s 옵션은 강제로 독립적으로 daemon을 실행시키기 위한 옵션입니다.

5. Bootp 동작 순서

① Target board는 host에게 Bootp Request Packet을 보낸다.

② Host에 Packet이 수신된다.

③ inetd를 사용하여 bootpd를 구동할 경우, 수신된 Packet을 처리하기 위해, inetd가 /etc/inetd.conf를 참조하여 bootpd를 실행시킨다.

④ 수신된 Packet을 bootpd에게 넘긴다.

⑤ bootpd는 /etc/bootptab을 참조하여 Bootp Reply Packet을 보낸다.

⑥ Target은 Bootp Reply가 자신의 것임을 확인한 후 IP와 Host의 정보를 가져온다.

6. Bootp Header

0                      8                      16                      24                    32 (bit)

Operation Code	Hardware Type	Hardware Address Length	HOP Count
Transaction ID
Number of seconds		Unused
Client IP address
Your IP address
Server IP address
Gageway IP address
Client hardware address (16bytes)
Server Hostname (64bytes)
Boot filename (128bytes)
Vendor-specific information (64bytes)

bootp 메시지는 고정길이 필드(총 300바이트) 사용 : Request와 Reply가 같은 양식을 사용

Operation Code	: Bootp Packet의 역할. 1=Request , 2=Reply.

Hardware type	: 사용하는 Network의 Hardware 종류. 10Mb Ethernet의 경우 1.

Hardware Address Length : 사용하는 Network의 Hardware Address의 길이. 10Mb Ethernet의 경우 6 byte Mac Address를 사용하므로 6.

HOP Count	: 0으로 set, 게이트웨이에 의해 임의로 사용.

Transaction ID	: 임의의 값(Random). Client가 임의의 값을 기록하여 Request를 보내면, Server는 동일한 값을 기록하여 Reply를 보낸다. 이 값으로 Client는 자신이 보낸 Request에 대한 응답임을 확인.

Number of Second	: Client가 bootstrap을 시도한 시간을 set. Secondary server는 이 시간을 참고하여 일정시간이 경과할 때까지 응답하지 않음.

Client IP Address	: Client가 자신의 IP를 기록. 할당된 IP가 없으면, Request에서 0으로 채워서 보냄.

Your IP Address	: Client에 할당된 IP가 없을 때, Bootp Request Packet에서 0을 채워서 보내면, Server는 /etc/bootptab을 참조하여, 할당할 IP를 기록하여 응답.

Server IP Address	: Server에 의해 채워짐.

Gateway IP Address : Proxy server를 사용할 경우 Proxy server의 라우터 IP Address를 보충

Client Hardware Address : Client는 반드시 Setting. 10Mb Ethernet의 경우 Mac Address를 사용함.

Server Host Name : Client는 옵션으로 원하는 서버 지정 가능. 만일 0이면 임의의 서버, 0이 아니면 특정 서버 지정

Boot Filename	: Client는 일반적인 Boot Filename 기술. 서버가 응답시(Reply) Boot file의 실제 경로 제공. 사용하지 않아도 됨.

vendor-specific information : Bootp의 확장과 추가적인 매개변수에 사용.

7. Bootp Packet 보기

bootp request와 bootp reply를 캡쳐한 그림입니다. ethereal이라는 프로그램으로 packet을 capture하고, gimp로 image를 capture했습니다. ethereal은 redhat 계열의 linux CD에 포함되어 있고, gimp는 기본으로 설치되는 image 편집 프로그램입니다.

linux CD에서 ethereal로 시작하는 rpm을 찾아서 설치하려고 하면, 설치되기 위해 필요할 rpm의 list가 나오는데 각각을 먼저 설치하시고, ethereal을 설치하시면 됩니다.

7.1. bootp request

7.3. bootp reply

8. tftp 설치

아래 과정은 root의 권한으로 실행합니다.

① tftp rpm을 설치합니다.

tftp rpm을 구합니다. tftp rpm은 client와 server가 분리되어 있는데, tftp-server로 시작하는 rpm을 설치하여야 합니다. 프로그램은 CD에서 포함되어 있으며, T&B Tronics(www.t-b.co.kr)에서 다운로드 할 수 있습니다.

rpm -ivh tftp-server-0.16-5.i386.rpm

설치되었는지 확인하는 방법은 「2. bootp 설치」를 참조하시면 됩니다.

② inetd.conf를 설정합니다.

bootpd와 마찬가지로 일반적으로 tftpd도 inetd를 통하여 실행합니다. inetd가 tftpd를 실행하기 위해서는 inetd.conf에 다음의 내용이 있어야 합니다.

tftp   dgram   udp   wait   root   /usr/sbin/tcpd   in.tftpd   /tftpdir

tftp는 service의 이름으로 /etc/services에 □tftp   69/udp"에 있는 이름이며, in.tftpd는 inetd가 필요할 때 실행할 daemon의 이름으로 rpm 설치시 /usr/sbin/in.tftpd로 생성됩니다.

마지막의 /tftpdir은 tftp daemon의 root directory로 tftp 요청시 필요한 파일을 이곳을 기준으로 찾습니다. 이 directory와 subdirectory에서만 찾습니다. tftp로 다운로드 하고자 하는 Kernel과 Ramdisk Image는 이곳에 있어야 합니다. 필요하다면 다른 이름을 사용하여도 됩니다.

③ tftp directory를 생성합니다.

②와 같이 설정하였다면 /tftpdir을 생성합니다. 위의 설정에서 /tftpdir 대신 다른 기존에 있던 directory를 사용한다면 이 과정은 생략합니다.

mkdir /tftpdir

mkdir은 directory를 생성하는 명령입니다.

④ tftp로 download 하고자 하는 file을 /tftpdir로 복사합니다.

9. tftp packet

tftp는 파일을 보내고 받는 두가지 기능을 가집니다.

9.1. RRQ (Read Request)

file을 읽기 위한 요청을 합니다. filename과 전송방식을 기록하여 보내면 tftp server는 해당하는 file을 찾아 data packet을 보내기 시작합니다.

9.2. WRQ (Write Request)

file을 쓰기 위한 요청입니다. tftp client는 이 packet을 보낸 후 data packet을 계속해서 보냅니다.

9.3. DATA

file의 data를 전송하는 packet입니다. 몇번째 block인지를 나타내는 정보와 함께, 512 bytes 단위로 전송하며, 512 bytes 보다 적은 내용이 남아 있으면, 남아 있는 부분만 전송합니다. 이때 받는 쪽은 512 bytes보다 적은 data가 온 것으로 전송이 끝났음을 확인합니다.

9.4. ACK

data의 수신시 정상적으로 수신하였음을 상대방에게 알림니다.

9.5. ERR

RRQ가 있었으나 file이 존재하지 않는 경우와 같이, 잘못된 packet이 왔을 때 error message와 함께, 잘못되 packet이 왔음을 상대방에게 알림니다.

9.6. packet format

10. tftp 전송 순서(RRQ의 경우)

참고 1. Linux에서의 TCP/IP 통신

TCP/IP 통신의 daemon들은 일반적으로 inetd 슈퍼서버를 통해 관리된다. 이렇게 관리되는 대표적인 daemon이 telnet, ftp등이며, bootpd, tftpd도 이런 방식으로 동작할 수 있다. 하지만, httpd와 같이 독립적으로 실행되는 daemon도 있다.

Inetd은 TCP/IP를 통하여 통신을 하고자 할 때 port를 관리하는 데몬이다. 여러 개의 daemon이 실행 중이면 system에 부하가 많이 걸리므로, packet의 수신시 필요하면 inetd를 통하여, 필요로 하는 daemon을 실행시킨다.

이때 요청이 온 packet의 port 번호를 /etc/services에서 찾아서 상위 protocol을 확인하고, /etc/inetd.conf에서 실행시킬 daemon을 찾아 실행시킨다.

daemon의 설치할 때는 /etc/service에서 해당되는 port가 지정되어 있는지 확인하고, /etc/inetd.conf에 daemon에 해당하는 설정이 바르게 설정되어 있는지 확인해야 한다.