Initramfs/Guide/ko

상당히 많은 시스템이 부팅을 제대로 수행하려면 initramfs를 필요로 합니다. 이 안내서에서는 initramfs의 개념을 파헤치고, 어떻게 제대로 만드는지 어떻게 initramfs 인스턴스를 관리하는지 설명하도록 하겠습니다.

도입부
대부분의 사용자는 initramfs 시스템을 신경쓰지 않습니다. 사용자들은 단순한 파티션 구조와, (암호화된 파일 시스템같이)낯설지 않은 드라이버 또는 설정을 사용하기 때문에 리눅스 커널은 시스템에서  바이너리로 제어권을 넘길 수 있습니다. 다만 대부분의 시스템은 initramfs는 거의 필수나 다름 없습니다.

initramfs가 무엇인지(무엇에 필요한지) 이해할 핵심 개념은 리눅스가 어떻게 부팅 과정을 처리하는지, 상위 레벨의 관점에서 이해하는 것입니다.

리눅스 부팅 과정
리눅스 커널이 (부트로더에서 불러오고 난 후의)시스템에 제어권을 넘기면, 메모리 구조와 드라이버를 가능한한 준비하는 것입니다. 그 다음 시스템을 더 많이 준비하는 작업을 하는 (보통 ) 프로그램으로 제어권을 넘기며, 부팅 과정의 마지막에는 모든 필요한 서비스가 동작하는지 확인하며 사용자가 로그온 할 수 있게 처리합니다. 프로그램은 실행으로 처리하는데, 다른 서비스 중에, 더 많은 요소를 불러올  데몬은 감지한 장치를 기반으로 시스템을 준비합니다. 를 실행하면, 아직 마운트 안된 모든 남아있는 파일 시스템을 마운트하며, 나머지 서비스를 시작합니다.

모든 필요한 파일과 도구가 같은 파일 시스템에 존재하는 시스템에서,  프로그램은 훨씬 더 많은 부팅 과정을 완벽하게 제어합니다만, 여러가지 파일 시스템을 정의했을 경우(또는 좀 더 낯선 방식의 설치요소를 올려두었다면), 좀 더 복잡해질 수 있습니다:


 * 파티션이 다른 파일 시스템에 있을 경우, 에 있는 도구와 드라이버는 를 사용할 수 있기 전에는 사용할 수 없습니다. 이들 도구가 을 사용할 수 있게 하는 과정이 필요하다면, 시스템을 부팅할 수 없습니다.


 * 루트 시스템을 암호화하면, 리눅스 커널이  프로그램을 찾을 수 없어, 시스템을 부팅할 수 없게 됩니다.

이 문제를 해결하는 방법으로 오래전부터 initrd(초기 루트 장치)를 사용하는 방법이 있습니다.

초기 루트 디스크
initrd는 루트 파일 시스템의  프로그램으로 제어권을 넘기기 전에 필요한 파일 시스템을 마운트하는데 필수적인 도구와 스크립트를 포함하고 있는 메모리 기반 디스크 구조(램디스크)입니다. 리눅스 커널은 이 루트 디스크에서 시스템을 준비하는 설정 스크립트(보통 라고 하지만 필수적인 요소는 아닙니다)를 실행하고 실제 루트 파일 시스템으로 전환한 후  을 실행합니다.

비록 initrd 방식이 필요한 그 전부 자체겠지만, 몇가지 문제가 있긴 합니다:


 * 완전히 구색을 갖춘 블록 장치이며 전체 파일 시스템에 대한 오버헤드를 필요로 하고, 고정 크기를 지니고 있습니다. 작은 inintrd를 사용하면 모든 필요한 스크립트를 넣을 수 없고 너무 크게 잡으면, 메모리를 쓸데 없이 많이 사용하게 됩니다.


 * 실제 장치이기 때문에, 리눅스 커널의 캐시 메모리를 소모하며, 메모리 및 파일 관리 방식(페이징)을 사용하는 중에 메모리 소모 동작이 잘못될 수도 있습니다.

이 (아마도 말하기 힘든) 문제를 해결하기 위해 initramfs가 만들어졌습니다.

초기 램 파일 시스템
initramfs는 tmpfs(유연한 크기의, 메모리 기반 경량 파일 시스템) 기반의 초기 램 파일 시스템이며 분할 블록 장치를 사용하지 않습니다(그래서 캐싱을 사용하지 않으며 먼저 언급한 모든 오버헤드를 없앴습니다). initrd처럼, 실제 루트 파일 시스템의  바이너리를 호출하기 전에 파일 시스템을 마운트하는데 필요한 도구와 스크립트를 넣습니다. 이러한 도구는 추상 레이어, 논리 볼륨 관리자, 소프트웨어 RAID, 파일 시스템 로더 기반 블루투스 드라이버 등에서(암호화된 파일 시스템을) 복호화할 수 있습니다.

initramfs의 내용은 cpio 아카이브를 만들면서 마련합니다. 는 오래된(검증된) 파일 아카이빙 솔루션입니다(그리고 결과 아카이브 파일을 cpio 파일 이라고 합니다). 이걸 분명하게 와 견주어볼 수 있습니다. 여기서 를 선택한 이유는 (코드 기반) 구현이 비교적 쉬웠고, ( 라 할 수 없던)장치 파일을 지원(및 유지)해주었습니다.

모든 파일, 도구, 라이브러리, 환경 설정(가능한 경우) 등을 cpio 아카이브에 놓습니다. 이 아카이브는  유틸리티를 활용하여 압축하며 리눅스 커널 부분에 저장합니다. 부트로더는 부팅 시간에 이 아카이브를 제공하여 커널이 initramfs가 필요함을 알도록 해줍니다.

initramfs를 커널이 감지하고 나면 tmpfs 파일 시스템을 만들고, 내용을 이 파일 시스템에 추출한 다음, tmpfs 파일 시스템의 루트에 위치한  스크립트를 실행합니다. 그 다음 이 스크립트로 실제 루트 파일 시스템을 마운트하고(다음 마운트를 확실하게 한 다음에는, 추가 모듈을 불러온다든지 하는 식으로, 암호화된 추상 레이어 같은 요소를 준비합니다) 이와 같이 다른 파일 시스템( 또는 )을 활성화합니다.

Once the root file system and the other vital file systems are mounted, the  script from the initramfs will switch the root towards the real root file system and finally call the   on that system to continue the boot process.

Introduction and bootloader configuration
To create an initramfs, it is important that you know what additional drivers, scripts and tools you need to boot your system. For instance, if you use LVM, then you will need to support LVM tools on the initramfs. Likewise, if you use software RAID, you need, etc.

Some tools exist that help you create initramfs' (compressed cpio archives) for your system. But for those that want total control, you can easily create your own initramfs as well.

Once created, you will need to adjust the bootloader configuration to tell it that an initramfs is to be used. For instance, if the initramfs file is stored as, then the configuration in  could look like so:

Using genkernel
Gentoo's kernel building utility,, can be used to generate an initramfs, even if you didn't use   to configure and build your kernel.

To use  for generating an initramfs, it is recommended that you include all necessary drivers and code that is needed to mount your  and  file systems in the kernel (and not as modules). Then, call  as follows:

Depending on your system, you might want to add one or more of the following options:

When finished, the resulting initramfs file will be stored in your.

Dracut 활용하기
유틸리티는 initramfs 파일을 관리하는 단순한 목적으로 만들었습니다. 어떤 지원을 넣을지 말지에 대해 상당히 모듈화된 접근 방식을 활용합니다.

을 설치할 때 올바른  지원을 포함하는데 신경써야 합니다. 이 변수의 값은 각각의 설치 과정에서 기능을 포함하기 위해 에 넣을 수 있습니다.

It is advisable to set (or unset) those modules you need (and don't need). Afterwards,  to install the utility on your system.

The next step is to configure  by editing. In the configuration file, which is well commented, you can add in support for specific modules where needed.

Once configured, create an initramfs by calling  as follows:

The resulting image supports generic system boots based on the configuration in. You can also opt to generate an initramfs specifically tailored to your system (in which  tries to detect the needed tools, drivers, etc. from your existing system). If you know that the needed support (code and drivers) is built in in your kernel (and not as module), then you can even add in :

더 많은 정보는 과  의 맨페이지를 확인하십시오.

젠투 관련

 * 공식 젠투 위키의 Initramfs
 * 공식 젠투 위키의 Dracut

범용 자원

 * 리눅스 커널 문서의 ramfs-rootfs-initramfs.txt

감사문
이 안내서에 제공한 노고에 대해 다음 작성자와 편집자분들께 감사의 말을 전하고자 합니다:


 * Sven Vermeulen