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
43 [Linux] ubuntu 16.04에 QT Creator 설치하기 digipine 2017.11.02 24321
42 Phabricator 설치 가이드 우분투 16.04 기준 digipine 2017.11.02 6187
41 Wi-Fi Display Standard Miracast Protocol Log digipine 2017.11.02 844
40 Git Http Backend Upload Size 설정 - Http 500 Error 해결 digipine 2017.11.02 2074
39 [Linux, OSX] pfctl - Packet FIlter Control 사용법 digipine 2017.11.02 3167
38 IPv6 프로그래밍 가이드 digipine 2017.11.02 1349
37 TCP/IP State Transition - TCP 스택 포팅 시 참조 file digipine 2017.11.02 194629
36 Git Commnd 사용법 정리 digipine 2017.11.02 262
35 Git Commit 취소 관련 명령어 정리 1 digipine 2017.11.02 1327
34 리눅스 커널의 Swap Memory에 대해서 digipine 2017.11.02 669
» Linux Kernel 컴파일 및 Patch 방법 digipine 2017.11.02 1097
32 XOR Encryption : 단순하면서도 강력한 암호/복호화 기법 digipine 2017.11.02 1733
31 Phabricator 설치 가이드 우분투 12.04 기준 digipine 2017.11.02 1225
30 Ubuntu Git - Latest Version Install digipine 2017.11.02 375
29 [ubuntu, 우분투] sendmail 설치 digipine 2017.11.02 2311
28 JDK Install ubuntu digipine 2017.11.02 355
27 Git 서버 구축 - 우분투[Ubuntu] digipine 2017.11.02 305
26 임베디드SW 개발자센터 이용안내(성남시 분당구, 개발공간 무료제공) digipine 2017.11.02 584
25 ATmega8 MCU 간의 TWI 기능을 이용한 I2C 통신 digipine 2017.11.02 5975
24 Mac Address 를 String 으로 변환하는 간편한 방법 digipine 2017.11.02 428
Board Pagination Prev 1 2 3 4 5 6 Next
/ 6