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
64 What is Android Repo? and Manual, Download file digipine 2017.11.02 99553
63 VSCode 에서 한글 특수문자 부분 만 검색하기 file digipine 2021.10.25 671
62 Visual Studio 단축키 정리 digipine 2024.03.28 0
61 UML - 기본편 ( 기본 표기 형식 및 관계 표현법 ) digipine 2017.10.28 878
60 Ubuntu 우분투 설치 가이드 lizard2019 2019.01.29 780
59 Ubuntu Server OS 한국어 모드로 설치 후 서버 콘솔에서 한글 깨짐 해결 방법 digipine 2017.10.31 2240
58 Ubuntu Git - Latest Version Install digipine 2017.11.02 375
57 Ubuntu 18.04 에서 vsftpd 설치하기 lizard2019 2021.03.02 373
56 Ubuntu 16 에 mysql 5.7 설치 및 원격 설정 file digipine 2017.11.08 1484
55 Ubuntu 16 에 JAVA 1.7.0 jdk 설치 하기 digipine 2017.11.07 1414
54 Ubuntu 12.0.4 LTS에 Nabi 나비 설치하기 digipine 2017.11.03 620
53 Thread간 동기화관리자 digipine 2017.10.28 572
52 TCP/IP State Transition - TCP 스택 포팅 시 참조 file digipine 2017.11.02 194825
51 select 와 epoll 엉뚱도마뱀 2017.12.11 827
50 RSA 암호화 알고리즘 개요 file 엉뚱도마뱀 2017.11.17 1036
49 Remove all .git files, recursively digipine 2021.11.26 366
48 QCAD 1.1 한국 최초의 2D CAD 소프트웨어 file digipine 2017.11.01 829
47 Photoshop CC 2018 한글 영문 변환 언어팩, 포토샵 언어변경 file 엉뚱도마뱀 2018.07.04 8525
46 Phabricator 설치 가이드 우분투 16.04 기준 digipine 2017.11.02 6193
45 Phabricator 설치 가이드 우분투 12.04 기준 digipine 2017.11.02 1226
Board Pagination Prev 1 2 3 4 5 6 Next
/ 6