scribnote5 on Feb 21, 20202020-02-21T00:00:00+09:00
Updated Feb 21, 20202020-02-21T00:00:00+09:00 6 min read
설치 환경
- ‘리눅스 커널 빌드 환경 구축’ 글을 참고하여 리눅스 커널 빌드 환경을 사전에 구축해야 한다.
- ‘리눅스 커널 포팅 - ARM Sabre Lite’ 글을 참고하여 Sabre Lite에 리눅스를 설치해야 한다.
- 호스트: Ubuntu 18.04(x86-64)
- 타겟: Sabre Lite에 커널 버전을 Linux Kernel 4.14.87(해당 리눅스 버전의 PREEMPT_RT 패치 적용)로 변경
리눅스 커널 다운로드
1
2
3
4
5
| # 커널 다운로드, .xz 확장자 : 뛰어난 압축률
$ wget https://kernel.org/pub/linux/kernel/v4.x/linux-4.14.87.tar.xz
# 압축 해제
$ tar -xvJf linux-4.14.87.tar.xz
|
PREEMPT_RT 패치 다운로드 및 적용
- PREEMPT_RT 패치는 리눅스의 실시간성을 개선하는 패치로서, 패치 적용 여부는 선택사항이다.
1
2
3
4
5
6
| $ wget http://cdn.kernel.org/pub/linux/kernel/projects/rt/4.14/patch-4.14.87-rt49.patch.xz
# PREEMPT_RT 패치 진행
$ cd linux-4.14.87
$ xzcat ../patch-4.14.87-rt49.patch.xz | patch -p1
$ cd ..
|
PREEMPT_RT 패치가 적용된 리눅스 커널 빌드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| # 디렉토리명 변경
$ mv linux-4.14.87 linux-4.14.87-rt49
$ cd linux-4.14.87-rt49
# 컴파일 의존성 삭제(mrproper + remove editor backup and patch files)
$ sudo make distclean
# 환경 변수 선언
$ export KERNEL_SRC=PWD
$ export ARCH=arm
$ export CROSS_COMPILE=arm-linux-gnueabihf-
$ export INSTALL_MOD_PATH=KERNEL_SRC/modules
# Sabre Lite 컴파일 옵션 적용
$ make imx_v6_v7_defconfig
# 커널 컴파일 설정으로 하단과 같이 수정한다. 미리 적용된 설정이 존재한다.
$ make menuconfig
# 커널 dmesg 저장 버퍼 크기 변경
$ CONFIG_LOG_BUF_SHIFT = 19
# PREEMPT_RT 적용
$ CONFIG_PREEMPT_RT_FULL = y
# 고상도의 타이머 적용
$ CONFIG_HIGH_RES_TIMERS = y
# PREEMPT_RT의 실시간성을 떨어뜨리는 Preempt, Object 디버그 옵션 해제
$ CONFIG_DEBUG_PREEMPT = n
$ CONFIG_DEBUG_OBJECTS = n
# PREEMPT-RT의 실시간성을 떨어뜨리는 Lock Debugging(spinlocks, mutexes, etc. . . ) 디버그 옵션 해제
$ CONFIG_PROVE_LOCKING = n
$ CONFIG_DEBUG_LOCK_ALLOC = n
$ CONFIG_DEBUG_SPINLOCK = n
$ CONFIG_DEBUG_MUTEXES = n
$ CONFIG_DEBUG_RT_MUTEXES = n
|
출처: https://wiki.linuxfoundation.org/realtime/documentation/howto/applications/preemptrt_setup
1
2
3
| # 모듈 삽입시 insmod: can't insert '.ko': invalid module 발생하는 오류는 커널 버전과 모듈 버전이 일치하지 않는 경우
# 해당 문제를 해결하기 위해 해당 옵션을 해제
$ CONFIG_LOCALVERSION_AUTO = n
|
출처: https://zinlee.tistory.com/entry/kernel-insmod-cant-insert-ko-invalid-module-format-%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95%EC%9B%90%EC%9D%B8-%EC%9D%B4%EC%9C%A0
1
2
3
4
5
6
7
8
| # 커널 설정을 종료한 다음 모듈 디렉토리 생성
$ mkdir modules
# 커널 모듈 빌드
$ make zImage modules dtbs -j4
# 커널 모듈 설치
$ make modules_install
|
출처: https://www.linuxquestions.org/questions/linux-general-1/vmlinuz-and-initrd-img-symbolic-links-4175609938/
https://m.blog.naver.com/PostView.nhn?blogId=lovespreads&logNo=221205221338&proxyReferer=https%3A%2F%2Fwww.google.com%2F
https://boundarydevices.com/customizing-ubuntudebian-kernels/
https://kldp.org/node/95521
https://wiki.linuxfoundation.org/realtime/documentation/howto/applications/preemptrt_setup
리눅스 커널 부팅에 필요한 파일 정리
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| $ cd modules
$ mkdir boot
# imx6 관련 rdts, dtb 파일 복사
$ cp ../arch/arm/boot/dts/imx6* ./boot
# zImage 파일 이동
# zImage는 vmlinuz과 같은 파일
$ cp ../arch/arm/boot/zImage ./boot/vmlinuz-4.14.87-rt49
# 링크 파일 생성
$ ln -s boot/initrd.img-4.14.87-rt49 initrd.img
$ ln -sfv boot/vmlinuz-4.14.87-rt49 vmlinuz
# scp 전송을 위한 파일 압축
$ tar -zcvf linux-4.14.87-rt49.tar.gz ./*
# 생성된 파일 목록 확인
$ ls -al
|
1
2
3
| # scp를 사용하여 타겟으로 파일 전송
# ex) sudo scp -r /home/sdy/linux-4.14.87-rt49/modules/linux-4.14.87-rt49.tar.gz ubuntu@168.188.127.63:/home
$ sudo scp -r /home/<username>/linux-4.14.87-rt49/modules/linux-4.14.87-rt49.tar.gz ubuntu@<ip>:/home
|
타겟에 리눅스 커널 설치
1
2
3
4
5
6
7
8
9
10
11
12
| # 처음 리눅스 커널 변경할 때 한 번만 실행
$ sudo apt-get purge -y linux-boundary-* linux-header-* linux-image-* qcacld-module
$ sudo tar --numeric-owner -xf /home/linux-4.14.87-rt49.tar.gz -C /
$ sudo update-initramfs -c -k4.14.87-rt49
$ rm /home/linux-4.14.87-rt49.tar.gz
$ sudo sync && sudo reboot
# 변경된 커널 버전 확인
$ uname -a
|
rt-tests(real-time task latency 측정)
- 리눅스의 실시간성을 측정하는 테스트다.
- PREEMPT_RT 패치를 적용하지 않은 경우보다 최대 latency와 평균 latency가 개선된 것을 확인할 수 있다.
1
2
3
4
5
6
| $ git clone git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git
$ cd rt-tests
$ git checkout stable/devel/v1.0.1
$ make -j4
$ sudo make install
$ sudo ./cyclictest -l100000 -m -n -a0 -t1 -p99 -i400 -h400
|
출처: https://m.blog.naver.com/PostView.nhn?blogId=alice_k106&logNo=221170259817&proxyReferer=https%3A%2F%2Fwww.google.com%2F
https://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git
Comments powered by Disqus.