커널 만지다가 책 따라서 실습을 하고 있었지만 똑같이 하니 역시 옛날 환경이라 예상치 못한 일들이 일어난다. 그중 하나가 바로 부팅 시 커널 패닉이 일어나는 상황이다. 이번에 내가 마주한 상황은 VFS 싱크로 관련 에러였다.
그때 당시의 스크린샷을 찍지는 못했지만 위에서 나타난 에러 구문과 똑같았다.
Cause & Solution
구글링을 했을 때 다음과 같은 두 원인과 각 해결책을 말해준 사람이 있었다.
1. 특정 디바이스에서 사용하는 파일 시스템이 커널에서 지원하지 않을 때 발생한다. 네가 만약 너만의 커널을 컴파일했을 때, 모듈로 컴파일을 하려 할 때가 보통 원인이다. root 옵션에 외래(exotic) 포맷을 부트로더에 명시하면 해결하는 방법 중 하나다.
2. 커널에 알려주는 root device의 이름이 잘못되었을 때 발생한다.
그리고 그 답변에 질문자가 initrd.img를 넣어주니 해결됐다고 했다. 그래서 좀 더 찾아보니 다른 사람도 그렇게 해결했었다.
Fix it
옛 커널 버전에서는 부트로더가 램 디스크를 이용해서 모듈을 올리는 데에 필요한 정보를 마운트 시키기 위한 파일 시스템이 필요했다. "mkinitrd" 명령어를 통해 커스텀 커널을 위한 램 디스크를 생성한 뒤 /boot/grub/menu.lst에서 "initrd [생성한 램 디스크]" 줄을 추가해준다.
title Linux 2.6.14.6
root (hd0,0)
kernel /boot/vmlinuz-2.6.14 root=/dev/hda1 ro
initrd /boot/initrd.img-2.6.14
savedefault
boot
다시 리부팅해서 grub 창이 뜨고 커널 패닉이 떴던 커널을 선택하면 정상적으로 실행되는 것을 확인할 수 있다.
최근에는 부트로더에서 "initrd"를 쓰지 않고 대신 "initramfs"를 쓰는데 부트로더에 상관없이 이런 램 디스크를 쓰지 않는 커널 버전도 있어 정확히 어떻게 작동하는지는 잘 모르겠다. 나중에 알게 되면 최신화해야겠다.