Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

79112
549
416219


[라즈베리 파이] 라즈비안 리눅스 커널 빌드하고 설치하기 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 빌드하니 시간이 오래 걸려요. 이 점도 참고하세요.
  • tjswlsgg 2021/03/21 23:53 # 삭제 답글

    아래 명령어를 통해 업데이트 완료 후 유틸리티 모두 설치완료하였습니다.
    apt-get update && upgrade
    apt-get install git bc bison flex libssl-dev
    ========================================
    하지만, build_rpi_kernel.sh를 이용하여 빌드 시 아래와 같이 에러가 발생합니다.
    * http://rousalome.egloos.com/10019506 이 글에서 build_rpi_kernel.sh를 다운로드 받아 실행하였습니다.

    /home/pi/rpi_kernel_src/linux/include/linux/fs.h: In function ‘vfs_lstat’:
    /home/pi/rpi_kernel_src/linux/include/linux/fs.h:3134:2: internal compiler error: in fold_binary_loc, at fold-const.c:9253
    return vfs_statx(AT_FDCWD, name, AT_SYMLINK_NOFOLLOW | AT_NO_AUTOMOUNT,
    ^~~~~~
    0x76a56717 __libc_start_main
    /build/glibc-FUvrFr/glibc-2.28/csu/libc-start.c:308
    Please submit a full bug report,
    with preprocessed source if appropriate.
    Please include the complete backtrace with any bug report.
    See <file:///usr/share/doc/gcc-8/README.Bugs> for instructions.
    make[2]: *** [/home/pi/rpi_kernel_src/linux/scripts/Makefile.build:303: arch/arm/mm/iomap.o] Error 1
    make[2]: *** Waiting for unfinished jobs....
    AS arch/arm/common/secure_cntvoff.o
    AR arch/arm/common/built-in.a
    AR arch/arm/net/built-in.a
    CC arch/arm/probes/decode.o
    CC arch/arm/probes/kprobes/core.o
    CC arch/arm/kernel/ptrace.o
    make[1]: *** [/home/pi/rpi_kernel_src/linux/Makefile:1058: arch/arm/mm] Error 2
    make[1]: *** Waiting for unfinished jobs....
    CC arch/arm/probes/decode-arm.o
    CC arch/arm/probes/kprobes/actions-common.o
    CC arch/arm/kernel/reboot.o
    CC arch/arm/probes/kprobes/checkers-common.o
    CC arch/arm/kernel/return_address.o
    CC arch/arm/probes/kprobes/actions-arm.o
    In file included from /home/pi/rpi_kernel_src/linux/include/linux/sysfs.h:16,
    from /home/pi/rpi_kernel_src/linux/include/linux/kobject.h:20,
    from /home/pi/rpi_kernel_src/linux/include/linux/module.h:17,
    from /home/pi/rpi_kernel_src/linux/include/linux/kallsyms.h:13,
    from /home/pi/rpi_kernel_src/linux/include/linux/ftrace.h:11,
    from /home/pi/rpi_kernel_src/linux/arch/arm/kernel/return_address.c:12:
    /home/pi/rpi_kernel_src/linux/include/linux/kernfs.h: In function ‘kernfs_enable_ns’:
    /home/pi/rpi_kernel_src/linux/include/linux/kernfs.h:289:2: internal compiler error: Illegal instruction
    WARN_ON_ONCE(kernfs_type(kn) != KERNFS_DIR);
    ^~~~~~~~~~~~
    CC arch/arm/probes/kprobes/checkers-arm.o
    CC arch/arm/probes/kprobes/opt-arm.o
    0x76a7611f ???
    ../sysdeps/unix/sysv/linux/arm/sigrestorer.S:64
    0x76a60717 __libc_start_main
    /build/glibc-FUvrFr/glibc-2.28/csu/libc-start.c:308
    Please submit a full bug report,
    with preprocessed source if appropriate.
    Please include the complete backtrace with any bug report.
    See <file:///usr/share/doc/gcc-8/README.Bugs> for instructions.
    make[2]: *** [/home/pi/rpi_kernel_src/linux/scripts/Makefile.build:303: arch/arm/kernel/return_address.o] Error 1
    make[1]: *** [/home/pi/rpi_kernel_src/linux/Makefile:1058: arch/arm/kernel] Error 2
    AR arch/arm/probes/kprobes/built-in.a
    AR arch/arm/probes/built-in.a
    make[1]: Leaving directory '/home/pi/rpi_kernel_src/out'
    make: *** [Makefile:146: sub-make] Error 2
  • AustinKim 2021/03/23 06:37 #

    저도 예전에 비슷한 문제를 겪었는데요. 그 원인은 다음과 같이 요약할 수 있습니다.

    * 라즈베리 파이 불량
    * 마이크로 SD 카드 불량
    * 라즈비안 커널 소스를 제대로 내려 받지 못함

    일단, 댓글로 알려주신 메시지는 GCC 컴파일러가 제대로 설치되지 않았을 때 확인됩니다.
    유사한 케이스는 아래 링크에서 확인할 수 있는데요.

    https://github.com/AFLplusplus/AFLplusplus/issues/25
    https://bugs.php.net/bug.php?id=74677

    아래 명령어를 입력한 다음에,

    $ apt-get update
    $ apt-get upgrade

    out 폴더를 지우시고 다시 빌드를 진행해보시고요.
    (되도록 소스 코드는 다시 내려 받으시길 권장드립니다.)

    만약 그래도 같은 에러가 보이면 아래와 같은 조치를 취하시길 권장드립니다.

    1. 아래 링크에 있는 내용을 참고해 크로스 컴파일로 라즈비안 커널을 빌드해 설치합니다. https://www.raspberrypi.org/documentation/linux/kernel/building.md

    (크로스 컴파일러 설치용 빌드 스크립트는 조만간에 새로운 포스트를 통해 공유될 예정입니다.)

    2. 다른 마이크로SD 카드나 라즈베리 파이를 교체한 다음에 라즈베이 파이를 설치하고 라즈비안 커널을 빌드합니다.

    이런 증상을 겪을 때 짜증이 나겠지만, 실전 개발에서 유사한 문제를 겪을 수 있으니 너무 스트레스를 받지 않으셨으면 좋겠습니다.
    그럼, 즐거운 하루 되세요.
  • tjswlsgg 2021/03/23 14:07 # 삭제

    라즈베리파이 불량이 원인인 것 같습니다.
    파이 새걸로 바꾸니 해결되었습니다.
    감사합니다~!^^
  • 2021/03/23 06:43 # 답글 비공개

    비공개 덧글입니다.
  • ilye 2021/09/17 01:18 # 삭제 답글

    안녕하세요 음.. 일단 제가 라즈베리파이 4B를 가지고 라즈비안 이미지, 라즈비안 브랜치 등을

    지시해주신대로 버전을 맞추어 수 많은 에러를 만나고 성공적으로 이미지까지 설치를 마쳤습니다^^

    하지만 리부팅을 한 뒤에 usb포트부터 블루투스 터치스크린(라즈비안 제품) 들이 전혀 작동을 하지않습니다. (usb포트에 전혀 전원이 안들어오고 화면은 나오는데 터치는 안되고ㅎㅎ)

    그래서 현재 임시로 최신 라즈비안 이미지에 최신 브랜치를 빌드/이미지 설치하면서 실습을 나아가고 있습니다.

    그러던 중에 "커널 디버깅용 Debugfs 드라이버 코드" 파트에서 rpi_debugfs.c를 작성한뒤 빌드를 하고 이미지를 설치했지만

    빌드만 되고 이미지 설치에서 안되는 것 같습니다. 왜냐하면 오류도 없고 컴파일된 rpi_debugfs.o는 되어 있지만 rpi_debug 디렉토리나 val 파일은 생기지 않습니다

    이렇게 문재가 꼬여서 번거롭게 해서 죄송하지만 도와주실 수 있나요?
  • AustinKim 2021/09/18 14:48 #

    정신이 없어 이제야 답신 드립니다.

    rpi_debugfs.c 파일을 추가하기 위해서는 소스 파일을 생성한 다음에,
    메이크 파일(Makefile)도 같이 수정해야 합니다. 이 부분도 함께 점검 부탁드립니다.

    감사합니다.
  • ilye 2021/09/20 15:01 # 삭제 답글

    Makefile도 여러 번 오타 검사를 하면서 수정했었습니다.
  • AustinKim 2021/09/20 19:03 #

    아래와 같은 패치를 적용해 보시겠어요?

    diff --git a/drivers/soc/bcm/Makefile b/drivers/soc/bcm/Makefile
    index 7bc90e0bd..062a56379
    --- a/drivers/soc/bcm/Makefile
    +++ b/drivers/soc/bcm/Makefile
    @@ -1,5 +1,5 @@
    # SPDX-License-Identifier: GPL-2.0-only
    -obj-$(CONFIG_BCM2835_POWER) += bcm2835-power.o
    +obj-$(CONFIG_BCM2835_POWER) += bcm2835-power.o rpi_debugfs.o

    저는 잘 되는데요.
  • liye 2021/09/21 16:31 # 삭제 답글

    수정 후 아예 다시 out 파일을 삭제 후 재빌드 해서 이미지 설치 리부팅를 해도 안 됩니다.

    선생님께 제 라즈베리파이를 보여드리고 싶은데 그건 실례가 될 것 같아서 이건 지금은 넘어가고 나중에 제가 더욱 실력을 쌓이면

    그때 해결해 보겠습니다. (선생님이라고 불러도 되겠죠?)

    그래도 궁금한게 있는데 괄호안에 CONFIG__BCM/RASPBARRYPI 등등 무엇을 의미하는 건가요?
  • AustinKim 2021/09/23 11:36 #

    리눅스 커널에서는 컨피그 파일에 따라 소스가 빌드됩니다.
    만약 CONFIG_BCM2835_POWER=y이면 해당 디렉토리에 있는 bcm2835-power.c rpi_debugfs.c 소스를 빌드하겠다는 의도의 코드입니다.

    'CONFIG_BCM2835_POWER=y'는 .config(out/.config)에서 다음과 같이 확인할 수 있습니다.

    #
    # Broadcom SoC drivers
    #
    CONFIG_BCM2835_POWER=y
    CONFIG_RASPBERRYPI_POWER=y

    CONFIG_BCM2835_POWER
  • Starter 2022/04/10 21:44 # 삭제 답글

    안녕하세요. "liye " 님과 같은 문제가 발생하고 있어서 댓글을 달게 되었습니다.

    책에 './install_rpi_kernel_img.sh" 스크립트에서는 rpi_debugfs.o를 Kernel의 Driver로 옮기는 부분이 없어서 아마도 rpi_debugfs.o가 실제 Kernel 이미지에 안올라 갈꺼 같은데요.

    실제로 install_rpi_kernel_im를 실행하면 /lib/modueles에 있는 파일들은 올라가지만 이 폴더안 에는 rpi_debugfs.o는 존재하지 않습니다. 왜냐면 이 파일은 OUT이라는 폴더 안에 존재하니까요.

    일단 지금 구글링 하면서 방법은 찾고 있는데 다른분들 불로그를 봐도 전부다 object파일은 copy하는 부분이 있습니다. 혹시 제가 잘못 생각하고 있는걸까요???

  • AustinKim 2022/04/10 22:10 #

    정상적으로 커널 빌드가 진행된 상황에서는요. rpi_debugfs.c 파일이 빌드되면 rpi_debugfs.o이 생성되고 이 파일은 전체 리눅스 커널 소스가 빌드된 결정체인 zImage에 합쳐집니다.

    그런데 install_rpi_kernel_img.sh 파일의 구현부를 보면요;
    # install_rpi_kernel_img.sh
    ...
    12 cp $OUTPUT/arch/arm/boot/zImage /boot/kernel7.img

    '$OUTPUT/arch/arm/boot/zImage' 파일(커널 이미지)을 /boot/kernel7.img로 복사하는 구문이 보일 겁니다.

    일단 rpi_debugfs.o 파일이 제대로 생성되면 zImage 파일로 합쳐지니, 우선 rpi_debugfs.o 파일이 제대로 생성되는지 확인이 필요합니다.

    감사합니다.
  • Starter 2022/04/11 01:52 # 삭제 답글

    아 넵 감사합니다. map 파일에서 rpi_debugsfs.o가 있는지 확인해 보겠습니다.

    그리고 rpi_4에서는 kernel7.img 아니고 kernel7l.img를 사용하고 있네요.

    즉 이미지 경로가 잘못 된거였어요.

    다른분들도 이글 보시고 참고하시길.. 감사합니다.
  • AustinKim 2022/04/11 10:21 #

    이미지 경로를 확인하셔서 다행입니다.
    즐거운 하루 되세요.

    감사합니다.
  • JK 2022/04/12 10:43 # 삭제 답글

    안녕하세요 처음 이용해봐서 어렵네요 ^^
    sh파일 만드는 것부터 난관이었네요..ㅎㅎ 구글링해보니 nano 편집기로 build_rpi_kernel.sh 스클립트 작성하고 실행해서 오류까지 발생했는데요

    #error "invoke compile error inside __schdedule"
    위 코드 한줄을 삭제하고 다시 빌드하라 하셨는데 코드 한줄 삭제를 어떻게 하나요??

    /home/pi/rpi_kernel_src/linux/kernel/sched 폴더에 있는 core.c 파일 들어가보니 #error "invoke compile error inside __schdedule" 코드가 안보여서 질문드립니다

    아니면 코드 삭제한는 다른방법이 있는건가요?

    너무 기초적인 질문 일 수도 있는데 이게 안돼서 진도가 안나가네요..ㅠㅠ
  • AustinKim 2022/04/12 22:52 #

    아래와 같이 '#error "invoke compile error inside __schdedule"' 코드를 추가한 후 삭제하면 됩니다.

    [before]
    https://elixir.bootlin.com/linux/v4.19.30/source/kernel/sched/core.c
    static void __sched notrace __schedule(bool preempt)
    {
    struct task_struct *prev, *next;
    unsigned long *switch_count;
    struct rq_flags rf;
    struct rq *rq;
    int cpu;
    #error "invoke compile error inside __schdedule"
    cpu = smp_processor_id();
    rq = cpu_rq(cpu);

    [after]
    https://elixir.bootlin.com/linux/v4.19.30/source/kernel/sched/core.c
    static void __sched notrace __schedule(bool preempt)
    {
    struct task_struct *prev, *next;
    unsigned long *switch_count;
    struct rq_flags rf;
    struct rq *rq;
    int cpu;

    cpu = smp_processor_id();
    rq = cpu_rq(cpu);

    감사합니다.
  • Imchanyang 2022/05/16 19:48 # 답글

    https://downloads.raspberrypi.org/raspbian_full/images/raspbian_full-2019-07-12/

    There is 2019-07-10-raspbian-buster-full.zip in this link.

    When I downloaded 2019-07-10-raspbian-buster.zip(instead full),
    (Because 'raspberrypi.org' is changed)
    Error was not disappeared...

    I found and downloaded 2019-07-10-raspbian-buster-ful.zip 's link.
    Then, Build Success.

    Gook luck.
    Thank you for your book.

    (I wrote this comment in rasbian. So, I used english... Sorry for my bad english.)

    +
    When I
    downloaded 'not full' version, I can't also execute 'apt-get install git bc flex libssl-dev'.(exactly, libssl-dev)
    If you download 'full' version, It will be ok.
댓글 입력 영역