how kernel start
항상 헷갈리는 개념이다. 바로 리눅스 커널 (운영체제)가 어떻게 시작이 되냐 인데
깔끔하게 정리를 하자면,
- 부트로더(GRUB/EFI) 가
- 커널 이미지(bzImage/vmlinuz)와
- initramfs(initrd/initramfs)를 RAM에 올림
- 커널이 시작되면서
- 커널 본체가 자기 자신을 압축해제하고
- 드라이버/메모리/스케줄러 등 커널 초기화를 진행
- initramfs가 있으면 커널은 그걸 임시 루트(/)로 삼고
- 보통 initramfs 안의 /init (스크립트/바이너리)를 PID 1로 실행
- 이 /init이 BusyBox 기반일 수 있음(“busybox initramfs”)
- initramfs , buzybox에 대한 자세한 내용은 → what is initramfs & buzybox
- /init이 실제 루트 장치를 준비/마운트한 다음
- 루트를 real rootfs로 바꾸고(switch_root/pivot_root)
- real rootfs의 /sbin/init 를 exec해서 넘김
즉, 커널이 시작하는 시점은 bzImage가 압축해제 되어 실행이 되는 순간이다.
이때 부터 각각의 모듈, 커널 코드들이 실행되고,
기본적인 커널을 제외한 서비스, 네트워크, 셸이 /sbin/init 이 실행되면서 시작이 된다.
조심할내용 )
주로 initramfs 파일시스템 내에 init 파일 하단에
C
mount /dev/sda2 /newroot
exec switch_root /newroot /sbin/init다음과 같은 코드로 루트 파일시스템을 바꾸면서 넘어감
근데 조심을 해야할게
C
exec /sbin/init "$@"이런식으로 바로 initramfs 파일시스템 안에 있는 /sbin/init을 시작할때도 있는데
이때는 이 initramfs 파일시스템을 기본 시스템으로 가볍게 사용하겠다. 이거임 기본 명령어들도 그냥 buzybox로만 사용하고
따라서 커널 문제를 풀기전에 이 initramfs 파일시스템의 init 파일을 보는 것도 상당히 중요하다.