리눅스/컴파일오류

Linux Kernel panic VFS Unable to mount root fs on block (0,0)

Songker 2011. 4. 25. 17:42

Ubuntu 9.04 version을 설치하면  kernel version이 2.6.28이다.
kernel version을 2.6.37로 업그레이드 하기 위해서
www.kernel.org에서  2.6.37 full source를 다운받았다.

위 verion을 컴파일 하기위해서

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_install modules
 
그럼 /lib/modules/  나의 kernel version에 맞는 폴더가 생긴다.

4.  
mkinitrd를 사용해서 램디스크 이미지를 생성해야하는데 ubuntu에서는 mkinitramfs 명령어를 사용한다
mkinitramfs -o  /boot/initrd.(컴파일한 kernel version).img  $(컴파일한 kernelversion) 사용하면
/boot 안에 새로운 initrd.( ).img 가 생긴걸 알수있다.

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

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

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


참고 사이트 : http://www.cyberciti.biz/faq/linux-kernel-panic-vfs-unable-to-mount-root-fs-and-solution/