2016-07-07

Acknowledgement (Korean)

아래의 글은 Ali Aljaani가 운영하는 블로그인 embedded centric의 “Zynq SoC Training”을 번역한 문서입니다. 한글 번역 및 공개를 허용한 Ali Aljaani에게 감사의 말을 전합니다.

Acknowledgement (English)

This post is a translated version of “Zynq SoC training” in embedded centric. Thank you Ali Aljaani for allowing me to translate nice posts. I’m Taekyung Heo, and I translated this post into Korean.

Contact information (Author)

Ali Aljaani’s blog: http://embeddedcentric.com/

Ali Aljaani’s mail: alialjaani@embeddedcentric.com

Ali Aljaani’s LinkedIn: https://www.linkedin.com/in/ali-aljaani-a7130099

Ali Aljaani’s github: https://github.com/ama142

Internet of Things(IoT)의 중요성이 커짐에 따라, 임베디드 시스템도 네트워크를 사용하는 것이 일반적이게 되었다. 네트워크를 사용하는 장치들은 원격지에서 모니터링할 수 있고, 제어할 수 있다. 또한 임베디드 시스템끼리 통신하고 조율할 수 있다. PetaLinux와 같은 임베디드 운영체제를 사용하는 것의 가장 큰 장점은 네트워크 스택을 지원한다는 점이다. 이를 통해 다양한 네트워크 프로토콜과 어플리케이션을 사용할 수 있다. 임베디드 운영체제를 사용하는 것은 네트워크를 사용하는 것을 크게 단순화할 수 있다.

11번째 실습에서는 Zynq chip을 사용해 이더넷 네트워크에 접속하고, 네트워크 기능을 활용하는 것에 대해 학습한다. 이번 실습은 PetaLinux의 네트워크 기능을 학습한다. PetaLinux에서는 여러 가지 종류의 네트워크 어플리케이션과 프로토콜을 지원한다. 이들에 대해 설명하고, 실제로 테스팅해 볼 것이다(dhcp, ping, ssh, httpd, ftp/tftp). 네트워크 스택과 어플리케이션을 설정하는 데 사용되는 커널 메뉴도 학습할 것이다.



Lab11 Design Flow



Lab11 Block Diagram



Lab11 Board Interface

목표

1. 호스트 머신에서 실행하는 DHCP 서버를 사용하여 ZedBoard에 IP를 동적으로 할당한다.

2. FTP 프로토콜을 사용해 ZedBoard와 파일을 교환한다.

3. PetaLinux에 접속하는 데 SSH를 사용한다.

4. PetaLinux에서 지원하는 menuconfig의 서브 메뉴를 사용하여 다른 네트워크 스택을 탐색한다.

5. 호스트 머신의 웹 브라우저를 사용하여 PetaLinux에서 제공하는 기본 웹 서버 페이지에 접속한다.

실습 단계
A. PetaLinux 실행 환경 설정
실습 10의 실습 단계 D를 참고하여 PetaLinux를 찾을 수 있도록 환경 변수를 설정한다.

B. 루트 파일 시스템을 설정해 dropbear와 httpd를 포함하도록 하기

이번 단계에서는 루트 파일 시스템의 설정 메뉴(menuconfig)를 실행하여 PetaLInux의 네트워크 스택의 컴포넌트를 설정한다.

1. 루트로 로그인되어 있어야 한다(커서 좌측에 #이 있어야 한다. 그렇지 않다면 명령어 sudo su를 사용하여 루트로 로그인한다).

2. 다음 명령어를 사용하여 PetaLinux 프로젝트 디렉토리로 이동한다 (실습 10에서 PetaLinux 를 다운로드하고 설정했다고 가정한다).

3. 다음 명령어를 사용하여 루트 파일시스템의 menuconfig을 실행한다.

4. Filesystem Packages을 선택한 다음, 아래 화살표를 눌러 console/network을 선택한다. console/network에서 dropbear을 선택하고 엔터를 친다. ‘y’를 입력해 dropbear와 dropbear-openssh-sftp-server을 루트 파일시스템에 포함한다.

rootfs menuconfig – Navigate to Filesystem Packages

Filesystem Packages -> Console/Network

Filesystem Packages -> Console/Network -> dropbear

Include both dropbear and dropbear-openssh-sftp-server (Use the Y key)

Dropbear는 경량 SSH(Secure SHell 서버, 클라이언트이다. 이를 사용해 개발 보드 외부에서 shell에 로그인할 수 있다. 이전 실습에서 상대적으로 느린 UART/USB 직렬 포트를 사용해서 PetaLinux shell을 접속했다 (gtkterm 어플리케이션을 사용). 이번 실습에서는 더욱 최적화되고 편리한 방법으로 PetaLinux shell에 접속할 것이다. dropbear를 사용하여 ZedBoard의 PetaLinux 터미널에 네트워크를 통해 접속할 수 있다.

Escape(ESC)키를 네 번 눌러 파일시스템 패키지 창으로 이동한다. 그 다음, 아래 방향 화살표 키를 눌러 base로 이동한다. base에서, busybox를 선택한 다음 엔터를 친다. ‘y‘를 눌러 busybox-http를 포함시킨다.

Filesystem Packages -> base

Filesystem Packages -> base -> busybox

Include busybox-http

httpd (HTTP Daemon의 약자)는 백그라운드에서 웹 서버를 실행하는 네트워크 어플리케이션으로, 들어오는 요청을 기다려 처리한다. httpd은 요청에 자동으로 응답하고, 하이퍼텍스트와 멀티미디어 문서를 네트워크를 통해 서비스한다.

이번 실습에서는 호스트 머신의 웹 브라우저를 사용해 PetaLinux의 기본 웹 페이지에 접근할 것이다. 웹 브라우저의 주소 창에 ZedBoard의 IP를 입력함으로써 웹 페이지에 쉽게 접근할 수 있다. 아래 스크린샷에서 ZedBoard의 IP는 192.168.1.10이다.

PetaLinux Default Webpage

우측 화살표 방향을 눌러 Save를 선택한 다음, 엔터를 쳐서 설정을 저장한다. 마지막으로 Exit을 선택하여 menuconfig에서 빠져나가 명령창으로 복귀한다.

rootfs menuconfig -Confirm new configuration

이로써 dropbear과 httpd 네트워크 어플리케이션이 커널 소스 코드에 포함되었다. 다음 단계에서는 커널을 컴파일하고 새로운 이미지를 빌드할 것이다.

C. PetaLinux 이미지 빌드
실습 10의 실습 단계 G를 따라하여, dropbear와 httpd 네트워크 어플리케이션들을 포함한 PetaLinux 이미지를 빌드한다.

D. 바이너리 패키지 생성 (BOOT.BIN)
실습 10의 실습 단계 H를 따라하여, SD card에 올릴 부트 파일을 생성한다.

E. BOOT.BIN과 리눅스 커널 이미지 (image.ud)를 SD card에 복사
실습 10의 실습 단계 I를 따라하여, 부트 파일과 커널 이미지를 SD card에 복사한다.

F. SD card를 사용해 부팅할 수 있도록 ZedBoard를 설정
실습 10의 실습 단계 J를 따라하여, ZedBoard가 SD card를 사용해 부팅할 수 있도록 설정한다.

G. 이더넷 케이블을 사용해 호스트 머신과 제드모드를 연결하기

호스트 머신과 ZedBoard를 연결하는 가장 간단한 방법은 이더넷 케이블을 사용해 두 기기를 연결하는 것이다. 이를 통해 두 기기 사이의 peer-to-peer 연결을 수립할 수 있다.

Ethernet Connection

다른 방법으로는 ZedBoard를 네트워크 스위치에 연결하는 방법이 있다. 이번 실습에서는 두 가지 방법 모두를 설명할 것이다.

H. 호스트 머신에 DHCP 서버를 다운로드하고, 설치하고, 설정하기

Dynamic Host Configuration Protocol(DHCP)는 자동으로 기기의 네트워크 설정을 도와주는 네트워크 서비스이다. DHCP 클라이언트들은 DHCP 서버로부터 받아오는 설정을 수정할 권한이 없으며, 각 설정은 사용자가 인지하지 못한 사이에 적용된다. DHCP 서버는 각 사용자의 머신에 IP 주소를 제공하는 역할을 한다. 이번 실습에서는 서버가 호스트 머신에서 실행 중이며, IP를 받을 DHCP 클라이언트는 PetaLinux를 실행 중인 ZedBoard이다. PetaLinux는 기본 설정으로 DHCP 클라이언트를 실행하고 있다.

1. 루트로 터미널에 로그인한다. 터미널을 열어 sudo su 명령어를 사용해 루트로 로그인한다.

Access as root

2. 다음 명령어를 사용해 Ubuntu에 DHCP 서버를 다운로드하고 설치한다.

Download and Install DHCP Server

확인 창이 뜨면 ‘y‘를 누른다. 다운로드와 설치에 약간의 시간이 걸릴 것이다. 성공적으로 설치가 완료되면, 다음과 같은 화면을 볼 수 있을 것이다:

Successful installation of DHCP Server

이로써 호스트 머신에 DHCP 서버가 설치되었다. 다음 단계에서 서버를 설정할 것이다.

3. 다음 명령어를 사용해 DHCP 서버의 설정 파일인 /etc/dhcp/dhcp.conf를 연다.

Open configuration file of the DHCP Server

4. 설정 파일의 끝에 다음 내용을 붙여 DHCP 서버 설정을 변경한다.

Change DHCP Server settings

새로운 설정은 DHCP 서버가 클라이언트(이번 실습에서 ZedBoard)에 IP를 192.168.1.10-192.168.1.100 또는 192.168.1.150-192.168.1.200에서 부여하도록 한다. DHCP 서버는 클라이언트가 정해진 타임 프레임을 요구하지 않는다면 600초동안 IP를 부여한다. 허용된 최대 IP 부여 시간은 7200초이다. 서버는 클라이언트에게 255.255.255.0을 서브넷 마스크로, 192.168.1.255를 브로드캐스트 주소로, 192.168.1.254를 게이트웨이 주소로, 192.168.1.1과 192.168.1.2를 DNS 서버로 이용하기를 조언한다. 변경한 설정 파일을 저장하고 파일을 닫는다.

5. DHCP 서버에서 어떤 물리적 인터페이스가 요청을 처리할 것인지 명시한다. ZedBoard를 호스트 머신의 이더넷 포트에 연결했기 때문에, “eth0″를 사용해서 연결하는 것으로 명시한다. 다음과 같은 명령을 사용해 isc-dhcp-server의 설정 파일을 연다.

마지막 라인에서 eth0를 따옴표 안에 입력한다. 변경 사항을 저장하고 종료한다.

Specify the interface dhcpd should serve

노트: USB-Ethernet 커넥터를 사용하고 있다면, ifconfig 명령어를 사용해 어떤 인터페이스에 ZedBoard에 연결되어 있는지 파악해야 한다.

6. 변경한 설정이 반영되도록 서버를 재시작한다.

Restart DCHP server to apply new configuration settings

성공적으로 재시작하면, 위와 같은 화면을 볼 수 있을 것이다 (프로세스의 수는 다를 수 있다).

7. 우측 상단에 있는 아이콘을 선택해 Network Connections의 Edit Connections를 실행한다.

Launch Network Connections

8. Network Connections에서 eth0를 선택하고 Edit을 클릭한다.

Network Connections

9. IPv4 Settings을 선택한다. Method를 Manual으로 변경하고, 주소를 다음과 같이 입력한다.

IPv4Settings

저장을 클릭한 다음, Network Connections를 닫는다. 다음 단계에서 호스트 머신에 고정 아이피를 부여할 것이다.

I. GtkTerm 직렬 포트 터미널 열기

1. 직렬 포트와 연관된 장치인 ttyACM0의 권한을 읽기와 쓰기 가능하도록 다음의 명령어를 사용한다.

Make ttyACM0 readable/writable

2. 대시보드의 탐색창에서 serial을 입력하여 GtkTerm을 실행한다.

Launch GtkTerm

3. PS-RST 버튼을 눌러 PetaLinux를 재부팅하면 부팅 순서를 확인할 수 있다.

PS-RST Button

4. GtkTerm에서 PetaLinux 부트 스크린을 확인하고, DHCP 서버에 의해 ZedBoard에 할당된 IP 주소를 기억해둔다.

PetaLinux Reboot

위 캡쳐에서 몇 가지 확인할 것이 있다. 우선, 호스트 머신의 DHCP 서버는 ZedBoard에 192.168.1.10 아이피를 ZedBoard에 부여했다는 것을 확인했다 (부여되는 IP 주소는 매번 다를 수 있으며, 따라서 실습할 때 부여되는 주소는 이 주소와 다를 것이다). 두 번째로, ZedBoard의 SSH 서버가 실행 중이고 사용 가능하다는 것을 확인해야 한다.

본인 화면에서 보이는 IP 주소를 어딘가 기록해두어야 한다. 이 정보를 사용해 PetaLinux에 원격지에서 접근할 것이다.

J. SSH를 사용해 ZedBoard에 접속하기

호스트 머신에 새로운 터미널을 열고, 루트로 로그인한다. 다음 명령어를 사용해 ZedBoard에 접속한다.

위 명령어에서 사용하는 IP 주소는 앞서 기록해둔 주소를 사용해야 한다.

로그인을 확인하는 메시지가 뜰 것이다. ‘yes‘를 입력한 다음 엔터를 친다 (‘y’가 아닌, ‘yes’를 입력해야 한다). 이 이후에, ZedBoard에 로그인하기 위해 ‘root’를 입력해야 한다.

Log-in to Zedboard using SSH

이로써 PetaLinux shell에 원격으로 접속했으며, ZedBoard 자원을 제어할 수 있다.

K. PING 네트워크 어플리케이션을 사용해 접속 상태 테스팅

PING(Packet INternet Groper) 네트워크 어플리케이션은 두 머신 사이에 네트워크 연결 상태를 알아보는 가장 쉬운 방법이다. Local Area Network(LAN) 또는 Wide Area Network(WAN)의 여부에 상관 없이 도움이 된다. PIng은 ICMP(Internet Control Message Protocol)을 사용해 다른 장치와 통신한다. 기본 설정에서 우리는 두 개의 머신만을 갖고 있다. 호스트 머신은 고정 아이피(192.168.1.1), ZedBoard는 동적 아이피를 갖고 있다. 두 머신 사이의 연결은 ping을 사용해 쉽게 확인될 수 있다.

ZedBoard에 접속한 shell(PetaLinux shell)에서 다음 명령을 사용해보라.

위 명령어에서 사용된 IP 주소는 호스트 머신의 IP 주소이다. 이미 ssh를 사용해 ZedBoard에 접속헀으므로, 위 명령 또한 접속 가능하다는 응답을 보일 것이다. Ctrl+C를 입력하여 ping 명령어에서 빠져나온다.

Testing Connectivity using PING command

만약 접근 불가능한 대역의 IP에 ping 명령어를 사용한다면, “time out” 또는 “network unreachable” 메시지를 확인할 수 있을 것이다.

FTP를 사용한 파일 교환

File Transfer Protocol(FTP)는 한 머신에서 다른 머신으로 TCP 기반 네트워크를 통해 파일을 전송하는 표준 네트워크 프로토콜이다. FTP는 클라이언트-서버 아키텍쳐를 사용하며, 제어와 데이터 전송을 분리해서 사용한다.

FTP를 사용해 호스트 컴퓨터와 ZedBoard를 쉽게 연결할 수 있다. 예를 들어 호스트 데스크탑에 Exchange라는 이름의 디렉토리가 있다고 하자.

Exchange directory(FTP Directory) on host machine

Content of Test1

Content of Test2

우선, cd 명령어를 사용해 ZedBoard로 전송하고자 하는 파일을 포함하는 디렉토리로 이동한다. 그 이후, 다음 명령어를 사용한다.

그 다음, root를 입력하고 비밀번호를 입력한다.

FTP Session( Host-Zedboard)

이로써, 호스트 머신과 ZedBoard 사이에 FTP 세션이 수립되었다.

호스트 머신의 Exchange 디렉토리는 ZedBoard로 전송하고자 하는 모든 파일을 담고 있다. ZedBoard에서도 이와 같이 FTP 파일 전송 전용 디렉토리가 있다(/var/ftp).

다음 명령어를 사용해 PetaLinux 터미널에서 ZedBoard의 FTP 디렉토리로 이동한다.

Browse to FTP directory on Zedboard

touch 명령어를 사용해 파일을 생성한다. Zedlog.txt를 생성한다.

Create a new file in Zedboard FTP directory

FTP 세션으로 돌아가, ls를 입력한다. 이는 원격으로 연결된 장치(ZedBoard)의 파일의 리스트를 보여줄 것이다.

Lists files on Zedboard FTP directory

Zedlog.txt를 확인할 수 있을 것이다. 이 파일을 원격 머신(ZedBoard)에서 호스트 머신으로 받아오기 위해서는, get “파일 이름” 명령어를 사용하면 된다.

Copy a file from Zedboard

이제 호스트 머신의 FTP 디렉토리(Exchange)를 확인하면 Zedlog.txt 파일을 확인할 수 있다.

FTP Directory – Host Machine

반대로 호스트 머신에서 ZedBoard로 파일을 전송하려면 send “파일 이름” 명령어를 사용하면 된다.

Send files to Zedboard using FTP

파일이 ZedBoard에서 받아졌는지 확인하기 위해서는 PetaLinux 터미널(SSH)에서 ls를 입력하면 된다.

FTP Directory – Zedboard

두 개의 파일이 ZedBoard에 전송되었음을 확인할 수 있다. 파일의 내용은 다음 명령어로 확인할 수 있다.

Verify content – Test1

Verify content – Test2

이로써 열한 번째 실습인 Networked-Systems를 마친다.

Show more