커널 컴파일 · 6 min read · Nov 09, 2025

커널 컴파일 방법 - CentOS 방식

커널 컴파일 방법 - CentOS 방식

버전 1.0
저자: Falko Timme

각 배포판은 소스에서 사용자 정의 커널을 빌드하기 위한 특정 도구를 가지고 있습니다. 이 문서는 CentOS 시스템에서 커널을 컴파일하는 방법에 대해 설명합니다. www.kernel.org에서 최신 수정되지 않은 커널 소스를 사용하여 사용자 정의 커널을 빌드하는 방법을 설명하므로 배포판에서 제공하는 커널에 의존하지 않게 됩니다. 또한, 필요한 기능이 포함되어 있지 않은 경우 커널 소스를 패치하는 방법도 보여줍니다.

저는 이것을 CentOS 4.4에서 테스트했습니다.

먼저 말씀드리고 싶은 것은, 이러한 시스템을 설정하는 방법이 이것만이 아니라는 것입니다. 이 목표를 달성하는 방법은 여러 가지가 있지만, 제가 선택한 방법입니다. 이것이 여러분에게 작동할 것이라는 보장은 하지 않습니다!

1 사전 참고

이 문서에서는 CentOS 시스템을 위한 커널을 빌드하는 두 가지 방법을 설명합니다. 첫 번째 방법은 설치하거나 다른 사람과 공유할 수 있는 커널 rpm 패키지를 얻는 것입니다. 두 번째 방법은 모든 리눅스 배포판에 동일하지만, rpm 패키지를 얻지 못합니다.

2 커널 rpm 패키지 빌드

이 장에서는 커널을 빌드하고 설치하거나 다른 사람과 공유할 수 있는 rpm 패키지를 만드는 방법을 보여줍니다.

2.1 커널 소스 다운로드

먼저 원하는 커널을 /usr/src에 다운로드합니다. www.kernel.org로 가서 설치할 커널을 선택합니다. 예를 들어, linux-2.6.18.3.tar.bz2 (여기에서 모든 2.6 커널을 찾을 수 있습니다: http://www.kernel.org/pub/linux/kernel/v2.6/). 그런 다음 다음과 같이 /usr/src에 다운로드할 수 있습니다:

cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.3.tar.bz2

그런 다음 커널 소스를 압축 해제하고 커널 소스 디렉토리에 대한 심볼릭 링크 linux를 생성합니다:

tar xjf linux-2.6.18.3.tar.bz2
ln -s linux-2.6.18.3 linux
cd /usr/src/linux

2.2 /etc/modprobe.conf 수정

이제 /etc/modprobe.conf에서 mptscsi 모듈을 주석 처리해야 합니다. 그렇지 않으면 다음과 같은 오류가 발생합니다:

No module mptscsi found for kernel 2.6.18.3-default, aborting.

새 커널을 위한 ramdisk를 생성하려고 할 때 발생합니다.

vi /etc/modprobe.conf

| alias eth0 pcnet32 alias scsi_hostadapter mptbase # alias scsi_hostadapter1 mptscsi alias scsi_hostadapter2 mptfc alias scsi_hostadapter3 mptspi alias scsi_hostadapter4 mptsas alias scsi_hostadapter5 mptscsih |

2.3 커널 소스에 패치 적용 (선택 사항)

때때로 새로운 커널에서 기본적으로 지원되지 않는 하드웨어에 대한 드라이버가 필요하거나 가상화 기술 또는 아직 커널에 포함되지 않은 기타 최첨단 기술에 대한 지원이 필요합니다. 이러한 모든 경우에 커널 소스를 패치해야 합니다(패치가 제공되는 경우…).

이제 필요한 패치를 /usr/src에 다운로드했다고 가정해 보겠습니다(이 예제에서는 patch.bz2라고 부릅니다). 커널 소스에 패치를 적용하는 방법은 다음과 같습니다(여전히 /usr/src/linux 디렉토리에 있어야 합니다):

bzip2 -dc /usr/src/patch.bz2 | patch -p1 –dry-run
bzip2 -dc /usr/src/patch.bz2 | patch -p1

첫 번째 명령은 단순한 테스트로, 소스에 아무런 영향을 미치지 않습니다. 오류가 표시되지 않으면 두 번째 명령을 실행하여 실제로 패치를 적용할 수 있습니다. 첫 번째 명령에서 오류가 표시되면 실행하지 마십시오!

패치가 bzip2(.bz2)가 아닌 gzip(.gz)로 압축된 경우, 다음과 같이 커널을 패치합니다:

gunzip -c /usr/src/patch.gz | patch -p1 –dry-run
gunzip -c /usr/src/patch.gz | patch -p1

커널 사전 패치도 커널 소스에 적용할 수 있습니다. 예를 들어, 커널 2.6.19-rc6에서만 사용할 수 있는 기능이 필요하지만, 이 커널에 대한 전체 소스는 아직 출시되지 않았습니다. 대신, patch-2.6.19-rc6.bz2가 제공됩니다. 이 패치를 2.6.18 커널 소스에 적용할 수 있지만, 커널 2.6.18.1, 2.6.18.2 또는 2.6.18.3 등에는 적용할 수 없습니다. 이는 http://kernel.org/patchtypes/pre.html에서 설명되어 있습니다:

사전 패치는 리눅스의 알파 릴리스에 해당합니다. 아카이브의 테스트 디렉토리에 존재합니다. 이전 전체 릴리스의 소스 코드에 patch(1) 유틸리티를 사용하여 적용해야 합니다. 3부분 버전 번호가 있는 경우(예: 2.6.12-rc4 사전 패치는 2.6.11 커널 소스에 적용해야 하며, 예를 들어 2.6.11.10에는 적용하지 않아야 합니다.)

따라서 2.6.19-rc6 커널을 컴파일하려면 2.6.18.3 커널 대신 2.6.18 커널 소스를 다운로드해야 합니다( http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2)!

다음은 2.6.19-rc6 패치를 2.6.18 커널에 적용하는 방법입니다:

cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc6.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.19-rc6.bz2 | patch -p1 –dry-run
bzip2 -dc /usr/src/patch-2.6.19-rc6.bz2 | patch -p1

2.4 커널 구성

현재 작업 중인 커널의 구성을 새 커널의 기반으로 사용하는 것이 좋습니다. 따라서 기존 구성을 /usr/src/linux에 복사합니다:

make clean && make mrproper
cp /boot/config-uname -r ./.config

그런 다음 실행합니다

make menuconfig

이 명령은 커널 구성 메뉴를 표시합니다. Load an Alternate Configuration File로 이동하여 현재 작업 중인 커널의 구성을 포함하는 .config를 구성 파일로 선택합니다:

그런 다음 커널 구성 메뉴를 탐색하고 선택합니다. General Setup —> () Local version - append to kernel release 아래에 커널 버전 식별 문자열을 지정해야 합니다. 저는 -default를 사용하므로 우리의 커널 rpm 패키지는 kernel-2.6.18.3default-1.i386.rpm이라는 이름을 갖습니다. 문자열을 비워두거나 커널을 식별하는 데 도움이 되는 다른 문자열을 지정할 수 있습니다(예: -custom 또는 원하는 대로).

참고: kernel-2.6.18.3default-1.i386.rpm을 설치한 후 다른 2.6.18.3 커널 rpm 패키지를 컴파일하기로 결정하면, 다른 버전 문자열(예: -default1, -default2 등)을 사용하는 것이 중요합니다. 그렇지 않으면 rpm이 kernel-2.6.18.3default-1.i386.rpm이 이미 설치되어 있다고 불평하므로 새로운 커널을 설치할 수 없습니다!

구성이 완료되면 Exit를 선택하고 다음 질문(새 커널 구성을 저장하시겠습니까?)에 Yes로 답합니다:

2.5 커널 빌드

커널을 빌드하려면 다음 명령을 실행합니다:

make rpm

이제 인내심을 가지세요. 커널 컴파일은 커널 구성 및 프로세서 속도에 따라 몇 시간이 걸릴 수 있습니다.

2.6 새 커널 설치

커널 빌드가 성공적으로 완료되면 src.rpm 및 rpm 패키지가 생성됩니다. src.rpm 패키지는 /usr/src/redhat/SRPMS/ 디렉토리에서 찾을 수 있으며, 다음 명령을 실행하여 이름을 확인할 수 있습니다:

ls -l /usr/src/redhat/SRPMS/

제 시스템에서는 kernel-2.6.18.3default-1.src.rpm이라고 불렸습니다.

rpm 패키지는 /usr/src/redhat/RPMS/i386/, /usr/src/redhat/RPMS/i586/, /usr/src/redhat/RPMS/i686/, /usr/src/redhat/RPMS/x86_64/ 등에서 찾을 수 있으며, 이는 아키텍처에 따라 다릅니다. 제 시스템에서는 /usr/src/redhat/RPMS/i386/에 위치해 있었고, 다음 명령을 실행하여

ls -l /usr/src/redhat/RPMS/i386/

이름이 kernel-2.6.18.3default-1.i386.rpm이라는 것을 확인했습니다.

이제 다음과 같이 커널 rpm 패키지를 설치할 수 있습니다:

cd /usr/src/redhat/RPMS/i386/
rpm -ivh –nodeps kernel-2.6.18.3default-1.i386.rpm

–nodeps 스위치를 주의하세요: 이를 사용하지 않으면 다음과 같은 오류가 발생합니다:

error: Failed dependencies:
kernel >= 2.6.10 conflicts with lksctp-tools-1.0.2-6.4E.1.i386

이 종속성을 무시해도 제 시스템에서는 문제가 발생하지 않았습니다.

이제 커널 rpm 패키지를 다른 CentOS 시스템으로 전송하고 동일한 방법으로 설치할 수 있습니다. 즉, 그곳에서 커널을 다시 컴파일할 필요가 없습니다.

다음으로 새 커널을 위한 ramdisk를 생성합니다. 그렇지 않으면 시스템이 새 커널을 부팅하지 못할 가능성이 높습니다:

mkinitrd /boot/initrd-2.6.18.3-default.img 2.6.18.3-default

2.7 GRUB 부트 로더 구성

이제 새 커널이 시스템을 재시작할 때 부팅되도록 GRUB 부트 로더를 구성해야 합니다.

다음 명령을 실행하여

ls -l /boot

새 커널(일반적으로 vmlinuz로 시작, 예: vmlinuz-2.6.18.3-default) 및 ramdisk(일반적으로 initrd로 시작, 예: initrd-2.6.18.3-default.img)에 대해 알아봅니다.

그런 다음 /boot/grub/menu.lst를 편집합니다. 기존(작동 중인) 커널 구문을 샘플로 삼아 새 구문을 추가하고 커널 및 ramdisk를 교체한 다음 모든 다른 구문 위에 구문을 추가합니다.

vi /boot/grub/menu.lst

예를 들어, 제 menu.lst는 새 구문을 추가하기 전에는 다음과 같았습니다:

| # grub.conf generated by anaconda # # 이 파일을 수정한 후 grub를 다시 실행할 필요가 없습니다. # NOTICE: /boot 파티션이 있습니다. 이는 # 모든 커널 및 initrd 경로가 /boot/에 상대적임을 의미합니다. 예: # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00 # initrd /initrd-version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.9-42.0.3.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.0.3.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.0.3.EL.img title CentOS-4 i386 (2.6.9-42.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.EL.img |

그리고 그 이후에는 다음과 같습니다:

| # grub.conf generated by anaconda # # 이 파일을 수정한 후 grub를 다시 실행할 필요가 없습니다. # NOTICE: /boot 파티션이 있습니다. 이는 # 모든 커널 및 initrd 경로가 /boot/에 상대적임을 의미합니다. 예: # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00 # initrd /initrd-version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.18.3-default) root (hd0,0) kernel /vmlinuz-2.6.18.3-default ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18.3-default.img title CentOS (2.6.9-42.0.3.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.0.3.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.0.3.EL.img title CentOS-4 i386 (2.6.9-42.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.EL.img |

이제 시스템을 재부팅합니다:

shutdown -r now

모든 것이 잘 진행되면 새 커널로 부팅됩니다. 다음 명령을 실행하여 실제로 새 커널을 사용하고 있는지 확인할 수 있습니다:

uname -r

이 명령은 다음과 같은 결과를 표시해야 합니다:

2.6.18.3-default

시스템이 시작되지 않으면 다시 시작하고, 다음과 같은 메시지가 표시되면:

![](/files/dc3a6f2d-b1a7-426d-bf0f-e8f3f6c15739.png) 

아무 키나 눌러 GRUB 메뉴로 들어갑니다:

![](/files/38e75d67-5999-4269-bad4-c4ae566c059f.png)

이전 커널을 선택하고 시스템을 시작합니다. 이제 다시 작동하는 커널을 컴파일해 볼 수 있습니다. 작동하지 않는 커널의 구문을 /boot/grub/menu.lst에서 제거하는 것을 잊지 마십시오.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.