본문 바로가기
RaspberryPi

[RaspberryPi4 Kernel] Ubuntu에서 BCM2711 커널 빌드해서 올리기

by TYB 2024. 2. 15.
반응형

현재 사용하는 커널의 버전을 확인하고, 직접 커널을 빌드해서 올려보자

 

우선 현재 사용중인 커널의 버전 확인

 

pi@pi08:~$ uname
Linux
pi@pi08:~$ uname -a
Linux pi08 6.1.0-rpi7-rpi-v7l #1 SMP Raspbian 1:6.1.63-1+rpt1 (2023-11-24) armv7l GNU/Linux

운영체제 호스트명 커널버전 순으로 나옴.

고로 커널버전은 6.1.0

 

이 커널 버전 소스를 찾아보자..!

 

시스템 콜 함수를 만들어서 배포하는건 비표준이라서 노우..

 

그저 이해해보기 위해 시스템 콜 함수를 해보는거임.

 

ubuntu로 가서 새로운 폴더 만들고 들어가주면서~

ubuntu@ubuntu8:~/pi_bsp$ mkdir kernel
ubuntu@ubuntu8:~/pi_bsp$ cd kernel

 

전에 U-Boot 할 때 다 쳤었는데 안쳤으면 치시고

 

sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev



sudo apt install crossbuild-essential-armhf   //32bit 툴체인

 

kernel 디렉터리 안에서 git clone 받으세유~

ubuntu@ubuntu8:~/pi_bsp/kernel$ git clone --depth=1 -b rpi-6.1.y https://github.com/raspberrypi/linux

 

ubuntu@ubuntu8:~/pi_bsp/kernel$ cd linux/arch/arm/configs/

ubuntu@ubuntu8:~/pi_bsp/kernel/linux/arch/arm/configs$ ls -l bcm2711_defconfig  
-rw-rw-r-- 1 ubuntu ubuntu 38834  2월 15 09:50 bcm2711_defconfig

 

 

 

ubuntu@ubuntu8:~/pi_bsp/kernel$ cd linux ; pwd
/home/ubuntu/pi_bsp/kernel/linux

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig
//arch/arm/config에 있는 bcm2711_defconfig파일을 들고와서 컴파일 하겠다는 거임.

 

나중에 파일을 바꾸기 전에 파일을 백업해둬야 함. 아직은 건든게 없으니 냅두고

 

ubuntu@ubuntu8:~/pi_bsp/kernel/linux$ cat .config

.config를 vi로 들어가면 read only고 수정하지 말라고 나와잇음.

그러면 수정을 어디서 하냐?

ubuntu@ubuntu8:~/pi_bsp/kernel/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

여기서 gui기반으로 수정해주면 된다. 지금은 수정할 거 없으니 나가주고

 

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j4

//3가지 파일이 필요하니 옵션으로 주고    j4는 컴파일 할 때 사용할 코어의 갯수임.(쓰레드 기반으로)
// -j4 명령을 안주면 코어 1개로만 빌드하므로 이론상 4배 더 걸림.

걸리는 시간이 궁금할 땐? time을 붙여서 확인하자..! 

금방되쥬?

 

만약에 내부 소스코드를 변경할 경우 해당 명령어를 다시 쳐서 다시 빌드해야됨. 

 

ubuntu@ubuntu8:~/pi_bsp/kernel/linux$ history | grep make
  350  sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev
  391  make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig
  393  make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_makemenuconfig
  394  make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- makemenuconfig
  395* make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j4
  396  make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  397  time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j4
  403  history | grep make

 

ubuntu@ubuntu8:~/pi_bsp/kernel/linux$ vi build.sh


  1 #make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig
  2 #make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  3 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j4

 

실행권한이 없을때 쉘 스크립트 실행 명령어 3개 중 아무거나 써도 됨. b

source build.sh

bash build.sh

sh build.sh

 

 

하지만 귀찮으니 권한 부여하자.

ubuntu@ubuntu8:~/pi_bsp/kernel/linux$ chmod u+x build.sh
ubuntu@ubuntu8:~/pi_bsp/kernel/linux$ ls -l build.sh
-rwxrw-r-- 1 ubuntu ubuntu 202  2월 15 11:13 build.sh
ubuntu@ubuntu8:~/pi_bsp/kernel/linux$ ./build.sh

 

빌드가 됬으니, 커널 이미지를 타켓 보드인 라즈베리파이4로 전송해야되는데

방법은 여러가지가 있음. 

1. sd카드 빼서 write하기

2. 압축해서 nfs에 보내기

 

1번 해보겠다.

 

라즈베리파이 sd카드 빼서 usb리더기에 꽂은 후 컴퓨터에 꽂아준다.

가상머신 ubuntu에서 장치->USB->sd리더기 선택

그러면 윈도우에서 연결해제되고 가상환경에 연결될거임.

 

df 치면

 

~/pi_bsp/kernel/linux$ sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/media/ubuntu/rootfs modules_install

 

INSTALL_MOD_PATH가 매우 중요함 이거 안주고 치면 UBUNTU에 라즈베리파이 커널이 우분투 커널로 써짐. 우분투가 안켜지겠쥬?

하고나면 아래 위치에 해당 커널의 파일이 생성된다.

ubuntu@ubuntu8:/media/ubuntu/rootfs/lib/modules$ ls
6.1.0-rpi7-rpi-v6  6.1.0-rpi7-rpi-v7l  6.1.77-v7l+
6.1.0-rpi7-rpi-v7  6.1.0-rpi7-rpi-v8

 

파일 압축할라믄 

 

[Linux] Linux 압축 관련 명령어 정리

리눅스 압축 명령어 정리입니다. 얼마나 큰 폴더인지 보고싶을 때 사용하는 명령어는 ubuntu@ubuntu8:~/pi_bsp/kernel$ du 너무 많이 나오기 때문에 몇 라인이 나온건지 확인해보니 5136..ㄷㄷ ubuntu@ubuntu8:~/

program-developers-story.tistory.com

 

 

지금까지 썼던 커널 이미지 백업한번 해야겠죠?

ubuntu@ubuntu8:~/pi_bsp/kernel/linux$ sudo cp /media/ubuntu/bootfs/kernel7l.img /media/ubuntu/bootfs/kernel7l-backup.img

해당되는 위치에 가면 이미지랑 백업이미지 둘다 보이죠?

 

ubuntu@ubuntu8:~/pi_bsp/kernel/linux$ sudo cp arch/arm/boot/zImage /media/ubuntu/bootfs/kernel7l.img

 

ubuntu@ubuntu8:/media/ubuntu/bootfs$ ls -l /home/ubuntu/pi_bsp/kernel/linux/arch/arm/boot/zImage
-rwxrwxr-x 1 ubuntu ubuntu 7458816  2월 15 11:22 /home/ubuntu/pi_bsp/kernel/linux/arch/arm/boot/zImage

 

ubuntu@ubuntu8:~/pi_bsp/kernel/linux$ sudo cp arch/arm/boot/dts/*.dtb /media/ubuntu/bootfs/

 

ubuntu@ubuntu8:~/pi_bsp/kernel/linux$ sudo cp arch/arm/boot/dts/overlays/*.dtb* /media/ubuntu/bootfs/overlays/

 

ubuntu@ubuntu8:~/pi_bsp/kernel/linux$ sudo cp arch/arm/boot/dts/overlays/README /media/ubuntu/bootfs/overlays/

 

 

ubuntu@ubuntu8:~/pi_bsp/kernel/linux$ sudo vi /media/ubuntu/bootfs/config.txt

G로 최하단에 가서

arm_64bit=0

 

sd카드 넣고 라즈베리파이 부팅

 

u-boot 때문에 graphic이 안보일거임.

 

pi@pi08:~$ cat /boot/cmdline.txt
console=serial0,115200 console=ttyS0 root=PARTUUID=921b283c-02 rootfstype=ext4 fsck.repair=yes rootwait
#console=serial0,115200 console=tty1 root=PARTUUID=921b283c-02 rootfstype=ext4 fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles cfg80211.ieee80211_regdom=GB

 

이제 u-boot은 해봤으니 빼주겠음.

 

pi@pi08:~$ sudo vi /boot/firmware/config.txt

firmware 폴더가 없다면 

pi@pi08:~$ sudo vi /boot/config.txt

boot 안에 있는 걸 해주면 됨.

u-boot.bin 삭제해주고~

 

 

자 이제 재부팅

 

잘 나오고~

 

 

lsmod를 쳐서 모듈들이 정상적으로 나오는지 봐줘야함.

pi@pi08:~$ lsmod
Module                  Size  Used by
rpcsec_gss_krb5        28672  0
rfcomm                 49152  4
snd_seq_dummy          16384  0
snd_hrtimer            16384  1
snd_seq                73728  7 snd_seq_dummy
snd_seq_device         16384  1 snd_seq
cmac                   16384  3
algif_hash             16384  1
aes_arm_bs             24576  2
crypto_simd            16384  1 aes_arm_bs
cryptd                 24576  2 crypto_simd
algif_skcipher         16384  1
af_alg                 28672  6 algif_hash,algif_skcipher
bnep                   20480  2
brcmfmac              344064  0
brcmutil               20480  1 brcmfmac
vc4                   360448  14
hci_uart               40960  0
cfg80211              835584  1 brcmfmac
btbcm                  20480  1 hci_uart
bluetooth             532480  33 hci_uart,bnep,btbcm,rfcomm
snd_soc_hdmi_codec     20480  2
drm_display_helper     16384  1 vc4
cec                    49152  1 vc4
binfmt_misc            20480  1
v3d                    86016  7
drm_dma_helper         20480  1 vc4
gpu_sched              49152  1 v3d
drm_shmem_helper       24576  1 v3d
drm_kms_helper        192512  3 drm_dma_helper,vc4
raspberrypi_hwmon      16384  0
bcm2835_isp            32768  0
bcm2835_codec          49152  0
bcm2835_v4l2           49152  0
ecdh_generic           16384  2 bluetooth
bcm2835_mmal_vchiq     36864  3 bcm2835_isp,bcm2835_codec,bcm2835_v4l2
rpivid_hevc            45056  0
snd_soc_core          258048  2 vc4,snd_soc_hdmi_codec
i2c_brcmstb            16384  0
v4l2_mem2mem           40960  2 rpivid_hevc,bcm2835_codec
videobuf2_vmalloc      16384  1 bcm2835_v4l2
ecc                    40960  1 ecdh_generic
videobuf2_dma_contig    20480  3 rpivid_hevc,bcm2835_isp,bcm2835_codec
videobuf2_memops       16384  2 videobuf2_dma_contig,videobuf2_vmalloc
videobuf2_v4l2         32768  5 rpivid_hevc,bcm2835_isp,bcm2835_codec,bcm2835_v4l2,v4l2_mem2mem
rfkill                 32768  6 bluetooth,cfg80211
videobuf2_common       65536  9 rpivid_hevc,bcm2835_isp,bcm2835_codec,videobuf2_dma_contig,videobuf2_vmalloc,videobuf2_memops,bcm2835_v4l2,v4l2_mem2mem,videobuf2_v4l2
snd_compress           20480  1 snd_soc_core
snd_pcm_dmaengine      20480  1 snd_soc_core
raspberrypi_gpiomem    16384  0
snd_bcm2835            24576  1
videodev              270336  7 rpivid_hevc,bcm2835_isp,bcm2835_codec,videobuf2_common,bcm2835_v4l2,v4l2_mem2mem,videobuf2_v4l2
snd_pcm               126976  5 snd_compress,snd_pcm_dmaengine,snd_soc_hdmi_codec,snd_bcm2835,snd_soc_core
vc_sm_cma              36864  2 bcm2835_isp,bcm2835_mmal_vchiq
snd_timer              36864  3 snd_seq,snd_hrtimer,snd_pcm
snd                    94208  12 snd_compress,snd_seq,snd_soc_hdmi_codec,snd_timer,snd_seq_device,snd_bcm2835,snd_soc_core,snd_pcm
mc                     57344  7 rpivid_hevc,bcm2835_isp,bcm2835_codec,videobuf2_common,videodev,v4l2_mem2mem,videobuf2_v4l2
fb_sys_fops            16384  1 drm_kms_helper
syscopyarea            16384  1 drm_kms_helper
sysfillrect            16384  1 drm_kms_helper
nvmem_rmem             16384  0
sysimgblt              16384  1 drm_kms_helper
uio_pdrv_genirq        16384  0
uio                    24576  1 uio_pdrv_genirq
drm                   548864  23 drm_dma_helper,v3d,vc4,drm_shmem_helper,drm_display_helper,gpu_sched,drm_kms_helper
i2c_dev                16384  0
nfsd                  516096  5
fuse                  135168  4
drm_panel_orientation_quirks    16384  1 drm
dm_mod                139264  0
backlight              20480  1 drm
ip_tables              28672  0
x_tables               36864  1 ip_tables
ipv6                  536576  82

 

find .

find . 을 해보면 모든 파일이 쭈루룩 나오고 너무많으니까 몇 갠지 line 명령으로 확인해보자 

pi@pi08:~$ cd /lib/modules/6.1.77-v7l+/kernel/
pi@pi08:/lib/modules/6.1.77-v7l+/kernel$ find . | wc -l
2116

 

 

반응형