강좌
클라우드/리눅스에 관한 강좌입니다.
자격증 분류

리눅스마스터1급 : 리눅스 커널 가져오기와 압축 해제

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

리눅스마스터1: 리눅스 커널 가져오기와 압축 해제

 





소스코드 형태의 리눅스 커널을 설치하는 방법은 특정 버전 커널의 전체 소스코드를 다운로드하여 설치하는 방식과 기존에 다운로드한 소스코드를 패치하여 업그레이드하여 설치하는 방식의 두 가지로 나눌 수 있다.

 

 

 

 

전체 커널 소스코드

리눅스 커널은 리눅스 커널을 공식 배포하는 http://www.kernel.org 에 있으며 이곳에서 최신 커널을 받을 수 있다.

 

 

 

FTP 사이트는 ftp.kernel.org이며 /pub/linux/kernel 이하 디렉토리에 존재한다(이 사이트 외에도 국내에 몇 곳의 미러 사이트들이 존재한다).

 

rpm 형식의 커널 소스는 설치 CD에 있는 것을 사용해도 된다.

 

 

 

rpm 형식으로 커널을 설치하고자 할 때 필수적으로 필요한 커널 패키지는 버전마다 조금 숫자가 조금 다를 수 있지만 다음과 같다

 

 

 

 

 

 

 

 

 

 

 

RPM 형식의 커널

RPM 형식으로 되어 있는 커널은 여타의 프로그램들과 마찬가지로 컴파일된 상태로 제공된다.

 

 

 

그렇기 때문에 RPM으로 설치한 이후에 바로 사용이 가능하다.

 

 

 

논리적으로 생각해 보면 처음 리눅스를 설치할 때 리눅스가 빠르게 설치되는 이유는 모든 패키지가 컴파일된 상태에서 복사되어 시스템에 설치되기 때문이고, 이것은 커널도 예외는 아니다.

 

 

 

따라서, RPM 형식으로 된 커널이 소스로 배포되기도 하는데, 이것은 따로 SRPM이라고 한다(src.rpm). 또한, 기본적으로 RPM은 바이너리 형태로 제공된다.

 

 

 

 

 

 

 

 

 

커널 소스를 받았으면 적당한 디렉토리에 다음과 같은 명령어로 압축을 해제한다.

 

 

 

커널소스는 관례상 /usr/src 디렉토리에 위치시킨다.

 

 

 

리눅스 커널은 현재 xz 압축형식으로 된 파일이 기본적으로 제공되고 gzipbzip2 압축형식으로 된 파일도 함께 제공하고 있다.

 

 

 

xzgzipbzip2와 같은 압축 프로그램으로 압축률이 가장 높다.

 

 

 

tar 명령어는 20093월에 발표된 1.22 버전부터 xz 압축형식을 지원한다.

 

 

 

따라서 xz(unxz)이나 tar 1.22가 설치되어 있지 않다면 프로그램을 설치하든지 다른 압축형식의 파일을 다운로드해야 한다.

 

 

 

 

 

xz 압축형식으로 된 파일은 다음과 같이 압축을 해제한다.

 

 

 

 

 

 

 

 

# tar xvJf linux-3.11.8.tar.xz

 

 

 

 

 

 

gzip 압축형식으로 된 파일은 다음과 같이 해제한다.

 

 

 

 

 

 

 

 

 

# tar -xvzf linux-3.11.8.tar.gz

 

 

 

 

 

bzip2 압축형식으로 된 파일을 받아 올 수도 있다.

 

 

 

bzip2gzip 보다 압축률이 높다.

 

 

 

bzip2 형태는 다음과 같이 압축을 푼다(xz 압축형식은 대문자 J이고 bzip2 압축형식은 소문자 j이다).

 

 

 

 

 

 

 

# tar xvjf linux-3.11.8.tar.bz2

 

 

 

 

 

 

그러면 현재 작업 디렉토리 이하에 liunx-3.11.8 이라는 디렉토리에 커널 소스가 풀린다(다른 이름으로 풀린다면 관례상 커널 버전을 붙여 디렉토리 이름을 변경한다).

 

 

그런 후 /usr/src 디렉토리 이하에 옮긴다(처음부터 /usr/src 디렉토리 아래에서 압축을 해제하면 더 간단할 것이다). 이는 여러 버전의 커널 소스가 있을 때 편의성을 돕기 위한 것이다.

 

 

 

 

 

 

 

 

# mv linux-3.11.8 /usr/src/

 

 

 

 

 

 

그 후에 ln 명령으로 새로운 커널의 디렉토리를 심볼릭 링크한다.

 

 

 

 

 

 

 

 

# ln -s /usr/src/linux-3.11.8 /usr/src/linux

 

 

 

 

 

 

또한 rpm 버전이라면 배포판 CD-ROM에서 kernel-source-2.6.x.rpm kernel- devel-2.6.x.rpm 을 찾아서 설치한다.

 

 

 

 

 

 

 

 

# rpm -Uvh kernel-source-2.6.x.rpm kernel-devel-2.6.x.rpm

 

 

 

 

 

 

만약 상용 프로그램을 구입한 경우에는 위 RPM 패키지를 yum 프로그램을 이용하여 설치할 수도 있을 것이다.

 

 

 

 

 

 

 

 

 

# yum install kernel-source

# yum install kernel-devel

 

 

 

 

 

 

 

 

 

커널 소스코드 디렉토리들의 용도

커널 소스코드를 압축해제하면 수많은 파일들과 디렉토리들이 생성된다.

 

 

 

이들 파일과 디렉토리들에는 C 소스코드 파일들이 대부분이며 이 파일들을 살펴보면 리눅스 커널을 이해하는데 도움이 된다.

 

 

 

 

arch 디렉토리 : 커널 코드를 저장하고 있는 디렉토리. 각 아키텍처별로 i386, alpha, ia64, sparc 등과 같은 별도의 서브 디렉토리들을 포함하고 있음. 각 아키텍처별 커널 소스코드도 포함하고 있음.

 

 

 

kernel 디렉토리 : C로 되어 있는 커널 소스코드 파일들이 들어 있음. 이 파일을 분석해 보면 커널에 대한 확실한 공부를 할 수 있음. 아키텍처별로 지원하는 커널 소스는 위의 arch 디렉토리 내의 각 서브 디렉토리 내에 존재함.

 

 

 

include 디렉토리 : 커널 이미지를 생성하는데 필요한 C 헤드 파일들을 보관하고 있는 디렉토리. , *.h 파일들이 들어 있음.

 

시스템 아키텍처별로 개별 디렉토리들을 가지고 있음. , asm-i386, asm-alpha, asm-x86_64, asm_ia64 등의 디렉토리들이 있으며, 특히 asm은 현재 인크루드될 기본 *.h 파일들을 저장하고 있는 디렉토리임.

 

init 디렉토리 : 커널의 초기화 코드를 가지고 있는 디렉토리. main.c 파일, built-in.c 파일 및 initramfs.c 파일을 살펴보면 커널의 초기화 내용을 이해하는데 도움이 됨.

 

 

 

mm 디렉토리 : 메모리 관리에 필요한 코드를 저장하고 있는 디렉토리로서 실제 메모리를 위한 코드와 스왑 메모리를 위한 코드들이 모두 포함되어 있음.

 

 

 

drivers 디렉토리 : 시스템 장치를 지원하기 위한 각 장치 드라이브들이 존재하는 디렉토리. isdn, serial, parport, pnp, scsi 등과 같은 각 장치별 서브 디렉토리를 포함하고 있음.

 

 

 

fs 디렉토리 : 리눅스에서 사용되는 파일 시스템 코드 파일들이 저장되어 있는 디렉토리. autofs, ext2, ext3, ext4, fat, nfs, proc, xfs, vfat, ntfs 등과 같이 리눅스 커널에서 지원하는 각 파일 시스템별로 하나씩의 서브 디렉토리들이 있음.

 

 

 

net 디렉토리 : 리눅스 커널의 네트워킹을 위한 코드 파일들이 들어 있음. , ipv4, ipv6, bridge, netlink, ethernet 등과 같은 서브 디렉토리들을 포함하고 각 서브 디렉토리 내에는 그에 관련된 소스코드 파일들이 존재함.

 

 

 

 

 

커널 패치하기

이 과정은 꼭 필요하지는 않으나 커널 패치의 필요성은 공식 커널에 지원하지 않는 드라이버나 드라이버 제조회사 및 개인에 의한 패치 등에 해당된다.

 

 

 

또한 2.6.32.61 버전의 커널을 받았는데 바로 2.6.32.62 버전의 커널을 받았다면 모두 새 커널을 받을 필요 없이 패치 버전을 받아 그전 버전에서 아주 조금 변화된 사항만 수정하면 된다.

 

 

 

패치 버전은 바뀐 부분만 파일로 만든 것이다.

 

 

 

이런 종류의 패치에서는 순서가 중요하다.

 

 

 

2.6.32.51에서 바로 2.6.32.62로 패치할 수 없다.

 

 

 

 

 

커널 패치는 리눅스 커널 공식 배포 사이트 ftp.kernel.org/pub/linux/kernel/의 각 버전별 디렉토리에서 발견 할 수 있다.

 

 

 

일단 patch 파일을 받았으면 /usr/src 디렉토리 이하에 위치시킨다.

 

 

 

 

패치 명령 적용은 아래와 같은 명령으로 한다.

 

 

 

다음은 xz 압축형식인 경우이다.

 

 

 

 

 

 

 

 

 

# uzxz patch-3.11.8.xz | patch -p0

 

 

 

 

 

 

gzip 압축형식인 경우에는 다음과 같이 한다.

 

 

 

 

 

 

 

 

 

# gzip -cd patch-3.11.8.gz | patch -p0

 

 

 

 

 

 

bzip2 압축형식이라면 다음과 같이 한다.

 

 

 

 

 

 

 

 

 

# bzip2 cd patch-2.11.8.bz2 | patch -p0

 

 

 

 

 

 

압축을 풀면서 파이프로 연결한 후 patch 명령을 내렸다.

 

 

 

patch 명령 중에 -p0 옵션을 주의해야 한다.

 

 

 

 

 

또한 공식 커널에 제공되지 않는 외부 드라이버 같은 것을 패치 할 수도 있다.

 

 

 

다음과 같이 한다.

 

 

 

 

 

 

 

 

 

# cd /usr/src/linux

# patch -p1 < /패치 파일이 있는 디렉토리 경로/ide.2.6.x.patch.gz

 

 

 

 

 

 

커널 패치의 또 다른 방법으로는 patch-kernel 스크립트를 이용하여 하는 방법이다.

 

 

 

커널 소스코드 디렉토리 이하의 스크립트 디렉토리 내에 커널 패치 작업을 앞서와 같은 복잡한 과정을 거치지 않고 자동으로 해주는 스크립트를 제공한다.

 

 

 

이 스크립트는 /usr/src 디렉토리에 위치한 커널 패치 파일들을 검사하여 /usr/src/linux-3.11.7 디렉토리에 있는 커널 버전을 참고하여 순서대로 자동으로 패치를 해준다.

 

 

 

 

 

 

 

 

# /usr/src/linux-3.11.7/scripts/patch-kernel

 

 

 

 

 

마지막으로 패치 명령은 패치할 파일 대상을 찾아 대상 파일에 내용을 추가 또는 수정한 후 성공을 하면 원래 파일명에 .orig 확장자를 붙여 백업을 한다.

 

 

 

또한 패치 실행 시 실패를 하면 실패한 대상 파일명에 .rej 확장자를 붙인다.

 

 

 

 

패치가 성공했는지 확인하려면 find 명령으로 *.rej 파일을 찾아서 없으면 성공한 것이다.

 

 

 

 

 

 

 

 

 

# cd /usr/src/linux-3.11.7

# find . -name "*.rej"

 

 

 

 

 

또한 패치 후 백업된 원본 파일 .orig을 지우고 싶다면 다음 명령을 실행한다.

 

 

 

 

 

 

 

 

 

# cd /usr/src/linux-3.11.7

# find . -name "*.orig" -exec rm -f {} \;

 

 

 

 

 

 

이렇게 패치 함으로서 기존에 있던 커널 버전은 한 단계 이상 올라갔을 것이다.

 

 

 

커널 버전 관리를 깔끔하게 하고 싶다면 다시 링크를 만든다.

 

 

 

 

 

 

 

 

 

# cd /usr/src

# rm -f linux

# mv linux-3.11.7 linux.3.11.8

# ln s linux-3.11.8 linux

 

 

 

 

 

 

또한 기존의 커널을 컴파일을 한 번이라도 시도했으면 커널 컴파일시에 생성된 오브젝트 파일 등의 많은 찌꺼기가 남아 있을 것이다.

 

 

 

이것은 새로운 커널에 문제를 일으킬 수도 있으므로 다음과 같은 명령으로 깨끗하게 청소를 한다

 

(기존에 있던 커널 설정파일 .config 파일도 깨끗하게 청소가 된다).

 

 

 

 

 

 

 

# cd /usr/src/linux

# make mrproper

 

 

 

 

 

이로서 커널 소스 패치 작업은 끝이 났다.

 

 

 

 

 

 

 

 

커널 패치

커널 패치는 커널의 업그레이드 시에도 사용되지만 특정 회사나 개발자에 의해 개발된 요소를 기존 커널에 추가하여 사용할 때 유용하다.

 

 

 

물론 이것이 모듈 형태로 제공되어 모듈만 커널에 맞게 컴파일 하도록 되어 있기도 하지만 커널에 종속되도록 할 필요가 있을 때에는 커널 패치가 필요하게 된다.

 

 

 

따라서 커널 패치 방법에 대해서 잘 알아두는 것이 시스템 관리에 도움이 될 것이다.

 

 

 

 

 

 

 

 

 

 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,150 명
  • 현재 강좌수 :  36,432 개
  • 현재 접속자 :  283 명