본문 바로가기

Enginius/Linux

Linux kernel patch & various ways of Kernel Compile + troubleshooting ★★★★★

1.
\> cp /usr/src/linux-headers-2.6.28-19-generic/.config ../linux.2.6.37
로 .config 파일을 복하였다.

커널을 컴파일하는데 설정을 해주기 위해서 보통 make menuconfig 를 실행해서 일일이 설정하지만
일일이 설정해주기는 매우 복잡하고 오랜시간이 걸린다.
그래서 기존의 리눅스 설정파일을 그대로 사용하기 위해서다.

make oldconfig 후에 

make 를 하면 arch/x86/boot/bzImage 파일이 생긴걸 알 수 있다.

위 파일을 /boot/vmlinuz-2.6.37 식으로 복사해주면 된다. ( bzImage를 그대로 옮기니까 update-grub시 이미지 파일을 찾지 못함 )

부트로더인 grub을 수정하기 위해서

update-grub을 실행해주자. ( /boot파일안의 리눅스 이미지 파일을 찾아서 /boot/grub/menu.lst 가 자동 수정됨)

그리고 reboot!!


2.
그런데 Linux Kernel panic VFS Unable to mount root fs on block (0,0) 오류가 계속 발생하였다.
검색해보니  램디스크라 불리우는 initrd 파일이 없어서 인것으로 추정되었다.
( 기존에 설치된 kernel인 2.6.28은 initrd가 지정되어 있고 파일도 있으나 새로 컴파일한 kernel버젼에는 initrd가 지정되어 있지 않음을 /boot/grub/menu.lst에서 확인할 수 있다. )


3. /usr/src/linux-2.6.37/ 폴더로 이동후
make modules
make modules_install
 
그럼 /lib/modules/  나의 kernel version에 맞는 폴더가 생긴다.

4.  
mkinitrd를 사용해서 램디스크 이미지를 생성해야하는데 ubuntu에서는 mkinitramfs 명령어를 사용한다
mkinitramfs -o  /boot/initrd.(컴파일한 kernel version).img  $(컴파일한 kernelversion) 사용하면
/boot 안에 새로운 initrd.( ).img 가 생긴걸 알수있다.
이거가 안되 (Could not load /lib/modules/ .../module.dep 에러)
/etc/initramfs-tools/initramfs.conf 의 MODULES=most를 dep로 변경하고, 시냅틱패키지관리자를 열어서 initramfs-tools를 재설치하고 리붓한다.  

update-initramfs -c -k 2.6.32-sj
여기서 c-option은 create이고, k-option은 커널 버젼을 뜻한다. 

5. 부트로더 grub이 알수 있게 수정 해주자
grub이 자동에서 해주는 명령어가 있는것 같은데 잘 모르겠으므로 수동으로 해주자.
vi /boot/gurb/menu.lst 에서

자기가 컴파일한 부분이 잇을 것이다.
initrd /boot/initrd.컴파일한 kernel version).img 을 지목해주자.  ( 기존 리눅스 설정된것처럼 적어주면 되므로 어렵지 않다. )

6. reboot 해주면 커널변경 OK!!

 

Kernel compile

* version 2.4

1. make mrproper
2. make menuconfig (or config, xconfig)
3. make dep
4. make clean
5. make bzImages
6. make modules
7. make modules
8. make install

* version 2.6
?
 cp /boot/config-2.6.15-1.2054_FC5 /usr/src/linux/linux 

1. make mrproper
2. make menuconfig (or config, xconfig)

 <2.6.23에서 config파일 - 이게 잘 된다.>
3. make clean
4. make
5. make modules
6. make modules_install
7. make install
> in command "make", "make bzImage" and "make modules" commands are included from 2.4 version

http://wiki.kldp.org/wiki.php/Kernel%202.6%20Intro

- Kernel patch
1. copy the patch file in to the /usr/src/$kernel_name
2. patch -p1 < $patch_name


- Make menuconfig 오류가 날 때 (우분투)
1. apt-get install build-essential
2. apt-get install ncurses-dev


- 우분투에서는 조금 다르다. 위의 과정의 마지막에 init을 추가해야 한다. 
1. 기존의 make install
2. mkinitramfs -0 /boot/initrd.img-2.6.24-dwrr (현재 패치 대상 이름)


- 우분투에서 컴파일 하기 2

1. 루트 권한으로 변경한다. 
   # sudo -i
2. 필요한  패키지는 build-essential, libncurses5-dev 입니다. 
3. kernel.org 에서 커널 소스를 압축을 푼다.
4. (생략가능) 기존의 config 파일 복사

 자 그럼 컴파일을 해보자. 
0. 여러개의 Thread로 make를 하기위한 설정을 한다. 
   # export CONCURRENCY_LEVEL=<쓰레드수>
1. 설정을 한다. 
   # make menuconfig  
   (없다면 apt-get install kernel-package)
2. 컴파일 결과물 삭제

   # make-kpkg clean
3. 실제 컴파일한다. 
   # make-kpkg --initrd kernel_image kernel_headers kernel_source modules_image
   레드햇 계열과 차이나는 과정으로 .deb 파일을 생성합니다.  
   * UTS RELEASE 어쩌고 하는 에러가 나면
   include/linux/version.h에 한줄 추가하고 3번 커맨드 다시 입력
   #define UTS_RELEASE <커널 버전>
    예) #define UTS_RELEASE 2.6.24-dwrr
4. 커널 패키지 설치
   # cd/usr/src
   # dpkg -i *.deb
   deb 파일이 생성된 /usr/src로 이동하여 패키지를 설치합니다. 여기서 grub도 자동으로 변경합니다. 

* Error handling
dpkg-deb: control directory has bad permissions 2755 (must be >=0755 and <=0775)
위와 같은 에러가 생긴다면 

debian:/usr/src/linux-2.6# cd ..
debian:/usr/src/# ls -l
total 274744
-rw-r--r--  1 root src     55659 2011-01-12 18:34 config-2.6.30-3-bpo50-atom
drwxr-sr-x 26 root src      4096 2011-01-12 23:14 linux-2.6
drwxrwxr-x 24 root root     4096 2011-01-12 18:44 linux-2.6.30.10
-rw-r--r--  1 root src  75791486 2009-12-04 06:05 linux-2.6.30.10.tar.gz
drwxr-xr-x 25 root root     4096 2011-01-12 19:04 linux-2.6.31
debian:/usr/src/#

As you can see in the above output of the ls command, the real problem is the attribute “s” (in red) that is set on your source directory. We need to get rid of it by the following command:

debian:/usr/src/# chmod -R a-s linux-2.6

Now give your make-kpkg command again and you won’t get the directory permission error message.

That’s it!