logo

English

이곳의 프로그래밍관련 정보와 소스는 마음대로 활용하셔도 좋습니다. 다만 쓰시기 전에 통보 정도는 해주시는 것이 예의 일것 같습니다. 질문이나 오류 수정은 siseong@gmail.com 으로 주세요. 감사합니다.

Linux Kernel 컴파일 및 Patch 방법

by digipine posted Nov 02, 2017
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print

1. 커널 컴파일

 

1> backup  (커널 컴파일 하기 전에 주요 데이터를 백업해둔다.)

 

2> 커널소스 받아서 풀기

   ftp.mizi.com/pub/kernel/

   ftp.kr.kernel.org/pub/linux/kernel/

   http://kernel.pe.kr

   http://people.redhat.com/mingo/realtime-preempt/older/

   등등에서 커널 소스를 받아 /usr/src/ 디렉토리에 풀어준다.

   a 커널 컴파일 작업은 시스템 운영에 아무런 영향을 미치지 않은 장소로서 /usr/src/

      에서 한다. ( ~~.bz2 는 bunzip2로 풀어준다.)

   풀어준 디렉토리안의 Makefile을 열어보면 XTRAVERSION = 이 있다.

그 옆에 이름을 적어주면 linux-version이름 이렇게 커널명이 생성된다.

 

3> make mrproper

a 커널 컴파일시에 문제가 되는 이전에 생성되어있던 오브젝트파일(*.o)들을 삭제(정리)

하는 작업

 

4> make menuconfig

a 커널 컴파일을 위한 옵션 설정 작업

   cd /usr/src/linux-version

   make menuconfig

   옵션을 설정해주고(책 참고) 저장후 빠져나온다.

 

(옵션을 설정해주고 맨밑의 SAVE 옵션을 이용해서 /boot/config-version 저장하면 다음에 그 저장한 config 파일을 불러와서 쓸수 있기 때문에 다시 설정하지 않아도 된다.)

 

ps.) make menuconfig 에서

Load an Alternate Configuration File (밑에서 두번째)를 선택후

/boot/config-version (기존 옵션…)을 불러온다.

그리고 불필요한 것을 체크 off해서 저장시킨 후 빠져나온다.

 

( config-version 파일안에 처음 리눅스 설치했을시의 기본적인 옵션)이 저장되어 있다.)

 

5> make

   a (make bzImage (커널 이미지 만들기) , /boot/에 만들어진 이미지 복사가 설정된다.)

 

6> make modules

   a “커널 컴파일 옵션설정:” 단계에서  커널 모듈로 선택하였던 기능들에 대한 모듈

파일생성

 

7> make modules_install

   a 위에서 생성된 모듈 파일들이 새로운 커널이 사용할 수 있도록

/lib/modules/커널버젼/kernel 디렉토리에 복사한다

(/lib/modules/디렉토리는 각 커널 버전별로 각각 사용할 모듈파일들이 존재한다)

 

 

8> make install

    a 커널이미지 /boot/ 디렉토리에 복사 및 링크 ,/boot/grub/grub.conf 파일 수정.

등등 설정 작업 수행

 

9> reboot

 

 

참고) 모듈관련 리눅스 명령어

 

depmod: 커널과 모듈간의 의존성을 갖도록하며  /lib/modules/커널버전/ 디렉토리에

          modules.dep라는 파일을 생성한다.

 

modprobe: 커널과 의존관계에 있는 각 모듈들을 modules.dep파일을 참조하여 메모리

           를 참조하여 메모리로 로드하거나 내리는 모듈관리 명령어

 

lsmod: 메모리에 로드되어 있는 모듈들의 정보를 출력하는 명령어

 

rmmod: 불필요해진 모듈들을 메모리에서 내리는 명령어

 

insmod: 커널에 필요한 모듈을 설치하는 명령어

 

 

2. 커널 패치

 

1> patch 명령어 여부 확인후 없으면 patch RPM 설치

 

2> 커널 패치 소스 풀기

 

ftp.mizi.com/pub/kernel/

   ftp.kr.kernel.org/pub/linux/kernel/

   http://kernel.pe.kr

   http://people.redhat.com/mingo/realtime-preempt/older/

   등등에서 커널 패치 소스를 받아 /usr/src/ 디렉토리에 풀어준다.

   풀어준 파일을 /usr/src/패치할 커널 디렉토리로 옮긴다.

 

3> patch 명령어

 

   압축을 푼 패치파일을 보고 명령어 옵션 설정!!! (vi patch-version)

 

patch  ?p1 < 패치파일

   

    옵션에서 -p0 , -p1, -p2 … 가 뜻하는 것!

Ex) 패치파일을 열어보면 패치한 설정이 있는데…

diff --git a/Documentation/00-INDEX b/Documentation/00-INDEX

--- a/Documentation/00-INDEX

+++ b/Documentation/00-INDEX

   

a/Documentation/00-INDEX b/Documentation/00-INDEX 에서

-p0 이면 a/Documentation/00-INDEX b/Documentation/00-INDEX

-p1 이면 Documentation/00-INDEX b/Documentation/00-INDEX

-p2 이면 00-INDEX b/Documentation/00-INDEX

    의 경로의 파일을 이용해서 패치하겠다라는 뜻이다. ( -p1면 앞의 디렉토리 1개 제외, -p2면 앞의 디렉토리 2개를 제외)

   

    여기서 ?p1을 해준 이유는 받은 패치 파일을 /usr/src/linux-version에 풀고열어보니 a/라는 디렉토리안에 Documentation/00-INDEX b/Documentation/00-INDEX을 이용하겠다고 설정되어 있는데 현재 패치가 풀려진 디렉토리는 /usr/src/linux-version 이

어서 앞의 /a/디렉토리를 제외시키고 실행하겠다고 옵션을 준것이다.

( /usr/src/linux-version 안에는Documentation/00-INDEX b/Documentation/00-INDEX

경로의 파일이 존재한다. 그러므로 ?p1옵션만 써주면 된다.)

 

4> make menuconfig

a 커널 컴파일을 위한 옵션 설정 작업

   cd /usr/src/linux-version

   make menuconfig

   옵션을 설정해주고(책 참고) 저장후 빠져나온다.

 

(옵션을 설정해주고 맨밑의 SAVE 옵션을 이용해서 /boot/config-version 저장하면 다음에 그 저장한 config 파일을 불러와서 쓸수 있기 때문에 다시 설정하지 않아도 된다.)

 

ps.) make menuconfig 에서

Load an Alternate Configuration File (밑에서 두번째)를 선택후

/boot/config-version (기존 옵션…)을 불러온다.

그리고 불필요한 것을 체크 off해서 저장시킨 후 빠져나온다.

 

( config-version 파일안에 처음 리눅스 설치했을시의 기본적인 옵션)이 저장되어 있다.)

 

5> make

   a (make bzImage (커널 이미지 만들기) , /boot/에 만들어진 이미지 복사가 설정된다.)

 

6> make modules

   a “커널 컴파일 옵션설정:” 단계에서  커널 모듈로 선택하였던 기능들에 대한 모듈

파일생성

 

7> make modules_install

   a 위에서 생성된 모듈 파일들이 새로운 커널이 사용할 수 있도록

/lib/modules/커널버젼/kernel 디렉토리에 복사한다

(/lib/modules/디렉토리는 각 커널 버전별로 각각 사용할 모듈파일들이 존재한다)

 

 

8> make install

    a 커널이미지 /boot/ 디렉토리에 복사 및 링크 ,/boot/grub/grub.conf 파일 수정.

등등 설정 작업 수행

 

9> reboot

 

참고) 패치하는 방법

 

패치파일 만들기 (diff 이용) 
- diff 의 쓰임 : 두 대상간의 차이점만을 모아 파일로 저장한다. 
- 확장자 : .diff or .patch 
- 만들기 전에는 make clean, make distclean, make mrproper 등을 수행하여, 
  컴파일된 파일을 모두 삭제한 뒤 만듭니다. 
- 아래 설명들은 pwd 를 항상 생각하면 도움이 됩니다. 

 

@ 실제 소스 코드를 통한 테스트를 합시다. 
 

*대상 : wu-ftpd-2.6.2.tar.gz 
 

# cd /usr/src/ 
# tar xzvf wu-ftpd-2.6.2.tar.gz : 압축 해제 
# mv wu-ftpd-2.6.2 wu-ftpd-2.6.2-orig : 원본 백업 
# tar xzvf wu-ftpd-2.6.2.tar.gz : 압축 해제 2 


* 수정 
# cd /usr/src/wu-ftpd-2.6.2 
# vi src/ftpd.c 

--------- 수정 전 ---------- 
int main(int argc, char **argv, char **envp) 

#if defined(UNIXWARE) || defined(AIX) 
size_t addrlen; 
#else 
int addrlen; 
#endif 

...... ( 중략 ) ........ 



--------- 수정 후 ---------- 
#if defined(UNIXWARE) || defined(AIX) 
size_t addrlen; 
int myaddr; <================ 한 줄 추가. 
#else 




# vi src/sco.c 
--------- 수정 전 ---------- 
char * 
getcwd(pt, size) 
char *pt; 
int size; 

register struct dirent *dp; 
...... ( 중략 ) ........ 



--------- 수정 후 ---------- 
char * getcwd(char *pt, int size) <======== 한 줄로 압축. 

register struct dirent *dp; 
...... ( 중략 ) ........ 




--------- 패치 파일 만들기 ---------- 

# cd /usr/src/ 
# ls 
wu-ftpd-2.6.2 
wu-ftpd-2.6.2-orig 

# diff -urN wu-ftpd-2.6.2-orig wu-ftp-2.6.2 > wu-ftp-2.6.2-test.diff 
diff [옵션] <원본 파일> <수정본> 

-u : --unidirectional-new-file 
통일된 출력 형식을 사용. 
(디렉토리 비교시, 두 디렉토리중 두번째 디렉토리에만 파일이 존재한다면, 
첫번째 디렉토리에는 파일이 없어도 있는 것처럼 처리한다) 
-r : --recursive, 재귀적. 하위 디렉토리를 모두 검색한다. 
-N : --new-file 
(비교하는 디렉토리에 파일이 하나의 디렉토리에만 모두 있는 것처럼 처리하지만 사실 다른 한 디렉토리에는 파일이 없다. 새로 만든다.) 

# vi wu-ftpd-2.6.2-test.diff 
diff -urN wu-ftpd-2.6.2-orig/src/ftpd.c wu-ftpd-2.6.2/src/ftpd.c 
--- wu-ftpd-2.6.2-orig/src/ftpd.c Fri Nov 30 01:56:11 2001 
+++ wu-ftpd-2.6.2/src/ftpd.c Sun Jun 23 20:04:57 2002 
@@ -567,7 +567,8 @@ 
int main(int argc, char **argv, char **envp) 

#if defined(UNIXWARE) || defined(AIX) 
- size_t addrlen; // 이 한 줄을 빼고, 
+ size_t addrlen // 아래 2 줄을 넣어라. 
+ int myaddr; // 
#else 
int addrlen; 
#endif 
diff -urN wu-ftpd-2.6.2-orig/support/sco.c wu-ftpd-2.6.2/support/sco.c 
--- wu-ftpd-2.6.2-orig/support/sco.c Sun Jul 2 03:36:29 2000 
+++ wu-ftpd-2.6.2/support/sco.c Sun Jun 23 20:14:47 2002 
@@ -429,10 +429,7 @@ 
(dp->d_name[0] == '.' && (dp->d_name[1] == '\0' || \ 
dp->d_name[1] == '.' && dp->d_name[2] == '\0')) 

-char * // 아래 4줄을 빼고, 
- getcwd(pt, size) // 
- char *pt; // 
- int size; // 
+char *getcwd(char *pt, int size) // 이 한 줄을 넣어라. 

register struct dirent *dp; 
register DIR *dir; 

----------------------------------------------------------------
--- 로 표시된 것은 원본 
+++ 로 표시된 것은 수정본 
- 로 표시된 줄은 빼고, 
+ 로 표시된 줄로 대치한다. 
**************************************************************** 
diff 파일은 ASCII 형태의 파일이므로, 압축을 하면 상당히 그 양을 줄일 수 있습니다. 
일반적으로 tar.gz 혹은 gz 을 사용하니 그대로 사용합니다. 

# gzip wu-ftpd-2.6.2-test.diff 
# ls 
wu-ftpd-2.6.2-test.diff.gz 

TAG •

List of Articles
No. Subject Author Date Views
52 git 환경 설정 및 명령어 정리 digipine 2017.11.03 622
51 유닉스/리눅스 명령어 레퍼런스 digipine 2017.11.03 928
50 포렌식을 활용한 정보보호 digipine 2017.11.02 604
49 소프트웨어 테스팅 전문가들을 위한 사이트 digipine 2017.11.02 791
48 MacOS 10.12.2 (OSX) KERNEL DEBUGGING file digipine 2017.11.02 1778
47 MacOS 10.12.2 (OSX) 보안 취약점 공격 기초 digipine 2017.11.02 887
46 MacOS 10.12.2 (OSX) 보안 취약점 공격 코드 2 file digipine 2017.11.02 1787
45 MacOS 10.12.2 (OSX) 보안 취약점 공격 코드 digipine 2017.11.02 850
44 [Qt] QSettings 클래스의 설명과 사용법, 설정 저장위치 digipine 2017.11.02 1741
43 [Linux] ubuntu 16.04에 QT Creator 설치하기 digipine 2017.11.02 24709
42 Phabricator 설치 가이드 우분투 16.04 기준 digipine 2017.11.02 6542
41 Wi-Fi Display Standard Miracast Protocol Log digipine 2017.11.02 1081
40 Git Http Backend Upload Size 설정 - Http 500 Error 해결 digipine 2017.11.02 2403
39 [Linux, OSX] pfctl - Packet FIlter Control 사용법 digipine 2017.11.02 3594
38 IPv6 프로그래밍 가이드 digipine 2017.11.02 1526
37 TCP/IP State Transition - TCP 스택 포팅 시 참조 file digipine 2017.11.02 196643
36 Git Commnd 사용법 정리 digipine 2017.11.02 476
35 Git Commit 취소 관련 명령어 정리 1 digipine 2017.11.02 1561
34 리눅스 커널의 Swap Memory에 대해서 digipine 2017.11.02 882
» Linux Kernel 컴파일 및 Patch 방법 digipine 2017.11.02 1336
Board Pagination Prev 1 2 3 4 5 6 Next
/ 6