본문 바로가기
임베디드/EtherCAT Master

비글본블랙에 리눅스 커널 설치하기

by 꾸용꾸용 2016. 10. 15.

비글본블랙에 리눅스 커널 설치하기



이글은 하기 경로의 글을 참조하여 작성하였습니다.

https://eewiki.net/display/linuxonarm/BeagleBone+Black

(거의 동일하므로 직접 보고 따라하셔도 무방합니다.)


개발환경은 ARM 크로스 컴파일러가 64bit로 pre-built 되어 있어서

64bit환경의 리눅스 호스트가 필요합니다.

해당 글은 Ubuntu 16.04 64bit 버전에서 진행하였습니다.

 

1. ARM Cross Compiler:GCC 설치


크로스 컴파일러는 간단하게 이기종 플랫폼에서 타겟 플렛폼에 맞는 실행파일을 

만들어 주는 역활을 합니다.

해당 포스팅의 경우 Host는 Intel기반 PC이고 타겟은 비글본블랙(ARM)이죠....


다운로드 및 컴파일러 경로 설정 :

~/

  wget -c https://releases.linaro.org/components/toolchain/binaries/5.3-2016.05/arm-linux-gnueabihf/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabihf.tar.xz

 tar xf gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabihf.tar.xz
 export CC=`pwd`/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-


테스트시 아래와 같은 메세지 나오면 정상 설치 :

~/

 ${CC}gcc --version

arm-linux-gnueabihf-gcc (Linaro GCC 5.3-2016.055.3.1 20160412
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.



2. 부트로더(U-Boot) 설치 및 컴파일


부트로더란 운영체제가 시동되기 전 실행되는 최초의 시스템 프로그램으로

하드웨어 초기화 및 검사등의 기초적인 작업으로 커널이 올바르게 실행되기 위한 

작업을 하는 프로그램 입니다.

보통 임베디드 시스템에서는 u-boot가 가장 많이 쓰입니다.


다운로드:

~/

  git clone https://github.com/u-boot/u-boot

 cd u-boot/
 git checkout v2016.09-rc2 -b tmp


패치:

~/u-boot

  wget -c https://rcn-ee.com/repos/git/u-boot-patches/v2016.09-rc2/0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch

  
 patch -p1 < 0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch


설정 및 빌드:

~/u-boot

  make ARCH=arm CROSS_COMPILE=${CC} distclean

 make ARCH=arm CROSS_COMPILE=${CC} am335x_evm_defconfig
 make ARCH=arm CROSS_COMPILE=${CC}


위 과정을 통하여 커널이 완료되면 u-boot 폴더 안에

MLO와 u-boot.img 가 생성됩니다.


각각을  first 부트로더 second 부트로더라고 하는데

초기화 안된 초기 하드웨어의 가용할 수 있는 rom용량이 작아서

first부트로더가 second 부트로더를 올릴수 있게 최소한의 하드웨어 초기화를 하고

초기화가 된 ram에 second 부트로더를 올려 나머지 초기화를 진행 합니다. 


3. 리눅스 커널 컴파일


해당 글은 추후 프로젝트를 위해 커널 버전 v4.4에 Real Time 커널을 대상으로 합니다.

리눅스에 real time성을 부여하는 방법으로는 여러가지 방법이 있으나(RTAI, Xenomai 등등..)

최근 RT커널도 성능이 많이 향상되었다고 하여 해당 커널로 진행 합니다.


커널 다운로드

~/

  git clone https://github.com/RobertCNelson/bb-kernel

 cd bb-kernel/


커널 체크아웃(git)

am33x-rt-v4.4(Longterm 4.4.x + Real-Time Linux)

~/bb-kernel

  git checkout origin/am33x-rt-v4.4 -b tmp


커널 빌드:

~/

  ./build_kernel.sh


커널을 빌드하기 위해서는 일반적으로 타겟 보드에 맞는
커널 패치와 커널 설정(make menuconfig)을 해야하는데
build_kernel.sh 요 스크립트에서 알아서 다 진행합니다.
해당 작업이 완료되면 KERNEL 폴더가 생성됩니다.


4. 루트 파일 시스템 설치


커널이 자동차의 엔진이라면 루트 파일시스템은 그외 나머지 인터페이스라 할수 있습니다.

자동차 핸들, 바퀴, 차체가 있어야 자동차가 굴러가듯이

커널과 인터페이스 할 수 있는 쉘과 같은 프로그램을 포함하는 파일 시스템이 있어야

운영체제로서의 활용이 가능합니다.


파일시스템은 데비안 및 우분투, Angstrom, Arago계열이 있으며 아래 내용은

우분투 16.04 LTS 버전 입니다.(개인적으로 선호....)


UserID : ubuntu 

Password : temppwd


다운로드:

~/

  wget -c https://rcn-ee.com/rootfs/eewiki/minfs/ubuntu-16.04.1-minimal-armhf-2016-08-16.tar.xz


확인:

~/


 sha256sum ubuntu-16.04.1-minimal-armhf-2016-08-16.tar.xz

 ae6b466e4782d4b6cd2a14f6d785b75de00623e3afe0967f38f51537dd97feba  ubuntu-16.04.1-minimal-armhf-2016-08-16.tar.xz


압축풀기:

~/

 

 tar xf ubuntu-16.04.1-minimal-armhf-2016-08-16.tar.xz




5. microSD 카드에 설치


위 과정이 모두 끝났으면 부트로더와 커널 그리고 루트 파일 시스템을 설치해야 합니다.

보통 microSD카드를 카드 리더기에 연결하면 장치명은 /dev/sd(x) 로 나오는데

이는 명령어 lsblk 또는 df -h 로 확인이 가능하니 맞는 명칭으로 진행하시면 됩니다.


DISK 환경변수 설정

 export DISK=/dev/sdb


microSD 카드 포멧

 sudo dd if=/dev/zero of=${DISK} bs=1M count=10


부트로더 설치

~/


sudo dd if=./u-boot/MLO of=${DISK} count=1 seek=1 bs=128k
sudo dd if=./u-boot/u-boot.img of=${DISK} count=2 seek=1 bs=384k


여기서 사용되는 sfdisk 와 mke2fs tool은 파티션을 생성하고 파일 시스템을 만드는 툴인데

이게 버전에 따라서 약간 명령어가 다릅니다.

이부분은 저도 확실치 않으니 맨위에 링크된 곳 주소에서 직접보시고 하는것이 좋을 것 같습니다.

Host가 우분투 16.04를 기준으로 설명합니다.

sfdisk는 v2.27.1

mke2fs 는 v1.42.13 


파티션 생성:

 sfdisk >= 2.26x

  sudo sfdisk ${DISK} <<-__EOF__

 4M,,L,*
 __EOF__


파일 시스템 생성(파티션 포멧): 

 mkfs.ext4 <= 1.42

  for: DISK=/dev/sdX

 sudo mkfs.ext4 -L rootfs ${DISK}1


정상적으로 파티션을 생성 하셨다면 거의 대부분

/media/_User_/rootfs/ <- 요렇게 자동으로 마운트 됩니다.


만일 없다면 microSD카드를 다시 인식 시키거나 

위 파티션 생성 작업을 다시한번 해보시기 바랍니다.


커널 및 루트 파일 시스템 설치(to microSD)


위에서 체크아웃 받은 bb-kernel 폴더 안에 들어가서

kernel_version 이라는 파일을 열어 커널 버전을 확인할수 있습니다.


kernel_version 환경변수 설정

 export kernel_version=4.X.Y-Z (예:4.4.20-bone-rt-r13)


루트 파일 시스템 복사

 ~/

  sudo tar xfvp ./*-*-*-armhf-*/armhf-rootfs-*.tar -C /media/_user_/rootfs


Boot 이미지 이름 설정

 ~/

  sudo sh -c "echo 'uname_r=${kernel_version}' >> /media/_user_/rootfs/boot/uEnv.txt"


커널 이미지 복사

 ~/

  sudo cp -v ./bb-kernel/deploy/${kernel_version}.zImage /media/_user_/rootfs/boot/vmlinuz-${kernel_version}

 

커널 디바이스 트리 복사

 ~/

  sudo mkdir -p /media/_user_/rootfs/boot/dtbs/${kernel_version}/

 sudo tar xfv ./bb-kernel/deploy/${kernel_version}-dtbs.tar.gz -C /media/_user_/rootfs/boot/dtbs/${kernel_version}/


커널 모듈 복사

 ~/

  sudo tar xfv ./bb-kernel/deploy/${kernel_version}-modules.tar.gz -C /media/_user_/rootfs/


파일 시스템 테이블 정보 생성

 /etc/fstab

  sudo sh -c "echo '/dev/mmcblk0p1  /  auto  errors=remount-ro  0  1' >> /media/rootfs/etc/fstab"


하기 경로에 상세한 내용이 있네요. 참고 하시면 좋을 것 같습니다.

http://bepa.tistory.com/81


네트워크 정보 생성


Edit: /etc/network/interfaces

 sudo vim /media/_user_/rootfs/etc/network/interfaces


내용 추가

 /etc/network/interfaces

  auto lo

 iface lo inet loopback
  
 auto eth0
 iface eth0 inet dhcp


Edit: /etc/udev/rules.d/70-persistent-net.rules

 sudo vim /media/_user_/rootfs/etc/udev/rules.d/70-persistent-net.rules


내용 추가

 /etc/udev/rules.d/70-persistent-net.rules

  # BeagleBone: net device ()

 SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"


위 경로를 보시면 udev가 있죠, 쉽게 말하면 리눅스 커널용 장치 관리자 입니다.

그리고 위 파일은 네트워크 장치에 대한 정보를 담고 있는 파일입니다.


위 과정까지 모두 되셨으면 microSD카드를 뽑아

비글본 블랙에 삽입후 보드 부팅 합니다.


이때에 있으면 좋은게 아래 경로의 케이블인데요

(USB to serial adapter) TTL-232R-3V3 


usb to serial에다가 3.3V로 전압레벨 컨버팅 까지 해주기 때문에

비글본 블랙과 같은 보드 디버깅시에 상당히 편합니다.

다만 가격이 좀 높습니다.


위 케이블을 통하여 부팅 메세지를 확인하고 혹시라도

커널 패닉시에 어디서 발생했는지 확인이 가능합니다.


6. USB 가젯(gadget)


usb 가젯 드라이버를 통해 비글본과 마치 유선네트워크 처럼

연결될수 있습니다.

상당히 편리합니다. usb를 통해 보드 전원도 공급되면서

삼바 같은 설정을 통해 네트워크로 접속도 가능합니다.


해당 작업은 보드 부팅 후 일단 eth0 유선랜을 꼽아 설정을 한 후에

사용하시면 될것 같습니다.


드라이버 설치

 sudo apt-get install udhcpd


네트워크 설정 추가

 /etc/network/interfaces

  # Ethernet/RNDIS gadget (g_ether)

 # ... or on host side, usbnet and random hwaddr
 iface usb0 inet static
        address 192.168.7.2
        netmask 255.255.255.252
        network 192.168.7.0
        gateway 192.168.7.1


스크립트?

  wget -c https://raw.github.com/RobertCNelson/tools/master/scripts/beaglebone-black-g-ether-load.sh

 chmod +x beaglebone-black-g-ether-load.sh
 sudo ./beaglebone-black-g-ether-load.sh



윈도우 상에서 Putty ssh(192.168.7.2)로 접속 화면 입니다.