2014.10.30 02:23
1. 기존에 설치되어 있던 리눅스 커널 버전을 확인한다.
[root@ljh ~]# uname -a
Linux ljh 2.6.18-308.el5 #1 SMP Tue Feb 21 20:06:06 EST 2012 x86_64 x86_64 x86_64 GNU/Linux
2. 업데이트를 원하는 리눅스 커널 버전을 www.kernel.org 사이트에서 해당 서버로 다운로드 한다.
3. 다운 받은 커널 소스를 업로드 하고 압축을 푼다.
[root@ljh src]# wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.30.7.tar.gz
[root@ljh redhat]# tar -xvzf linux-2.6.30.7
4. 기존에 사용하던 커널옵션은 /boot/config-2.6.18-308.el5에 저장되어 있다. 이 파일을 압축해제한 폴더에 복사하여 붙여넣는다.
[root@ljh boot]# cp config-2.6.18-308.el5 /usr/src/redhat/linux-2.6.30.7/
5. 새로운 소스의 심볼릭 링크를 생성한다.
[root@ljh linux-2.6.30.7]# ln -s linux-2.6.30.7 linux-2.6
6. 본격적인 커널을 컴파일 한다. 만약 이전에 커널을 컴파일한 경험이 있다면 아래와 같은 명령어로 오브젝트파일과 이전 커널 옵션등을 정리해준다.
[root@ljh linux-2.6.30.7]# make clean
[root@ljh linux-2.6.30.7]# make menuconfig
HOSTCC scripts/basic/fixdep
HOSTCC scripts/basic/docproc
HOSTCC scripts/basic/hash
HOSTCC scripts/kconfig/conf.o
HOSTCC scripts/kconfig/kxgettext.o
HOSTCC scripts/kconfig/lxdialog/checklist.o
HOSTCC scripts/kconfig/lxdialog/inputbox.o
HOSTCC scripts/kconfig/lxdialog/menubox.o
HOSTCC scripts/kconfig/lxdialog/textbox.o
HOSTCC scripts/kconfig/lxdialog/util.o
HOSTCC scripts/kconfig/lxdialog/yesno.o
HOSTCC scripts/kconfig/mconf.o
SHIPPED scripts/kconfig/zconf.tab.c
SHIPPED scripts/kconfig/lex.zconf.c
SHIPPED scripts/kconfig/zconf.hash.c
HOSTCC scripts/kconfig/zconf.tab.o
HOSTLD scripts/kconfig/mconf
scripts/kconfig/mconf arch/x86/Kconfig
#
# using defaults found in /boot/config-2.6.18-308.el5
#
/boot/config-2.6.18-308.el5:630:warning: symbol value 'm' invalid for IP_DCCP_CCID3
/boot/config-2.6.18-308.el5:631:warning: symbol value 'm' invalid for IP_DCCP_TFRC_LIB
/boot/config-2.6.18-308.el5:1365:warning: symbol value 'm' invalid for FIXED_PHY
/boot/config-2.6.18-308.el5:1671:warning: symbol value 'm' invalid for ISDN
/boot/config-2.6.18-308.el5:2789:warning: symbol value 'm' invalid for RTC_INTF_SYSFS
/boot/config-2.6.18-308.el5:2790:warning: symbol value 'm' invalid for RTC_INTF_#ROC
# configuration written to .configarning: symbol value 'm' invalid for RTC_INTF_#EV
/boot/config-2.6.18-308.el5:2813:warning: symbol value 'm' invalid for DMA_ENGINE
*** End of Linux kernel configuration.ng: symbol value 'm' invalid for GFS2_FS_L*** Execute 'make' to build the kernel or try 'make help'.
여러 명령어가 수행된 후 위와 같은 화면이 출력된다.
해당 화면에서 커널에 대한 사용환경에 따라 설정옵션을 넣어 준 후에 아래의 Save an alternate Configuration File 을 통해 .config 라는 이름을 저장한다. 이 파일은 사용자 환경에 따라 다르겠지만 일반적으로 /usr/src/redhat 또는 /usr/src/linux 에 저장 되며 커널 컴파일시 사용하므로 안전하게 보관해야 한다. 만약 make mrproper 을 실행하면 .config 파일은 삭제되므로 저장 할 때 다른 이름으로 한번 더 저장하는 것이 좋다.
7. 커널 이미지를 생성한다.
커널 이미지 생성 시 시간설정이 현재시간으로 설정 되어있지 않다면 이미지생성 과정에서 무한루프가 발생할 수 있다. 따라서 커널 이미지 생성 명령어를 입력하기 전에 현재시간으로 동기화 해줘야 한다. bzImage의 I는 반드시 대문자 I 로 입력해야 한다.
[root@ljh linux-2.6.30.7]# rdate -s time.bora.net
[root@ljh linux-2.6.30.7]# make bzImage
이전생략
CC arch/x86/boot/video-bios.o
LD arch/x86/boot/setup.elf
OBJCOPY arch/x86/boot/setup.bin
OBJCOPY arch/x86/boot/vmlinux.bin
HOSTCC arch/x86/boot/tools/build
BUILD arch/x86/boot/bzImage
Root device is (253, 2)
Setup is 14072 bytes (padded to 14336 bytes).
System is 2566 kB
Kernel: arch/x86/boot/bzImage is ready (#1)
8. 커널 이미지가 생성 완료 되면 커널 옵션에서 모듈로 선택한 기능들에 대해 모듈파일을 생성하는 작업을 진행해야 한다.
명령어는 ‘make modules’ 이며 명령어가 실행된 후 ‘make modules_install’ 명령어로 앞서 생성된 오브젝트 파일들을 /lib/modules/업데이트할 커널 버전 디렉토리에 복사한다.
[root@ljh linux-2.6.30.7]# make modules
[root@ljh linux-2.6.30.7]# make modules_install
이전생략
INSTALL /lib/firmware/edgeport/down2.fw
INSTALL /lib/firmware/edgeport/down3.bin
INSTALL /lib/firmware/whiteheat_loader.fw
INSTALL /lib/firmware/whiteheat.fw
INSTALL /lib/firmware/keyspan_pda/keyspan_pda.fw
INSTALL /lib/firmware/keyspan_pda/xircom_pgs.fw
DEPMOD 2.6.30.7
9. 마무리 단계로 커널이미지와 여러가지 관련 셋팅 정보 파일을 /boot폴더에 복사하고 새 커널로 부팅을 하기 위해 ‘make install’ 이라는 명령어를 입력하여 자동 실행한다.
[root@ljh linux-2.6.30.7]# make install
sh /usr/src/redhat/ linux-2.6.30.7/arch/x86/boot/install.sh 2.6.30.7 arch/x86/boot/bzImage \
System.map "/boot"
이후 /boot 디렉토리에 정상 복사가 되었는지 확인한다.
10. /boot/grub/grub.conf 파일을 살펴보면 새로운 커널에 맞는 부팅메뉴가 추가된 것을 확인할 수 있다.
[root@ljh linux-2.6.30.7]# cat /boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/mapper/ddf1_4c5349202020202010000055000000004711471100001450p2
# initrd /initrd-version.img
#boot=/dev/mapper/ddf1_4c5349202020202010000055000000004711471100001450
default=1
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.30.7)
root (hd0,0)
kernel /vmlinuz-2.6.30.7 ro root=LABEL=/
initrd /initrd-2.6.30.7.img
title CentOS (2.6.18-308.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-308.el5 ro root=LABEL=/
initrd /initrd-2.6.18-308.el5.img
화면을 보게 되면 총 2가지의 커널버전으로 부팅가능 하도록 메뉴에 나타나있다.
위에서부터 0번 1번 2번 3번순서로 번호가 부여되며, 부팅하고자 하는 커널 번호를 default=숫자 로 설정 변경하여 reboot을 통해 해당 커널 변경하여 부팅을 할 수 있다.
11. 업데이트한 커널로 정상부팅 확인
[root@ljh ~]# uname -a
Linux ljh 2.6.30.7 #1 SMP Wed Sep 30 16:56:26 KST 2009 x86_64 x86_64 x86_64 GNU/Linux