2009년 10월 8일 목요일

초보자를 위한 젠커널


젠투 리눅스에서 커널 컴파일에 익숙하지 않은 이를 위한 가이드이다. 커널 소스를 설치하고, 커널을 컴파일 한 뒤, 커널에 포함되어 있지 않은 모듈들을 설치하는 순서로 진행된다.
소개커널 소스 설치젠커널 설치 및 설정커널 설정 파일에 대한 설명커널 기본 설정 파일 생성menuconfig로 커널 설정을 변경하며 커널 컴파일 하기커널 비 포함 모듈 컴파일 하기필요 없는 파일 정리마지막: 가장 덜 귀찮게 커널 업그레이드 하는 법
소개젠투 리눅스를 사용한다면 커널을 컴파일 한 적이 있을 것이다. 처음 설치할 때 거치는 과정이기 때문이다. 그러나 커널 컴파일은 성가신 일이다. 그것을 위하여 젠투 리눅스에는 젠커널(genkernel)이라는 도구가 있다.
이 글에서는 커널 소스 설치와 젠커널의 설정, 커널 설정 파일들에 대한 약간은 지루한 설명들을 일단 먼저 하고, 마지막에는 가장 단순하고 쉬운 방법으로 커널을 업그레이드 하는 방법을 소개하고자 한다. 처음 설치하는 것은 핸드북을 참조하여 설치하는 경우가 많으므로 마이너한 커널 업그레이드를 위주로 설명할 것이다.
커널 소스 설치당연한 얘기지만 커널 소스가 있어야 커널을 컴파일 할 수 있다. 젠투에는 다양한 커널 소스가 있는데 입맛대로 고를 수 있다. 일반적으로 gentoo-sources 패키지를 이용하면 된다. 그런데 대부분의 경우에는 world를 업데이트 하다가 새로운 버전의 커널 소스가 새 슬롯에 설치된 경우일 것이다.
/usr/src/linux는 이용하고자 하는 커널 소스로 연결된 심볼릭 링크이다. 심볼릭 링크를 건다는 것은 여러 커널 소스들 중에서 이것을 이용하겠다고 정하는 것이다. 따라서, 새로 설치된 커널 소스 디렉토리로 링크를 걸어주면 되는데, 이것을 수동으로 해도 상관없고, 다른 방법을 쓸 수도 있다. symlink라는 USE flag가 켜져 있으면 커널을 emerge 할 때 새로 설치된 커널 소스로 심볼릭 링크가 자동으로 걸린다. 그 외에 방법으로는 eselect를 이용하면 된다. 다음과 같은 명령으로 커널의 목록과 링크되어 있는 커널을 볼 수 있다.
# eselect kernel list 목록을 보고 해당 번호의 커널에 링크를 걸려면 다음과 같은 명령을 내리면 된다.
# eselect kernel set 숫자 만약에 eselect가 없다면 eselect를 emerge 시키면 된다.
젠커널 설치 및 설정젠커널 역시 설치되어 있어야 한다. 만약 설치되어 잇지 않다면 다음과 같은 명령을 내려서 젠커널을 설치해야 한다.
# emerge genkernel 이제 /etc/genkernel.conf 파일에 설정을 할 수 있는데, 여기에 설정을 하지 않아도 명령줄 옵션을 이용할 수 있다. 그렇지만 설정을 해 두는 것이 여러모로 편리할 것이다.
파일을 열어서 BOOTLOADER="grub" 이라고 된 부분이 주석처리 되어 있는 것을 풀어준다. 그러면 커널 설치가 끝난 뒤에 자동으로 grub.conf에 새로 컴파일 된 커널을 맨 위에 추가하여 부팅 메뉴에서 맨 위에 새로 추가된 커널이 나타나게 된다.
커널 설정 파일에 대한 설명커널 설정 파일은 3 단계로 놓여 있다. 기본 커널 설정, 해당 버전의 성공한 커널 설정, 그리고 방금 전에 설정한 설정 이렇게 셋이다. 기본 커널 설정은 커널 2.4 혹은 커널 2.6과 같이 큰 단위의 커널 버전마다 따로 저장되어 있고 위치는 커널 2.6에 x86 머신 기준으로 /usr/share/genkernel/x86/kernel-config-2.6 이다. 해당 버전의 성공한 커널 설정은 /etc/kernels/kernel-config-x86-2.6.24-r8 과 같은 형태이다. 마지막으로 커널이 실제로 컴파일 될 때 사용되는 설정 파일인데 위치는 /usr/src/linux/.config 이다.
젠커널의 기본 동작은 다음과 같다. 일단 기존에 동일한 버전의 커널을 컴파일 하여 성공한 적이 있다면 그 설정을 기본으로 이용하여 컴파일 한다. 즉, /etc/kernels 밑에 해당 커널 버전의 설정 파일이 있다면 이것을 /usr/src/linux/.config 파일로 복사한다. 만약에 그 파일이 없다면 /usr/share/genkernel 밑에 있는 파일을 가져와서 기본 .config 파일을 만든다. 커널이 성공적으로 컴파일 된 후에 .config 파일은 /etc/kernels 밑으로 들어간다. 만일 힘들게 menuconfig 설정을 한 후, 커널을 컴파일 하다가 중간에 중단하였다면 젠커널을 할 때 --oldconfig 옵션을 함께 주면, 위와 같은 과정을 생략하게 되어 .config 파일을 덮어쓰지 않으므로 기존의 설정을 이어서 컴파일 할 수 있다.
커널 기본 설정 파일 생성커널 설정은 매우 귀찮은 일이다. 따라서 예전에 사용했던 설정 파일을 그대로 사용하고 싶은 유혹을 떨치기 힘들 것이다. 커널 버전이 r 뒤에 있는 숫자만 바뀐 경우에는 완전히 동일한 설정 파일을 이용할 수 있으며, 그렇지 않더라도 커널 버전이 크게 바뀌지 않는다면 옛 설정 파일을 그대로 쓰는 것은 큰 문제가 되지 않는다. 물론 책임은 지지 않는다. 그렇지만 귀찮은 마음을 누를 길이 없다.
처음에 커널 설정을 잡는 방법 중에 하나는 라이브 씨디를 이용하는 것이다. 젠투의 라이브 씨디로 부팅을 하면 대략적인 설정이 잡혀 있으므로, /proc/config.gz 에서 보여주는 설정을 그대로 이용하면 된다. 이것은 gzip으로 압축되어 있으므로 다음과 같은 명령으로 기본 커널 설정을 덮어써 주면 된다. 커널 2.6을 x86 머신에서 쓰는 것을 기준으로 설명하였다. 그렇지 않다면 알맞게 바꿔 주어야 한다.
# zcat /proc/config.gz > /usr/share/genkernel/x86/kernel-config-2.6 이제 커널을 컴파일하면 된다.
menuconfig로 커널 설정을 변경하며 커널 컴파일 하기이제 커널을 빌드할 텐데, 몇 가지 옵션을 생각해 보자. 직접 menuconfig 커널 설정을 하고 싶으면 --menuconfig 옵션을 붙인다. 부팅할 때 해상도 높은 예쁜 화면을 원한다면 --splash 옵션을 이용한다. 이용하지 않으면 80x25 크기의 텍스트 모드로 부팅이 된다. 다음과 같이 커널을 빌드하면 된다.
# genkernel --menuconfig --splash all 처음 라이브 씨디의 설정을 그대로 가져온 경우에는 커널 설정들이 마음에 들지 않는 부분이 있을 것이다. 따라서 최초에 한번은 귀찮더라도 --menuconfig 옵션을 이용하여 직접 설정을 고치는 것이 좋다.
menuconfig를 이용하여 커널 설정을 변경하고 이것이 성공적으로 컴파일 되었다면 /etc/kernels 밑에 설정이 생겼을 것이다. 커널 버전이 업그레이드 되었을 때 오늘 했던 설정을 다시 하고 싶지 않을 것이다. 그러므로 다음과 같은 명령으로 이것을 기본 설정으로 덮어 써 준다. 커널 버전이나 기계의 아키텍쳐는 알맞게 수정해서 명령을 내린다.
# cp /etc/kernels/kernel-config-2.6.24-r8 /usr/share/genkernel/x86/kernel-config-2.6 이제 2.6.25 버전 등이 나왔을 때 기본적으로 오늘 했던 설정을 기본으로 하게 된다. 별 문제가 없다면 바꿀 이유도 없을 것이다.
커널 비 포함 모듈 컴파일 하기커널에 포함되어 있는 모듈들은 genkernel이 컴파일을 해 주지만 그렇지 않은 모듈들은 설치가 되지 않는다. 예를 들어서 nvidia 사의 비디오 드라이버는 커널에 포함되어 있는 것보다 가속 능력이 우수하여 사용하는 경우가 많은데 이것을 다시 설치하지 않으면 다음 번 재부팅 할 때 그래픽 화면이 동작하지 않을 것이다. vmware 모듈 등도 마찬가지이다.
그렇다면 이런 것들을 기억해 두었다가 다시 컴파일 하는 수고를 덜기 위한 스크립트가 module-rebuild 스크립트이다. 설치가 되어 있지 않다면 다음과 같은 명령으로 설치하면 된다.
# emerge module-rebuild 옵션은 두 가지가 있다. populate로 새로 설치해야 하는 모듈을 알아내고 rebuild로 재설치를 한다. 따라서 다음과 같은 명령을 내리면 모듈들이 알아서 재설치 된다.
# module-rebuild populate && module-rebuild rebuild 재부팅 하기 전에 제대로 부트로더의 설정 파일이 변경되었는지 확인해 보아도 좋다.
필요 없는 파일 정리정리하는 것을 무지 싫어하는 사람이 대부분이겠지만 가끔 정리도 하면 재미있을 때가 있다. 필요 없어진 파일들을 정리해 보자. 일단 새로운 커널로 재부팅이 원활히 되었다면 옛 커널 소스들은 필요가 없어진다.
# emerge -P gentoo-sources # rm -rf /usr/src/linux-2.6.24-r7 이런 식으로 옛날 소스 파일과 컴파일 과정 중에 생성되었던 오브젝트 파일들을 지워 준다. 현재 버전의 디렉토리는 남겨두도록 하자. 아직 unmerge 한 것도 아니다.
/boot/grub/grub.conf 에 목록의 수가 점점 늘어날 것인데 가끔씩 옛날 항목들을 지워주면 된다. 그리고 /boot 디렉토리 밑에 있는 해당 커널 이미지 파일도 지워 준다.
마지막: 가장 덜 귀찮게 커널 업그레이드 하는 법위에서 했던 설정들을 잘 따라 하였고 커널 소스의 symlink USE flag를 켜 두었다면, 커널 업그레이드를 가장 덜 귀찮게 할 수 있다. 어느 날 world를 업그레이드 하다가 새로운 버전의 커널 소스가 설치 되었다면 어렵지 않게 커널을 컴파일 할 수 있다. 다음과 같은 명령들로 커널 업그레이드를 할 수 있다.
# genkernel --splash all && module-rebuild populate && module-rebuild rebuild 커널 설정을 바꾸어야 되겠다 싶으면 genkernel에 --menuconfig 옵션을 주어 컴파일 성공한 후 커널 설정을 덮어 써 주면 된다.
# genkernel --splash --menuconfig all && cp /etc/kernels/... /usr/share/genkernel/... && module-rebuild populate && module-rebuild rebuild 젠투를 쓰면서 나름 귀찮을 수 있는 커널 업그레이드도 큰 무리없이 수행할 수 있을 것이다.
마지막으로 커널 컴파일을 자주 수행하다 보면, 일련의 과정들을 조금씩 쉘 스크립트 등으로 옮기는 자동화 과정을 조금씩 거치면 작업이 더욱 편해진다.

댓글 1개:

  1. 안녕하세요. ^^

    원문의 라이센스에 원저작자 표시 조항이 있습니다. 원저작자 표시와 원문으로 링크 정도는 걸어주시면 감사하겠습니다. ^^

    답글삭제

팔로어