1. 커널 컴파일
1> backup (커널 컴파일 하기 전에 주요 데이터를 백업해둔다.)
2> 커널소스 받아서 풀기
ftp.kr.kernel.org/pub/linux/kernel/
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.kr.kernel.org/pub/linux/kernel/
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