개요
커널 컴파일을 할 때, 항상 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://askubuntu.com/questions/496549/error-you-must-put-some-source-uris-in-your-sources-list
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
'Linux' 카테고리의 다른 글
Ubuntu 22.04 Server(CLI) WIFI 연결 방법 (1) | 2024.02.26 |
---|---|
[vim] 초기 설정 (0) | 2024.02.15 |
C언어 마이크로초(Microsecond) 시간측정 (0) | 2024.01.16 |
리눅스 시스템에서 활성화된 CPU Core 수 확인 방법 (top 명령) (0) | 2023.12.05 |
리눅스 Interrupt 밸런싱 시스템 튜닝 (irqbalance) (0) | 2023.12.04 |