티스토리 뷰

최근에 노드 별로 커널 버전을 맞추는 소요가 있어서 커널 컴파일을 할 필요성이 생겼다.

커널 컴파일은 운영체제를 설치하는 것보다는 조금 귀찮고, 에러가 발생하는 일이 잦아서 처음 해보았을 때는 공포감이 들었던 기억이 있다.

자주 커널을 업데이트하면서 작업하지 않는 이상 어딘가에 기록을 해둘 필요가 있다고 생각하여 포스트로 정리해둔다.


필요한 준비물은 커널 소스와  커널 configuration 파일이다.

커널 소스는 공식적으로 배포되는 사이트가 있다.

https://www.kernel.org/ 이곳을 보면, 장기적으로 지원되는 버전(LTS, Long-Term Support), 안정 버전(Stable)이 있다.

https://www.kernel.org/pub/linux/kernel/ HTTP 디렉터리 형식으로 볼 수 있는 곳인데, 모든 버전을 보관하고 있다.


본인은 3.19 버전을 받아서 진행하였다. configuration 파일은 이전에 설정해둔 것을 가져와서 진행하였지만,

일반적으로 /boot/ 에 있는 해당 버전의 것을 가져다 사용하면 된다. (ex) config-3.19.0-61-generic)



0. 필요한 라이브러리를 설치한다.

$ >> sudo apt-get install build-essential libncurses5 libncurses5-dev bin84 kernel-package



1. /usr/src 디렉터리에 소스를 다운로드 받고, tar 압축을 풀고, 그 디렉터리에 접근한다.

$ >> wget <다운로드 링크>

$ >> tar -zxvf <다운로드 한 tar.gz 파일>  (물론, tar.xz, tar.bz2를 다운받고, 그것ㅇ르  푸는 방식으로 풀어도 상관 없음)

$ >> cd <디렉터리>


만약, 여기서 이미 한 번 컴파일 작업을 했거나 하는 경우

의존성 등을 삭제하기 위해서 본 커맨드를 입력한다.


$ >> make mrproper

$ >> make clean



2. 리눅스 소스 디렉터리에 configuration 파일을 .config  이름으로 복사한다.

$ >> cp /boot/config-3.19.0-61-generic ./.config



3. configuration 설정

$ >> make menuconfig



1) Load > 엔터 => .config 되어있는 것 확인 > 엔터

(중간에 다른 설정을 하는 경우도 있지만, 생략)

2) Exit



4. 커널 컴파일

$ >> make -j8 (make all을 사용하는 경우도 있지만, 최근에 업그레이드 하는 경우 문제가 발생하는 것을 확인함)

-j8은 스레드 8개를 사용하여 병렬처리로 속도를 올리는 방법이다.

만약, -j 를 사용하는 경우 CPU가 못 받아줘서 멈춰버리는 경우가 발생하곤 하므로, 가능하면 숫자를 명시하도록 하자.


$ >> make modules_install -j8


$ >> make install -j8



5. 부트로더 설정

설치된 커널버전으로 부팅될 수 있도록 설정할 필요가 있다.

$ >> vi /boot/grub/grub.conf 로 들어가면, 몇번째에 설치되었는지 그 순서를 볼 수 있다.

인덱스는 0부터 시작하며, 만약 2번째 메뉴의 3번째 submenu의 경우는 다음과 같이 지정한다. '1>2'


부트로더 설정이 잘 안바뀌어서 여러가지 방법을 취해보았다.

vi /etc/default/grub  에서 default값을 위와 같이 변경하였으나, 부팅이 잘 이루어지지 않았다.


$ >> grub-reboot '1>2' 명령이 제일 잘 들었던 것으로 생각된다.


본 링크를 참고

http://unix.stackexchange.com/questions/62733/how-to-correctly-set-up-the-right-grub-2-default-menu-entry



이렇게 설치한 후 최종적으로 reboot 해본 후, uname -r 로 현재 커널 버전을 확인해보면 된다.

정상적으로 컴파일이 됬음에도 불구하고 버전이 바뀌지 않는 것은,  부트로더 설정을 확인해보면 된다.




댓글