개요

커널 컴파일을 할 때, 항상 Secure Boot가 가능한 커널을 만들지 못해서 바이오스에서 직접 Secure Boot를 Disable 시키고 하는 등 불편한 커널을 생성했었다.

 

그리고 항상 모든 커널에 대한 컴파일을 성공하진 못했으며, 특정 커널 버전의 컴파일만 성공했던 방법을 따랐었다.

 

최근에 이러한 문제를 해결하고자 제대로 구글링을 하였고 이제야,, 제대로된 커널 컴파일을 할 수 있게 되었다.

 

본 페이지에서는 Ubuntu 22.04에서 커널 컴파일을 하기위해서 어떻게 진행하면 되는지를 설명한다.

 

Linux Boot Loader : Grub 설정

먼저, 커널 컴파일을 진행하기 전에 혹시라도 실패할 수도 있을 것이다.

이 경우를 대비하기 위해 PC를 부트할 때 특정 커널을 선택하여 부트할 수 있도록 Grub 설정을 먼저 셋팅해준다.

필자는 PC를 부트할 때 Grub 메뉴를 유용하게 사용해서 이 셋팅은 디폴트로 해주긴 한다.

$ sudo vi /etc/default/grub

##################################
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=10
##################################

# /etc/default/grub을 위와 같이 수정한 뒤 아래 진행
$ sudo update-grub

/etc/default/grub을 Text Editor로 실행시켜 GRUB_DEFAULT, GRUB_TIMEOUT_STYLE, GRUB_TIMEOUT에 대한 값을 위와 같이 수정해주면 된다.

 

저렇게 수정해주면 PC를 부트할 때, 항시 특정 커널 버전을 선택할 수 있게끔 Grub Menu가 실행된다.

Timeout을 10으로 설정했으니 10초 동안 아무런 동작을 하지 않으면 Default 0번 커널이 선택된다.

 

Linux Kernel Soucre Download

커널 소스를 내려받기 전에 아래와 같이, 설정해준다.

$ sudo software-properties-gtk

위 명령을 실행시키게 되면, 아래와 같은 창이 뜰 것이며 "Source code" 부분을 체크해주면 된다.

 

만약, GUI를 지원하지 않는 Ubuntu 버전이라면 아래와 같이 CLI 환경에서도 진행해줄 수 있다.

완전히 클린한 CLI 방법이라고는 하진 않는다. 하지만, 필자또한 CLI 환경이라 아래 방법으로 성공하였다.

$ sudo cp /etc/apt/sources.list /etc/apt/sources.list~
$ sudo sed -Ei 's/^# deb-src /deb-src /' /etc/apt/sources.list

 

이제 커널 소스를 내려받기 위한 apt 소스 저장소 설정이 완료되었으면 Update를 진행한 뒤 커널 소스를 다운로드 받으면된다. 

# 소스 저장소 업데이트
$ sudo apt-get update

# Kernel Build Tool 설치
$ sudo apt build-dep linux linux-image-$(uname -r) # 이 부분은 필자는 실패하였지만, 커널 컴파일에는 문제가 없었다.
$ sudo apt install libncurses-dev gawk flex bison \ 
$ openssl libssl-dev dkms libelf-dev libudev-dev \ 
$ libpci-dev libiberty-dev autoconf llvm build-essential \ 
$ libncurses5-dev gcc bc dwarves

# Root 계정으로 변환
$ sudo su

# 특정 버전 커널 소스 내려받기 (본 페이지에서는 동일한 커널 버전사용)
$ apt source linux-image-unsigned-$(uname -r)

 

커널 소스를 내려받았다면, 커널 컴파일을 진행하기 위해 아래의 과정을 따르면 된다.

# 커널 컴파일 진행 전 셋팅
$ cd ./linux-<version>/
$ chmod a+x debian/scripts/*
$ chmod a+x -R ./scripts

# 현재 커널 Configuration을 내려받은 커널 소스에 적용
$ cp /boot/config-$(uname -r) ./.config
$ make oldconfig

# 커널 컴파일 수행
# bindeb-pkg와 deb-pkg 둘 중 하나를 쓸 수 있다.
# bindeb-pkg는 Rebuild를 위해서도 사용할 수 있는 차이점이 있다. (make clean을 하지 않음)
$ make -j$(nproc) bindeb-pkg LOCALVERSION=-custom

# 컴파일된 커널을 PC에 적용
$ cd ..
$ dpkg -i *.deb
$ update-grub

# Reboot하고 PC가 다시 부트될 때, Grub Menu가 뜰 것이다.
# 그때, 새롭게 컴파일한 커널로 부트하면 된다.
$ reboot

# Reboot 완료 후 커널 버전 확인
# 앞서 커널 컴파일을 할 대 LOCALVERSION에 -custom을 붙였으니 uname -r의 결과에도 -custom이 확인되어야 한다.
$ uname -r

 

끝~

 

References

https://dongwooklee96.github.io/post/2021/08/29/%EB%B6%80%ED%8C%85%ED%95%A0-%EB%95%8C-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%BB%A4%EB%84%90-%EB%B2%84%EC%A0%84-%EC%84%A0%ED%83%9D%ED%95%98%EB%8A%94-%EC%98%B5%EC%85%98.html

https://askubuntu.com/questions/496549/error-you-must-put-some-source-uris-in-your-sources-list

https://askubuntu.com/questions/1435591/correct-way-to-build-kernel-with-hardware-support-fix-patches-ubuntu-22-04-lts

https://unix.stackexchange.com/questions/603365/building-a-custom-kernel-in-debian

https://unix.stackexchange.com/questions/238469/difference-between-make-kpkg-and-make-deb-pkg

https://stackoverflow.com/questions/24489734/how-can-i-rebuild-ubuntu-kernel-sources-without-recompiling-any-of-unchanged-fil

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기