Programming/Docker

Docker - ODROID Kernel Builder, 오드로이드 커널 빌드 간편화 이미지 개발/배포

awesometic 2019. 3. 5. 10:51
반응형

Docker - ODROID Kernel Builder

ODROID 리눅스 커널을 데스크탑 리눅스 환경에서 빌드할 때, 사실 꽤 불편합니다.

각 오드로이드 플랫폼에 맞는 툴체인을 받아야 하고, 각 환경에 맞는 환경 변수도 설정해줘야 해요.

툴체인과 환경 변수 설정을 완료하더라도 make 명령어를 때려서 .config 생성부터, modules들을 부트 미디어의 / 파티션에 설치해줘야 하고, 빌드된 Image파일과 .dtb 파일을 부트 미디어로 또 옮겨줘야 합니다.

초보자에겐 그 과정이 충분히 어렵기도 하고, 숙련자에게도 살짝 귀찮은 작업일 수 있어요.

그래서 저도 쓸 겸 해서 도커 이미지를 만들었습니다.

제 경우에도 확실히 커널 소스 수정 후 바로 빌드/설치할 때 이 이미지가 자동으로 해주니 편하네요.

특징

구성

이 이미지는 컨테이너 내부로 연결되는 환경 변수를 이용해서 부트 미디어의 bootrootfs 파티션을 지정해주면, 알아서 빌드 후 설치까지 하게 만들 수 있습니다.

우분투 등을 올린 SD 카드를 PC에 꼽은 뒤, 마운트된 boot, rootfs 파티션, 그리고 몇 가지 플래그를 지정해준 후 이미지를 실행시키면 됩니다.

XU4, C1, C2 뿐 아니라 단종된 XU3부터 가장 최근에 나온 N2까지 전부 지원합니다.

게다가 빌드 순서와 환경 변수, 툴체인은 하드커널 위키 페이지의 공식 가이드를 따르기 때문에 안정적입니다.

안정적인 빌드를 위해 표준 이미지인 Ubuntu 18.04 LTS 이미지를 베이스로 만들었습니다.

사용법

설치

Docker가 설치되어 있다고 가정합니다.

Docker Hub에서 awesometic/odroid-kernel-builder 이미지를 다운받습니다.

docker pull awesometic/odroid-kernel-builder

모든 툴체인을 포함하기 때문에 용량이 다소 커서 오래걸릴 수 있습니다.

해당 이미지는 데몬 형식으로 사용하는 게 아니라 컨테이너를 즉석에서 사용하고 바로 지우는 이미지입니다.

필요할 때 일반적인 bash 명령어처럼 돌리면 알아서 모든 게 진행됩니다.

옵션

기본적인 사용법은 아래와 같습니다.

docker run -it --rm \
-v /kernel/source/path:/kernel \
-v /path/to/output:/output \
-e SBC={ 오드로이드 제품명: XU4, C2, N2, ... } \
-e MAKE_ARGS={ 사용하고 싶은 make 옵션 } \
awesometic/odroid-kernel-builder

이미지 안의 /kernel 디렉토리는 꼭 등록해두셔야 합니다. 리눅스 커널 소스를 지정해주세요.

/output 디렉토리가 존재하면 커널 빌드 후 [z]Image, dtb 파일이 해당 output 디렉토리로 복사됩니다.

SBC 환경 변수로 어떤 보드의 설정값과 툴체인을 사용할지 결정합니다. 아래의 보드와 커널 버전이 지원됩니다.

  • XU3: 3.10, 4.9
  • XU4: 4.14
  • C1: 3.10
  • C2: 3.14, 3.16
  • N2: 4.9

MAKE_ARGS 환경 변수로 원하는 make 옵션을 줄 수 있습니다.

꼭 필요한 옵션들은 원활한 프로그램 진행을 위해 내장되어 있습니다.

  • defconfig for make odroid?_defconfig
  • menuconfig for make menuconfig
  • clean for make clean
  • distclean for make distclean
  • No arguments for make

추가 옵션: 자동 설치

호스트 컴퓨터에 마운트된 부트 미디어 경로를 등록하면 커널 빌드 완료 시 자동으로 커널과 모듈들을 설치할 수 있습니다.

예를 들어,

awesometic@awesometic-desktop:~$ df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
...
/dev/sda1      vfat      128M   23M  105M  18% /media/awesometic/boot
/dev/sda2      ext4       58G  9.1G   49G  16% /media/awesometic/rootfs
...

일 때, 부트 미디어의 boot 파티션은 /media/awesometic/boot로, rootfs 파티션은 /media/awesometic/rootfs로 마운트되어 있는 것을 알 수 있습니다.

자동으로 설치하기 위해 옵션을 주자면,

docker run -it --rm \
-v /kernel/source/path:/kernel \
-v /media/awesometic/boot:/media/boot \
-v /media/awesometic/rootfs:/media/root \
-e SBC={ 오드로이드 제품명: XU4, C2, N2, ... } \
-e MAKE_ARGS={ 사용하고 싶은 make 옵션 } \
-e AUTO_INSTALL=True

처럼 입력할 수 있습니다.

사용 예제 1

N2 커널 빌드 후 특정 디렉토리로 이미지와 dtb 파일 복사해보겠습니다.

먼저 각 디렉토리를 지정해준 후 defconfig를 진행합니다.

docker run -it --rm \
-v /home/awesometic/Developer/odroid-linux-kernel:/kernel \
-v /home/awesometic/Developer/odroid-linux-kernel-output:/output \
-e SBC=n2 \
-e MAKE_ARGS=defconfig \
awesometic/odroid-kernel-builder

그리고 빌드합니다.

docker run -it --rm \
-v /home/awesometic/Developer/odroid-linux-kernel:/kernel \
-v /home/awesometic/Developer/odroid-linux-kernel-output:/output \
-e SBC=n2 \
-e MAKE_ARGS= \
awesometic/odroid-kernel-builder

사용 예제 2

XU4 커널 빌드 후 자동으로 커널과 모듈을 설치해보겠습니다.

마운트된 부트 미디어의 파티션들을 포함해 각 디렉토리를 지정해준 후 defconfig를 진행합니다.

docker run -it --rm \
-v /home/awesometic/Developer/odroid-linux-kernel:/kernel \
-v /home/awesometic/Developer/odroid-linux-kernel-output:/output \
-v /media/awesometic/boot:/media/boot \
-v /media/awesometic/rootfs:/media/root \
-e SBC=xu4 \
-e MAKE_ARGS=defconfig \
awesometic/odroid-kernel-builder

AUTO_INSTALL 환경 변수를 포함해서 빌드합니다.

docker run -it --rm \
-v /home/awesometic/Developer/odroid-linux-kernel:/kernel \
-v /home/awesometic/Developer/odroid-linux-kernel-output:/output \
-v /media/awesometic/boot:/media/boot \
-v /media/awesometic/rootfs:/media/root \
-e SBC=xu4 \
-e MAKE_ARGS= \
-e AUTO_INSTALL=True \
awesometic/odroid-kernel-builder

MacOS, Windows

도커 이미지는 기본적으로 리눅스가 아니면 너무 느립니다. 뭐냐 하면, 도커 이미지는 리눅스 기반인데, 도커가 도커 컨테이너의 리눅스 커널을 호스트 컴퓨터의 리눅스 커널로 연결시켜줍니다. 그래서 성능 저하가 없어요. 가상머신이지만, 커널을 공유하기 때문입니다.

근데 윈도우나 맥OS에선 리눅스 커널이 없기 때문에 도커는 리눅스 커널 환경을 가상으로 만들어줘야 합니다. 이 땐 정말 다들 알고 있는 가상머신이기 때문에 성능 저하가 심합니다.

간단한 데이터베이스 서버나 웹 서버는 괜찮은데, 이렇게 CPU를 가능한 한 많이 쓰면서 Disk IO도 많은 빌드 작업은 속도가 굉장히 느려지더라구요. 이 이미지로 XU4 커널을 빌드해보니 2시간 이상이 걸렸습니다. 30분 안에 끝날 작업이에요.

따라서 성능이 필요하다면 리눅스 환경의 도커에서 사용하시면 좋습니다.

참고


반응형