Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

75261
1501
219117


[라즈베리 파이] 라즈비안 리눅스 커널 빌드하고 설치하기 2. 라즈베리 파이 설정

라즈비안 리눅스 커널 빌드

라즈비안의 커널 소스를 내려받았으니 이제 소스를 빌드하는 방법을 알아볼 차례입니다. 참고로 아래의 라즈베리 파이 홈페이지에 가면 커널을 빌드하는 방법을 확인할 수 있습니다.

https://www.raspberrypi.org/documentation/linux/kernel/building.md

이 페이지에서 ‘Raspberry Pi 2, Pi 3, Pi 3+, and Compute Module 3 default build configuration’라고 적힌 부분을 아래 명령어를 차례로 입력하면 커널을 빌드하기 위한 설정을 진행할 수 있습니다.

cd linux
KERNEL=kernel7
make bcm2709_defconfig

이어서 그 아래의 ‘Building’ 부분에 나온 아래 명령어를 통해 본격적인 커널 빌드를 진행합니다.

make -j4 zImage modules dtbs
sudo make modules_install
sudo cp arch/arm/boot/dts/*.dtb /boot/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
sudo cp arch/arm/boot/zImage /boot/$KERNEL.img

그런데 커널 빌드를 할 때마다 위와 같은 명령어를 입력하면 어떨까요? 그럼 빌드하는 데 시간이 오래 걸릴 것입니다. 그래서 위와 같은 커널 빌드 명령어를 모아 하나의 파일로 만들 수 있습니다. 이 파일을 커널 빌드를 할 때 실행하면 일일이 빌드 명령어를 입력할 필요가 없습니다. 이를 빌드 셸 스크립트라고 부르며 대부분의 임베디드 리눅스 개발에서 활용합니다.

다음은 라즈베리 파이에서 커널 빌드를 수행하는 빌드 스크립트입니다.

01 #!/bin/bash
02
03 echo "configure build output path"
04 
05 KERNEL_TOP_PATH="$( cd "$(dirname "$0")" ; pwd -P )"
06 OUTPUT="$KERNEL_TOP_PATH/out"
07 echo "$OUTPUT"
08 
09 KERNEL=kernel7
10 BUILD_LOG="$KERNEL_TOP_PATH/rpi_build_log.txt"
11 
12 echo "move kernel source"
13 cd linux
14
15 echo "make defconfig"
16 make O=$OUTPUT bcm2709_defconfig
17
18 echo "kernel build"
19 make O=$OUTPUT zImage modules dtbs -j4 2>&1 | tee $BUILD_LOG

위와 같은 입력한 다음 build_rpi_kernel.sh라는 이름으로 저장합니다(참고로 맨 왼쪽에 있는 번호는 입력하면 안 됩니다).

파일을 저장한 다음의 chmod 명령어를 입력해 파일에 실행 권한을 부여합니다.
root@raspberrypi:/home/pi/rpi_kernel_src# chmod +x build_rpi_kernel.sh

빌드 스크립트의 내용을 조금 더 살펴볼까요?

05 KERNEL_TOP_PATH="$( cd "$(dirname "$0")" ; pwd -P )"
06 OUTPUT="$KERNEL_TOP_PATH/out"
07 echo "$OUTPUT"

05번째 줄에서는 현재 작업 디렉터리를 KERNEL_TOP_PATH에 저장합니다. 

06 번째 줄에서는 KERNEL_TOP_PATH 경로에 out 폴더를 추가해 OUTPUT이라는 셸 스크립트 변수에 저장합니다.

05~06 번째 줄 코드를 실행하면 OUTPUT 변수는 다음과 같이 '/home/pi/rpi_kernel_src/out'으로 변경됩니다.

OUTPUT=/home/pi/rpi_kernel_src/out

여기서 설정한 OUTPUT은 16 번째와 19번째 줄과 같이 커널 컨피그와 커널 빌드 명령어에서 "O=$OUTPUT" 형식으로 사용됩니다.

16 make O=$OUTPUT bcm2709_defconfig
19 make O=$OUTPUT zImage modules dtbs -j4 2>&1 | tee $BUILD_LOG

위 코드가 실행되면 커널을 빌드했을 때 만들어지는 오브젝트와 커널 파일이 out 폴더에 생성됩니다.

16번째 줄은 커널 컨피그 파일을 생성하는 코드입니다.

16 make O=$OUTPUT bcm2709_defconfig

이 명령어는 다음 경로에 있는 bcm2709_defconfig 파일에 선언된 컨피그 파일을 참고해 .config 파일을 생성합니다.

root@raspberrypi:/home/pi/rpi_kernel_src/linux/arch/arm/configs/bcm2709_defconfig

make의 옵션으로 "O=$OUTPUT"을 추가했으므로 다음과 같이 out 폴더에 .config가 생성됩니다.

root@raspberrypi:/home/pi/rpi_kernel_src/out/.config

다음은 19 번째 줄입니다.

19 make O=$OUTPUT zImage modules dtbs -j4 2>&1 | tee $BUILD_LOG

이 명령어는 리눅스 커널 소스를 빌드하는 명령어입니다.

다음으로 커널 빌드 로그를 저장하는 코드를 함께 보겠습니다.

10 BUILD_LOG="$KERNEL_TOP_PATH/rpi_build_log.txt"
...
19 make O=$OUTPUT zImage modules dtbs -j4 2>&1 | tee $BUILD_LOG

10 번째 줄에서는 $KERNEL_TOP_PATH 디렉터리 안의 rpi_build_log.txt라는 파일을 지정해 BUILD_LOG에 저장합니다. 

19 번째 줄은 커널 빌드 명령어입니다. 맨 오른쪽에 "2>&1 | tee $BUILD_LOG"가 추가됐는데, 이는 커널을 빌드할 때 출력되는 메시지를 $BUILD_LOG 파일에 저장한다는 뜻입니다.

커널을 빌드하는 도중 컴파일 에러가 발생하면 rpi_build_log.txt 파일을 열어 어디서 문제가 생겼는지 확인할 수 있습니다. 실전 개발에서 리눅스 커널을 빌드하는 도중 문제가 발생하면 이 같은 방법으로 커널 빌드 로그를 다른 개발자에게 전달합니다. 커널 로그를 통해 커널 빌드 옵션 등을 볼 수 있기 때문입니다.

빌드 스크립트 코드를 설명했으니 이번에는 빌드 스크립트를 실행하는 방법을 알아보겠습니다. 먼저 라즈비안 커널 소스로 이동합니다. 소스로 이동한 상태는 다음과 같습니다.

root@raspberrypi:/home/pi/rpi_kernel_src# ls
build_rpi_kernel.sh linux  

다음으로 ./build_rpi_kernel.sh 명령어를 입력해 커널 빌드를 시작합니다. 

root@raspberrypi:/home/pi/rpi_kernel_src# ./build_rpi_kernel.sh
configure build output path
make[1]: Entering directory ' /home/pi/rpi_kernel_src/out'
  GEN     ./Makefile
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/zconf.lex.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
...
  CC [M]  net/bridge/netfilter/ebt_nflog.o
  AR      net/bluetooth/bnep/built-in.o
  CC [M]  net/bluetooth/bnep/core.o
  CC [M]  fs/dlm/recover.o
  CC [M]  sound/soc/codecs/cs42xx8-i2c.o
  AR      drivers/i2c/busses/built-in.o
  CC [M]  drivers/i2c/busses/i2c-bcm2708.o
  CC [M]  fs/dlm/recoverd.o
...
  LD [M]  sound/soc/snd-soc-core.ko
  LD [M]  sound/usb/6fire/snd-usb-6fire.ko
  LD [M]  sound/usb/caiaq/snd-usb-caiaq.ko
  LD [M]  sound/usb/hiface/snd-usb-hiface.ko
  LD [M]  sound/usb/misc/snd-ua101.ko
  LD [M]  sound/usb/snd-usb-audio.ko
  LD [M]  sound/usb/snd-usbmidi-lib.ko
make[1]: Leaving directory '/home/pi/rpi_kernel_src/out'

만약 컴파일 에러가 발생하면 다음과 같은 에러 메시지와 함께 빌드가 중단됩니다.

root@raspberrypi:/home/pi/rpi_kernel_src# ./build_rpi_kernel.sh
configure build output path
make[1]: Entering directory '/home/pi/rpi_kernel_src/out'
  GEN     ./Makefile
#
# configuration written to .config
#
make[1]: Leaving directory '/home/pi/rpi_kernel_src/out'
make[1]: Entering directory '/home/pi/rpi_kernel_src/out'
  GEN     ./Makefile
scripts/kconfig/conf  --silentoldconfig Kconfig
...
  CHK     include/generated/compile.h
  CC      kernel/sched/core.o
/home/pi/rpi_kernel_src/linux/kernel/sched/core.c:3302:6: error: #error "invoke compile error inside __schdedule"
     #error "invoke compile error inside __schdedule"
      ^
/home/pi/rpi_kernel_src/linux/scripts/Makefile.build:328: recipe for target 'kernel/sched/core.o' failed
make[3]: *** [kernel/sched/core.o] Error 1
/home/pi/rpi_kernel_src/linux/scripts/Makefile.build:587: recipe for target 'kernel/sched' failed
make[2]: *** [kernel/sched] Error 2
/home/pi/rpi_kernel_src/linux/Makefile:1040: recipe for target 'kernel' failed
make[1]: *** [kernel] Error 2
make[1]: *** Waiting for unfinished jobs....
make[1]: Leaving directory '/home/pi/rpi_kernel_src/out'
Makefile:146: recipe for target 'sub-make' failed
make: *** [sub-make] Error 2

사실 이 에러는 다음과 같이 컴파일 에러를 일으키는 코드(#error)를 일부러 작성해서 발생시킨 것입니다.

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 4e89ed8..5c46f29 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -3299,7 +3299,7 @@ static void __sched notrace __schedule(bool preempt)
        struct rq_flags rf;
        struct rq *rq;
        int cpu;
-
+    #error "invoke compile error inside __schdedule"
        cpu = smp_processor_id();
        rq = cpu_rq(cpu);
        prev = rq->curr;

#error는 gcc 컴파일러가 제공하는 매크로인데, 코드를 컴파일할 때 해당 코드를 실행하면 무조건 컴파일 에러를 유발합니다. 위에서 든 예제에서는 아래 코드를 추가해 컴파일 에러가 발생했으니,
#error "invoke compile error inside __schdedule"

위 코드 한 줄을 삭제하고 build_rpi_kernel.sh 빌드 스크립트를 실행해 커널을 빌드하면 컴파일 에러가 사라질 것입니다.

여기서 한 가지 주의해야 할 점이 있는데, 컴파일 에러를 만나면 반드시 리눅스 커널 코드를 수정한 다음 다시 커널 빌드를 해야 합니다. 만약 컴파일 에러를 제대로 수정하지 않고 커널 이미지를 설치하면 수정한 코드가 제대로 동작하지 않습니다.

라즈비안 리눅스 커널 설치하기

커널 코드를 빌드만 해서는 수정한 코드가 라즈베리 파이에서 실행되지 않습니다. 컴파일해 생성된 이미지를 라즈베리 파이에 설치해야 합니다. 라즈비안 리눅스 커널을 빌드했으니 이제 빌드한 커널 이미지를 설치해 봅시다. 다음은 라즈비안 이미지를 라즈베리 파이에 설치하는 셸 스크립트입니다.

install_rpi_kernel_img.sh
01 #!/bin/bash
02
03 KERNEL_TOP_PATH="$( cd "$(dirname "$0")" ; pwd -P )"
04 OUTPUT="$KERNEL_TOP_PATH/out"
05 echo "$OUTPUT"
06
07 cd linux
08
09 make O=$OUTPUT modules_install
10 cp $OUTPUT/arch/arm/boot/dts/*.dtb /boot/
11 cp $OUTPUT/arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
12 cp $OUTPUT/arch/arm/boot/dts/overlays/README /boot/overlays/
13 cp $OUTPUT/arch/arm/boot/zImage /boot/kernel7.img

위와 같은 코드를 입력한 후 다음 명령어로 install_rpi_kernel_img.sh 셸 스크립트를 실행합시다.

root@raspberrypi:/home/pi/rpi_kernel_src# ./install_RPi_kernel_img.sh

다시 한 번 반복하지만 install_rpi_kernel_img.sh 스크립트를 실행하기 전에 먼저 커널 빌드 시 발생한 에러는 반드시 수정해야 합니다. 이 과정을 건너뛰고 커널 이미지를 설치하면 수정한 커널 이미지가 제대로 설치되지 않습니다. 

라즈베리 파이 설정 

라즈베리 파이 설치하기
라즈베리 파이 기본 설정하기 
라즈비안 리눅스 커널 빌드

"혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!" 

Thanks,
Austin Kim(austindh.kim@gmail.com)



# Reference: For more information on 'Linux Kernel';

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 1

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 2


Thanks,
Austin Kim




핑백

덧글

  • 질문 2020/05/27 03:33 # 삭제 답글

    build_rpi_kernel.sh에서 커널 코드를 수정하라 하셨는데 어디를 어떻게 수정해야 하나요??? 설명이 붕 뜬거같습니다
  • AustinKim 2020/05/27 09:48 #

    '여기서 한 가지 주의해야 할 점이 있는데, 컴파일 에러를 만나면 반드시 리눅스 커널 코드를 수정한 다음 다시 커널 빌드를 해야 합니다' 부분을 읽고 의견을 주신 것 같은데요.

    위에서 든 예제에서는 아래 코드를 추가해 컴파일 에러가 발생했으니,
    #error "invoke compile error inside __schdedule"

    위 코드 한 줄을 삭제하고 build_rpi_kernel.sh 빌드 스크립트를 실행해 커널을 빌드하면 컴파일 에러가 사라질 것입니다.

    추가로 궁금한 점이 있으면 댓글로 알려주세요.

    Thanks,
    Austin Kim
  • 질문 2020/05/28 01:04 # 삭제 답글

    제가 받은 파일에서 core.c 파일엔 #error 부분이 없습니다. 그런데도 불구하고 build_rpi .sh 파일이 빌드가 안됩니다. 첫장부터 진도를 못나가네요 ㅠ
  • 질문 2020/05/28 01:48 # 삭제 답글

    make[1]: 디렉터리 '/home/pi/rpi_kernel_src/out' 들어감
    GEN ./Makefile
    #
    # configuration written to .config
    #
    make[1]: 디렉터리 '/home/pi/rpi_kernel_src/out' 나감
    kernel build
    make[1]: 디렉터리 '/home/pi/rpi_kernel_src/out' 들어감
    GEN ./Makefile
    scripts/kconfig/conf --syncconfig Kconfig
    GEN ./Makefile
    UPD include/config/kernel.release
    Using /home/pi/rpi_kernel_src/linux as source for kernel
    /home/pi/rpi_kernel_src/linux is not clean, please run 'make mrproper'
    in the '/home/pi/rpi_kernel_src/linux' directory.
    make[1]: *** [/home/pi/rpi_kernel_src/linux/Makefile:1085: prepare3] 오류 1
    make[1]: *** 끝나지 않은 작업을 기다리고 있습니다....
    make[1]: 디렉터리 '/home/pi/rpi_kernel_src/out' 나감
    make: *** [Makefile:146: sub-make] 오류 2

    제 에러 출력입니다. 대체 뭐가 문제인걸까요?
  • 질문 2020/05/28 01:48 # 삭제 답글

    너무 당연한 말이지만 코드는 털끝만큼도 건들지 않았습니다
  • 질문 2020/05/28 02:00 # 삭제 답글

    make -j4 zImage modules dtbs
    sudo make modules_install
    sudo cp arch/arm/boot/dts/*.dtb /boot/
    sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
    sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
    sudo cp arch/arm/boot/zImage /boot/$KERNEL.img

    이 명령어는 linux 디렉토리내에서,

    sh파일들 실행은 그 상위인 rpi_kernel_src에서 하는거 맞나요? 명확하게 와닿지가 않네요. 출판사 깃허브가봐도 마찬가지고;;

    질문 많이해서 죄송합니다
  • AustinKim 2020/05/28 07:15 #

    rpi_kernel_src 폴더에서 라즈비안 리눅스 커널 소스를 내려받으면 linux 폴더가 생길 겁니다.
    linux 바로 상위 폴더에서 다음과 같은 셸 스크립트를 실행하면 됩니다.

    root@raspberrypi:/home/pi/rpi_kernel_src# ./build_rpi_kernel.sh
    root@raspberrypi:/home/pi/rpi_kernel_src# ./install_RPi_kernel_img.sh

    그래도 에러가 생기면 다음과 같이 해보시면 됩니다.

    1. 아래 디렉터리 이동
    root@raspberrypi:/home/pi/rpi_kernel_src/linux

    root@raspberrypi:/home/pi/rpi_kernel_src/linux# git clean -xdf

    2. out 디렉터리를 삭제
    root@raspberrypi:/home/pi/rpi_kernel_src/out

    3. 'root@raspberrypi:/home/pi/rpi_kernel_src' 폴더에 build_rpi_kernel.sh 스크립트를 복사한 후 실행

    root@raspberrypi:/home/pi/rpi_kernel_src# ./build_rpi_kernel.sh

    그래도 에러가 생기면 다시 라즈비안 커널 소스를 내려받고 빌드해보시길 권장드립니다.
  • AustinKim 2020/05/28 07:16 # 답글

    rpi_kernel_src 폴더에서 라즈비안 리눅스 커널 소스를 내려받으면 linux 폴더가 생길 겁니다.
    linux 바로 상위 폴더에서 다음과 같은 셸 스크립트를 실행하면 됩니다.

    root@raspberrypi:/home/pi/rpi_kernel_src# ./build_rpi_kernel.sh
    root@raspberrypi:/home/pi/rpi_kernel_src# ./install_RPi_kernel_img.sh

    그래도 에러가 생기면 다음과 같이 해보시면 됩니다.

    1. 아래 디렉터리 이동
    root@raspberrypi:/home/pi/rpi_kernel_src/linux

    root@raspberrypi:/home/pi/rpi_kernel_src/linux# git clean -xdf

    2. out 디렉터리를 삭제
    root@raspberrypi:/home/pi/rpi_kernel_src/out

    3. 'root@raspberrypi:/home/pi/rpi_kernel_src' 폴더에 build_rpi_kernel.sh 스크립트를 복사한 후 실행

    root@raspberrypi:/home/pi/rpi_kernel_src# ./build_rpi_kernel.sh

    그래도 에러가 생기면 다시 라즈비안 커널 소스를 내려받고 빌드해보시길 권장드립니다.
  • 진돗개 2020/07/03 11:18 # 삭제 답글

    - sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
    해당 README파일이 없어서 진행이 안됩니다.
    처음부터 싹 커널소스 다운받고 빌드 다시시작해도 overlays폴더에 README파일이 생성이 안되네요.
    그래서 - sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/ 명령 건너뛰고 커널 설치했어요.
    앞으로 실습 진행하는데 문제 있을까요?
  • AustinKim 2020/07/03 11:30 #

    그대로 진행하셔도 무방합니다.
    참고로, 아래 파일은 텍스트 포멧의 가이드 문서입니다.
    https://github.com/raspberrypi/linux/blob/rpi-4.9.y/arch/arm/boot/dts/overlays/README

    라즈비안 커널의 빌드 & 설치 명령어는 업데이트될 수 있으니 아래 링크 참고하세요.

    https://www.raspberrypi.org/documentation/linux/kernel/building.md

    make -j4 zImage modules dtbs
    sudo make modules_install
    sudo cp arch/arm/boot/dts/*.dtb /boot/
    sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
    sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
    sudo cp arch/arm/boot/zImage /boot/$KERNEL.img
  • 2020/07/03 11:30 # 답글 비공개

    비공개 덧글입니다.
  • 진돗개 2020/07/03 11:51 # 삭제 답글

    답변 감사합니다. 책 내용 정말 좋아요 감사합니다
  • AustinKim 2020/07/03 13:26 #

    감사합니다.
    책이 리눅스 개발에 많은 도움이 됐으면 좋겠습니다.
  • 2020/07/03 13:26 # 답글 비공개

    비공개 덧글입니다.
  • 깨알같은 얼음의신 2020/08/05 18:10 # 답글

    안녕하세요 개발자님! 개발자님의 책으로 잘 배우고있는 학생입니다.
    커널을 빌드하는 과정에서 에러가 났는데, 에러가 난 파일을 열어보아도 수정할 에러문이 보이지않아 문의드립니다.

    생성된 에러 로그.txt파일은 아래와 같습니다.

    1 make[1]: Entering directory '/home/pi/rpi_kernel_src/out'
    2 GEN ./Makefile
    3 YACC scripts/kconfig/zconf.tab.c
    4 /bin/sh: 1: bison: not found
    5 LEX scripts/kconfig/zconf.lex.c
    6 make[3]: *** [scripts/Makefile.lib:196: scripts/kconfig/zconf.tab.c] Error 127
    7 make[3]: *** Waiting for unfinished jobs....
    8 /bin/sh: 1: flex: not found
    9 make[3]: *** [scripts/Makefile.lib:188: scripts/kconfig/zconf.lex.c] Error 127
    10 make[2]: *** [/home/pi/rpi_kernel_src/linux/Makefile:534: syncconfig] Error 2
    11 make[1]: *** [/home/pi/rpi_kernel_src/linux/Makefile:633: include/config/auto.conf.cmd] Error 2
    12 make[1]: Leaving directory '/home/pi/rpi_kernel_src/out'
    13 make: *** [Makefile:146: sub-make] Error 2
  • AustinKim 2020/08/05 21:22 #

    빌드 로그를 보니 'bison' 'flex'가 설치가 안 된 듯 합니다.

    아래 명령어를 입력하시고 커널 빌드를 해보시겠어요?
    $ apt-get update
    $ apt-get upgrade
    $ apt-get install git bc bison flex libssl-dev

    참고로 빌드하시기 전에 이미 생성된 out 디렉터리는 삭제해주세요.
    root@raspberrypi:/home/pi/rpi_kernel_src# rm -rf out

    감사합니다.
  • 2020/08/05 21:22 # 답글 비공개

    비공개 덧글입니다.
  • 2020/08/06 12:08 # 비공개

    비공개 답글입니다.
  • rex 2020/08/10 17:00 # 삭제 답글

    local build 에 시간이 엄청 오래 걸리네요. cross compile 해도 되겠죠?
  • AustinKim 2020/08/10 17:22 #

    라즈베리 파이 로컬 빌드는 가장 쉽게 빌드하는 차원으로 소개한 것입니다.
    크로스 컴파일 방법에 익숙하시면 크로스 컴파일 빌드 방법을 권장드립니다.

    감사합니다.
  • 2020/08/10 17:22 # 답글 비공개

    비공개 덧글입니다.
  • 미운오리 2020/08/16 21:49 # 삭제 답글

    안녕하세요. 빌드 과정에 이렇게 에러가 나는데 어떻게 고쳐야 할까요.

    ld: kernel/debug/kdb/kdb_main.o: in function `kdb_init':
    kdb_main.c:(.init.text+0x70): undefined reference to `kdb_cmds'
    ld: kdb_main.c:(.init.text+0x78): undefined reference to `kdb_cmds'
    make: *** [Makefile:1038: vmlinux] Error 1
  • AustinKim 2020/08/16 22:13 #

    소스를 수정하지 않고 빌드하는 과정에서 이런 에러를 만났다면,
    커널 빌드 환경을 점검할 필요가 있습니다.

    아래와 같은 명령어를 입력하신 후;

    $ apt-get update
    $ apt-get upgrade

    이미 생성된 out 디렉터리는 삭제하신 다음, 다시 커널을 빌드해시길 권장드립니다.
    root@raspberrypi:/home/pi/rpi_kernel_src# rm -rf out
  • 2020/08/16 22:13 # 답글 비공개

    비공개 덧글입니다.
  • 조용한 에스키모 2020/09/30 14:32 # 답글

    빌드를 에러 없이 정상적으로 하고 설치 스크립트로 설치하는데 cp : cannot stat.... : No such file or directory라는 문구가 나오면서 설치가 되지 않습닏다.
    실제 복사하는 폴더에 가봐도 옮길 dtb 파일이 없습니다. 어떻게 설치를 해야 하는건지 공식사이트 가봐도 명령문만 있지 잘 모르겠네요.
    도움 주시면 감사하겠습니다
  • AustinKim 2020/09/30 15:54 #

    실행하신 명령어를 포함한 전체 출력 메세지를 공유해주세요. 감사합니다.
  • 조용한 에스키모 2020/09/30 16:37 #

    책에서 써주신대로 아래 설치 스크립트를 아래와 같이 rpi_kernel_src 폴더에서 실행했습니다.

    #!/bin/bash

    KERNEL_TOP_PATH="$( cd "$(dirname "$0")" ; pwd -P )"
    OUTPUT="$KERNEL_TOP_PATH/out"
    echo "$OUTPUT"

    cd linux

    make O=$OUTPUT modules_install
    cp $OUTPUT/arch/arm/boot/dts/*.dtb /boot/
    cp $OUTPUT/arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
    cp $OUTPUT/arch/arm/boot/dts/overlays/README /boot/overlays/
    cp $OUTPUT/arch/arm/boot/zImage /boot/kernel7.img

    실행하면 나오는 메시지가 긴데 붙여보겠습니다.

    /home/pi/rpi_kernel_src/out
    make[1]: Entering directory '/home/pi/rpi_kernel_src/out'
    INSTALL arch/arm/crypto/aes-arm-bs.ko
    cp: cannot stat 'arch/arm/crypto/aes-arm-bs.ko': No such file or directory
    INSTALL arch/arm/crypto/aes-arm.ko
    cp: cannot stat 'arch/arm/crypto/aes-arm.ko': No such file or directory
    INSTALL arch/arm/crypto/sha1-arm-neon.ko
    cp: cannot stat 'arch/arm/crypto/sha1-arm-neon.ko': No such file or directory
    INSTALL arch/arm/crypto/sha1-arm.ko
    cp: cannot stat 'arch/arm/crypto/sha1-arm.ko': No such file or directory
    INSTALL fs/9p/9p.ko
    cp: cannot stat 'fs/9p/9p.ko': No such file or directory
    INSTALL fs/binfmt_misc.ko
    cp: cannot stat 'fs/binfmt_misc.ko': No such file or directory
    INSTALL fs/btrfs/btrfs.ko
    cp: cannot stat 'fs/btrfs/btrfs.ko': No such file or directory
    INSTALL fs/cifs/cifs.ko
    cp: cannot stat 'fs/cifs/cifs.ko': No such file or directory
    INSTALL fs/dlm/dlm.ko
    cp: cannot stat 'fs/dlm/dlm.ko': No such file or directory
    INSTALL fs/ecryptfs/ecryptfs.ko
    cp: cannot stat 'fs/ecryptfs/ecryptfs.ko': No such file or directory
    INSTALL fs/fuse/cuse.ko
    cp: cannot stat 'fs/fuse/cuse.ko': No such file or directory
    INSTALL fs/fuse/fuse.ko
    cp: cannot stat 'fs/fuse/fuse.ko': No such file or directory
    INSTALL fs/gfs2/gfs2.ko
    cp: cannot stat 'fs/gfs2/gfs2.ko': No such file or directory
    INSTALL fs/hfs/hfs.ko
    cp: cannot stat 'fs/hfs/hfs.ko': No such file or directory
    INSTALL fs/hfsplus/hfsplus.ko
    cp: cannot stat 'fs/hfsplus/hfsplus.ko': No such file or directory
    INSTALL fs/isofs/isofs.ko
    cp: cannot stat 'fs/isofs/isofs.ko': No such file or directory
    INSTALL fs/jffs2/jffs2.ko
    cp: cannot stat 'fs/jffs2/jffs2.ko': No such file or directory
    INSTALL fs/jfs/jfs.ko
    cp: cannot stat 'fs/jfs/jfs.ko': No such file or directory
    INSTALL fs/nfs/blocklayout/blocklayoutdriver.ko
    cp: cannot stat 'fs/nfs/blocklayout/blocklayoutdriver.ko': No such file or directory
    INSTALL fs/nfs/flexfilelayout/nfs_layout_flexfiles.ko
    cp: cannot stat 'fs/nfs/flexfilelayout/nfs_layout_flexfiles.ko': No such file or directory
    INSTALL fs/nfsd/nfsd.ko
    cp: cannot stat 'fs/nfsd/nfsd.ko': No such file or directory
    INSTALL fs/nilfs2/nilfs2.ko
    cp: cannot stat 'fs/nilfs2/nilfs2.ko': No such file or directory
    INSTALL fs/nls/nls_cp1250.ko
    cp: cannot stat 'fs/nls/nls_cp1250.ko': No such file or directory
    INSTALL fs/nls/nls_cp1251.ko
    cp: cannot stat 'fs/nls/nls_cp1251.ko': No such file or directory
    INSTALL fs/nls/nls_cp1255.ko
    cp: cannot stat 'fs/nls/nls_cp1255.ko': No such file or directory
    INSTALL fs/nls/nls_cp737.ko
    cp: cannot stat 'fs/nls/nls_cp737.ko': No such file or directory
    INSTALL fs/nls/nls_cp775.ko
    cp: cannot stat 'fs/nls/nls_cp775.ko': No such file or directory
    INSTALL fs/nls/nls_cp850.ko
    cp: cannot stat 'fs/nls/nls_cp850.ko': No such file or directory
    INSTALL fs/nls/nls_cp852.ko
    cp: cannot stat 'fs/nls/nls_cp852.ko': No such file or directory
    INSTALL fs/nls/nls_cp855.ko
    cp: cannot stat 'fs/nls/nls_cp855.ko': No such file or directory
    INSTALL fs/nls/nls_cp857.ko
    cp: cannot stat 'fs/nls/nls_cp857.ko': No such file or directory
    INSTALL fs/nls/nls_cp860.ko
    cp: cannot stat 'fs/nls/nls_cp860.ko': No such file or directory
    INSTALL fs/nls/nls_cp861.ko
    cp: cannot stat 'fs/nls/nls_cp861.ko': No such file or directory
    INSTALL fs/nls/nls_cp862.ko
    cp: cannot stat 'fs/nls/nls_cp862.ko': No such file or directory
    INSTALL fs/nls/nls_cp863.ko
    cp: cannot stat 'fs/nls/nls_cp863.ko': No such file or directory
    INSTALL fs/nls/nls_cp864.ko
    cp: cannot stat 'fs/nls/nls_cp864.ko': No such file or directory
    INSTALL fs/nls/nls_cp865.ko
    cp: cannot stat 'fs/nls/nls_cp865.ko': No such file or directory
    INSTALL fs/nls/nls_cp866.ko
    cp: cannot stat 'fs/nls/nls_cp866.ko': No such file or directory
    INSTALL fs/nls/nls_cp869.ko
    cp: cannot stat 'fs/nls/nls_cp869.ko': No such file or directory
    INSTALL fs/nls/nls_cp874.ko
    cp: cannot stat 'fs/nls/nls_cp874.ko': No such file or directory
    INSTALL fs/nls/nls_cp932.ko
    cp: cannot stat 'fs/nls/nls_cp932.ko': No such file or directory
    INSTALL fs/nls/nls_cp936.ko
    cp: cannot stat 'fs/nls/nls_cp936.ko': No such file or directory
    INSTALL fs/nls/nls_cp949.ko
    cp: cannot stat 'fs/nls/nls_cp949.ko': No such file or directory
    INSTALL fs/nls/nls_cp950.ko
    cp: cannot stat 'fs/nls/nls_cp950.ko': No such file or directory
    INSTALL fs/nls/nls_euc-jp.ko
    cp: cannot stat 'fs/nls/nls_euc-jp.ko': No such file or directory
    INSTALL fs/nls/nls_iso8859-1.ko
    cp: cannot stat 'fs/nls/nls_iso8859-1.ko': No such file or directory
    INSTALL fs/nls/nls_iso8859-13.ko
    cp: cannot stat 'fs/nls/nls_iso8859-13.ko': No such file or directory
    INSTALL fs/nls/nls_iso8859-14.ko
    cp: cannot stat 'fs/nls/nls_iso8859-14.ko': No such file or directory
    INSTALL fs/nls/nls_iso8859-15.ko
    cp: cannot stat 'fs/nls/nls_iso8859-15.ko': No such file or directory
    INSTALL fs/nls/nls_iso8859-2.ko
    cp: cannot stat 'fs/nls/nls_iso8859-2.ko': No such file or directory
    INSTALL fs/nls/nls_iso8859-3.ko
    cp: cannot stat 'fs/nls/nls_iso8859-3.ko': No such file or directory
    INSTALL fs/nls/nls_iso8859-4.ko
    cp: cannot stat 'fs/nls/nls_iso8859-4.ko': No such file or directory
    INSTALL fs/nls/nls_iso8859-5.ko
    cp: cannot stat 'fs/nls/nls_iso8859-5.ko': No such file or directory
    INSTALL fs/nls/nls_iso8859-6.ko
    cp: cannot stat 'fs/nls/nls_iso8859-6.ko': No such file or directory
    INSTALL fs/nls/nls_iso8859-7.ko
    cp: cannot stat 'fs/nls/nls_iso8859-7.ko': No such file or directory
    INSTALL fs/nls/nls_iso8859-9.ko
    cp: cannot stat 'fs/nls/nls_iso8859-9.ko': No such file or directory
    INSTALL fs/nls/nls_koi8-r.ko
    cp: cannot stat 'fs/nls/nls_koi8-r.ko': No such file or directory
    INSTALL fs/nls/nls_koi8-ru.ko
    cp: cannot stat 'fs/nls/nls_koi8-ru.ko': No such file or directory
    INSTALL fs/nls/nls_koi8-u.ko
    cp: cannot stat 'fs/nls/nls_koi8-u.ko': No such file or directory
    INSTALL fs/nls/nls_utf8.ko
    cp: cannot stat 'fs/nls/nls_utf8.ko': No such file or directory
    INSTALL fs/ntfs/ntfs.ko
    cp: cannot stat 'fs/ntfs/ntfs.ko': No such file or directory
    INSTALL fs/ocfs2/cluster/ocfs2_nodemanager.ko
    cp: cannot stat 'fs/ocfs2/cluster/ocfs2_nodemanager.ko': No such file or directory
    INSTALL fs/ocfs2/dlm/ocfs2_dlm.ko
    cp: cannot stat 'fs/ocfs2/dlm/ocfs2_dlm.ko': No such file or directory
    INSTALL fs/ocfs2/dlmfs/ocfs2_dlmfs.ko
    cp: cannot stat 'fs/ocfs2/dlmfs/ocfs2_dlmfs.ko': No such file or directory
    INSTALL fs/ocfs2/ocfs2.ko
    cp: cannot stat 'fs/ocfs2/ocfs2.ko': No such file or directory
    INSTALL fs/ocfs2/ocfs2_stack_o2cb.ko
    cp: cannot stat 'fs/ocfs2/ocfs2_stack_o2cb.ko': No such file or directory
    INSTALL fs/ocfs2/ocfs2_stack_user.ko
    cp: cannot stat 'fs/ocfs2/ocfs2_stack_user.ko': No such file or directory
    INSTALL fs/ocfs2/ocfs2_stackglue.ko
    cp: cannot stat 'fs/ocfs2/ocfs2_stackglue.ko': No such file or directory
    INSTALL fs/overlayfs/overlay.ko
    cp: cannot stat 'fs/overlayfs/overlay.ko': No such file or directory
    INSTALL fs/quota/quota_tree.ko
    cp: cannot stat 'fs/quota/quota_tree.ko': No such file or directory
    INSTALL fs/quota/quota_v1.ko
    cp: cannot stat 'fs/quota/quota_v1.ko': No such file or directory
    INSTALL fs/quota/quota_v2.ko
    cp: cannot stat 'fs/quota/quota_v2.ko': No such file or directory
    INSTALL fs/reiserfs/reiserfs.ko
    cp: cannot stat 'fs/reiserfs/reiserfs.ko': No such file or directory
    INSTALL fs/squashfs/squashfs.ko
    cp: cannot stat 'fs/squashfs/squashfs.ko': No such file or directory
    INSTALL fs/ubifs/ubifs.ko
    cp: cannot stat 'fs/ubifs/ubifs.ko': No such file or directory
    INSTALL fs/udf/udf.ko
    cp: cannot stat 'fs/udf/udf.ko': No such file or directory
    INSTALL fs/xfs/xfs.ko
    cp: cannot stat 'fs/xfs/xfs.ko': No such file or directory
    INSTALL mm/zsmalloc.ko
    cp: cannot stat 'mm/zsmalloc.ko': No such file or directory
    DEPMOD 4.19.127-v7l+
    Warning: modules_install: missing 'System.map' file. Skipping depmod.
    make[1]: Leaving directory '/home/pi/rpi_kernel_src/out'
    cp: cannot stat '/home/pi/rpi_kernel_src/out/arch/arm/boot/dts/*.dtb': No such file or directory
    cp: cannot stat '/home/pi/rpi_kernel_src/out/arch/arm/boot/dts/overlays/*.dtb*': No such file or directory
    cp: cannot stat '/home/pi/rpi_kernel_src/out/arch/arm/boot/dts/overlays/README': No such file or directory
    cp: cannot stat '/home/pi/rpi_kernel_src/out/arch/arm/boot/zImage': No such file or directory
  • AustinKim 2020/09/30 20:42 #

    오늘 올린 아래 링크의 포스팅을 참고해 보셨으면 합니다.

    http://rousalome.egloos.com/10019506
    [공지] 2장: 라즈비안 커널 빌드가 안될 때 조치 방법

    그 동안 제보에 따르면, 빌드나 설치가 안되는 원인은 대부분 빌드 스크립트를 입력할 때 오타 때문인 경우가 대부분입니다.

    감사합니다.
  • 2020/09/30 20:42 # 답글 비공개

    비공개 덧글입니다.
  • jinn.k 2020/12/31 17:50 # 삭제 답글

    혹시 커널 코드가 일부 수정 되었을 때 해당 코드만 라즈베리 파이에 설치할 수 있는 방법이 혹시 존재할까요 ?
  • AustinKim 2020/12/31 21:57 #

    현재 리눅스를 지원하는 대부분 SoC 벤더에서는 리눅스 커널의 이미지 전체를 특정 파티션에 플래시를 하는 구조로 설계하고 있습니다. 라즈베리 파이도 마찬가지 구조라서, 커널의 일부 파일만 수정해 다운로드할 수 있는 방법은 없습니다.
  • 로라하트윅 2021/01/11 22:50 # 삭제 답글

    root@raspberrypi:/home/pi/rpi_kernel_src# ./install_rpi_kernel_img.sh
    =======================

    ##!/bin/bash

    KERNEL_TOP_PATH="$( cd "$(dirname "$0")" ; pwd -P )"
    OUTPUT="$KERNEL_TOP_PATH/out"
    echo "$OUTPUT"

    cd linux

    make O=$OUTPUT modules_install
    cp $OUTPUT/arch/arm/boot/dts/*.dtb /boot/
    cp $OUTPUT/arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
    cp $OUTPUT/arch/arm/boot/dts/overlays/README /boot/overlays/
    cp $OUTPUT/arch/arm/boot/zImage /boot/kernel7.img

    ==========================================

    cp: cannot stat '/home/pi/rpi_kernel_src/out/arch/arm/boot/dts/overlays/README': No such file or directory


    올려주신 예제를 스크립트에 붙여넣고 해도 위와 같이 오류가 발생합니다.

    제 생각엔 스크립트 돌리면서 만들어진 out 폴더에 README 파일이
    없어서 그런것 같은데요.
    라즈베리파이 문서에서는 out 폴더를 만들라는 부분이 없는데
    혹시 make할 때 README 파일도 같이 복사되는것이 맞는지요?

    제가 리눅스에 대해 잘 몰라서 여쭤봅니다.
  • AustinKim 2021/01/13 10:31 #

    아래에 보이는 에러 메시지는 무시하셔도 좋구요.
    cp: cannot stat '/home/pi/rpi_kernel_src/out/arch/arm/boot/dts/overlays/README': No such file or directory

    'cp $OUTPUT/arch/arm/boot/dts/overlays/README /boot/overlays/' 코드는 주석으로 처리하시길 부탁드립니다.

    cp $OUTPUT/arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
    #cp $OUTPUT/arch/arm/boot/dts/overlays/README /boot/overlays/
    cp $OUTPUT/arch/arm/boot/zImage /boot/kernel7.img

    참고로 'arch/arm/boot/dts/overlays/README'는 다운로드될 파일이 아니라, 파일 이름 그대로 dts에 대한 가이드 문서입니다.

    감사합니다.
  • 무야호 2021/02/06 01:30 # 삭제 답글

    커널 빌드와 인스톨은 진행이 잘되는데 빌드 속도가 너무 느립니다. 켜넣고 자면 다음날에 완료될 정도로 느려서 챕터마다 진도빼기가 힘드네요
    제 라즈베리파이 화면에는 노란색 번개가 뜨는데 이게 이유일까요?
  • AustinKim 2021/02/08 19:47 #

    라즈비안 커널은 한 번 빌드를 하고 난 다음에,
    소스 코드를 수정하고 빌드하면 수정된 소스 파일만 빌드가 됩니다.

    아래 동영상의 (5:23) 초에 해당하는 부분을 참고하시고 진행하였으면 합니다.
    https://www.youtube.com/watch?v=-USmpeIU41U

    그리고 라즈비안 커널을 빌드하면 생성되는 out 디렉터리는 혹시 삭제하셨는지 모르겠는데요.
    out 디렉터리를 삭제하면 라즈비안 커널을 full 빌드하니 시간이 오래 걸려요. 이 점도 참고하세요.
댓글 입력 영역