티스토리 뷰

리눅스 서버를 이용해서 모듈을 수정하거나 라이브러리를 원하는 대로 수정해야하는 경우 커널 코드를 수정해야합니다. 

 

커널 코드를 한번 다운받고 원하는 버젼의 커널을 설치한 이후에는, 수정한 코드 컴파일만 다시 해주면 쉽게 적용할 수 있기 때문에 익혀놓으면 커널을 다루기 굉장히 편리합니다 !

 

커널 다운로드

원하는 커널 버젼을 선택하여 다운받을 수 있습니다. 저는 5.10 버젼의 커널 코드가 필요하여 5.10으로 다운받아서 사용했습니다.

만약 5.6버젼이 필요한 경우에는 git clone -b v5.6 .... 명령어를 이용하면 됩니다. 정상적으로 커널 소스가 다운로드 되면 현재 디렉토리에 linux 디렉토리가 생성됩니다.

git clone -b v5.10 --single-branch --depth 1 https://github.com/torvalds/linux.git

 

Ubuntu에서 커스텀 커널 설치

커스텀 커널을 설치하기 전 필요한 라이브러리를 설치합니다.

sudo apt update
sudo apt upgrade
sudo apt install libncurses5-dev flex bison libssl-dev wget

 

이후 소스코드가 있는 linux 디렉토리로 이동합니다. 그리고 현재 리눅스 커널 설정파일을 가져옵니다.

uname -r 명령어는 현재 커널의 버젼을 확인하는 명령어입니다. 

cp /boot/config-$(uname -r) .config

config 설정파일을 정상적으로 가져온 후 vi Makefile을 입력하면 위 사진과 같은 화면이 나옵니다. EXTRAVERSION 항목이 최초에는 비어있는 상태입니다. EXTRAVERSION = -DongUk 처럼 설정해주면 자신이 만든 커널임을 표시할 수 있습니다. 5.10.0-DongUk과 같이 표기됩니다. 해당 항목을 표기하지 않으면 정확히 어떤 버젼이 커스텀 버젼인지 파악하기 힘들 수 있습니다.

 

 

 

커스텀 커널 컴파일

현재 리눅스 서버의 CPU 코어 개수를 확인하는 명령어입니다. 컴파일 하는 과정이 시간이 오래 걸리기 때문에 사용할 수 있는 코어를 최대한 활용하는 것이 좋습니다.  저의 경우에는 32코어임을 확인할 수 있습니다.

grep -c processor /proc/cpuinfo

이제 커스텀 커널을 컴파일하기 위한 준비가 끝났습니다. 위에서 파악한 코어개수를 이용해 -j32 옵션을 붙여줍니다.

마지막에 sudo update-grub을 하지 않으면 커널이 등록되지 않습니다.

sudo oldconfig
sudo make -j32
sudo make modules_install -j32
sudo make install -j32
sudo update-grub

 

커스텀 커널을 기본 커널로 설정

위 과정을 모두 마치고 난 이후, 부팅 시 기본 커널을 커스텀 커널로 설정해줘야 합니다. Femu 환경에서는 부팅 시 원하는 커널 버젼을 선택해 들어오기 때문에 따로 설정할 필요가 없지만, Qemu 환경에서는 반드시 설정해야합니다. 

아래 명령어를 입력하면 menuentry 값을 확인할 수 있습니다.

grep -A100 submenu /boot/grub/grub.cfg | grep menuentry

여기서 Advanced options의 $menuentry_id_option 값과 커스텀 커널의 $menuentry_id_option을 확인합니다. 그리고 나서 두 $menuentry_id_option 값을 '>' 을 이용해 병합합니다. 위 사진에서는 아래와 같습니다.

gnulinux-advanced-796005ea-7157-4f1e-9dc4-db0b51c89950>gnulinux-5.10.0-kiJung+.old-advanced-796005ea-7157-4f1e-9dc4-db0b51c89950

이 값을 복사한 후 vi /etc/default/grub을 실행해 GRUB_DEFAULT 값에 넣어주면 기본 커널로 설정이 완료됩니다.

sudo update-grub, sudo reboot를 수행한 후 uname -r을 입력하면 커스텀 커널로 부팅된 것을 확인할 수 있습니다.

 

 

 

재컴파일

원하는 소스 코드를 수정하고 적용하기 위해서는 컴파일이 필수입니다. 그렇다면 위 과정을 계속해서 반복해야 할까요? 아닙니다. 최초 컴파일을 한 이후에는 sudo make, sudo make modules_install, sudo make install 과정과 reboot만 실행하면 재컴파일을 할 수 있습니다.

소스 코드를 수정하고 컴파일 하는 과정에서 확인할 수 있는 오류는 sudo make 과정에서 확인할 수 있습니다. 저는 따로 쉘 파일을 만들어 재컴파일 과정을 좀 더 편리하게 진행하고 있습니다. compile.sh 라는 파일을 만들고 해당 파일의 권한 설정을 sudo chmod 644 compile.sh로 변경합니다. compile.sh 파일 내부는 아래와 같습니다.

#!/bin/bash

sudo make -j32

sudo make modules_install -j32

sudo make install -j32

 

 

댓글