리눅스원(주) 컨설팅팀.최승수 (2005/03/10)
--------------------------------------------------------------------------------
많은 개발자들은 자신들이 개발하는 프로그램 소스의 버전을 유지하기 위해, 원소스 외에 패치파일을 준비한다. 일반적으로 패치파일은 diff를 사용해서 작성하고, 해당 패치파일을 적용할 때는 patch 명령어를 사용해 패치적용을 완료한다.
필자는 처음에 커널 공부를 할 때, 패치파일 사용으로 어려움을 겪은적이 있다. 실제 버전업된 커널 소스 파일 전체를 받는게 나은지, 아님, 하나의 커널 소스 파일을 받고, 패치 파일만 받는게 낳은지 잠시나마 고민했던 적도 있다.
따라서, diff 와 patch 파일은 커널에만 관련있는 내용은 아니나, 커널 패치와 유용히 사용될 수 있는 명령어이므로, 아래에서 살펴보고자 합니다.
기본 개념 및 사용법은 아래의 설명을 따라하기 식으로 해보면, 이해할 수 있을겁니다.
Diff 사용법
1. 두개의 빈 파일을 생성합니다.
[css@css ~]$ touch aaa bbb
[css@css ~]$ ls
aaa bbb
2. aaa에 아래의 라인을 추가합니다. (vi 사용법은 애플리케이션 소개란을 참고하세요. ^^) [css@css ~]$ vi aaa
This is first line // 라인을 추가합니다.
3. aaa 를 bbb로 복사하고, 새로운 라인을 추가합니다. [css@css ~]$ cp aaa bbb
[css@css ~]$ vi bbb
This is a first line
This is a second line // 라인 추가
4. aaa와 bbb의 변경 부분을 패치파일로 만듭니다. 그리고, 변경되는 부분이 패치파일에 어떻게 저장되나 확인합니다.
[css@css ~]$ diff -urN aaa bbb > mydiff.patch
[css@css ~]# cat mydiff.patch
--- aaa 2005-03-07 20:23:22.566188880 +0900
+++ bbb 2005-03-07 20:23:32.986604736 +0900
@@ -1 +1,2 @@
this is a first line
+this is a second line
5. bbb를 지우고, 패치파일의 내용을 aaa에 적용시킵니다. [css@css ~]$ rm -f bbb
[css@css ~]$ patch -p 0 < mydiff.patch
patching file aaa
6. aaa에 패치파일의 내용이 적용되었나 확인합니다.
[css@css ~]$ cat aaa
this is a first line
this is a second line // 라인이 추가되었음
위의 예제에서는 diff와 patch 명령어의 사용과 개념을 이해하기 위해 간략히 설명했지만,
실제 소스의 크기가 상당한 경우, 원소스(aaa)를 가지고, 패치파일만 가지고 작업합니다.
그럼, diff와 patch의 기본 개념 및 사용법을 이해했으니, 커널과 관련되어 알아보도록 하지요..
커널 패치파일 만들기
일반적으로 커널에 자신만의 변경 내용을 담고자 하고, 그 패치를 제공하고자 하면, 아래의 방법 대로 하시면 됩니다.
1. 바닐라 커널 소스를 준비한다. (kernel.org 에서 다운로드
2. 커널 소스의 복사본을 준비하고, 해당 소스에 변경을 가한다. [root@css kernels]# cp -a linux-2.6.9 linux-2.6.9-my
Linux-2.6.9-1 디렉토리내 원하는 부분 소스 수정
3. 소스 수정이 끝나면, 패치파일을 작성한다. [root@css kernels]# diff -urN linux-2.6.9 linux-2.6.9-my > mykernel.patch
[root@css kernels]# gzip -9 mykernel.patch(보통 커널의 경우, 패치파일도 사이즈가 크므로, 압축을 합니다.)
[root@css kernels]# ls
linux-2.6.9 linux-2.6.9-my mykernel.patch
gzip으로 압축하면, mykernel.patch는 mykernel.patch.gz으로 파일명이 변경됩니다.
4. 원소스에 패치 적용을 한다.
[root@css kernels]# pwd
/usr/src/
[root@css kernels]# ls
linux-2.6.9 linux-2.6.9-my mykernel.patch
[root@css kernels]# patch ?p 0 < mykernel.patch (패치 파일이 압축되지 않은 경우)
[root@css kernels]# gzip ?cd mykernel.patch.gz| patch ?p0 (패치 파일이 압축된 경우. 압축을 풀고 패치 적용)
커널과 관련해, diff/patch 명령어를 알아보았습니다. 위의 명령어 설명은 기본적인 내용만 다루었습니다.
실제 리눅스에서 자주 언급되는 커널이 어떠한 것이 있는지, 자세한 명령어 활용은 어떻게 되는지는 다음에 다시 글을 올리겠습니다.
Posted by 삐꾸강아쥐쥐



