TFTP란
TFTP 구축 필요성
리눅스 호스트의 서비스 실행 설정
리눅스 호스트의 TFTP 서버 환경 설정
tftp 전송 테스트

TFTP란

tfpt란 Trivial File Transfer Protocol의 약자로 이더넷을 이용하여 파일을 송수신하는 프로토콜입니다. udp 방식을 사용하며, ftp와 같은 파일 전송 프로토콜이지만 매우 간단하게 만들어졌기 때문에 부트로더와 같은 작은 크기의 프로그램에서도 수행이 가능하다는 장점이 있습니다. 보통 BOOTP와 연동하여 네트워크 부트를 할 때에도 사용됩니다.

ftp 프로토콜은 tcp 프로토콜(3웨이 핸드쉐이킹방식, 자세한 사항은 네트웍 관련 서적을 참고 하기 바랍니다.)을 사용하지만, tftp는 udp프로토콜(단방향 핸드쉐이킹 방식)을 사용하여 전송합니다.

동작되는 방식은 클라이언트가 서버에 접속하여 파일을 요청하면, 서버는 해당 파일을 전송하고, 이를 클라이언트는 응답하는 방식입니다. 매번 파일의 일 부분의 블록을 전송할 때, 블록의 길이를 전송하는데 이 블록의 크기는 고정되어 있어서 이 크기보다 작은 블록이 오면 파일의 마지막 블록으로 인식합니다.

장점이라면 앞서 말씀드린 바와 같이 크기가 작아서 부담이 적고 대부분의 유닉스에 기본으로 설치되기 때문에 따로 설치할 필요가 없습니다. 대신에 블록 하나라도 전송에 실패하면 전송을 중지하므로 패킷 손실이 많은 환경에서는 사용이 곤란하다는 단점이 있습니다.

TFTP 구축 필요성

타겟보드에 리눅스를 다운로드 하는 방식에는 시리얼을 이용하는 방식과 랜을 이용하는 방식이 있습니다. 시리얼을 이용하는 것은 시리얼 케이블만 연결하면 되기 때문에 간편하지만 대신에 전송하려는 파일이 클 경우에는 시간이 너무 걸려서 작업이 어렵습니다.

대신에 랜을 이용하시면 시리얼 통신의 속도 문제를 해결할 수 있어서 개발 속도를 높이고 효율을 높일 수 있는데, 이때 가장 간단한 방법이 TFTP를 이용하는 방법입니다.

리눅스 호스트의 서비스 실행 설정

tftp는 리눅스 시스템이 부팅이 될 때마다 자동으로 실행되도록 하는 것이 편리합니다. 이렇게 자동으로 실행하도록 설정하기 위해서는 root 권한으로 ntsysv를 실행하고 부팅할 때 자동으로 실행하는 서비스를 선택해 주면 되는데, tftp 외에도 아래와 같은 서비스를 선택해 주시면 편리합니다.

nfs, nfslock, smb, telnet, tftp, xinetd

root 권한으로 ntsysv를 실행합니다.

]# ntsysv

서비스를 선택하고 [확인] 버튼을 클릭합니다.

만일 서비스 항목에 tftp와 xinetd가 보이지 않는다면 tftp가 설치 안된 것입니다. 그러므로 tftp를 설치하셔야 하는데 rpm이나 yum을 이용하여 설치하셔도 좋습니다만 X Window 에 있는 [프로그램 추가 설치]를 이용하시는 것이 편합니다. 아래는 CentOS5에서 tftp를 설치하는 모습입니다. 그림의 설치 순서를 참고하여 주십시오.

메뉴에서 [소프트웨어 추가/삭제]를 선택합니다.

[레거시 네트워크 서버]를 선택하십시오.

tftp와 xinetd 를 선택합니다.

[적용] 버튼을 클릭하시면 설치할 패키지 목록이 출력되고 [계속]버튼을 클릭하면 설치를 시작합니다.

리눅스 호스트의 TFTP 서버 환경 설정

/etc/xinetd.d/tftp 파일을 열어서 수정합니다.

[ 수정 전 ]

# default: off
# description: The tftp server serves files using the trivial file transfer \
#       protocol.  The tftp protocol is often used to boot diskless \
#       workstations, download configuration files to network-aware printers, \
#       and to start the installation process for some operating systems.
service tftp
{
      socket_type             = dgram
      protocol                = udp
      wait                    = yes
      user                    = root
      server                  = /usr/sbin/in.tftpd
      server_args             = -s /tftpboot
      disable                 = yes            // no 로 변경합니다.
      per_source              = 11
      cps                     = 100 2
      flags                   = IPv4
}

[ 수정 후 ]

# default: off
# description: The tftp server serves files using the trivial file transfer \
#       protocol.  The tftp protocol is often used to boot diskless \
#       workstations, download configuration files to network-aware printers, \
#       and to start the installation process for some operating systems.
service tftp
{
      socket_type             = dgram
      protocol                = udp
      wait                    = yes
      user                    = root
      server                  = /usr/sbin/in.tftpd
      server_args             = -s /tftpboot
      disable                 = no 
      per_source              = 11
      cps                     = 100 2
      flags                   = IPv4
}

tftp를 활성화하겠다는 의미로 disable = no 로 설정을 해주었습니다. 그리고 부팅 후에 자동으로 실행하도록 ntsysv에 tftp 서비스를 등록해 놓았습니다.

그러므로 시스템을 재부팅하면 tftp가 자도응로 실행되겠지만 xinet 데몬을 재 시동하여 tftp를 실행하겠습니다.

]# /etc/init.d/xinetd restart
xinetd 를 정지 중:                                         [실패]
xinetd (을)를 시작 중:                                     [  OK  ]
]# 

   데몬이 정확히 구동 되고 있는지 확인하려면 netstat를 실행한 결과값으로 알 수 있습니다.
   netstat를 그냥 실행하면 많은 양의 결과 값이 출력되므로 grep로 tftp 정보만 출력합니다.

]# netstat -al | grep tftp
udp        0      0 *:tftp                      *:* 
]#

tftp 전송 테스트

리눅스 호스트에 있는 파일을 tftp를 이용하여 타겟 보드로 전송해 보겠습니다. tftp를 설치하시면 호스트의 루트 디렉토리(/)에 tftpboot 디렉토리가 생성됩니다. 이 디렉토리에 타겟보드로 전송할 파일을 복사해 놓습니다.

예로 EZ-S3C2440보드에 동봉된 CD에 있는 /image/zImage.ez-s3c2440을 타겟 보드의 /app에 전송해 보겠습니다.

]# mount /dev/cdrom /mnt/cdrom                  또는 mount /dev/cdrom /media
]# cp /mnt/cdrom/zImage.ez-s3c2440 /tftpboot/   또는 cp /media/zImage.ez-s3c2440 /tftpboot/
]# umount /dev/cdrom

호스트에서 타겟보드로 전송할 준비는 끝났습니다. 이제 타겟보드에서 tftp를 이용하여
파일을 전송 받으면 됩니다. 이후로는 타겟보드에서 작업한 내용입니다.

]$ cd /app
]$ tftp 192.168.10.50 -r zImage.ez-s3c2440 -g
]$ ls -al
drwxrwxrwx    1 root     root          512 Jan  1 00:00 .
drwxr-xr-x   18 root     root         1024 Dec 17  2007 ..
drw-rw-rw-    1 root     root          512 Jan  1 00:00 lost+found
-rw-r--r--    1 root     root      1868308 Jan  1 00:05 zImage.ez-s3c2440
]$ 

tftp는 이렇게 호스트에서 타겟보드롤 파일을 전송하는데 유용하게 사용됩니다. 그러나 보통은 nfs를 이용하는 것이 더 편리하기 때문에 대부분의 작업은 호스트의 nfs 서버를 사용하게됩니다. 대신에 tftp는 앞서 말씀드린대로 크기가 작기 때문에 BOOTP에 설치할 수 있어서 타겟보드. 즉, EZ보드의 EZBOOT 모드에서 커널이나 램디스크 이미지를 전송 받는데 사용됩니다.