Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

693
557
422265


[라즈베리 파이] 라즈비안 커널 소스코드 내려받기 2. 라즈베리 파이 설정

이번에는 라즈비안 리눅스 커널 소스코드를 내려받고 빌드 및 설치하는 과정을 다룹니다. 이 내용은 아래 라즈베리 파이 커뮤니티에서 소개한 내용을 참고했습니다.

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


리눅스 유틸리티 프로그램을 설치하기

라즈비안 리눅스 커널 소스코드를 내려받기에 앞서 리눅스 유틸리티 프로그램을 설치해야 합니다. 이를 위해 다음 명령어를 입력합니다.

$ apt-get install git bc bison flex libssl-dev

이 책에서 사용한 라즈베리 파이에서 이 명령어를 입력했을 때 나오는 화면은 다음과 같습니다. 

 
그림 2.39 리눅스 필수 유틸리티 프로그램 설치

유틸리티 프로그램을 설치하는 데 약 1분 정도 시간이 걸립니다.

라즈비안 리눅스 커널 소스 코드 내려받기

이어서 리눅스 커널 소스코드를 다운로드하는 방법을 소개합니다. 다음 명령어를 입력하면 라즈비안 최신 커널 소스를 내려받을 수 있습니다.

$ git clone --depth=1 https://github.com/raspberrypi/linux

이 명령어를 라즈베리 파이 터미널에서 입력한 후 출력되는 화면은 다음과 같습니다.

root@raspberrypi:/home/pi/rpi_kernel_src# git clone --depth=1 https://github.com/raspberrypi/linux
Cloning into 'linux'...
remote: Enumerating objects: 85646, done.
remote: Counting objects: 100% (85646/85646), done.
remote: Compressing objects: 100% (65774/65774), done.
Receiving objects:  33% (28569/85646), 41.45 MiB | 1.22 MiB/s    

소스코드를 내려받는 데 약 10분 정도가 걸립니다. 커널 소스를 다 내려받고 나서 브랜치를 확인하니 rpi-4.19.y입니다.

root@raspberrypi:/home/pi/rpi_kernel_src# git branch
* rpi-4.19.y

linux 폴더에 생성되는 .git/config 파일을 열어보면 기본적으로 rpi-4.19.y 브랜치로 설정돼 있습니다. 

root@raspberrypi:/home/pi/rpi_kernel_src/linux# vi .git/config
.git/config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = https://github.com/raspberrypi/linux
    fetch = +refs/heads/rpi-4.19.y:refs/remotes/origin/rpi-4.19.y
[branch "rpi-4.19.y"]
    remote = origin
    merge = refs/heads/rpi-4.19.y

이렇게 git clone 명령어를 써서 라즈비안 리눅스 커널 소스코드를 내려받으면 최신 버전의 브랜치를 선택합니다.


리눅스 커널은 git을 통해 소스코드를 관리합니다. 브랜치(branch)는 git에서 자주 쓰는 개념으로, 프로젝트 소스코드의 큰 줄기라고 볼 수 있습니다. 라즈비안은 리눅스 커널 버전에 따라 각기 다른 브랜치를 운영합니다.


이 책에서는 리눅스 커널 4.19.60 버전을 기준으로 빌드 및 테스트를 마쳤습니다. 이 책에서 다루는 리눅스 커널 버전에 맞춰 커널 코드를 내려받기를 권장합니다. 이를 위해 rpi-4.19.y 브랜치를 선택해야 합니다.

다음은 브랜치를 rpi-4.19.y로 지정해 라즈비안 리눅스 커널 코드를 다운로드하는 명령어입니다.

$ git clone --depth=1 --branch rpi-4.19.y https://github.com/raspberrypi/linux

root@raspberrypi:/home/pi/rpi_kernel_src# git clone --depth=1 --branch rpi-4.19.y https://github.com/raspberrypi/linux
Cloning into 'linux'...
remote: Enumerating objects: 122739, done.
remote: Counting objects: 100% (122739/122739), done.
remote: Compressing objects: 100% (74357/74357), done.
remote: Total 122739 (delta 54284), reused 72109 (delta 47307), pack-reused 0
Receiving objects: 100% (122739/122739), 185.97 MiB | 1.17 MiB/s, done.
Resolving deltas: 100% (54284/54284), done.
Checking connectivity... done.
Checking out files: 100% (61885/61885), done.

다시 반복하지만 가급적이면 이 책에서 사용하는 4.19 버전에 맞춰 라즈비안 리눅스 커널 소스코드를 다운로드하길 바랍니다. 2021년이 되면 라즈비안 기본 브랜치가 아마 새로운 버전으로 설정될 수 있습니다. 즉, git clone 명령어로 브랜치 이름을 지정하지 않으면 최신 브랜치 소스코드를 다운로드하게 됩니다.

* 유튜브 강의 동영상도 있으니 같이 들으시면 더 많은 걸 배울 수 있습니다. 






 
라즈베리 파이 설정 

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

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

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


# Reference: 리눅스 커널

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

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




핑백

덧글

  • 컴친구 2019/10/15 16:57 # 삭제 답글

    커널 설정이나 빌드할때 "make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig, make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j4" 처럼
    ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 를 넣어줘야 하는데 셀 스크립터 작성시에는 어떻게 넣어줘야 할까요
  • AustinKim 2019/10/21 09:07 #

    아래는 라즈비안을 빌드할 때 shell script 코드입니다. 참고하세요.
    #!/bin/bash

    export PATH=$PATH:~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
    KERNEL=kernel7

    echo "configure build output path"
    TOP_PATH=$( cd "$(dirname "$0")" ; pwd )
    OUTPUT="$TOP_PATH/out"

    BUILD_LOG="$TOP_PATH/rpi_build_log.txt"

    rpi_build_start_time=`date +%s`

    OUTPUT_PATH=$( cd "$(dirname "$0")" ; pwd )
    OUTPUT="$OUTPUT_PATH/out"

    pushd linux > /dev/null

    # make config
    make ARCH=arm O=$OUTPUT CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig -j16 2>&1

    # build kernel source
    make ARCH=arm O=$OUTPUT CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j16 2>&1 | tee $BUILD_LOG
  • AustinKim 2019/10/21 09:07 # 답글

    아래는 라즈비안을 빌드할 때 shell script 코드입니다. 참고하세요.
    #!/bin/bash

    export PATH=$PATH:~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
    KERNEL=kernel7

    echo "configure build output path"
    TOP_PATH=$( cd "$(dirname "$0")" ; pwd )
    OUTPUT="$TOP_PATH/out"

    BUILD_LOG="$TOP_PATH/rpi_build_log.txt"

    rpi_build_start_time=`date +%s`

    OUTPUT_PATH=$( cd "$(dirname "$0")" ; pwd )
    OUTPUT="$OUTPUT_PATH/out"

    pushd linux > /dev/null

    # make config
    make ARCH=arm O=$OUTPUT CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig -j16 2>&1

    # build kernel source
    make ARCH=arm O=$OUTPUT CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j16 2>&1 | tee $BUILD_LOG
  • 뉴비 2020/04/07 00:01 # 삭제 답글

    임베디드 시스템에 관심을 갖게되어 여기까지 오게된 공대생 4학년 학생입니다
    좋은 자료 감사합니다~~
  • AustinKim 2020/04/07 07:37 #

    보신 자료가 많은 도움이 됐으면 좋겠습니다. 즐거운 하루 되세요.

    Thanks,
    Austin Kim
  • 견정 2021/03/14 02:17 # 삭제 답글

    안녕하세요.


    커널을 빌드 후 설치하고 있는데
    에러가 발생하여 문의드립니다.

    사용하는 상태는 아래와 같습니다.
    1. 기존에 사용하던 라즈비안을 재설치하지 않음
    2. 리눅스 소스 삭제 후 다시 책의 내용대로 받음
    3. 빌드는 완료되어 out 디렉토리에 저장되어있음

    ./install_rpi_kernel_img.sh
    /out
    make[1]: Entering directory '/out'

    ERROR: Kernel configuration is invalid.
    include/generated/autoconf.h or include/config/auto.conf are missing.
    Run 'make oldconfig && make prepare' on kernel src to fix it.

    /home/serum/linux/Makefile:590: include/config/auto.conf: No such file or directory
    make[1]: *** [/home/serum/linux/Makefile:641: include/config/auto.conf] Error 1
    make[1]: Leaving directory '/out'
    make: *** [Makefile:146: sub-make] Error 2
    cp: cannot stat '/out/arch/arm/boot/dts/*.dtb': No such file or directory
    cp: cannot stat '/out/arch/arm/boot/dts/overlays/*.dtb': No such file or directory
    cp: cannot stat '/out/arch/arm/boot/dts/overlays/README': No such file or directory
    cp: cannot stat '/out/arch/arm/boot/zImage': No such file or directory

    감사합니다
  • AustinKim 2021/03/14 10:25 #

    라즈비안 커널이 설치되지 않아 고생이 많으십니다.
    다른 독자 분들께서도 유사한 문제를 겪었는데, 대부분 빌드 스크립트를 입력하시다가 오타를 입력해 이런 어려움을 겪는 것 같습니다.

    아래 링크에 빌드 스크립트를 올려 놨으니, 빌드 스크립트를 내려 받으신 다음에,
    http://rousalome.egloos.com/10024852

    내려받은 빌드 스크립트를 실행해 라즈비안 커널을 빌드해보시겠어요? 여기서 주의해야 할 점은 이미 빌드한 out 디렉터리를 반드시 지우시고 다시 빌드를 하셔야 합니다.

    실전 프로젝트를 하다보면 누구나 겪는 현상(저도 이런 문제를 만난 적이 있어요)이니 스트레스를 너무 받지 마시고 차근 차근 진행하셨으면 좋겠습니다.

    감사합니다.
  • 견정 2021/03/14 13:05 # 삭제 답글

    답변 주셔서 감사합니다.

    안그래도 Make O를 숫자 0으로 입력해 버리는 대참사를 겪어서
    아... 이럴때도 있지...라는 생각과 함께 '내탓이오'를 외치고 있습니다

    주말임에도 불구하고 빠르게 답변 주신 점 감사드리며, 문제 발생 시 다시 글을 올리겠습니다.

    감사합니다.
  • AustinKim 2021/03/14 22:31 #

    커널을 빌드할 때 누구나 겪을 수 있는 시행착오인 것 같네요.
    공유 드린 빌드 스크립트로 아마 잘 빌드가 될 것이니 너무 걱정하지 마세요.

    감사합니다.
  • jasmu 2021/06/30 17:19 # 삭제 답글

    라즈베리파이에 device driver를 만들어서 insmod로 추가하려고 하니, Invalid module format이라는 에러가 발생하였습니다. 여기저기 찾아보니, 버전이 안맞아서 그렇다고 하여, 현재 라즈베리파이는 버전이 5.10.17-v7+라고 나오는데, 최신 커널 을 다운받으니 5.10.42라고 표시가 됩니다. 보드와 동일한 소스코드를 받으려고, $ git clone --depth=1 --branch rpi-5.10.17 https://github.com/raspberrypi/linux 을 입력하니, branch를 찾을 수 없다고 나오는데요. 어떤 방법으로 해당 버전을 받을 수 있는지요? 아니면, insmod했을 때 에러가 발생한 내용이 버전이 맞지 않는 문제 말고 다른 문제가 있는 것인지 궁금합니다.
  • AustinKim 2021/06/30 18:29 #

    Invalid module format이라면 드라이버에서 매크로를 선언하지 않았을 때 발생될 수 있는데요.
    혹시 커널 로그 좀 공유해주시면 원인을 더 좁힐 수 있을 것 같네요.

    Thanks.
  • jasmu 2021/07/01 09:02 # 삭제 답글

    제가 리눅스 시작한지 얼마 안되서, 저자님께서 말씀하신 커널 로그에 대해 어떤 것인지 잘 모르겠습니다.
    우선 제가 진행했던 것은 sudo insmod simple_dev.ko를 했더니 insmod: ERROR: could not insert module simple_dev.ko: Invalid module format 이라고 나옵니다.

    simple_dev.c 의 내용은
    #include <linux/kernel.h>
    #include <linux.module.h>
    #include <linux/init.h>
    MODULE_LICENSE("GPL");
    MODULE_AUTHOR("DE");
    static int module_begin(void)
    {
    printk(KERN_ALERT, "hello, doulen");
    return 0;
    }
    static void module_end(void)
    {
    printk(KERN_ALERT, "goodbyen");
    }
    module_init(module_begin);
    module_exit(module_end);

    Makefile
    obj-m += simple_dev.o
    all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
    clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

    감사합니다.
  • AustinKim 2021/07/01 09:27 #

    올려주신 드라이버 코드를 돌려보고 업데이트드릴께요.

    감사합니다.
  • jasmu 2021/07/01 09:47 # 삭제 답글

    http://rousalome.egloos.com/10016289 여기 보니, 동일하게 설명이 되어 있네요.
    그래서 커널로그라고 말씀하신 것을 확인해 봤습니다.
    sudo insmod simple_dev.ko
    insmod: ERROR: could not insert module simple_dev.ko: Invalid module format
    tail -20 /val/log/kern.log
    Module has invalid ELF header
    라고 표시가 되네요.

    감사합니다.
  • jasmu 2021/07/01 11:12 # 삭제

    http://rousalome.egloos.com/10016289 이 부분을 다시 보고 있는데요,
    저자님께서는 make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 이 부분에서,
    build 폴더가 있는데, 저는 없습니다.

    감사합니다.
  • AustinKim 2021/07/02 07:57 #

    보내주신 소스를 빌드했는데. 아래와 같이 에러가 발생해 헤더 파일 경로를 수정했어요.

    /home/pi/work/module_work/hello_module.c:3:10: fatal error: linux.module.h: No such file or directory
    #include <linux.module.h>
    ^~~~~~~~~~~~~~~~

    이어서 빌드를 해보니 printk에 전달되는 로그 레벨 인자로 Warning 에러가 발생하네요.

    /home/pi/work/module_work/hello_module.c: In function ‘module_begin’:
    /home/pi/rpi_kernel_src/linux/include/linux/kern_levels.h:5:18: warning: too many arguments for format [-Wformat-extra-args]
    #define KERN_SOH "" /* ASCII Start Of Header */
    ^~~~~~
    /home/pi/rpi_kernel_src/linux/include/linux/kern_levels.h:9:20: note: in expansion of macro ‘KERN_SOH’
    #define KERN_ALERT KERN_SOH "1" /* action must be taken immediately */
    ^~~~~~~~

    아래 파일로 빌드를 하고,

    #include <linux/kernel.h>
    #include <linux/module.h>
    #include <linux/init.h>
    MODULE_LICENSE("Dual BSD/GLP");
    static int module_begin(void)
    {
    printk("hello, doulen n");
    return 0;
    }
    static void module_end(void)
    {
    printk("goodbyen n");
    }
    module_init(module_begin);
    module_exit(module_end);

    모듈을 설치하니,

    root@raspberrypi:/home/pi/work/module_work# insmod hello_module.ko

    커널 로그에서 로그가 출력되네요.

    Jul 1 23:41:32 raspberrypi kernel: [ 2173.269456] hello, doulen

    lsmod 명령어를 입력해도 제대로 모듈이 설치됐다는 정보가 보입니다.

    root@raspberrypi:/home/pi/work/module_work# lsmod
    Module Size Used by
    hello_module 16384 0

    다음은 Makefile 의 내용입니다.

    obj-m += hello_module.o

    all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

    clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
  • jasmu 2021/07/02 08:31 # 삭제 답글

    제가 복사해서 붙여넣는 기능을 몰라서, 라즈베리파이에 있는 화면을 전부 타이핑을 하다 보니, 오타가 있었던 것 같습니다. 정리하면, 저자님 환경에서는 문제가 없는 것 같습니다. 질문 올리고, 책을 다시 여러번 읽었고, 빌드하니라 시간이 오래 걸렸는데, 다시 올려주신 내용 확인해 보고, 질문 있으면 다시 글 올리겠습니다. 이렇게 확인까지 해주셔서 감사합니다.
  • AustinKim 2021/07/02 08:40 #

    즐거운 하루 되세요. (:
  • Imchanyang 2022/05/16 19:47 # 답글

    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.
댓글 입력 영역