분류

2018년 2월 14일 수요일

Yocto NFS & TFTP boot 문서 한글화

--------------------------------------------------------------------------------------------------
이 문서는 nxp커뮤니티의 Yocto NFS & TFTP boot 문서를 한글 화 한 것입니다. 저자이신 alejandrolozano 님의 수락 하에 한글 화 작업을 진행하였습니다. 일부 주석을 첨부 할 것이며, 필요하면 의역을 통해 일부 내용이 변경 되거나 누락 될 수 있습니다. 하지만 기본은 구글이 번역하겠습니다.

nxp 커뮤니티 https://community.nxp.com
원본문서 https://community.nxp.com/docs/DOC-103717
※작업중 보드가 사망하여 5번 항목을 실행해보지 못했습니다. ..
--------------------------------------------------------------------------------------------------


1. 소개

이 문서는 리눅스 커널을 부팅하고 타깃 NFS를 마운트하는 데 필요한 단계를 설명합니다.

2. 요구 사항 

ㆍYocto 개발 환경 (대상에 맞게 생성된 이미지)
ㆍ원하는 대상 (SABRE-AI, SABRE-SD)
ㆍ이더넷 케이블 1개
ㆍ마이크로 USB 케이블 1개
ㆍ시리얼 포트 USB 변환기(대상 기능에 따라)

3.  Yocto 폴더 목록 

Yocto를 사용하여 리눅스 커널과 루트 파일 시스템을 개발 할 때 다른 폴더가 만들어지며 각 폴더에는 다른 정보가 들어있습니다.

{YOCTO_BUILD_DIR}/tmp/deploy/images/ {TARGET}/ 
이 디렉터리에는 커널, U-Boot 및 tar 파일의 파일 시스템과 같은 출력 이미지가 들어 있습니다. 이 디렉터리는 커널 및 장치 트리 blob  파일 만 가져오는 데 사용됩니다.

{YOCTO_BUILD_DIR}/tmp/sysroot/{TARGET}/ 
이 폴더에는 Yocto 이미지를 생성하는 데 사용되는 모든 개발 파일이 들어 있습니다. 여기서 우리는 개발에 사용된 모든 동적 라이브러리와 헤더를 찾을 수 있습니다. 이 폴더는 상호 편집을 위한 매게 변수로 사용됩니다.

{YOCTO_BUILD_DIR}/tmp/work/{TARGET}-poky-linux-gnueabi/{IMAGE}/1.0-r0/rootfs
이 폴더는 대상의 압축되지 않은 rootfs가 들어있습니다. 이 폴더는 호스트의 NFS서버의 항목으로 사용됩니다.

4. IP주소 및 네트워크 설정 

이 절에서는 네트웍을 통해 Linux를 부팅하고 root file system(RFS)를 마운트 하는 방법을 설명합니다. 이 시나리오에서는 RFS가 랩톱의 하드 드라이브에 있고, 대상 보드에서 실행되는 커널이 이더넷을 통해 RFS에 탑재됩니다.

이 설정은 리눅스 응용 프로그램을 개발하고 디버깅 하는데 사용됩니다. 매번 커널을 다시 부팅 할 필요 없이 응용 프로그램을 로드하고 실행할 수 있습니다.

먼저 호스트의 일부 패키지를 설치해야 합니다.
$ apt-get install xinetd tftp tftpd isc-dhcp-server nfs-kernel-server portmap

개발을 위해서는 보드 및 Linux 환경에 대한 고정 IP 설정이 가장 좋습니다. U-Boot 옵션이 재 부팅 하는 사이 변경되는 것을 원치 않는다면 DHCP처럼 새 주소를 얻는 방법은 피하는 것이 좋습니다.

4.1 리눅스 호스트 설정 

이 절에서는 Linux 호스트 환경에서 고정 IP를 설정하는 방법을 설명합니다. 필수는 아니지만 가상 호스트 시스템의 IP 주소가 변경되지 않도록 합니다. u-boot 매개 변수는 특정 IP 주소를 사용하므로 IP 주소가 변경될 경우 u-boot 매개 변수를 변경하는 작업을 통해 리눅스 호스트와 일치 시켜야 합니다. 그러므로 이 단계를 수행하시는 것이 좋습니다.

기존 IP 주소를 가져와서 고정으로 사용할 수 있지만, 가상 vmware 환경에서는 인터넷 연결이 끊어 질 수 있습니다. 따라서 vmware 환경을 사용하는 랩톱에서 무선 연결을 사용할 수 있는 원래 이더넷 포트를 유지하면서 유선 이더넷 연결에 연결된 보조 이더넷 포트를 추가하려고 합니다.

※ 본 부분은 vmware 12버전에서 진행되었습니다. vmware 12의 경우 기본적으로 가상네트워크로 인터넷 연결까지 지원을 해주고 있습니다. 따라서 브릿지 구성을 추가하여 인터넷 망과 arm과 통신하는 내부망 2개를 구성하였습니다. 
1. 리눅스 가상 환경에서 sudo ifconfig를 입력 하였을때 하나의 이더넷 어댑터 (eth0)가 있어야 합니다. 나열된 다른 항목은 (Io) 루프백 모드를 위한 가상 포트 입니다.

2. Linux 가상 시스템 종료

3. VMware Player에서 가상 시스템 설정 (setting) 으로 이동하세요. 유선 이더넷 포트만 선택하여 브리지 네트워크 어댑터를 추가하고, 확인을 눌러주세요.
아래 화면을 참고하세요 (※ vmware 12 스크린샷입니다. )

① 환경 설정할 vm 선택하여 마우스 오른쪽 클릭
② setting 메뉴 선택
③ add 버튼 클릭
④ network 어댑터 추가
⑤ 다음 버튼 클릭
⑥ 커스텀 선택, 임의의 VMnet을 선택한다.
※ 괄호 치고 뭐 써있는건 사용하는 거니 다른거로 선택해야 합니다.
   저는 vmnet5를 선택하였습니다.
⑦ finish를 눌러 네트워크 어댑터 추가

다음은 저 임의로 선택한 VMnet을 브릿지 모드로 변경해주어야 합니다.
① Edit 메뉴의 Virtual Network Editor를 선택하면 우측 팝업이 뜹니다.
② Change Settings를 눌러 편집 가능상태로 만들어줍니다.
③ Add Network.. 버튼을 눌러줍니다.
④ 조금 전 어댑터에 설정한 VMnet을 선택합니다.(전 VMnet5)
⑤ OK를 눌러 선택된 VMnet을 추가합니다.
⑥ 추가된 VMnet을 선택합니다.
⑦ 브릿지 를 선택하시고, 내부망을 구성할 랜카드를 선택합니다. (하드웨어적으로 설치된 네트워크 카드 목록이 나오는 부분입니다. )
⑧ OK를 눌러 모든 설정을 저장해줍니다.
※ 주의사항 : 새로 추가한 vmnet에 birdge가 선택되지 않고 오류가 나는 경우가 있습니다. 이 경우는 기존 vmnet0번에서 bridge모드로 automatic을 설정했을 경우 모든 네트워크 카드를 점유하고 있어서 입니다. vmnet0번에는 본 구성에 사용하지 않는 네트웍 카드를 직접 선택해주어야 합니다. (저의경우 wify lan카드를 통해 인터넷 브릿지로 0번을 사용하고 5번은 내부망용으로 사용합니다. )

다음은 VM내의 리눅스 IP설정을 해주어야 합니다.
1. Linux가 설치된 VM을 부팅해주세요
2. 터미널을 열고 다음 명령을 입력합니다.
    $sudo ifconfig 
Vmware 에서 새로운 네트워크 카드를 브릿지로 할당 받았을 겁니다. (eth1) 이것은 아마 물리적인 이더넷 카드와 연결이 되있을 겁니다. 이제 이 네트워크 카드에 고정 IP를 설정합니다.

1. eth1에 고정 IP를 설정하기 위해 /etc/nework/interfaces 파일을 오픈하세요 

    sudo gedit /etc/network/interfaces

1. eth1에 설정할 네트워크  주소를 다음과 같이 설정하세요 
   auto eth1
   iface eth1 inet static
   address 192.168.0.100
   netmask 255.255.255.0 
   gateway 192.168.0.1
1. 파일을 저장하세요
2. eth1을 재시작 하세요
   $ sudo ifdown eth1 
   $ sudo ifup eth1

※아래는 제 네트워크 구성 파일 실제 내용 스크린샷 입니다.


4.2 대상 설정 

우리는 대상 (보드)에 사용할 네트워크 아이피를 설정해야 합니다.
1. 보드에 전원을 넣고, 키를 입력하여 U-Boot 환경이 실행되는 것을 멈춰야 합니다.
   ※약 2초면 지나가기 때문에 재발리 눌러야 되요
2. 아래 매개변수를 입력하세요

setenv serverip 192.168.0.100   <-- 이전에 설정한 호스트의 IP
setenv ipaddr 192.168.0.102     <-- 타겟 보드의 IP
setenv ip_dyn no   

호스트에 저장된 rootfs 경로를 U-Boot에 입력해야 합니다.

setenv nfsroot /home/usuario/fsl-release-bsp/buildimx6q/tmp/work/imx6qsabresd-poky-linux-gnueabi/fsl-image-gui/1.0-r0/rootfs

※ 저의 경로를 아래와 같습니다.
    setenv nfsroot /home/user1/fsl-community-bsp/build_imx6/tmp/work/imx6solosabresd-poky-linux-gnueabi/core-image-base/1.0-r0/rootfs/
    경로를 잘 모르실 경우 Yocto 교육 문서 - 홈을 참조하세요 작업1,2,3을 참조하시면 됩니다.
     dtb 파일은 작업 7, 8을 통해 구성할 수 있다고 합니다.  


setenv image zImage
※ uImage와 zImage가 무슨 차이인지 몰라 검색을 해보았더니 uImage를 zImage로 변환시켜줘야 하더군요 일단 mkImage가 설치되어있어야 합니다. mkimage 를 이용하여 uimage 정보를 조회하면 이렇게 나옵니다.  
# mkimage -l uImage 
  Image Name: Linux-3.4.103-5-ARCH 
  Created: Fri Jan 16 13:34:10 2015 
  Image Type: ARM Linux Kernel Image (uncompressed) 
  Data Size: 3327616 Bytes = 3249.62 kB = 3.17 MB 
  Load Address: 40008000 
  Entry Point: 40008000 
다음은 uImage에서 zImage를 추출하는 명령입니다.
 $ tail -c+65 < uImage > zImage

하지만 본 장에서는 마지막에 zimage 링크를 만들어줍니다. 
setenv fdt_file uImage-imx6q-sabresd.dtb

※ imx6soloauto 를 입력하여 bitbake core-image-base를 수행할경우 dtb파일이 생성되지 않습니다. 개인적으로 dtb파일에 대한 학습이 더 필요한 것 같습니다. 
setenv netargs 'setenv bootargs console=${console},${baudrate} ${smp} 
root=/dev/nfs ip={ipaddr}
nfsroot=${serverip}:${nfsroot},v3,tcp'
saveenv

4.3 TFTP와 NFS 환경설정
이제 TFTP(Trivial File Transfer Protocol) 서버와 NSF(Networked File System) 서버를 구성하세요. U-Boot가 TFTP를 통해 Linux커널을 다운로드 하는 방법이며, 커널은 NFS를 통해 루트 파일 시스템을 컴퓨터 하드 드라이브에 탑재합니다.

4.3.1 TFTP 설정 

다음 단계는 TFTP서버를 설정입니다. 다음 명령은 ROOT계정으로 수행해야 합니다. (아니면 명령마다 'sudo'를 붙이시면 됩니다.

※ 인스톨 해야 할 패키지가 몇개 있습니다. xinetd , portmap, nfs-kernel-server

1./etc/xinetd.conf 편집(호스트 컴퓨터의)

$ sudo gedit /etc/xinetd.conf 
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s
{YOCTO_BUILD_DIR}/tmp/deploy/images/ {TARGET}/
disable = no
}
주의 :  {YOCTO_BUILD_DIR}/tmp/deploy/images/ {TARGET}/   절대 경로 값을 정확히 입력 해야 합니다.
※ 처음에 뭔가 내용이 있었는데 주석 처리를 하고 했더니 사용이 안됩니다. 그래서 아래처럼 다 지우고 했더니 되더군요;  혹시 안되는 분은 참고하세요 클릭하면 커져유

1. xinetd 서비스를 재시작

$ sudo service xinetd restart 

1. tftp 동작 테스트 :
$ tftp localhost
   tftp> get {폴더 내의 파일 이름}
   tftb> quit 

4.3.2 NFS 설정

1. /etc/exports 파일 편집
$ sudo gedit /etc/exports

1. 호스트 내의 rootfs 폴더가 잇는 경로를 입력하세요
2. {YOCTO_BUILD_DIR}/tmp/work/{TARGET}-poky-linux-gnueabi/{IMAGE}/1.0-r0/rootfs *(rw,no_root_squash)
{YOCTO_BUILD_DIR}/tmp/work/{TARGET}-poky-linux-gnueabi/{IMAGE}/1.0-r0/rootfs 에 있는 파일들은 대부분 보드에서 정상 작동할 것입니다. 그러나 {image}.bz2 파일은 압축을 해제하는 것이좋습니다. sudo를 사용하여 각 폴더와 파일의 권한을 유지/관리합티다.

3. NFS 서비스 재시작 


sudo service portmap stop
sudo service nfs-kernel-server stop
sudo service portmap start
sudo service nfs-kernel-server start

5. 최종 호스트 설정과 NFS를 이용한 Linux부팅

1. 호스트의 {Yocto_build_dir}/tmp/deploy/image/{target} 아래 이미지 링크를 생성합니다.
In -s zImage_imx_v7_defconfig zImage 

2. 보드 콘솔에서 다음 명령을 입력하세요
run netboot 
몇 분 후 타겟보드에서 리눅스 시스템이 작동할 것입니다.

댓글 없음:

댓글 쓰기