• Home
  • About
    • 검은색 잉크 블로그 photo

      검은색 잉크 블로그

      github GIST → https://gist.github.com/BlaCkinkGJ입니다.

    • Learn More
    • Email
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

[Linux] 리눅스에 커스텀 커널 설치 방법

02 Jul 2020

Reading time ~4 minutes

커널 다운로드 과정

먼저, 커스텀 커널을 git에서 받도록 합니다. 리눅스 커널 아카이브에서도 받을 수 있지만 한국의 경우에는 그 속도가 느리기 때문에 github에 들어가서 torvalds/linux에서 커널을 다운로드를 받도록 합니다.

이때, 커널 버전 전체가 필요한 경우에는 그냥 git clone https://github.com/torvalds/linux.git을 수행하면 됩니다. 하지만 만약 특정 커널 버전(e.g. v5.2)이 필요한 경우에는 아래의 명령을 수행하도록 합니다.

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

여기서 --depth 1은 커널의 커밋 가져오는 것의 횟수를 최소화하기 위해서 사용하는 명령입니다. 만약 해당 버전의 커널 커밋이 전부 필요한 경우에는 저 부분은 삭제해도 상관없습니다.

이제 리눅스 커널 파일들이 생겼으니 컴파일을 하고 설치하는 과정을 거치도록 하겠습니다.

Ubuntu에서의 커스텀 커널 설치 방법

빌드 도구 설치

본 자료는 링크 내용에 기반되어 작성되었습니다. 커스텀 커널을 설치하기 위해서는 커널 빌드할 파일들을 받아야 하기 때문에 아래의 명령을 통해서 커널 빌드할 파일들을 받아주도록 합니다.

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

설정 파일 생성

이 다음에 방금 다운로드 받은 리눅스 커널 파일들이 들어있는 디렉터리 위치로 cd linux를 통해 이동하도록 합니다. 그 후에 현재 컴퓨터의 커널 설정 파일을 가져오도록 합니다.

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

그리고 만약 설정 내용을 바꿔야 한다면 make menuconfig 명령을 통해 .config를 로드하고 설정을 하도록 합니다.

최초 컴파일

여기까지 되었으면 자신이 만든 것임을 표기하기 위해서 vi Makefile로 Makefile을 열어 아래와 같이 원하는 태그를 붙여주도록 합니다.

EXTRAVERSION = -BlaCkinkGJ

grep -c processor /proc/cpuinfo를 통해서 코어의 갯수를 파악하도록 합니다. 이때, 파악된 코어의 갯수가 12개 인경우에는 아래의 절차를 진행하도록 합니다.

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

sudo update-grub을 하지 않으면 커널이 등록되지 않으므로 반드시 실시해주도록 합니다.

기본 커널로 설정

하지만 이 경우에커스텀 커널이 아니라 기존의 커널이 기본값으로 되어 있어 부팅 때마다 계속 바꿔줘야 하는 문제가 있습니다. 따라서, 이를 해결하기 위해서는 아래의 작업을 실시해야 합니다.

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

이를 하면 아래와 같이 menuentry들이 나타납니다.

submenu 'Ubuntu용 고급 설정' $menuentry_id_option 'gnulinux-advanced-d47dbd0e-2b57-4064-98f6-41e8ffbd2c2e' {
        menuentry '리눅스 Ubuntu가 있는, 5.3.0-61-generic입니다' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.3.0-61-generic-advanced-d47dbd0e-2b57-4064-98f6-41e8ffbd2c2e' {
        menuentry 'Ubuntu, with Linux 5.3.0-61-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.3.0-61-generic-recovery-d47dbd0e-2b57-4064-98f6-41e8ffbd2c2e' {
        menuentry '리눅스 Ubuntu가 있는, 5.3.0-59-generic입니다' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.3.0-59-generic-advanced-d47dbd0e-2b57-4064-98f6-41e8ffbd2c2e' {
        menuentry 'Ubuntu, with Linux 5.3.0-59-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.3.0-59-generic-recovery-d47dbd0e-2b57-4064-98f6-41e8ffbd2c2e' {
        menuentry '리눅스 Ubuntu가 있는, 5.3.0-53-generic입니다' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.3.0-53-generic-advanced-d47dbd0e-2b57-4064-98f6-41e8ffbd2c2e' {
        menuentry 'Ubuntu, with Linux 5.3.0-53-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.3.0-53-generic-recovery-d47dbd0e-2b57-4064-98f6-41e8ffbd2c2e' {

여기서 먼저 Ubuntu용 고급 설정의 $menuentry_id_option 값과 원하는 커널의 $menuentry_id_option 값을 확인해서 >로 병합합니다. 예를 들어, 5.3.0-53-generic인 경우에는 아래와 같이 된다고 보면 됩니다.

gnulinux-advanced-d47dbd0e-2b57-4064-98f6-41e8ffbd2c2e>gnulinux-5.3.0-53-generic-advanced-d47dbd0e-2b57-4064-98f6-41e8ffbd2c2e

이 값을 잘 기억하고 vi /etc/default/grub을 실행해주도록 합니다. 여기서 GRUB_DEFAULT 부분을 아래와 같이 변경해주도록 합니다. 유의 사항, 절대로 > 사이에 공백을 만드셔서는 안됩니다.

GRUB_DEFAULT="gnulinux-advanced-d47dbd0e-2b57-4064-98f6-41e8ffbd2c2e>gnulinux-5.3.0-53-generic-advanced-d47dbd0e-2b57-4064-98f6-41e8ffbd2c2e"
GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="console=tty1 console=ttyS0"
GRUB_CMDLINE_LINUX=""

sudo update-grub, sudo reboot를 수행하면 커스텀 커널로 재부팅이 되는 것을 확인할 수 있습니다.

재컴파일 시

그리고 커널을 지속적으로 컴파일하고 적용을 하는 경우에는 수정 후에 아래의 과정을 진행하면 됩니다.

make -j12
sudo make modules_install -j12
sudo make install -j12

Fedora에서의 커스텀 커널 설치 방법

빌드 도구 설치

본 자료는 링크 내용에 기반하여 작성되었습니다. 먼저, 커널을 컴파일을 하기 위한 빌드 도구들을 설치합니다. 우분투와 달리 아래의 과정을 통해서 진행하도록 합니다. (여담으로 dnf 미러 서버 속도를 높이기 위해서는 /etc/dnf/dnf.conf 파일에 fastestmirror=true를 설정해주시면 됩니다.)

sudo dnf install fedpkg
fedpkg clone -a kernel
cd kernel
sudo dnf builddep kernel.spec

이렇게 하면 커널 빌드에 필요한 도구들을 다 설치할 수 있습니다. 만약 make xconfig를 수행하고자 한다면 추가로 아래의 명령을 수행해주시면 됩니다.

sudo dnf install qt3-devel libXi-devel gcc-c++

그리고 빌드를 위해서 유저가 /etc/pesign/users에 등록될 수 있도록 아래의 명령을 통해서 추가해주도록 합니다.

sudo /usr/libexec/pesign/pesign-authorize

추가로 재빌드의 속도를 높여주기 위해서 ccache도 설치해주도록 합니다.

sudo dnf install ccache

설정 파일 생성

우분투에서처럼 커널 컴파일을 위해서 cd linux를 통해 아까 받은 리눅스 커널 파일의 디렉터리에 들어가도록 합니다. 그리고 우분투와 비슷하게 config 파일을 아래와 같이 가져온 후에 혹시 수정하는 경우에는 make menuconfig를 통해서 수정을 진행하도록 합니다.

cp /boot/config-`uname -r`* .config

최초 컴파일

먼저, 우분투와 동일하게 Makefile에서 EXTRAVERSION을 원하는 이름으로 설정해주도록 합니다. 그리고 커널 컴파일은 거의 우분투와 동일하나, 약간의 단계가 좀 더 많습니다.

make oldconfig
make bzImage
make modules
sudo make modules_install
sudo make install

기본 커널로 설정

기본 커널 설정 방식은 우분투보다 좀 더 쉽습니다. 먼저, root 권한을 획득한 후에 grubby --default-kernel을 통해서 현재 설정된 index가 무엇인지를 확인하고 아래의 명령을 수행하여 index를 확인합니다.

grubby --info=ALL

그러면 아래와 같은 출력이 나오게 됩니다.

index=0
kernel="/boot/vmlinuz-5.6.19-300.fc32.x86_64"
args="ro resume=/dev/mapper/fedora_localhost--live-swap rd.lvm.lv=fedora_localhost-live/root rd.lvm.lv=fedora_localhost-live/swap rhgb quiet"
root="/dev/mapper/fedora_localhost--live-root"
initrd="/boot/initramfs-5.6.19-300.fc32.x86_64.img"
title="Fedora (5.6.19-300.fc32.x86_64) 32 (Thirty Two)"
id="b1395f352d3b4836af31ef849e8878a0-5.6.19-300.fc32.x86_64"
index=1
kernel="/boot/vmlinuz-5.6.6-300.fc32.x86_64"
args="ro resume=/dev/mapper/fedora_localhost--live-swap rd.lvm.lv=fedora_localhost-live/root rd.lvm.lv=fedora_localhost-live/swap rhgb quiet"
root="/dev/mapper/fedora_localhost--live-root"
initrd="/boot/initramfs-5.6.6-300.fc32.x86_64.img"
title="Fedora (5.6.6-300.fc32.x86_64) 32 (Thirty Two)"
id="b1395f352d3b4836af31ef849e8878a0-5.6.6-300.fc32.x86_64"
index=2
kernel="/boot/vmlinuz-5.6.0-grad+"
args="ro resume=/dev/mapper/fedora_localhost--live-swap rd.lvm.lv=fedora_localhost-live/root rd.lvm.lv=fedora_localhost-live/swap rhgb quiet"
root="/dev/mapper/fedora_localhost--live-root"
initrd="/boot/initramfs-5.6.0-grad+.img"
title="Fedora (5.6.0-grad+) 32 (Workstation Edition)"
id="b1395f352d3b4836af31ef849e8878a0-5.6.0-grad+"
index=3
kernel="/boot/vmlinuz-0-rescue-b1395f352d3b4836af31ef849e8878a0"
args="ro resume=/dev/mapper/fedora_localhost--live-swap rd.lvm.lv=fedora_localhost-live/root rd.lvm.lv=fedora_localhost-live/swap rhgb quiet"
root="/dev/mapper/fedora_localhost--live-root"
initrd="/boot/initramfs-0-rescue-b1395f352d3b4836af31ef849e8878a0.img"
title="Fedora (0-rescue-b1395f352d3b4836af31ef849e8878a0) 32 (Thirty Two)"
id="b1395f352d3b4836af31ef849e8878a0-0-rescue"

여기서 만약 default 커널이 우리가 원한 것이 아닌 경우에는 기본값을 변경해줘야 합니다. 이를테면, /boot/vmlinuz-5.6.0-grad+를 설정하고 싶은 경우에는 아래와 같이 수행해주면 됩니다.

grubby --set-default /boot/vmlinuz-5.6.0-grad+

이러면 기본값으로 원하는 커널로 변경되게 됩니다.

재컴파일 시

커널을 수정하고 재컴파일을 하는 경우에는 아래의 과정만 진행하면 됩니다.

make bzImage
make modules
sudo make modules_install
sudo make install


container Share Tweet +1