현재 사용하는 커널의 버전을 확인하고, 직접 커널을 빌드해서 올려보자
우선 현재 사용중인 커널의 버전 확인
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
파일 압축할라믄
지금까지 썼던 커널 이미지 백업한번 해야겠죠?
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 안에 있는 걸 해주면 됨.
자 이제 재부팅
잘 나오고~
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
'RaspberryPi' 카테고리의 다른 글
[Raspberry Pi Kernel] Kernel menuconfig로 GPIO enable하고 다시 LCD 켜기 (0) | 2024.02.16 |
---|---|
[RaspberryPi Kernel] Ubuntu에서 Raspberry Pi Kernel system call 함수 구현 (0) | 2024.02.15 |
[Raspberry Pi] 작업한 이미지 복제하기 (2) | 2024.02.02 |
[Raspberry Pi] PC와 USB로 SERIAL 연결하기 (0) | 2024.02.02 |
[Raspberry Pi] tag 사용해보기 (0) | 2024.02.01 |