분류

2018년 2월 27일 화요일

vmware에 ubuntu 설치 (vmware-workstation 12)

vmware는 기존 사용하는 os내에 다른 os를 추가 설치하게 해주는 프로그램입니다. 동일한 os를 여러 개 사용하는 경우도 있고, 저처럼 ubuntu가 필요할 수 도 있습니다. 개인적으로 정리해둘 필요가 있을 것 같아 기록합니다. (설치 중 약간의 문제가 생겼었는데, 설치 이미지가 인식이 안됐던 것. 하지만 vm-ware를 잘 모르니 어디가 문제인지 몰라 한참의 시간이 들었습니다.

일단 vmware 의 workstation 버전은 64bit 윈도우, linux에서만 작동합니다. 이 부분에 유의하셔야 합니다. 노트북에서 설치해서 잘 썼기에, 회사에서 지급해준 pc에도 설치하려 했는데  설치가 진행되지 않기에 한참을 고민하다 검색해보니 64bit 전용이라고 하더군요, 32bit에서는 vm-player라는 제품을 설치하셔야 합니다. (일단 vm설치 부분은 건너뛰겠습니다.)

ubuntu를 받기 위해서는 일단 http://releases.ubuntu.com/에 접속하셔야 합니다. 저는 개인적으로 이곳을 선호합니다. 설치할 수 있는 ubuntu 버전을 모두 확인할 수 있고, 다양한 다운로드 방법을 제시합니다. 텍스트로 이루어진 화면의 아랫부분 까지 내려가면 12.04~ 17.10까지 다양한 버전의 ubuntu를 확인할 수 있습니다.

설치하고 싶은 버전을 클릭하시면 안에 여러가지 다운로드 파일들이 제공됩니다.
위 이미지처럼 하나의 ubuntu에도 여러가지가 제공되는데요 일단 desktop과 server 버전으로 나뉩니다. 둘의 차이는 서비스 기준이냐, 사용 기준이냐 정도 일 겁니다. 저는 사용자 환경이 필요하기에 desktop를 선택합니다. 하지만 desktop 내에도 여러가지 버전이 있는데, 우선 amd64라는 이름이 들어가 있는 것과 i386이 들어가 있는 녀석이 있습니다. 이 부분은 amd64bit는 64비트 컴퓨터에, 그리고 i386은 32bit 컴퓨터에 설치하는 녀석 입니다. vm-workstation이라면 64, vm-player라면 32bit를 설치 하는 것이 맞는 것 같습니다.

확장자로 나뉩니다. 그중 제가 알고 있는 확장자는 3가지 있습니다.

iso --> 일반적인 설치 이미지 파일입니다.
torrent --> p2p를 통해 고속으로 이미지를 받을 수 있습니다.
zsync  --> p2p를 통해 고속으로 이미지를 받을 수 있습니다.

저는 torrent를 선호하지만, 얼마 전 torrent를 통해 받은 파일이 정상 작동하지 않아 애먹은 적이 있기에 iso를 선택하여 다운로드 합니다.

파일이 다운로드 되었다면 이제 설치를 하기로 합니다.
(조회하시는 데이터 용량을 줄이기 위해 여러 개의 이미지를 하나로 합쳐서 작업하겠습니다.
vmware의 메뉴를 선택합니다. File -> New Virtual Machine


① ctrl+n을 통해서도 새 vm을 설치할 수 있는 것 같습니다.
② ubuntu가 설치 단계를 쉽게 몇 가지 대신해주는 기능 인 것 같습니다.
③ 다음을 눌러서 옆 화면으로 이동합니다.
④ 다운로드 받은 이미지를 선택해서 vm에 설치하겠다는 옵션입니다.
⑤ 다운로드 받은 파일의 위치를 지정하기 위해 선택합니다.
⑥ 다음 페이지로 이동
① 사용자 정보 입력
② 다음으로 이동
③ 가상머신의 이름 입력
④ 가상머신의 실제 저장 폴더 선택
⑤ 다음으로 이동
⑥ 가상머신에 할당할 용량 입력
⑦ 가상머신을 저장할 방식 선택
※ single은 하나의 파일로 저장, multiple은 2-4기가 파일로 분할하여 지속 확장됩니다. 하지만 single은 웬만하면 선택을 피하시는 것이 좋습니다. single을 사용 할 경우 디스크 용량을 얼마로 증가 시키던 하나의 파일로 계속 확장 생성되어가는데, 파일 시스템 종류에 따라 개별 파일의 용량 제한을 설정하고 있기 때문에 single을 선택할 경우 사용 중 알 수 없는 이유로 vm이 동작하지 않게 될 수 있습니다.
⑧ 다음 페이지로 이동

이렇게 해서 기본 환경 설정이 종료 되었는데 저는 개인적으로 저 메모리가 너무 적게 할당된 것 같습니다. 변경이 필요한 것 같tmqsle Customize Hardware를 선택합니다.

cpu와 메모리 같은 대체적인 것들이 기본 설정되어있어 저는 4gb메모리와 core4개를 추가 할당하였습니다. 네트워크는 원래 nat를 통해 사용할 예정이었기에 큰 차이가 없어 그냥 사용합니다. 그리고 finsish를 누르면 자동으로 설치를 진행합니다.

이 부분에서 설치 완료까지는 대체로 그냥 쭉 진행되기에 건드릴 것 없습니다. 소요 시간은 개인 pc마다 다르지만 저는 업데이트를 포함 30분이 소요되었습니다. 다만 이 방법으로 설치 할 경우 쓸데없이 오피스 같은 녀석이 설치가 됩니다. (이 pc는 컴파일 전용으로 사용 할 것이기에 전혀 쓸모가 없는데 말이죠) 그래도 자동으로 설치되는 것은 너무 편합니다. (os설치 시 이것 저것 한다고 30분간 앉아서 클릭 질 하는 것도 귀찮으니까요 )

이렇게 해서 영문 판 설치는 완료되었습니다. 추가적으로 한국 시간과, 한국어와 한국 시간을 설정하는 방법은 아래 이미지를 보시면 쉽게 해결 됩니다.

● 언어 설정 추가 :
① 화면 우측 상단의 톱니 마크 선택
② system Setting 선택
③ Language Support 선택
④ Install 선택
⑤ Install / Remove Languages... 선택
⑥ Korean 선택 (abc순으로 정렬되어있음)
⑦ Apply/Change를 선택한 후 비밀번호 입력하여 언어 팩 인스톨
※ 설치 이후 한국어가 여전히 안 나오는 경우가 있습니다. Language목록에 한글이 나오지 않는다면 Install / Remove Language에서 Korean을 선택 해제 했다가 다시 선택하면 나옵니다.

● 시간대 변경
① 설정 우측 하단의 time&date
② 세계 지도에서 중국과 일본 사이의 조그맣게 튀어나온 부분을 클릭 하면

추가 라이브러리 설치
※ 이 부분은 개인적으로 많이 사용하는 라이브러리 를 추가해놓은 것 입니다.
$ sudo apt-get install xinetd tftpd nfs-kernel-server minicom build-essential libncurses5-dev uboot-mkimage autoconf automake libqt3-mt-dev openssh-server

※ ubuntu 64의 경우 추가 해야 할 라이브러리  (32bit 호환을 위한 라이브러리) 
$ sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 zlib1g:i386


어렵지 않게 ubuntu 설치 및 한글 설정이 완료 되었습니다. 시간은 35분 정도 소요된 것 같네요. 그럼 이만. 수고하십시오 ㅎㅎ

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 
몇 분 후 타겟보드에서 리눅스 시스템이 작동할 것입니다.

2018년 2월 8일 목요일

Yocto 학습 : 작업 #8 - 생성된 툴 체인을 사용하여 수동으로 커널 빌드

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

원본은 https://community.nxp.com/docs/DOC-94849 입니다.
---------------------------------------------------------------------------------------------------

$bitbake meta-toolchain을 실행한 후 툴채인 패키지를 설치하는 스크립트는 아래와 같습니다.


$ ls tmp/deploy/sdk/poky-eglibc-x86_64-arm-toolchain-1.4.1.sh
   tmp/deploy/sdk/poky-eglibc-x86_64-arm-toolchain-1.4.1.sh

※ 늘곰씨는 ami6solo를 선택해서 파일 명칭이 조금 다릅니다.
tmp/deploy/sdk/poky-eglibc-i686-meta-toolchain-cortexa9hf-vfp-neon-toolchain-1.5.4.sh


아래는 이것을 설치하기 위한 명령입니다.

$ ./tmp/deploy/sdk/poky-eglibc-x86_64-arm-toolchain-1.4.1.sh
   [sudo] password for daiane:
   Enter target directory for SDK (default: /opt/poky/1.4.1):
   You are about to install the SDK to "/opt/poky/1.4.1". Proceed[Y/n]?y
   Extracting SDK...done
   Setting it up...done
   SDK has been successfully set up and is ready to be used.


Hello World 

$ source /opt/poky/1.4.1/environment-setup-armv7a-vfp-neon-poky-linux-gnueabi
$ cd ~/test/
$ arm-poky-linux-gnueabi-gcc helloworld.c
$ ls
a.out helloworld.c
$ ./a.out
-bash: ./a.out: cannot execute binary file
$ file a.out
a.out: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped

Kernel
설치된 툴 체인을 사용하여 커널 빌드하기 
$ source /opt/poky/1.4.1/environment-setup-armv7a-vfp-neon-poky-linux-gnueabi 

커널 소스는 github.com/boundarydevices/linux-imx6.git 에 가보시면 확인하실 수 있습니다. 
커널 소스 다운로드 (user 폴더에 생성합니다. 원문에서는 전체를 클론 하지만, 용량과 시간이 과다하게 투입되므로, 특정 버전을 다운로드 합니다. ) 
$ git clone --branch imx_3.0.35_4.0.0 --depth=1 git://github.com/boundarydevices/linux-imx6.git
imx6의 커널 환경 파일을 복제합니다. 

$ cp ../fsl-community-bsp/build/tmp/work/imx6qsabresd-poky-linux-gnueabi/linux-imx/3.0.35-r37.14/git/arch/arm/configs/imx6_defconfig ./

$ cd linux-imx 
$ export ARCH=arm
$ export CROSS_COMPILE=$TARGET_PREFIX 

$ unset LDFLAGS 
$ make imx6_defconfig
$ make uImage


bin 패치에서 mkimage를 사용할 수 있는지 확인해보세요
(만약 u-boot에서 mkimage를 내보냈다면 이것이 패치입니다.)

또는 ubuntu 패키지를 다운로드 하셔도 됩니다.

$ sudo apt-get install uboot-mkimage

※mkimage는 uimage를 만들어주는 도구라고 합니다.
※ ubuntu 14.04 64bit 버전에서 uboot-mkimage가 설치되지 않습니다. 따라서 다음 명령으로 대체합니다. 
$ sudo apt-get install u-boot-tools

※ 다른 툴 체인을 사용하여 빌드하기
※ 툴체인 중 arm-linux-gnueabihf- 툴체인이 cortex-a 계열을 지원합니다.  
apt-get install을 통한 cross compiler 를 설치하세요 
sudo apt-get install gcc-4.7-arm-linux-gnueabihf
gcc가 여러개인 경우 update-alternatives를 설정합니다.
$ sudo update-alternatives --install /usr/bin/arm-linux-gnueabihf-gcc arm-linux-gnueabihf /usr/bin/arm-linux-gnueabihf-gcc-4.7 473 --slave /usr/bin/arm-linux-gnueabihf-g++ arm-linux-gnueabihf-g++ /usr/binbin/arm-linux-gnueabihf-g++-4.7

$ export CROSS_COMPILE=arm-linux-gnueabihf-
$ export ARCH=arm
$ make imx6_defconfig
※커널 개별 설정을 할경우 아래 명령 
$ make menuconfig

$ make -j3 uImage LOADADDR=0x10008000
※ -j3는 병렬처리 코어 개수 설정입니다. 
※ 이 과정에서 kernel git이 잘못되었으면 dtb파일이 생성되지 않는다고 합니다. dtb가 없을 경우 커널의 정상 적용이 안될 수 있습니다. 

업데이트
아래와 같은 오류가 발생했다면

OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
multiple (or no) load addresses:
This is incompatible with uImages
Specify LOADADDR on the commandline to build an uImage
make[1]: *** [arch/arm/boot/uImage] Error 1
make: *** [uImage] Error 2
LOADADDR이 누락되었습니다.
mkimage 가 uImage를 생성하는데 사용할 수 있는 권한이 LOADADDR에 있어야 합니다.

주소 값은 하드웨어에 종속됩니다. 같은 imx6 보드라도 . 해당 하드웨어의 올바른 값에 대해 알고 계셔야 합니다.

예를 들어, 사용 중인 머신이 Yocto project/meta-fsl-arm에서 지원된다면 , 보드와 관련된 값을 conf/machine/include/imx-base.inc 파일이나, meta-fsl-arm - Freescale ARM 하드웨어 지원 메타데이터가 포함된 레이어 에서 구할 수 있습니다.
이것은 UBOOT_ENTRYPOINT에 사용된 값과 같습니다.

예를 들어 Freescale SABRE-SD 보드의 정보는 conf/machine/include/imx-base.inc에 기록되어 있습니다.
UBOOT_ENTRYPOINT_mx6 = "0x10008000"

따라서 빌드 명령은 다음과 같습니다.
make uImage LOADADDR=0x10008000

빠른 참조를 위해 필자가 가장 많이 사용하는 명령은 다음과 같습니다.
imx28evk:
$ make LOADADDR=0x40008000
imx53qsb:
$ make LOADADDR=0x70008000
imx6qsabresd:
$ make LOADADDR=0x10008000

업데이트2
Craig McQueen이 제안한
autotools 기반 패키지 만들기 예 :

$ source /opt/poky/1.4.1/environment-setup-armv7a-vfp-neon-poky-linux-gnueabi
$ ./configure ${CONFIGURE_FLAGS}
$ make
$ make install

CONFIGURE_FLAGS는 프로젝트에 완전히 귀속된 의존성 변수 입니다.

Yocto 교육 문서 - 홈
Yocto 학습 : 작업 #7 - 툴 체인 만들기
Yocto 학습 : 작업 #9 - bad/ugly 추가 방법 (플러그인에 대한 옵션 인 것 같습니다.)

Yocto 학습 : 작업 #7 - 툴 체인 만들기

---------------------------------------------------------------------------------------------------
이 문서는 Yocto Training - HOME 문서를 한글 화 한 것입니다. 저자이신 Daiane Angolini 님의 수락 하에 한글 화 작업을 진행하고 있습니다. 일부 주석을 첨부 할 것이며, 필요하면 의역을 통해 일부 내용이 변경 되거나 누락 될 수 있습니다. 하지만 기본은 구글이 번역하겠습니다.
원본은 https://community.nxp.com/docs/DOC-94849 입니다.
---------------------------------------------------------------------------------------------------
툴 체인을 생성하세요. 호스트 컴퓨터에 설치되고, 모든 소스 코드를 작성하는데 사용되는 툴 체인을 생성합니다.

$ bitbake meta-toolchain

빌드하는데 약간의 시간이 걸립니다.
※ core2개 ram4gb 상태로 작업 수행시 약 1시간 소요되었습니다. 

툴 체인을 만드는 이유는 무엇입니까? 

Yocto는 패키지를 개발하는데 사용되지 않습니다. Yocto는 리눅스 배포판 생성자입니다. rootfs 생성시, 배포용 이미지 생성시 사용되는 것입니다. (Yocto는 무엇인가에 대한 내용을 자세히 보시려면 여기, 그리고 여기를 클릭하세요)

따라서 Yocto 자체는 새로운 패키지 개발에 사용될 수 없습니다. 하지만 Yocto는 meta-toolchain 또는 Eclipse ADT와 같은 개발 환경을 만드는 데 도움을 줄 수 있습니다.


Yocto 교육 문서 - 홈
Yocto 학습 : 작업 #6 - 사용자 정의 이미지 만들기
Yocto 학습 : 작업 #8 - 생성된 툴 체인을 사용하여 수동으로 커널 빌드

Yocto 학습 : 작업 #6 - 사용자 정의 이미지 만들기

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

원본은 https://community.nxp.com/docs/DOC-94849 입니다.
---------------------------------------------------------------------------------------------------
업데이트 하는 것 잊지 마세요

사용자 정의 이미지 만드는법

<yocto> /source 폴더에 들어가 사용 가능한 이미지를 찾으세요
※작업1에서 BSP를 다운로드 받은 폴더 (fsl-community-bsp)


$ find -name *image*.bb
./meta-fsl-demos/recipes-fsl/images/fsl-image-gui-sdk.bb
./meta-fsl-demos/recipes-fsl/images/fsl-image-test.bb
./meta-fsl-demos/recipes-fsl/images/fsl-image-gui.bb
./meta-fsl-demos/recipes-qt/images/qt-in-use-image.bb
./meta-fsl-demos/recipes-qt/images/qte-in-use-image.bb
./meta-openembedded/meta-initramfs/recipes-bsp/images/initramfs-kexecboot-klibc-image.bb
./meta-openembedded/meta-initramfs/recipes-bsp/images/initramfs-kexecboot-image.bb
./meta-openembedded/meta-oe/recipes-support/imagemagick/imagemagick_6.7.5.bb
./meta-openembedded/meta-oe/recipes-multimedia/libsdl-image/libsdl-image_1.2.12.bb
./poky/meta-hob/recipes-core/images/hob-image.bb
./poky/meta-skeleton/recipes-multilib/images/core-image-multilib-example.bb
./poky/meta/recipes-devtools/mkelfimage/mkelfimage_svn.bb
./poky/meta/recipes-sato/images/core-image-sato-dev.bb
./poky/meta/recipes-sato/images/core-image-sato.bb
./poky/meta/recipes-sato/images/core-image-sato-sdk.bb
./poky/meta/recipes-qt/images/qt4e-demo-image.bb
./poky/meta/recipes-core/images/core-image-minimal.bb
./poky/meta/recipes-core/images/core-image-base.bb
./poky/meta/recipes-core/images/core-image-minimal-dev.bb
./poky/meta/recipes-core/images/core-image-minimal-initramfs.bb
./poky/meta/recipes-core/images/build-appliance-image.bb
./poky/meta/recipes-core/images/core-image-minimal-mtdutils.bb
./poky/meta/recipes-extended/images/core-image-lsb-sdk.bb
./poky/meta/recipes-extended/images/core-image-basic.bb
./poky/meta/recipes-extended/images/core-image-lsb-dev.bb
./poky/meta/recipes-extended/images/core-image-lsb.bb
./poky/meta/recipes-graphics/images/core-image-directfb.bb
./poky/meta/recipes-graphics/images/core-image-x11.bb
./poky/meta/recipes-graphics/images/core-image-clutter.bb
./poky/meta/recipes-graphics/xcb/xcb-util-image_0.3.9.bb
./poky/meta/recipes-bsp/u-boot/u-boot-mkimage_2012.04.01.bb
./poky/meta/recipes-bsp/u-boot/u-boot-mkimage_2011.06.bb
./poky/meta/recipes-bsp/u-boot/u-boot-mkimage_2011.03.bb
./poky/meta/recipes-rt/images/core-image-rt-sdk.bb ./poky/meta/recipes-rt/images/core-image-rt.bb
위의 이미지들은 (파일 명칭에 'image'가 들어잇는 것이 기본 패키지 파일입니다.) 기본(베이스) 이미지, 새 패키지를 추가할 수 있는 위치 또는 새 이미지의 예제로 사용될 수 있습니다.

bitbake -s 는 로컬에서 사용 가능한 패키지를 보여줍니다. grep 옵션을 통해 원하는 패키지 이름을 필터링 할 수 있습니다.

$ bitbake -s | grep calibrat
calibrateproto :0.0+gitAUTOINC+1da6fd1e2c7a49648245c98481fabea8b9690a8c-r2
libxcalibrate :0.0+gitAUTOINC+209d83af61ed38a002c8096377deac292b3e396c-r0
xinput-calibrator :0.7.5+gitAUTOINC+c01c5af807cb4b0157b882ab07a893df9a810111-r1

예를 들어 패키지 이름이 xinput-calibrator이며 이 패키지를 포함하려면 이 문자열이 필요 할 것입니다.

디펜던시 트리를 보려면 아래 명령을 입력하세요

$ bitbake -g fsl-image-test
fsl-image-test의 경우나 다른 이미지의 경우도 동일합니다.

이미지 정의 파일에 패키지 이름을 넣습니다.

$ cd meta-fsl-demos/
$ vim recipes-fsl/images/fsl-image-test.bb

IMAGE_INSTALL list에 패키지 파일 이름을 추가하세요
IMAGE_INSTALL += " \
   packagegroup-fsl-gstreamer \
   packagegroup-fsl-tools-testapps \
   packagegroup-fsl-tools-benchmark \
xinput-calibrator \
"

이미지에 패키지를 포함하려면 conf/local.conf파일을 다음과 같이 구성하세요


MACHINE ??= 'imx6qsabresd'
DISTRO ?= 'poky'
PACKAGE_CLASSES ?= "package_rpm"
EXTRA_IMAGE_FEATURES = "debug-tweaks tools-sdk"
USER_CLASSES ?= "buildstats image-mklibs image-prelink"
PATCHRESOLVE = "noop"
CONF_VERSION = "1"
BB_NUMBER_THREADS = '8'
PARALLEL_MAKE = '-j 8'
ACCEPT_FSL_EULA = "1"

CORE_IMAGE_EXTRA_INSTALL += "xinput-calibrator"

그리고 다음
$ bitbake fsl-image-test

conf/local.conf에 디버그 또는 기본 빌더를 추가하는 설정 아래와 같습니다.
EXTRA_IMAGE_FEATURES += "tools-sdk"

이후에 만들어지는 모든 이미지에 개발 도구가 포함됩니다. 동일한 이미지 파일에 포함될 수 있습니다.


Poky 설명 :
'tools-sdk'- gcc, make, pkgconfig 등과 같은 개발 도구를 추가합니다.
"dev-pkg"- 설치된 모든 패키지에 -dev 패키지를 추가합니다. 이미지의 라이브러리와 비교하여 개발할 때 유용합니다.
"tools-debug"- gdb 및 strace와 같은 디버깅 도구를 추가합니다.

명령어 입력 방식이 마음에 들지 않거나, 윈도우 방식의 인터페이스를 선호하는 경우 HOB를 살펴볼 수 있습니다.
HOB 문서 https://www.yoctoproject.org/documentation/hob-manual
유투브에서 HOB 시작 가이드 비디오 (Hob소개) 를 검색해보세요


Yocto 교육 문서 - 홈
Yocto 학습 : 작업 #5 - 커널
Yocto 학습 : 작업 #7 - 툴 체인 만들기

라섹수술 후 12년차 몇 가지 변동 사항이 있습니다.

이전문서가 있습니다. 이어서 보시면 내용을 조금 이해하기 쉬울 수 있습니다.
하지만 귀찮으실까봐 이전 문서의 라섹 후 관리 주요 요점
1. 일 수면 7시간 이상 (7시간 미만 수면 시 안구 건조 발생)
2. 안구 건조 시 2,30분 단위로 인공 눈물 넣기(12년인 지금도 합니다.)
3. 일 20분 이상 운동으로 안압과 혈압을 관리하라(안 할 경우 눈앞에 안개낀 듯 뿌옇게됨)
4. 난시가 발생하지 않도록 불 꺼놓고 영상을 보지 말라. 무드 조명을 사용하라.
5. 휴대폰 얼굴에 대놓고 보거나, 책도 그렇게 보는 경우를 없애라.(가끔 보면 휴대폰에 빨려 들어갈거같은 분들 있어요.. 그럼 시력 더나빠져요)
6. 먼 곳을 볼 수 있게 산으로 들로 놀러 다니던지, 자전거 타고 강변을 달려보아라.

---------------------------------------------------------------------------------------------------
2018년 2월: 라섹 10년차 후기를 쓴 이후(2016.08) 최근 1년 6개월이 지났습니다. 그동안 공부를 한다고 운동을 거의 하지 않고 지냈습니다. 이전 글은 네이버 블로그에 2016년 8월 올렸던 글입니다.  (특히 자전거) 자전거는 최근 5년간 연 100일 이상 타던 것이 작년엔 20일도 채 타지 않았습니다. 1년간 무드등도 거의 사용하지 않고 있습니다. 그리고 시력은 떨어졌죠. 오른쪽 1.2 왼쪽 1.0까지 하락했습니다. 운동하지 않으면 시력 떨어집니다. (혹은 노화 일수도 있겠네요. 나이가 40을 바라보다 보니...)

대부분 책상이 1m 이내의 사이즈로 생성되므로, 일할 때, 공부할 때 가까운 사물을 보는 시간이 많아집니다. 어쩔 수 없이 시력은 하락합니다. 평소에도 좁은 책상에서 90cm거리의 모니터만 보면서 지내는데.. 집에서까지 공부만 하니 시력이 떨어질 수 밖에 없지요. (안구가 운동할 기회를 잃는 것입니다. )

최근 친한 동생이 라섹을 하자마자 6개월 만에 0.6으로 떨어졌는데 이놈은 고시 공부 하느라 반지하에서 노트북 하나 들고 지냅니다. 어두운 것, 가까운 것만 보는 것 위험합니다.

그리고 이*원 님께서 빛 번짐이랑 건조증에 대해 질의해주셔서 검색을 해보니 후기라고 하면서 후기가 아닌 음해성 글인 것 처럼 보이는 글들이 있습니다?! 그래서 제가 직접 경험한 근시, 난시, 흐려짐에 대해 논해보려 합니다. 일단 발그림 한장 추가하겠습니다.

이 발그림은 제가 직접 경험한 라섹 이전 난시에 대한 그림과, 라섹 이후 안압에 따른 근시/원시에 대한 그림입니다.

그림 위쪽 : 난시
처음 난시가 강력해진 것은 중학생 때 시력이 0.4까지 떨어진 이후입니다. 처음 그림처럼 학교에서 맨 뒷자리에 앉아 칠판을 볼 경우 글자들이 서로 애매하게 겹쳐 있어 안경이 없이는 알아볼 수 없었지요. 그리고 고교를 가면서 달이 3개로 보이는 지경 까지 이르렀습니다. 저 그림은 실제 제가 본 것과 유사합니다.

그림 아래쪽 : 근시/원시
 라섹 수술 이후 약 5년 동안 겨울철마다 발생했던 심한 안구 건조나 운동 부족으로 인한 하락에 부수적으로 딸려오는 근/원시 발생 현상입니다. 두 가지는 차이가 있습니다. 안압이 하락하면 근/원시 1처럼 사물이 뿌옇고 흐려집니다. (진하기만 빠짐) 근데 여기에 안구 건조까지 오면 사물의 경계면도 약간씩 찌그러진 것 처럼 보입니다. (이 경우 20분 정도만 운동을 하더라도 증상이 쉽게 완화되기도 합니다. )

그림의 현상은 흔히 카메라에서 찾아볼 수 있습니다.
1. 번지거나 겹치는 것 : 카메라 렌즈가 초점을 정확히 맞추지 못할 경우.
2. 흐려지는 것:  조리개 값이 낮아서 빛이 충분히 들어오지 못할경우
3. 외형의 선이 뭉개지는 것 :  카메라 렌즈의 표면 가공이 매끄럽지 않아서 미세한 번짐이 발생하는 것 이지요. 이 상태로 빛을 본다면 빛이 번지는 것 처럼 느껴질 것 입니다.

1,2는 홍체와 관련이 있어 보입니다. 즉 안구의 근력이 가장 큰 영향을 미치는 부분입니다.
3은 각막의 상태와 관련이 있는 것 같은데 안압이 떨어지면 각막이 평평하게 유지되지 않는 것 같습니다. 결론은 둘 다 운동하지 않아서 생기는 일일 수 있다는 것 입니다.

개인적으로 이것을 라섹 후유증이라고 표현하기엔 무리가 있다고 생각이 됩니다. 만약 이런 증상으로 고생하고 계시고 정말 후유증이라 생각 된다면 청와대 국민청원이라도 해보시는 것을 추천합니다. 의료 과실에 대한 인과관계가 따지기 어렵긴 하지만 20만이라는 사례가 모인다면 혹은 정부에서 지속적으로 해당 문제에 관심을 갖는다면 언젠가 해결이 되겠지요.

개인적으로 사람들이 라식 라섹 이후로 안구 건조가 심하다 라 말하는 부분에 '그럴 수 있지' 라고 공감을 하기도 하지만, 제 주변에 원래 시력이 좋은 사람들도 종종 안과에 다닙니다. 안구 건조에 의한 각막 손상 때문에 실명 직전까지 간 27세 동생 녀석도 있고, 눈이 가려워서 자꾸 비비다가 안과 가서 보니 각막에 염증이 생기는 질환으로 판정 받고 안약 넣기도 합니다.

이런 걸로 비추어 볼 때. 안구 관리에 소흘했던 사람이 라섹 이후 안구 건강에 신경을 쓰기 시작하면서 발생하는 관심의 과도한 표현이 부작용 처럼 나타나지 않나 합니다. (안구 건조는 원래 잠을 6시간 이상 자지 못하면 발생하는 것인데, 라섹 이후 안구가 건조하다! 라고 생각하는 것 같은 현상이지요.)

라섹이 만능이 아닙니다. 라섹해도 지속적으로 관리하고 안과도 다녀야 합니다.
관리 안 하면 그냥 망합니다.

올해 3월 24일 준비한 시험에 합격한다면 올 해는 자전거 100일 이상을 탈 생각입니다. 연말에 시력 측정하고 다시 이 문서에 결과를 추가하도록 하겠습니다.
시험에 떨어져서 여전히 공부중입니다.

2018년 2월 7일 수요일

Yocto 학습 : 작업 #5 - 커널

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

원본은 https://community.nxp.com/docs/DOC-94849 입니다.
---------------------------------------------------------------------------------------------------

당신은 이미 당신의 소스 코드가 1주일 전 소스라는 것을 알고 있습니다. 이제 업데이트 하세요. (아니면 제가 'sync'라고 말해야 할까요?) BSP 계층을 업데이트 하는 것에 익숙해져야 합니다.

레시피 
패키지가 작동하는 방식을 결정하는 파일입니다.
예를 들자면 : 버전, 주요 저장소의 위치, 빌드 방법, 설치, 링크, 기타.

커널
meta-fsl-arm의 경우 커널 레시피는 meta-fsl-arm / recipes-kernel / linux(meta-fsl-arm - Freescale ARM 하드웨어 지원 메타데이터가 포함된 레이어 에서 확인할 수 있습니다.)

meta-fsl-arm을 위한 3개의 커널 레시피
linux-fslc_3.8.bb --> 메인라인 커널 (kernel.org)
linux-imx_2.6.35.3.bb --> imx5x와 imx28을 위한 FSL 커널
linux-imx_3.0.55.bb --> imx6를 위한 FSL커널

※커널 레시피 위치 ~/fsl-community-bsp/sources/meta-fsl-arm/recipes-kernel/linux 


imx6를 위한 linux-imx 예제는 여기 있습니다. : meta-fsl-arm - Freescale ARM 하드웨어 지원 메타데이터가 포함된 레이어

레시피 결정 시 고려 사항 :
이 리눅스 버전과 호환되는 기계는 무엇입니까?(mx6)
이 코드의 해드에 대한 커밋 ID는 무엇입니까?(SRCREV)(MX6DL과 MX6SL은 서로 다른 소스 코드를 갖고 있습니다.)
mx6 보드에 대한 패치는 어떤 것이 잇습니까?(SRC_URI)

소스 코드가 어디에서 복제되었는지 확인하려면 .inc파일을 확인하면 됩니다. meta-fsl-arm - Freescale ARM 하드웨어 지원 메타데이터가 포함된 레이어
※vi 에디터나 cat linux-imx.inc 파일을 확인하세요
SRC_URI = "git://git.freescale.com/imx/linux-2.6-imx.git \ 
                file://defconfig \
 " 

이것은 git.freescale.com의 것입니다. 또한 SRC_URI에 defconfig 파일이 추가되어 있습니다.

모든 리눅스 버전마다 모든 보드에 대한 defconfig 파일이 있습니다. 일부 defconfig 파일들은 둘 이상의 보드 에서 공유되며(예 : 모든 mx6보드), 일부 리눅스 버전은 일부 보드에서 호환되지 않습니다. (예 : imx53은 2.6.35만 호환 가능합니다. )

bitbake linux-imx 명령을 수행하다 보면 git 코드와 패치, defconfig가 포함된 temp 폴더가 build/tmp/armv7-imx6 ..../linux-imx 아래 생성됩니다. 그 다음 bitbake는 해당 defconfig와 커널 환경을 구성하고, 빌드 한 다음 배포합니다.

그러므로 커널 환경 설정을 변경하려면(메뉴 환경 설정을 정의하여) meta-fsl-arm/recipes-kernel/linux/linux-imx-3.0.35/mx의 defconfig 파일을 변경해야 합니다.

커널 설정 변경 방법

새로운 defconfig 파일을 만듭니다.
meta-fsl-arm/recipes-kernel/linux/linux-imx-3.0.35/mx6 에 defconfig 파일을 복제합니다. (자신의 보드/커널에 맞는 폴더를 찾아 복제하세요 )
$ bitbake -c cleansstate linux-imx
$ bitbake linux-imx  

※ bitbake linux-imx는 커널을 빌드하는 명령입니다. 

Yocto로 menuconfig를 만드는 법

$ bitbake -c menuconfig linux-imx
tmp/work/imx6qsabresd-poky-linux-gnueabi/linux-imx/3.0.35-r33.10/git/.config에 설정 파일을 생성합니다.

커널 설정을 변경하기 위한 단계 별 작업

※menu config 를 통해 커널의 환경설정을 변경합니다. 
$ bitbake -c menuconfig linux-imx
※ 변경된 커널 환경설정을 defconfig로 변경합니다. 

$ cp tmp/work/imx6qsabresd-poky-linux-gnueabi/linux-imx/3.0.35-r33.10/git/.config ../sources/meta-fsl-arm/recipes-kernel/linux/linux-imx-3.0.35/mx6/defconfig 
※ 커널의 상태를 초기화 합니다.
$ bitbake -c cleansstate linux-imx 

※이미지를 빌드합니다.
$ bitbake fsl-image-gui

※ 커널에 변경사항을 반영하려면 커널만 빌드합니다. 
$ bitbake linux-imx  

uImage 는 tmp/deploy/image 아래에 있습니다.

준비된 하나의 sd카드에 uImage 바이너리 만 변경하려면 다음을 수행하세요 :

$sudo cp tmp/deploy/image/uImage-imx6-XXX.bin /media/user/Boot imx6/uImage

메인 라인 커널 - kernel.org

https://mirrors.edge.kernel.org/pub/linux/kernel/v3.0/
linux-imx 대신 커널 메인 라인을 사용하기 위해서. conf / local.conf에 다음 코드를 추가하십시오.
PREFERRED_PROVIDER_virtual/kernel = "linux-fslc"

kernel.org에서 보드를 지원하는지 확인하세요

메인 라인 커널을 수동으로 빌드하려면 https://community.freescale.com/docs/DOC-95017 파일을 참조하세요.

마지막 포인트 
이것은 간단한 작업이 아닙니다. Yocto는 개발 단계에서 커널을 개발하고 사용자 정의하는 데 사용할 수 있는 최상의 도구는 아닙니다. 외부 툴 체인(bitbake 메타 툴 체인)을 사용하는 것이 더 쉽습니다. 커널 개발 또는 사용자 정의가 완료되면 변경 사항을 Yocto에 통합하여 프로덕션 용도로 관리할 수 있습니다.

저는 커널 소스 코드를 git.freescale.com에서 제 로컬 머신에 직접 복사하고 작업을 합니다. 그런 다음 다시 설정하고 패치를 적용하고, 변경하고 수동으로 빌드 하는 등 원하는 데로 변경할 수 있습니다. 그래서 버그와 그 수정 방법을 알고, 제가 패치를 갖고 있을 때만 Yocto를 사용하여 커널을 변경합니다. (그리고 이것이 제가 작업하는 방식입니다. )

이것이 커널을 구성하는 방법입니다. (그리고 패치도)
(만약 커널을 패치하고 싶다면 레시피 예제를 따라 진행하세요)

오류가 발생하면 저에게 알려주세요, 나는 그 단계를 테스트 해 보았지만 가상 머신이 아닌 우분투 머신을 사용하고 있습니다. (가상 머신 에서는 -c menuconfig 가 어떻게 작동하는지 모릅니다.)

Yocto 교육 문서 - 홈
Yocto 학습 : 작업 #4 - 배포 및 테스트
Yocto 학습 : 작업 #6 - 툴 체인 만들기

2018년 2월 6일 화요일

Yocto 학습 : 작업 #4 - 배포 및 테스트

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

원본은 https://community.nxp.com/docs/DOC-94849 입니다.
---------------------------------------------------------------------------------------------------

업데이트
이미 알고 있듯이 소스는 주기적으로 업데이트 하십시오.

$ repo sync

이미지 - bitbake 결과

bitbake 수행 후 콘텐츠 예:

build_mx6/tmp/deploy/images:
fsl-image-gui-imx6qsabresd-20130505174618.rootfs.ext3
fsl-image-gui-imx6qsabresd-20130505174618.rootfs.sdcard
fsl-image-gui-imx6qsabresd-20130505174618.rootfs.tar.bz2
fsl-image-gui-imx6qsabresd-20130508162511.rootfs.ext3
fsl-image-gui-imx6qsabresd-20130508162511.rootfs.sdcard
fsl-image-gui-imx6qsabresd-20130508162511.rootfs.tar.bz2
fsl-image-gui-imx6qsabresd.ext3
fsl-image-gui-imx6qsabresd.sdcard
fsl-image-gui-imx6qsabresd.tar.bz2
modules-3.0.35-1.1.0+yocto+g0596856-r32.10-imx6qsabresd.tgz
README_-_DO_NOT_DELETE_FILES_IN_THIS_DIRECTORY.txt
u-boot.imx
u-boot-imx6qsabresd.imx
u-boot-imx6qsabresd-v2013.04-r3.imx*
uImage
uImage-3.0.35-r32.10-imx6qsabresd-20130505174618.bin
uImage-imx6qsabresd.bin

익숙한 이미지들이 생성되었을 겁니다. 어떤 이미지 파일이 심볼릭 링크인지 그리고 어느것이 실제 이미지인지 이해하십시오. 심볼릭 링크는 항상 최신 이미지를 가리킵니다.

SD카드 이미지 
이곳을 확인하시면 sd카드가 어떻게 생성되는지 확인할 수 있습니다.  : meta-fsl-arm - Freescale ARM 하드웨어 지원 메타데이터가 포함된 레이어

디스크 레이아웃은 아래와 같습니다.
0 -> IMAGE_ROOTFS_ALIGNMENT이 부트로더에 예약됨
IMAGE_ROOTFS_ALIGIN  -> BOOT_SPACE 커널 및 기타 데이터
BOOT_SPACE -> SDIMG_SIZE rootfs
IMAGE_OVERHEAD_FACTOR를 사용하여 공간을 추가하십시오.

디스크 레이아웃을 이해하려면 원본 파일을 살펴보세요
※바로 위에 있는 링크를 말하는 것 같습니다. 

이것은 기본적으로 u-boot를 위한 약간의 초기 영역이 설정되어 있습니다. uImage를 위한 하나의 파티션. rootfs를 위한 하나의 파티션. 전체 sd카드 사이즈는 모든 이미지에 대해 계산되야 합니다. 만약 sd카드 내에 빈 공간을 만들고 싶다면, IMAGE_OVERHEAD_FACTOR를 사용하세요.


※ 배포에 앞서 저는 초보라 sd카드 리더기를 연결하는데도 한세월이 걸렸습니다. 그래서 방법을 올려놨습니다. ARM Embedded 초보 개발자의 이슈 정리 글에 가셔서 "4.VMWARE에서 SD카드 어떻게 연결해?"를 검색해보세요  

sd카드에 이미지 배포하기

$ sudo dd if=fsl-image-gui-imx6qsabresd.sdcard of=/dev/sdX bs=1M

※리눅스를 잘 몰라서 이게 무슨의미인지 찾는데 한참 걸렸습니다. sd카드 전체에 이미지를 배포한다는 것이고, 파티션 구성을 포함한 모든게 바뀝니다. 
$sudo fdisk 를 하시면 아래와 같이 디스크 정보가 나옵니다. 첫번째는 vm의 메인으로 잡힌 디스크 드라이브이고, 두번째가 sd카드입니다. Disk 옆에 나오는 /dev/sdb <---이것이 disk의 이름이고, sd카드에 배포하기는 여기에 배포하는 것 , 그리고 rootfs나, u-boot만 배포하는 것은 디스크가 아닌 파티션에 배포하라는 것 입니다. 

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048   163575807    81786880   83  Linux
/dev/sda2       163575808   167772159     2098176    5  Extended
/dev/sda5       163577856   167770111     2096128   82  Linux swap / Solaris

Disk /dev/sdb: 7948 MB, 7948206080 bytes
4 heads, 32 sectors/track, 121280 cylinders, total 15523840 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000983f0

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            8192       24575        8192    c  W95 FAT32 (LBA)

/dev/sdb2           24576    15523839     7749632   83  Linux


ext3만 rootfs에 배포하는 방법

$ sudo dd if=fsl-image-gui-imx6qsabresd.ext3 of=/dev/sdX2 bs=1M

tar.bz만 rootfs에 배포하는 방법

$ sudo mount /dev/sdX2 /mnt/card
$ sudo tar xf imagename-imx53qsb.tar.bz2 -C /mnt/card

커널만 배포하는 방법

$ sudo cp uImage-3.0.35-r32.10-imx6qsabresd-20130505174618.bin /media/Boot

u-boot 만 배포하는 방법

$ sudo dd if=u-boot-imx6qsabresd-v2012.10-r3.imx of=/dev/sdX bs=512 seek=2

만약 HDMI를 사용한다면 u-boot 환경 인수를 변경해주어야 합니다.

setenv mmcargs "setenv bootargs console=${console},${baudrate} root=${mmcroot} rootwait rw video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24"

이것은 meta-fsl-arm을 통해 sd카드를 만드는 방법입니다. 물론 자신의 것을 사용할 수 있습니다. 하지만 u-boot bootenv를 다시 확인해야 합니다.

이제 sd카드를 꽂고 보드를 부팅 시키십시오.

로그인은 : root 계정을 사용하면 됩니다.

Yocto NFS & TFTP boot  sd카드를 vm에 연결하기 귀찮아서 네트워크 부팅을 번역해보았습니다.

Yocto 교육 문서 - 홈
Yocto 학습 : 작업 #3 - 빌드 결과
Yocto 학습 : 작업 #5 - 커널

Yocto 학습 : 작업 #3 - 빌드 결과

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

원본은 https://community.nxp.com/docs/DOC-94849 입니다.
---------------------------------------------------------------------------------------------------

이미 알고 있듯이 소스는 주기적으로 업데이트 하십시오.

$ repo sync

무엇이 변경되었습니까? 터미널에 출력 된 메시지를 읽고 변경 사항을 확인하세요.

디렉터리 구조 

이것이 제  fsl-community-bsp 디렉터리 내에 포함되어 있는 소스 목록입니다. 
$ tree -d -L 2 -A

├── build_mx53
│ ├── conf
│ ├── sstate-cache
│ └── tmp
├── build_mx6
│ ├── conf
│ ├── sstate-cache
│ └── tmp
├── downloads
│ └── git2
└── sources
├── base
├── meta-fsl-arm
├── meta-fsl-arm-extra
├── meta-fsl-demos
├── meta-openembedded
└── poky

tree 명령이 수행되지 않을 경우 아래 명령을 수행해서 tree를 설치해주세요 
$ sudo apt-get install tree
늘곰씨 디렉터리도 큰 구조 차이는 없습니다. 
.
├── build
│   ├── cache
│   ├── conf
│   ├── sstate-cache
│   └── tmp
├── downloads
│   ├── backport
│   ├── debian
│   ├── etc
│   ├── git2
│   ├── licenses
│   └── share
└── sources
    ├── base
    ├── meta-fsl-arm
    ├── meta-fsl-arm-extra
    ├── meta-fsl-demos
    ├── meta-openembedded
    └── poky

폴더는 작업 Yocto 학습 : 작업 #2 - 첫 번째 빌드의 새 빌드 디렉터리 생성 에서 입력한 명칭으로 빌드 디렉터리를 생성한 결과입니다. 학습 문서에 따라 $ source setup-environment build 라고 입력하였다면 디렉터리만 생성됩니다. 

sstate-cache는 이전에 빌드 된 패키지의 정보를 유지합니다. 패키지의 변경 사항이 없을 경우 다시 빌드를 수행 할 필요는 없습니다.
만약에 팀 간의 빌드 환경을 동일하게 공유하고 있을 경우. Sstate-cache 폴더 역시 공유할 수 있습니다. Yocto의 개인 환경 설정에 익숙하지 않을 경우 Yocto  프로젝트 참조 설명서를 읽어보세요.
※ 한글 화 된 문서가 있긴 합니다. 검색해보시면. 그런데 제 스타일 아니라서 나중에 번역해서 참조 링크를 추가 하겠습니다. 

downloads는 모든 빌드 폴더에서 공유된 것입니다. 이것은 모든 패키지 소스 코드를 포함하고 있습니다. 예를 들어 ssh소스코드 같은 것들이죠(그리고 이 소스 코드는 어떤 아키텍처의 빌드에도 사용될 수 있습니다.)

또한 당신의 팀과 다운로드 폴더를 공유할 필요성이 생길 수 있습니다. (팀 전체를 위한 하나의 다운로드 폴더를 사용)  이럴 경우  Yocto  프로젝트 참조 설명서의 DL_DIR 부분을 참조하세요.

build_mx6의 구조

.../build_mx6$ tree -d -L 2 -A
.
├── conf
├── sstate-cache
└── tmp
       ├── buildstats
       ├── cache
       ├── deploy
       ├── log
       ├── pkgdata
       ├── sstate-control
       ├── stamps
       ├── sysroots
       ├── work
       └── work-shared

tmp폴더 안에서 이미지의 빌드 결과를 찾을 수 있습니다. 생성된 이미지들은 deploy안에 있습니다.

buildstats 폴더에는 각 패키지가 들어있으며 build_stats 파일에 태스크의 초기 및 최종 시간과 같은 빌드 수행 관련 통계 정보가 있습니다.

log 폴더에는 수행한 모든 'bitbake' 명령에 대한 전체 로그가 기록됩니다. 예를 들어 log/cooker/imx6qsabresd/111111.log 같은 파일을 살펴보십시오. 11111은 pid 번호이므로 bitbake를 실행할 때마다 다른 번호가 표시됩니다.

작업에 사용된 각 패키지에 대한 소스 코드, 패치, bitbake에 대한 로그가 작동 중입니다. 커널의 경우 tmp/work/imx6qsabresd-poky-linux-gnueabi/linux-imx/3.0.35-r37.14/ 아래에 있는 파일을 보십시오.


.../build_mx6$ tree -d -L 1 -A tmp/work/imx6qsabresd-poky-linux-gnueabi/linux-imx/3.0.35-r37.14/tmp/work/imx6qsabresd-poky-linux-gnueabi/linux-imx/3.0.35-r37.14/

├── deploy-linux-imx
├── deploy-rpms
├── git
├── image
├── license-destdir
├── package
├── packages-split
├── pkgdata
├── pseudo
├── sysroot-destdir
└── temp

tmp 폴더 아래의 많은 로그들과 실행 파일들을 확인하세요.
r37.14/temp/

log.do_bundle_initramfs                   log.do_uboot_mkimage                
run.do_package_write_rpm.28992       run.perform_packagecopy.16364
log.do_bundle_initramfs.28986          log.do_uboot_mkimage.2325           
run.do_patch                                 run.populate_packages.16364
log.do_compile                              log.do_unpack                       
run.do_patch.2556                          run.read_shlibdeps.16364
log.do_compile.3483                       log.do_unpack.1155                  
run.do_populate_lic                        run.read_subpackage_metadata.28992
log.do_compile_kernelmodules          log.task_order                      
run.do_populate_lic.10988                run.split_and_strip_files.16364
log.do_compile_kernelmodules.29051  run.base_do_fetch.28859             
run.do_populate_sysroot                   run.split_kernel_module_packages.16364
log.do_configure                            run.base_do_unpack.1155             
run.do_populate_sysroot.17692          run.split_kernel_packages.16364
log.do_configure.3048                      run.BUILDSPEC.28992                 
run.do_qa_configure.3048                 run.sstate_create_package.10988
log.do_deploy                                run.debian_package_name_hook.16364  
run.do_qa_staging.17692                  run.sstate_create_package.16364
log.do_deploy.617                          run.do_bundle_initramfs             
run.do_sizecheck                            run.sstate_create_package.17692
log.do_fetch                                  run.do_bundle_initramfs.28986       
run.do_sizecheck.2323                     run.sstate_create_package.2724
log.do_fetch.28859                         run.do_compile                      
run.do_strip                                  run.sstate_create_package.28992
log.do_install                                run.do_compile.3483                 
run.do_strip.2321                           run.sstate_create_package.617
log.do_install.2327                         run.do_compile_kernelmodules        
run.do_uboot_mkimage                   run.sstate_task_postfunc.10988
log.do_package                             run.do_compile_kernelmodules.29051  
run.do_uboot_mkimage.2325           run.sstate_task_postfunc.16364
log.do_package.16364                    run.do_configure                    
run.do_unpack                             run.sstate_task_postfunc.17692
log.do_packagedata                      run.do_configure.3048               
run.do_unpack.1155                      run.sstate_task_postfunc.2724
log.do_packagedata.2724               run.do_deploy                       
run.emit_pkgdata.16364                run.sstate_task_postfunc.28992
log.do_package_write_rpm             run.do_deploy.617                   
run.fixup_perms.16364                  run.sstate_task_postfunc.617
log.do_package_write_rpm.28992     run.do_fetch                        
run.package_depchains.16364         run.sstate_task_prefunc.10988
log.do_patch                               run.do_fetch.28859                  
run.package_do_filedeps.16364       run.sstate_task_prefunc.16364
log.do_patch.2556                        run.do_install                      
run.package_do_pkgconfig.16364      run.sstate_task_prefunc.17692
log.do_populate_lic                       run.do_install.2327                 
run.package_do_shlibs.16364           run.sstate_task_prefunc.2724
log.do_populate_lic.10988              run.do_package                      
run.package_do_split_locales.16364  run.sstate_task_prefunc.28992
log.do_populate_sysroot                run.do_package.16364                
run.package_fixsymlinks.16364         run.sstate_task_prefunc.617
log.do_populate_sysroot.17692        run.do_packagedata                  
run.package_get_auto_pr.16364       run.sysroot_cleansstate.3048
log.do_sizecheck                            run.do_packagedata.2724             
run.package_get_auto_pr.2327        run.sysroot_stage_all.17692
log.do_sizecheck.2323                    run.do_package_qa.16364             
run.package_get_auto_pr.617            run.write_specfile.28992
log.do_strip                                  run.do_package_rpm.28992            
run.package_name_hook.16364
log.do_strip.2321                            run.do_package_write_rpm            

run.patch_do_patch.2556
각 패키지에 대한 최종 작업과 종료된 최종 작업 로그 파일을 확인할 수 있습니다.
예 :
log.do_compile - 커널 생성에 사용된 최종 do_compile 의 로그 출력
log.do_compile.3483 - 3483 시간의 컴파일 로그 출력
※ 순번을 나타내는 time인지, 시간을 나타내는지 정확히 모르겠습니다. taskorder에 의한 순번인 것 같습니다.
run.do_compile   -  컴파일에 사용된 명령어

작업과 작업 시퀀스에 대한 정보는 log.task_order파일에 있습니다.

생성된 이미지에 대한 정보는 아래와 같이 확인할 수 있습니다.


.../build_mx6$ ls -la tmp/deploy/images/imx6qsabresd/
total 146260
drwxr-xr-x 2 user user 4096 Mar 6 21:21 .
drwxrwxr-x 3 user user 4096 Mar 6 21:12 ..
-rw-r--r-- 1 user user 67108864 Mar 6 21:21 core-image-base-imx6qsabresd-20140306173758.rootfs.ext3
-rw-r--r-- 1 user user 83886080 Mar 6 21:21 core-image-base-imx6qsabresd-20140306173758.rootfs.sdcard
-rw-r--r-- 1 user user 18782361 Mar 6 21:21 core-image-base-imx6qsabresd-20140306173758.rootfs.tar.bz2
lrwxrwxrwx 1 user user 55 Mar 6 21:21 core-image-base-imx6qsabresd.ext3 -> core-image-base-imx6qsabresd-20140306173758.rootfs.ext3
lrwxrwxrwx 1 user user 57 Mar 6 21:21 core-image-base-imx6qsabresd.sdcard -> core-image-base-imx6qsabresd-20140306173758.rootfs.sdcard
lrwxrwxrwx 1 user user 58 Mar 6 21:21 core-image-base-imx6qsabresd.tar.bz2 -> core-image-base-imx6qsabresd-20140306173758.rootfs.tar.bz2
-rw-rw-r-- 2 user user 439697 Mar 6 21:12 modules--3.0.35-r37.14-imx6qsabresd-20140306173758.tgz
lrwxrwxrwx 2 user user 54 Mar 6 21:12 modules-imx6qsabresd.tgz -> modules--3.0.35-r37.14-imx6qsabresd-20140306173758.tgz
-rw-rw-r-- 2 user user 294 Mar 6 21:20 README_-_DO_NOT_DELETE_FILES_IN_THIS_DIRECTORY.txt
lrwxrwxrwx 2 user user 35 Mar 6 21:16 u-boot.imx -> u-boot-imx6qsabresd-v2013.10-r0.imx
lrwxrwxrwx 2 user user 35 Mar 6 21:16 u-boot-imx6qsabresd.imx -> u-boot-imx6qsabresd-v2013.10-r0.imx
-rwxr-xr-x 2 user user 297984 Mar 6 21:16 u-boot-imx6qsabresd-v2013.10-r0.imx
lrwxrwxrwx 2 user user 53 Mar 6 21:12 uImage -> uImage--3.0.35-r37.14-imx6qsabresd-20140306173758.bin
-rw-r--r-- 2 user user 4042496 Mar 6 21:12 uImage--3.0.35-r37.14-imx6qsabresd-20140306173758.bin
lrwxrwxrwx 2 user user 53 Mar 6 21:12 uImage-imx6qsabresd.bin -> uImage--3.0.35-r37.14-imx6qsabresd-20140306173758.bin


이제 생성된 모든 이미지에 엑세스 할 수 있습니다. 이미지 이름이 년월일PID로 작성되어 있는 것이 진짜 이미지 입니다. 매번 bitbake 수행이 완료될 때 마다 새로운 이미지가 생성됩니다.

심볼릭 링크는 최종 생성된 이미지의 정보를 나타냅니다.
※ 리눅스 초보라 심볼릭 링크가 뭔가 보니 그냥 '->' 마크 이후에 나오는 것이 심볼릭 링크 정보더군요. 제타위키의 심볼릭 링크 생성 실습

.ext3 파일은 rootfs의 EXT3 이미지입니다.
다음 명령을 사용하여 SD카드에 이용하여 직접 복사할 수 있습니다.
$sudo dd if=core-image-base.ext3 of=/dev/sdb2
.sdcard 파일은 SD카드에 복사할 전체 이미지 파일입니다. (u-boot + uImage+rootfs)
.tar.bz2 파일은 rootfs용 압축 파일이며 pc에서 압축을 풀 수 있습니다.
uImage는 최신 커널 이미지입니다.
u-boot는 최신 u-boot 이미지입니다.

생성된 파일로 놀아보세요. 저도 그중 많은 것들에 대해 알지 못합니다. 그리고 저는 그중 많은 것들을 사용하지 않습니다. 표준 이미지 생성의 경우 최종 이미지의 배치 위치만 알면 됩니다.

모든 질문, 의견, 문제는 알려주시기 바랍니다.

학습을 종료 하기 전에 bitbake에서 가장 큰 이미지를 생성하세요
$ bitbake fsl-image-gui
Note 2014.02.24 : 빌드에 필요한 디스크 용량은 44GB입니다.
수행시켜놓고 다른 일을 하는 것을 권장 합니다.
※ 늘곰씨는 디스크 용량이 최대 80gb 밖에 안되서 그간 bitbake했던 build 디렉터리를 모두 삭제하였습니다. 
※2017.02.07 bitbake fsl-image-gui 사용시 오류가 발생하는 중입니다. ('gitorious.org[0: 64.13.172.37]: errno=Connection refused') 해당 사항은 문의중이며 오류 메시지 전문은 아래 캡처와 같습니다. 현재 fsl-image-gui 버전 이외의 core-image-base 를 통해 배포 및 기타 테스트를 진행했습니다. 

빌드 결과 개인적으로 변경해야 할 녀석들이 생겼습니다. busybox에서 일부 명령이 안들어서 문제가 되었는데요 이 경우 환경설정을 menuconfig를 통해서 해주어야 합니다. 
$ bitbake -c menuconfig busybox 
$ bitbake busybox 
$ bitbake core-image-base

디스크의 파티션 사이즈가 너무 작아 파일을 넣거나 빼기 어렵습니다. 따라서 디스크 크기도 조정 해 줍니다.
build폴더내에서 아래 명령을 수행해주면 rootfs가 2gb로 변경됩니다. 이부분에 계산 방법이 있다고 합니다. https://community.nxp.com/docs/DOC-105521
$ cat >> ./conf/local.conf << 'EOF' IMAGE_ROOTFS_SIZE = "2097152" IMAGE_OVERHEAD_FACTOR = "1.5" EOF



Yocto 교육 문서 - 홈
Yocto 학습 : 작업 #2 - 첫 번째 빌드
Yocto 학습 : 작업 #4 - 배포 및 테스트