System/OS
2003.04.23 10:31
[linux] 커널 컴파일, 설정
조회 수 18185 댓글 0
전체과정:
$ cd /usr/src/linux
$ (make mrproper) # 이전 정보 삭제, 이전에 설정된 컴파일환경을 재사용한다면 건너뛴다
$ make menuconfig
$ make dep; make clean; make bzImage; make modules; make modules_install
1. 소스 구하기
사이트: ftp.kr.kernel.org, ftp.kernel.org
http://www.kr.kernel.org/pub/linux/kernel/
id: anonymous
pw: 639@netian.com
Dir: /pub/linux/kernel/vX.Y
안정버젼: 가운데 숫자가 짝수로 끝나는 것
개발버젼: 가운데 숫자가 홀수로 끝나는 것
커널파일: linux-x.y.z.tar.gz (여기서 x.y.z는 버젼)
2. 커널소스풀기(root로 작업)
$ cd /usr/src
$ uname -r # 구커널 버전 알아내기
2.2.12
$ mv linux linux-2.2.12 # 구커널 백업, 소스를 풀기 전에 /usr/src/linux가 반드시 없어야 한다
또는 $ tar zcvf linux-2.2.12.tgz linux # 압축 백업
$ tar xvzfp linux-2.2.15.tar.gz # 새 커널 소스 풀기, 새 linux 디렉토리가 생긴다
$ mv linux linux-2.2.15 # 새 커널 백업
$ ln -s linux-2.2.15 linux # 새 커널 링크
$ cat ./linux/README # `INSTALLING the kernel' 글을 반드시 점검
3. 커널 설정(make config)
$ cd /usr/src/linux
$ cp /usr/src/linux/arch/i386/config.in config.in.old # 디폴트 컴파일 환경설정을 복사 해둔다
$ make menuconfig # 메뉴 방식, 권장
혹은 $ make config # 텍스드모드 설정
혹은 $ make xconfig # X윈도우에서 설정
# 자세한 설정은 다른 파일 'Doc/커널설정.htm'을 참조한다
4. 커널 컴파일(커널 이미지 생성) 및 커널의 설치
$ make dep # 의존성, 파일들이 제대로 되어 있는지 확인
$ make clean # 오브젝트 파일과 구버전이 남겨논 것을 제거
4.1 일반적인 방법(권장, bz는 압축을 의미, 옛날식 make zImage는 최대 1/2MB 크기, bzImage는 최대 2MB 크기)
$ make bzImage # 새로 압축된 커널 bzImage 파일을 /usr/src/linux/arch/i386/boot 에 남긴다
$ mv(cp) /usr/src/linux/System.map /boot/System.map-2.2.14
$ mv(cp) /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.2.14
$ cd /boot
$ rm -f System.map; rm -f vmlinuz
$ ln -s System.map-2.2.14 System.map
$ ln -s vmlinuz-2.2.14 vmlinuz
4.2 일괄처리 방법(비권장, 새 이미지 생성, "/boot/" 로 이미지와 System.map을 복사, lilo 등록, lilo 실행까지)
$ make bzlilo # /usr/src/linux/Makefile 중 INSTALL_PATH 부분의 주석을 없애주어야 boot 디렉토리에 저장된다
$ cd / # 위에 안하면 / 에 vmlinuz, System.map 파일이 생긴다
$ cp vmlinuz /boot/vmlinuz-2.2.14
$ cp System.map /boot/System.map-2.2.14
$ cd /boot
$ rm vmlinuz; rm System.map
$ ln -s vmlinuz-2.2.14 vmlinuz
$ ln -s System.map-2.2.14 System.map
4.3 플로피 부팅 디스크로 만들어 테스팅(부팅이 되면 정상)
$ cd /usr/src/linux
$ cat /usr/src/linux/arch/i386/boot/bzImage > /dev/fd0
혹은 $ dd if=arch/i386/boot/zImage of=/dev/fd0
혹은 $ make bzdisk
5. 모듈 컴파일
$ cd /usr/src/linux
$ make modules # 커널 옵션에서 모듈(M)으로 선택한것을 컴파일
$ make modules_install # 위와같이 하면 '/lib/modules/커널버전' 디렉에 모듈들이 위치한다
# _ 주의
$ depmod -a 2.2.15 # 모듈 사이의 의존성을 검사하여 /lib/modules/2.2.15/modules.dep 파일을 만든다
6. 부트 관리자 lilo.conf 편집
$ vi /etc/lilo.conf # 새 커널을 /etc/lilo.conf 파일에 등록
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
message=/boot/boot.msg # 부팅 메시지, 인사말과 부트 메뉴 목록 표시, [Tab]키와 같다
image = /boot/vmlinuz # 현재 설치된 커널을 나타낸다
label = linux # 부팅하게 될 커널이나 운영체제
root = /dev/hda1 # 운영체제의 /
read-only
image=/boot/vmlinuz-2.2.12-4 # 혹시나 모를 커널 패닉에 대비하여
label= linux.old # 예전 커널을 linux.old란 레이블로 해놓는다.
root=/dev/hda1 # (예전 버전이 2.2.12-4 일때)
read-only
7. $ lilo # 꼭 lilo를 실행해줘야 한다
$ reboot
8. 새 커널로의 부팅이 성공하면 다음을 해준다
$ depmod -a
$ modprobe -a *
9. 팁
7.1 두번째 컴파일부터 간단히 하는 방법
일단 컴파일을 하기위해 한번은 make menuconfig를 하십시오..
그러면 /usr/src/linux에 .config가 생깁니다. 이걸 백업하십시오..
그리고 나서 새로운 버전의 커널을 컴파일하려고 한다면
백업해 놓은 .config를 /usr/src/linux 에 카피해서
make oldconfig를 실행하십시오...
새로운 부분이 있다면 물어 볼 것입니다. 간딴하게 답하면 됩니다.
---------------------------------------------------------------------
[ 심플 커널 컴파일 ]
$ cd /usr/src
$ rm -f linux
$ mkdir linux-2.3.8
$ ln -s linux-2.3.8 linux
$ tar xvzf linux-2.3.8.tar.gz
$ cd /usr/include
$ ll asm linux scsi
$ rm -rf asm
$ ln -s /usr/src/linux/include/asm-i386 /usr/include/asm
$ cd /usr/src/linux
$ make mrproper
$ make menuconfig
$ make dep
$ make clean
$ make bzImage
$ make modules
$ make modules_install
$ cd arch/i386/boot
$ cp bzImage /boot/mykernel-2.3.8
$ cd /etc
$ vi lilo.conf
image=/boot/vmlinuz-2.0.36-3kr
label=linux
root=/dev/hda6
read-only
image=/boot/mykernel-2.3.8
label=mykernel
root=/dev/hda6
read-only
$ lilo
$ reboot
-----------------------------------------------------------------------
[ 커널 패치 ]
패치는 버전 순서대로 모두 적용해야만 한다
커널 2.2.9에서 커널 2.2.12로 업그레이드하기 위해서
patch-2.2.10.gz, patch-2.2. 11.gz 모두를 순서대로 적용해야 한다
1. 백업하기
$ cd /usr/src
$ make clean
$ tar zcvf '백업할커널이름.tar.gz' linux
2. 패치의 적용
$ cd /usr/src
$ ls
linux linux-2.2.9 patch-2.2.10.gz patch-2.2.11.gzpatch-2.2.12.gz
$ gzip -cd patch-2.2.10.gz | patch -p0 또는 $ zcat patch-2.2.10.gz | patch -p0
$ gzip -cd patch-2.2.11.gz | patch -p0
$ gzip -cd patch-2.2.12.gz | patch -p0
또는 쉘의 for 명령을 이용해 자동화하려면
$ for LeveL in 10 11 12 ; do
> gzip -cd patch-2.2.$[LeveL].gz | patch -p0
> done
또는 자동실행하는 스크립트 이용하려면
$ /usr/src/linux/scripts/patch-kernel
또는 패치가 압축되어있지 않다면 $ patch -p0 < patch-2.2.10
단지 에러 메세지만을 나오게 하려면 patch -s 플래그를 사용
3. 커널 컴파일
패치된 커널 소스 디렉토리 이름을 패치레벨 번호로 바꾸고 링크를 다시 설정합 니다.
$ cd /usr/src
$ rm -f linux; mv linux-2.2.9 linux-2.2.12; ln -s linux-2.2.12 linux
$ cd /usr/src/linux
$ (make mrproper); make menuconfig; make dep; make clean; make bzImage
$ rm -rf /lib/modules/2.0.36; make modules; make modules_install; depmod -a 2.2.12
$ cp /usr/src/linux/arch/i386/bzImage /boot/bzImage-2.2.12
$ vi /etc/lilo.conf
boot=/dev/hda
...
image=/boot/vmlinuz
label=linux
root=/dev/hdb1
image=/boot/bzImage-2.2.12
label=new
root=/dev/hdb1
other=/dev/hda1
...
$ lilo; reboot
... new linux booting # 성공 하였다면
$ cd /boot
$ rm -f vmlinuz
$ ln -s zImage-2.2.12 vmlinuz
4. 에러 대처하기
$ find /usr/src/linux/ -name '*.rej' -print
$ vi *.rej
$ vi config.in.rej
# 고쳐진것은 보통 그 행의 처음에 `+'와 `-'로 표시가 된다. 'y'나 'n'를 적절히 바꾼다
$ patch -p0 < config.in.rej
실패가 없으면, 구성과 컴파일을 계속하고, 남아있는 config.in.rej 파일은 지워도 된다
만일 `previously applied patch detected: Assume -R?'라고 나오고, `y'라고 답하면, 소스를 낮은 버전으로 되돌리는 것이다
패치를 되돌리려면, 원래 패치에서 `patch -R'을 사용하라.
5. 원본 백업 파일 .orig의 삭제
$ find /usr/src/linux/ -name '*.orig' -exec rm -f {} ';'(;)
혹은 더 좋은 방법 $ find . -name '*.orig' | xargs rm
또는 확실하나 화면출력이 많은 방법 $ find . -name '*.orig' -print0 | xargs --null rm --
--------------------------------------------------------------------------
[ 심플 패치 ]
$ cd /usr/src
$ ls
patch-2.3.9.gz patch-2.3.10.gz
$ linux/scripts/patch-kernel
$ cd linux
$ find . -name "*.rej" # 무소식이 희소식
$ find . -name "*.orig" -exec rm -f {} ;
$ cd /usr/src
$ rm -f linux
$ mv linux-2.3.8 linux.2.3.10
$ ln -s linux-2.3.10 linux
번호 | 분류 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|---|
48 | System/OS | [linux] ipfwadm를 이용한 패킷필터링(구버전) | hooni | 2003.04.23 | 13338 |
47 | System/OS | [linux] ipchains 사용예(패킷 필터링) | hooni | 2003.04.23 | 14505 |
46 | System/OS | [linux] ipchains 옵션 | hooni | 2003.04.23 | 13967 |
45 | System/OS | [linux] Xwindow/Xmanager 사용 | hooni | 2003.04.23 | 13800 |
44 | System/OS | [linux] 최소한의 커널 설정(커널설치 전체과정) | hooni | 2003.04.23 | 17770 |
43 | System/OS | [linux] 네트워크 커널 설정.. | hooni | 2003.04.23 | 16793 |
» | System/OS | [linux] 커널 컴파일, 설정 | hooni | 2003.04.23 | 18185 |
41 | System/OS | [linux] 네트웍 트래픽 모니터링(MRTG) | hooni | 2003.04.23 | 43853 |
40 | System/OS | [linux] DHCP(Dynamic Host Configuration Protocol) 서버 | hooni | 2003.04.23 | 13323 |
39 | System/OS | [linux] Masquerade 가상 ip분할기법 | hooni | 2003.04.23 | 48363 |
38 | System/OS | [linux] DNS(Domain Name System) 설치, 설정 | hooni | 2003.04.23 | 12748 |
37 | System/OS | [linux] sendmail 설정/사용 | hooni | 2003.04.23 | 14883 |