Docker - ODROID Kernel Builder
ODROID 리눅스 커널을 데스크탑 리눅스 환경에서 빌드할 때, 사실 꽤 불편합니다.
각 오드로이드 플랫폼에 맞는 툴체인을 받아야 하고, 각 환경에 맞는 환경 변수도 설정해줘야 해요.
툴체인과 환경 변수 설정을 완료하더라도 make
명령어를 때려서 .config
생성부터, modules
들을 부트 미디어의 /
파티션에 설치해줘야 하고, 빌드된 Image
파일과 .dtb
파일을 부트 미디어로 또 옮겨줘야 합니다.
초보자에겐 그 과정이 충분히 어렵기도 하고, 숙련자에게도 살짝 귀찮은 작업일 수 있어요.
그래서 저도 쓸 겸 해서 도커 이미지를 만들었습니다.
제 경우에도 확실히 커널 소스 수정 후 바로 빌드/설치할 때 이 이미지가 자동으로 해주니 편하네요.
특징
구성
이 이미지는 컨테이너 내부로 연결되는 환경 변수를 이용해서 부트 미디어의 boot
와 rootfs
파티션을 지정해주면, 알아서 빌드 후 설치까지 하게 만들 수 있습니다.
우분투 등을 올린 SD 카드를 PC에 꼽은 뒤, 마운트된 boot
, rootfs
파티션, 그리고 몇 가지 플래그를 지정해준 후 이미지를 실행시키면 됩니다.
XU4
, C1
, C2
뿐 아니라 단종된 XU3
부터 가장 최근에 나온 N2
까지 전부 지원합니다.
게다가 빌드 순서와 환경 변수, 툴체인은 하드커널 위키 페이지의 공식 가이드를 따르기 때문에 안정적입니다.
안정적인 빌드를 위해 표준 이미지인 Ubuntu 18.04 LTS
이미지를 베이스로 만들었습니다.
Ubuntu 18.04 LTS
Toolchains
- XU3 (3.10, 4.9): arm-eabi-4.6.tar.gz
- XU4 (4.14): gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
- C1 (3.10): gcc-linaro-arm-linux-gnueabihf-4.7-2013.04-20130415_linux.tar.bz2
- C2 (3.14, 3.16): gcc-linaro-aarch64-linux-gnu-4.9-2014.09_linux.tar.xz
- N2 (4.9): aarch64-linux-gnu/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu.tar.xz
사용법
설치
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분 안에 끝날 작업이에요.
따라서 성능이 필요하다면 리눅스 환경의 도커에서 사용하시면 좋습니다.
참고
'Programming > Docker' 카테고리의 다른 글
Docker 불필요한 이미지들 한 번에 제거하기 (0) | 2019.08.05 |
---|---|
Docker 이미지 한 번에 업데이트하기 (latest 태그) (0) | 2019.05.20 |
Docker - h5ai, 개인 파일 사이트 이미지 개발/배포 (29) | 2019.01.11 |
Docker - 오드로이드/라즈베리파이 웹 개발을 위한 간단 ARM LEMP 스택 패키지 (4) | 2017.11.13 |