반응형

안녕하세요.

이 글에서는 리눅스(우분투) 커널 컴파일 하는 방법에 대해서 알아보도록 하겠습니다.


* 최신 커널 기준으로 다시 포스팅하였습니다. http://harryp.tistory.com/839 를 참조해주세요. 


커널 컴파일 전에 커널에 대해서 알아보도록 하겠습니다.

커널이란, 운영체제에서 시스템의 제어 등을 하는 프로그램을 말합니다.

컴퓨터를 부팅 하면 자동으로 실행되어 메모리에 올라가게 됩니다.

 

이 커널은 수시로 업그레드, 업데이트가 됩니다.

새로운 커널의 소스는 http://kernel.org 에서 다운로드 받으실 수 있구요.

이 사이트에서 받은 소스를 내 컴퓨터에 설치할 수 있게 만드는 과정을 커널 컴파일 이라고 합니다.

 

커널은 여러 사용자(컴퓨터)와의 원활한 호환을 위해 다양한 정보를 담고 있습니다.

때문에 필요한 정보보다는 불필요한 정보가 더 많이 담겨있게 되죠.

능숙한 사용자, 개발자일수록 본인에게 필요한 것만 설정하여 더 최적화 된 커널을 빌드할 수 있게 됩니다.

저 역시 능숙한 개발자가 아니기 때문에…

이 글에서는 커널 판 올림을 위한 커널 컴파일만을 다루도록 하겠습니다.

 

현재 커널 버전 확인

현재 커널 버전을 확인은 다음 명령어를 통해 할 수 있습니다.


$ uname -r

 

이렇게 하면 현재 커널의 버전을 확인할 수 있습니다.


커널 컴파일, 설치 전 제 컴퓨터의 커널 버전은 3.8.0-19-generic 이네요.

 

커널 소스 다운로드

커널 소스는 http://kernel.org 에서 받으실 수 있습니다.

제가 이 글을 쓰는 시점에서의 최신 커널 버전은 3.9.2 네요.

원하시는 버전의 커널 소스를 다운받으시면 됩니다.


 

필요 패키지 설치

커널 컴파일을 하는데 필요한 패키지가 있습니다.

총 5가지 인데요.

다음의 명령어를 통해 설치하시면 됩니다.


$ sudo apt-get update

$ sudo apt-get install build-essential libncurses5 libncurses5-dev bin86 kernel-package libssl-dev -y

 


다운로드 받은 커널 소스 이동

다운로드 받은 커널 소스를 '/usr/src/' 디렉토리로 이동시켜 줍니다.

그리고 해당 디렉토리로 이동합니다.


$ sudo mv 커널소스파일명 /usr/src/

$ cd /usr/src


이동하셔서 ls 명령어를 통해 파일이 이동된 것을 확인할 수 있습니다.


 

압축 풀기

커널 소스는 보통 압축된 형태로 배포가 됩니다.

압축을 풀어야 합니다.

제가 받은 압축 파일의 형식은 '.tar.xz' 형식이기 때문에 xz와 tar를 통해 압축을 해제하셨습니다.

(다운받은 형태에 따라 압축 해제 방식은 바뀔 수 있습니다.)

제가 압축을 해제할 때 사용한 명령어는 다음과 같습니다.


$ sudo xz –d linux-3.9.2.tar.xz

$ sudo tar xf linux-3.9.2.tar

 

압축이 정상적으로 해제되었다면 다운로드 받은 커널 소스가 담긴 새로운 디렉토리가 생성된 것을 확인할 수 있습니다.

새로운 디렉토리가 생성되었다면, 해당 디렉토리로 이동합니다.


 

-14.10.01 추가-

Configuration 파일 복사

현재 커널의 configuration 파일을 복사 합니다.

현재 커널 설정을 그대로 가져갈 경우 별다른 수정 없이 사용할 수 있습니다.

먼저 현재 커널의 버전을 'uname -a' 명령어로 확인합니다. (본 포스팅에서의 커널 버전은 3.8.0-19-generic 입니다.)

그리고 현재 커널의 configuration 파일을 복사합니다.

파일 경로 및 파일 명은

/boot/config-현재커널명

입니다.

커널 소스 디렉토리에 '.config' 파일로 복사해 줍니다.

# sudo cp /boot/config-현재커널명 ./.config

본 포스팅 같은 경우엔 3.8.0-19-generic 커널을 사용하고 있으므로

# sudo cp /boot/config-3.8.0-19-generic ./.config

명령어를 사용하였습니다.

(원본 파일명을 치실 때 'tab' 키를 활용하시면 좀 더 편하게 사용하실 수 있습니다.


make menuconfig

커널 소스 디렉토리로 이동한 후엔 현재 내 컴퓨터에 맞는 설정을 해주어야 합니다.

만약 이전에 커널 컴파일 한 기록이 있으면 make mrproper 명령어를 통해 의존성을 삭제합니다. (첫 커널 컴파일이라면 하지 않으셔도 됩니다.


$ sudo make mrproper (첫 커널 컴파일이라면 하지 않아도 됨)

$ sudo make menuconfig

 


제대로 작동 된다면 다음의 화면을 만날 수 있습니다.



이제 이 화면에서 본인에게 필요한 설정을 하시면 됩니다.

하지만 이 화면에서 마음대로 설정 가능하신 분은 이 글을 보지 않으실 테니…

현재 컴퓨터의 설정을 가져오도록 하겠습니다.

 

밑에 Load를 누릅니다.



새로운 터미널 창을 띄워 '/boot' 디렉토리로 이동한 후, '/boot' 디렉토리의 파일을 확인합니다.

그 중 'config-xxx' 라는 파일을 확인합니다. (xxx 는 현재 커널 버전을 말합니다.)


$ cd /boot

$ ls

 



저 파일을 Load 해 줍니다. (절대 경로로 작성해야 합니다.)

/boot/확인한 파일 명

 

 

정상적으로 로드 되었으면 아무런 에러 메시지 없이 처음의 화면을 만나게 됩니다.

이제 추가 수정 없이 저장해주시면 됩니다.

저장은 Save를 눌러 하시면 되고, 저장하는 파일 명은 '.config' 입니다.

정상 저장 되었다면 저장 되었다는 메시지를 확인하실 수 있습니다.


 

정상적으로 저장되었다면


원하시는 설정을 사용하시고, Exit를 눌러 빠져 나오시면 됩니다.


 

커널 컴파일 (커널 설치 이미지 생성)

이제 커널 컴파일을 하여 설치 이미지를 생성하면 됩니다.

다음의 명령어를 통해 커널 컴파일을 실행할 수 있습니다.


$ sudo make-kpkg --initrd --revision=1.0 kernel_image

-19.01.13 추가-

빠른 컴파일을 위해 멀티 코어 옵션을 적용합니다.

먼저 해당 PC의 코어 개수를 확인해야 합니다.

 $ grep -c processor /proc/cpuinfo

/proc/cpuinfo는 (논리) 코어 별로 정보가 출력되게 됩니다.

따라서 grep 명령어를 사용하여 특정 라인만 출력하게 되면 코어 개수를 알 수 있습니다.

 

해당 명령어로 코어 개수를 확인 한 후, 컴파일 명령어에 멀티 코어 옵션을 추가 해줍니다.

 $ sudo make-kpkg --J # --initrd --revision=1.0 kernel_image

위 명령어의 # 부분에 코어 개수를 입력합니다.

i7 CPU의 경우 16을 입력해주시면 됩니다. (보통 PC에선 8아니면 4일겁니다.)

 

추 후에 같은 버전의 커널을 여러 번 빌드 하게 될 경우 '--revision=' 뒤에 숫자를 올려주시면 됩니다.

'--revision=1.0' '--revision=2.0' 이런 식으로요. 단, 숫자만 입력하셔야 합니다.


 

커널 컴파일을 하는 데는 많은 시간이 소요됩니다.

컴퓨터 성능에 따라 적게는 수 십분, 많게는 3~4시간 까지 걸리기도 합니다.

커널 컴파일 중에는 다음과 같은 복잡한 화면을 보실 수 있습니다.


 

커널 컴파일이 완료되면 다음과 같이 종료가 되구요.


 

커널 컴파일이 정상적으로 완료되었다면, 상위 디렉토리 ('/usr/src')에 커널 이미지가 생성되게 됩니다.

'cd ..' 명령어를 통해 상위 디렉토리로 이동하여 확인해 줍니다.


 

'.dev' 파일이 커널 설치 파일입니다.

이제 이 파일을 사용하여 커널을 설치해주면 됩니다.

 

커널 설치

커널 이미지가 있는 디렉토리(/usr/src)에서 다음 명령어를 입력해 주시면 됩니다.


$ sudo dpkg -i 커널이미지파일명

 

 

설치가 완료된 후엔 컴퓨터를 재부팅 해주시면 됩니다.


 

바뀐 커널 버전 확인

재부팅 후 처음에 커널 버전을 확인할 때 사용하였던 'uname -r' 명령어를 사용하시면 바뀐 커널 버전을 확인하실 수 있습니다.



기존의 3.8.0-19-generic 버전에서 3.9.2 버전으로 바뀐 것을 확인할 수 있습니다.


* 2016년 2월 19일 추가 내용

선량한지구인님 께서 댓글로 좋은 정보를 주셨습니다.

컴파일 도중 "openssl/opensslv.h 그런 파일이나 디렉터리가 없습니다."는 오류가 발생할 경우 libssl 설치를 통하여 해결이 가능하다고 알려주셨습니다. 

다음의 명령어를 통해 설치 가능합니다.

$ sudo apt-get install libssl-dev

좋은 정보 공유해주신 '선량한지구인'님 감사드립니다.

 

 

시스템 프로그래밍 수업이나 운영체제 수업 실습 시간이나 과제로 꼭 한번씩은 해보는 커널 컴파일을 해봤습니다.

궁금한 점이나 되지 않는 부분이 있으면 댓글 달아주시면 아는 한도 내에서 최대한 답변해드리도록 하겠습니다.

반응형
Posted by 해리팍
BLOG main image

Chanhyun Park (해리팍)
Software Engineer @ SK hynix

Contact Info.
parkch0708@hanmail.net
chanhyun0708@gmail.com
chanhyun.park@sk.com

카테고리

All (1501)
Profile (2)
Park's Life (599)
Computer System (165)
Computer Programming (39)
Computer Study (54)
Computer Etc. (189)
Scuba Diving (137)
Golf (8)
Traveling (245)
생활 정보 (12)
Pokemon GO (50)