지금의 회사에 입사한지 1년이 넘었지만, 좀체로 리눅스를 쓰지 않았다 (라기보다 안쓴다).  뭐 이유인즉슨 사용하는 OS가 RTOS위주로 구성이 되어있기 때문이고 어쩌고 저쩌고... 하튼 그렇다.

사실 전회사에서 A to Z를 모두 리눅스에서 해결했었는데... 지금은 뭘 하려고 하면 기억이 안나서 구글링부터 시작하게 되었다.  눈에서 멀어지면 마음도 멀어진다는 옛말이 정답이로구나.

뭐 어쨌든 그런 와중에 새롭게 시작하는 MIPS architecture에서는 리눅스를 사용한다고해서 VMware를 설치하고, 나름 예전에 했었던 tftp 환경을 조성하기로 했다.  이미 windows에 익숙해져있는 상태이고, 더군다나 회사에서 쓰는 대부분의 툴들이 windows 용임을 감안했을 때 혼자서 리눅스로 갈아타기는 쉽지 않은 일이었다. (하지만 언젠간 하고 말리라... -.-)

VMware workstation 6.5를 설치하고 ubuntu 8.04를 설치했다.  사실 ubuntu에 슬슬 정내미가 떨어져가고 있는데 (열악한 KDE) 굳이 ubuntu를 선택한건 손에 그나마 익은 상태서이다... -.- 마음같아서는 opensuse로 갈까 했으나 사용법이 너무 서툴러서...

잡설이 매우 길어졌는데 일단.. 절차는 다음과 같다.


음.  위에서 주목할 것은 Network Adapter를 2개 잡았는데, 한개는 NAT로, 한개는 Bridge로 설정했다는 것이다.  즉.. 리눅스의 생명인 networking을 위해 NAT를 돌리고 tftp는 Bridge로... 물론 LAN카드는 2개이다.. -.-

그 다음, Edit->Virtual Network Editor에서 Automatic Bridging은 off,


그 다음, Host Virtual Network Mapping은 다음과 같이... (VMnet0가 tftp 용이고, VMnet1과 VMnet8이 NAT용이다)


뭐 이 정도 해주시고 리눅스를 설치한 다음 대역폭을 맞추어주면 되는데, default로 NAT는 DHCP를 사용하게끔 되어있으니 건드릴 필요는 없지만, bridge로 연결된 network adapter는 windows에서 설정한 IP 대역과 맞춘다.  예를 들어, bridge로 사용할 LAN card의 network setting이 windows에서 다음과 같다면,


리눅스에서는 비슷하게 168.126.63.100/24 정도로 잡아주면 되겠다.

아하하.. 잘 된다.
Posted by 강군님

댓글을 달아 주세요

TFTP 구현 삽질...

STB 2009. 3. 2. 14:26
일본향 프로젝트의 loader 부분을 맡게 됐다.  사용하는 core는 SH4 (super hitachi).  사실 SH라면 linux kernel에서 꽤 보긴 했지만 난 왜 linux kernel에서 shell 얘기가 나오는 건가... 했었던... 생소한 (나한테만 -_-) architecture이다.

사실 이거 말고도 삽질이라면 NOR flash도 있는데... 그건 차차 쓰기로 하고 먼저 TFTP 삽질한 것부터...

TFTP는 잘 알려진 대로 인증 따위의 번거로운 절차 (... -_-;;)를 빼버리고 UDP를 통해 간단하게 데이터 전송을 할 수 있는 protocol이다.  이러한 특성으로 오늘날에는 bootloader 등에서의 firmware update에 많이 쓰이고 있는 것이 사실이다 (구현이 쉬운데다가 UDP를 쓰니까... 이번에 network stack을 porting하면서 느낀 것!).  뭐 어쨌든 우리도 마찬가지 용도로 TFTP를 쓰기로 했고... 마침 referece board에서 u-boot으로의 TFTP download가 성공하였으므로... 그닥 어려운 작업은 아니라고 생각했다.

열심히 u-boot code를 우리쪽에 맞게 (polling에서 ISR로, porting한 network stack을 사용하도록...) 고쳤고, 테스트를 했다.  그런데 뭔가 문제가 있었다.


이렇게... RRQ가 server에 인지되었고, server에서 data를 보내주었고, data를 받고 host에서 ack를 날려주었는데... 이걸 인지할 수 없다는 error다! 뭐가 문제일까... 제대로 되는 경우는 어떤 경우인지 확인해보고자 u-boot을 돌렸다.


어라... 이건 ack가 제대로 먹는다.  왜일까.  ACK packet을 비교해본 결과.. 차이점은 port에 있었다.  문제의 code에서는 UDP:69에 RRQ / ACK 모두 날리게 되어있는데... u-boot는 RRQ만 UDP:69에다 날리고... ACK는 DAT가 날라온 port에다 쏘는거다!!! 이게 문제였던가... 재빨리 google 님을 불렀다.

개괄적인 지식을 알기엔 wiki가 최고 아니던가.  http://en.wikipedia.org/wiki/Trivial_File_Transfer_Protocol 에서 충격적인 (-_-?) 그림을 봤다... 그것은...


젠장... 표준을 보는 자에게 복 있으라... 뭐냐.. ACK를 엄한데다 쏘고 있었던거냐... 그러니까 invalid operation이라고 나오지............................ -_-
Posted by 강군님
TAG port, rrq, tftp

댓글을 달아 주세요

$ sudo apt-get install xinetd tftpd tftp
// tftpd는 server, tftp는 테스트를 수행할 client, xinetd는 이들을 관리해줄 super daemon

$ sudo vi /etc/xinetd.d/tftp
// 아래의 내용으로 완성시킨다
service tftp
{
       protocol = udp
       port = 69
       socket_type = dgram
       wait = yes
       user = nobody
       server = /usr/sbin/in.tftpd
       server_args = -s /tftpboot
       disable = no
}


$ sudo mkdir /tftpboot
$ sudo chmod 777 /tftpboot
$ sudo chown nobody /tftpboot
$ sudo /etc/init.d/xinetd start
Posted by 강군님

댓글을 달아 주세요