initramfs, initrd의 개념 및 한계


linux system을 사용하다보면, initramfs를 사용하는 경우도 있고, initrd를 사용하는 경우도 종종있다.
그러나 이를 왜 어떻게 사용하는지 정의가 없다.

 

initrd/initramfs를 알기 이전에 리눅스 부팅과정에 대해서 잠시 이해할 필요가 있다.

아래 정리해둔 내용을 일차로 읽어보면 initrd와 initramfs를 왜 사용하는지 간단하게 정리했다.

Linux 부팅의 세부 동작 방식 및 실행

 

정리하면

  • kernel은 부팅 시, root partition를 “read only”로 mount한다.
  • root partition에서 init process를 실행한다. (kernel 컴파일 시, 정의한 파일)
  • 1개의 partition만으로 구성된 시스템이라면 문제가 없이 init process가 각각의 디바이스를 로딩하고, 서비스를 시작한다.
  • 그러나 multi partition으로 구성된 시스템이라면 root partition만 mount했기 때문에 문제가 생긴다.
  • 위와 같이 multi partition으로 구성된 시스템을 보정하기 위해서 initrd/initramfs가 추가되었다.

 

initrd/initramfs의 주요 기능

initrd/initramfs의 주요 기능을 정리하면 아래와 같이 정리될 수 있다.

  • 디바이스를 시스템에 적절히 매핑
  • 분할된 partition은 시스템에 설정된 파티션에 맞게 remount
  • 서비스 시작

 

initrd/initramfs 차이점

initrd와 initramfs은 몇 가지에서 차이점이 발생한다. 이로 인해서 현재는 initramfs가 주로 사용하는 상황이 되었다.

2가지 모두 압축을 풀어서 메모리에 올려서 실행하는 점은 동일하다.
그러나 initrd는 linux에 “디바이스 – device“로 인식한다.

“디바이스 – device”라는 의미가 무슨 큰 의미가 있을 것이냐고 생각하지만 생각과 다르게 큰 의미를 지닌다. 디바이스는 block으로 시스템에 인식되며 메모리에 상주한다. 즉 사라지지 않는다는 의미이다.  10mb의 디바이스가 계속 메모리에 상주하고 있다면 낭비가 된다. 또한 메모리에 상주하고 있다가 특정 조건에 의해서 메모리에서 사라지면 문제가 될 수도 있는 상황이된다. 왜냐하면 init process는 initrd의 내부에서 실행되었기 때문이다. 그리고 다른 큰 문제는 initrd는 크기 제한이 있다.

이런 문제점으로 인해서 initrd에서 initramfs로 변화하는 추세이다.
그러나 fixed된 자원 그리고 메모리를 직접 억세스하는embedded system에서는 initrd가 아직도 대세라고 봐도 된다. 시스템 특성상 embedded system은 initrd가 효율적이기 때문인다.

나중에 initramfs를 수정하거나 변경하는 방법에 대해서 공부해보는 것도 좋다.