Computers/Adv. Linux System Programming

커널 컴파일 / kernel compile

emzei 2014. 3. 7. 00:16

[환경] 

Windows 8.1 64bit

VMware Player

Fedora 20 (64bit) kernel version 3.11.10 (EOL)



학부때 배운 것을 버전만 달리해서 다시 해보았다.

kernel.org 사이트를 참고하기 전에 다짜고짜 최신 커널을 올리고자 3.13.tar.gz를 받아 했는데, 불안정했는지 제대로 되지 않았다.


Fedora 20 을 설치한 당시에 커널버전은 3.11.10 이었다.

https://www.kernel.org/pub/linux/kernel/v3.x/ 를 참고해보면 몇일 간격으로 커널버전은 꾸준하게 오르고 있다.




2014.03.06 자 www.kernel.org 사이트를 방문한 화면이다.

주요 커널 버전은 페이지 메인에서 확인할 수 있다.


기타 필요한 버전이 있다면, https://www.kernel.org/pub/linux/kernel/ 를 참고하길 바란다.




페도라에서 터미널을 띄워 현재 커널의 버전을 확인하면 다음과 같다.





새롭게 설치할 버전의 커널을 일단 받아보자.

나는 /kernel 디렉토리에 해당 압축파일을 받기로 했다.

(현재로서는 가장 최신이면서 안정적인 버전이 3.13.5 여서 본 버전을 받기로 했다)

(행여나 wget이 설치되어있지 않다면 # yum install wget 입력하여 통해 우선 설치하자)

# wget http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.13.5.tar.gz




파일 다운을 완료 한 후에, 다음과 같은 명령어로 압축을 풀자

# tar xvfz linux-3.13.5.tar.gz



압축을 풀고나면 linux-3.13.5 라는 폴더가 있다.




소스코드는 얻었으니 이제 바로 컴파일 단계로 들어가면된다.


그러나, 그전에 미리 현재 버전의 커널 소스코드를 설치해보자. 

(현재 커널 버전에서 설정된 config 파일을 이따가 써야하는데, 왔다갔다하기보단 이게 나은거 같다는 나만의 생각)


# yum install kernel-devel-`uname -r`


명령어 실행이 완료된 후에, /usr/src/kernels 아래에 커널 버전 명의 디렉토리를 확인할 수 있다.






커널 디렉토리 접근을 좀 더 용이하게 ? (사실 굳이 안해도 되지만) 하기 위해

현재 새롭게 다운받은 커널 소스코드 (3.13.5) 디렉토리의 위치를 파악하자.


(나의 경우에는 /kernel )


그리고 /usr/src/로 이동하여 소프트 링크를 생성하도록 한다.




# ln -s /kernel/linux-3.13.5/ linux


링크 생성 후, ls -al 로 확인할 수 있다.









+본격+


커널 컴파일을 처음 하는 경우에는 필요 없지만, 기존 커널 컴파일 결과물이 있는 경우, 의존성을 제거해줘야 한다.


# make mrproper




그리고 커널의 옵션을 설정해줘야하는데

다음 네 가지 명령어 중에 하나로 하면 된다.

1) # make config


2) # make menuconfig

- ncurses 라이브러리 기반이기 때문에, 본 명령어 실행전에 설치되어있는지 확인이 필요하다

- 설치하려면 다음 명령어!

   # yum install ncurses-devel


3) # make xconfig

- x 라이브러리, qt 사용

- 2)와 마찬가지로 설치되어있는지 모른다면, 명령어 실행 전 설치하자.

  # yum install qt-devel 


4) # make oldconfig



나는 menuconfig를 사용했다.




GUI로 나오기때문에 한결 수월하다.

TAP 키를 이용해서 Save 를 선택하여 설정을 저장하면 된다.




Save 후에 다음과 같은 완료 메시지를 볼 수 있다.





그리고 이제, 아까 설치한 커널 디렉토리에서 필요한 것을 가져와야한다.

기존 커널의 옵션을 그대로 사용하는 것이다.


기존 커널 소스코드 디렉토리에 있는 .config 설정파일을 현재 디렉토리로 복사한다.


# cp /usr/src/kernels/3.11.10-301.fc20.x86_64/.config ./



복사를 완료한 다음에는 기존 설정을 적용할 수 있도록 한다

# make oldconfig



추가 옵션사항에 대해서 질문이 나타나게 되는데, 함부로 건드리기 보다는 엔터키를 이용하면 default 값이 자동으로 입력되므로 엔터!



엔터를 막 누르다보면 다 됨!








+ 리얼 컴파일 +


이제 컴파일 할 시간!


# make 


-j4 옵션을 주면 컴파일하는 것을 쓰레드화하여 하므로 멀티코어에서 좀더 빠르게 컴파일 된다

그래도 보통 한시간은 넘게 걸린다는게 함정..ㅎㅎ 





make 작업이 끝났다면 커널이미지를 확인해보자.


# ls -lh /usr/src/linux/arch/x86/boot/bzImage




그 다음으로는 모듈을 컴파일 하고 설치하는 과정을 거친다.


# make modules




# make modules_install








+ 커널 설치 +


소스코드 디렉토리로 이동한다..

# cd /usr/src/linux


컴파일이 완료된 이미지는 /boot 디렉토리로 복사한다.

복사할 때 마지막에 되도록 커널 버전을 기입하도록 한다. (하라는 대로 하는게 좋아여)

# cp arch/x86/boot/bzImage /boot/vmlinuz-3.13.5


그리고 System map 복사

# cp System.map /boot/System.map-3.13.5


마지막, /boot 폴더로 이동 후 initrd 생성

# mkinitrd initrd-3.13.5 3.13.5




그리고 나서 grub 을 수정하여 부팅 화면에서 새롭게 만든 이미지를 선택할 수 있도록 하자.


약 62번째 라인에 있는 코드에보면

menuentry ~~~ 로 시작해서 { } 한 블록을 복사하고 아래에 바로 붙여넣기하자



복사한 부분에서 빨간 박스 친 부분만 고치자.

메뉴 엔트리 이름은 마음대로 해도된다.

다만 두세번째 이름은 앞에서 생성한 것을 그대로 입력하자!






이제 재부팅하면 우리가 컴파일한 커널을 선택할 수 있다 ^ㅁ^






커널을 선택한 뒤에, 부팅을 완료하고 다시한번 커널 버전을 확인해보자.




커널 버전이 바뀐 것을 확인할 수 있다 ^ㅁ^




처음 하다 보면 잘 안되서 반복하는 경우도 많지만 익숙해지면 빨라진닷 ★

'Computers > Adv. Linux System Programming' 카테고리의 다른 글

change sources.list  (0) 2014.05.20
install RT linux  (0) 2014.05.19
ubuntu initrd.img 생성  (0) 2014.05.01
system call / 시스템콜 추가  (0) 2014.03.10
checkpoint +_at_ Embedded board  (0) 2013.04.26