Initrd

리눅스 시스템에서 **`initrd`** (initial ramdisk, 초기 램디스크)는 임시 파일 시스템을 메모리에 로드하여 리눅스 시작 프로세스의 일부로 사용하는 방식이다. `initrd`와 `initramfs` (초기 RAM 파일 시스템에서 유래)는 이를 달성하기 위한 두 가지 다른 방법을 가리킨다. 둘 다 실제 루트 파일 시스템을 마운트하기 전에 준비 작업을 수행하는 데 일반적으로 사용된다.

## 배경
많은 리눅스 배포판은 단일의 일반적인 리눅스 커널 이미지를 제공한다. 이 이미지는 배포판 개발자가 다양한 하드웨어에서 부팅되도록 특별히 생성한 것이다. 이 일반 커널 이미지의 장치 드라이버는 적재 가능 커널 모듈로 포함되는데, 많은 드라이버를 하나의 커널에 정적으로 컴파일하면 커널 이미지가 훨씬 커져서 메모리가 제한된 컴퓨터에서는 부팅하기에 너무 커질 수 있거나, 경우에 따라 존재하지 않거나 충돌하는 하드웨어를 검색하여 부팅 시 충돌 또는 기타 문제가 발생할 수 있기 때문이다. 이 정적 컴파일된 커널 방식은 또한 더 이상 사용되지 않거나 필요 없는 모듈을 커널 메모리에 남기고, 부팅 시 루트 파일 시스템을 마운트하는 데 필요한 모듈을 감지하고 로드하는 문제 또는 루트 파일 시스템이 어디에 있고 무엇인지 추론하는 문제를 발생시킨다.

더 복잡한 문제로, 루트 파일 시스템은 소프트웨어 RAID 볼륨, 논리 볼륨 관리자, 네트워크 파일 시스템 (디스크 없는 워크스테이션에서), 또는 암호화된 파티션에 있을 수 있다. 이 모든 것은 마운트하기 위해 특별한 준비가 필요하다.

또 다른 복잡한 문제는 하이버네이션에 대한 커널 지원인데, 이는 컴퓨터의 모든 메모리 내용을 스왑 파티션이나 일반 파일로 덤프한 다음 전원을 끄는 방식으로 컴퓨터를 디스크에 일시 중단시킨다. 다음 부팅 시에는 이 이미지를 메모리로 다시 로드하기 전에 액세스 가능하게 만들어야 한다.

커널에 너무 많은 특수 사례를 하드코딩하는 것을 피하기 위해, 임시 루트 파일 시스템현재는 초기 사용자 공간이라고 불리는을 사용하는 초기 부팅 단계가 사용된다. 이 루트 파일 시스템은 실제 파일 시스템을 마운트하는 데 필요한 하드웨어 감지, 모듈 로딩 및 장치 검색을 수행하는 사용자 공간 도우미를 포함할 수 있다.

## 구현

[upright=1.2|섬네일|[아치 리눅스 및 관련 배포판에서 initramfs를 생성하는 프로그램인 `mkinitcpio`]]
upright=1.2|섬네일|일부 리눅스 배포판에서 initramfs를 생성하는 또 다른 프로그램인 <code>dracut</code>
이 초기 루트 파일 시스템의 디스크 이미지는 (커널 이미지와 함께) 부트로더 또는 컴퓨터의 부팅 펌웨어가 액세스할 수 있는 어딘가에 저장되어야 한다. 이것은 루트 파일 시스템 자체, 광 디스크의 부팅 이미지, 로컬 디스크의 작은 파티션(부팅 파티션, 일반적으로 ext2 또는 파일 할당 테이블 파일 시스템 사용), 또는 TFTP 서버( 이더넷에서 부팅할 수 있는 시스템에서)일 수 있다.

부트로더는 커널과 초기 루트 파일 시스템 이미지를 메모리로 로드한 다음 커널을 시작하고 이미지의 메모리 주소를 전달한다. 부팅 시퀀스 끝에서 커널은 데이터의 처음 몇 블록에서 이미지의 형식을 결정하려고 시도하며, 이는 initrd 또는 initramfs 방식으로 이어질 수 있다.

**initrd** 방식에서 이미지는 파일 시스템 이미지(선택적으로 압축됨)일 수 있으며, 이는 특별한 블록 장치()에서 사용할 수 있게 되어 초기 루트 파일 시스템으로 마운트된다. 해당 파일 시스템의 드라이버는 커널에 정적으로 컴파일되어야 한다. 많은 배포판은 원래 압축된 ext2 파일 시스템 이미지를 사용했지만, 다른 배포판(데비안 3.1 포함)은 cramfs 이미지가 압축 해제를 위한 추가 공간을 필요로 하지 않고 제자리에서 마운트될 수 있기 때문에 메모리가 제한된 시스템에서 부팅하기 위해 cramfs를 사용했다. 초기 루트 파일 시스템이 실행되면 커널은 를 첫 번째 프로세스로 실행한다. 종료되면 커널은 실제 루트 파일 시스템이 마운트되었다고 가정하고 를 실행하여 일반 사용자 공간 부팅 프로세스를 시작한다.

**initramfs** 방식(리눅스 커널 2.6.13부터 사용 가능)에서는 이미지가 cpio 아카이브(선택적으로 압축됨) 또는 그러한 아카이브의 연결일 수 있다. 아카이브는 커널에 의해 특별한 tmpfs 인스턴스로 압축 해제되어 초기 루트 파일 시스템이 된다. 이 방식은 중간 파일 시스템이나 블록 드라이버가 커널에 컴파일될 필요가 없다는 장점이 있다. 일부 시스템은 dracut 패키지를 사용하여 initramfs 이미지를 생성한다. initramfs 방식에서는 커널이 를 종료되지 않을 것으로 예상되는 첫 번째 프로세스로 실행한다. 일부 응용 프로그램의 경우 initramfs는 'casper' 유틸리티를 사용하여 unionfs를 활용하여 읽기 전용 루트 파일 시스템 이미지 위에 지속성 계층을 오버레이하는 쓰기 가능한 환경을 생성할 수 있다. 예를 들어, 오버레이 데이터는 USB 플래시 드라이브에 저장되고, 압축된 SquashFS 읽기 전용 이미지는 라이브 CD에 저장되어 루트 파일 시스템 역할을 한다.

커널에 정적으로 컴파일된 알고리즘에 따라 커널은 gzip, bzip2, LZMA, XZ, LZO, LZ4, 및 zstd로 압축된 initrd/initramfs 이미지를 압축 해제할 수 있다.

### 마운트 준비
데비안과 같은 일부 리눅스 배포판은 ATA, SCSI 및 파일 시스템 커널 모듈과 같이 특정 컴퓨터를 부팅하는 데 필요한 것만 포함하는 맞춤형 initrd 이미지를 생성한다. 이러한 이미지에는 일반적으로 루트 파일 시스템의 위치와 유형이 포함되어 있다.

다른 리눅스 배포판(페도라 및 우분투 등)은 보다 일반적인 initrd 이미지를 생성한다. 이들은 루트 파일 시스템의 장치 이름(UUID 포함)으로만 시작하며 부팅 시 다른 모든 것을 찾아야 한다. 이 경우 소프트웨어는 루트 파일 시스템을 마운트하기 위해 복잡한 일련의 작업을 수행해야 한다.
* 부팅 프로세스가 의존하는 모든 하드웨어 드라이버가 로드되어야 한다. 일반적인 구성은 일반 스토리지 장치용 커널 모듈을 initrd에 팩한 다음 핫플러그 에이전트를 호출하여 컴퓨터의 감지된 하드웨어와 일치하는 모듈을 가져오는 것이다.
* 부팅 스크린을 표시하는 시스템에서는 비디오 하드웨어를 초기화하고 사용자 공간 도우미를 시작하여 부팅 프로세스와 동기화하여 디스플레이에 애니메이션을 그린다.
* 루트 파일 시스템이 NFS에 있는 경우, 주 네트워크 인터페이스를 활성화하고 DHCP 클라이언트를 호출하여 DHCP 임대 정보를 얻고, 임대 정보에서 NFS 공유 이름과 NFS 서버 주소를 추출하여 NFS 공유를 마운트해야 한다.
* 루트 파일 시스템이 소프트웨어 RAID 장치에 있는 것으로 보이는 경우, RAID 볼륨이 어떤 장치에 걸쳐 있는지 알 수 있는 방법이 없다. 표준 MD 유틸리티를 호출하여 사용 가능한 모든 블록 장치를 스캔하고 필요한 장치를 온라인 상태로 만들어야 한다.
* 루트 파일 시스템이 논리 볼륨에 있는 것으로 보이는 경우, LVM 유틸리티를 호출하여 해당 볼륨이 포함된 볼륨 그룹을 스캔하고 활성화해야 한다.
* 루트 파일 시스템이 암호화된 블록 장치에 있는 경우, 소프트웨어는 사용자에게 암호를 입력하거나 하드웨어 토큰(스마트카드 또는 USB 보안 동글 등)을 삽입하라는 메시지를 표시하는 도우미 스크립트를 호출한 다음 장치 매퍼를 사용하여 암호 해독 대상을 생성해야 한다.

일부 배포판은 이벤트 기반 핫플러그 에이전트인 udev를 사용하는데, 이는 특정 규칙과 일치하는 하드웨어 장치, 디스크 파티션 및 스토리지 볼륨이 온라인 상태가 될 때 도우미 프로그램을 호출한다. 이를 통해 검색이 병렬로 실행되고 LVM, RAID 또는 암호화의 임의 중첩으로 점진적으로 이어져 루트 파일 시스템에 도달할 수 있다.

루트 파일 시스템이 마침내 보이게 되면, 마운트된 루트 파일 시스템에서 실행할 수 없는 유지 보수 작업이 수행되고, 루트 파일 시스템은 읽기 전용으로 마운트되며, 계속 실행되어야 하는 모든 프로세스(예: 스플래시 스크린 도우미 및 해당 명령 FIFO)는 새로 마운트된 루트 파일 시스템으로 이동된다.

최종 루트 파일 시스템은 단순히 에 마운트될 수 없다. 그렇게 하면 초기 루트 파일 시스템의 스크립트와 도구가 최종 정리 작업을 위해 접근할 수 없게 되기 때문이다.
* initrd에서는 새 루트가 임시 마운트 지점에 마운트된 다음 pivot_root(8) (이 목적을 위해 특별히 도입됨)를 사용하여 제자리로 회전된다. 이로 인해 초기 루트 파일 시스템은 마운트 지점(예: )에 남아 있게 되며, 나중에 일반 부팅 스크립트가 이를 언마운트하여 initrd가 차지하는 메모리를 해제할 수 있다.
* initramfs에서는 초기 루트 파일 시스템을 회전시킬 수 없다. 대신 단순히 비워지고 최종 루트 파일 시스템이 그 위에 마운트된다.

대부분의 초기 루트 파일 시스템은  또는 를 셸 스크립트로 구현하므로 최소한의 셸(일반적으로 /bin/ash)과 일부 필수 사용자 공간 유틸리티(일반적으로 비지박스 툴킷)를 포함한다. 공간을 더욱 절약하기 위해 셸, 유틸리티 및 해당 지원 라이브러리는 일반적으로 공간 최적화가 활성화된 상태(예: gcc의 "-Os" 플래그 사용)로 컴파일되고, 이 목적을 위해 특별히 작성된 최소 버전의 C 라이브러리인 klibc에 링크된다.

### 다른 용도
리눅스 배포판 설치 프로그램은 일반적으로 initramfs에서 전적으로 실행되는데, 영구 저장소가 설정되기 전에 설치 프로그램 인터페이스와 지원 도구를 호스팅할 수 있어야 하기 때문이다.

타이니 코어 리눅스 및 퍼피 리눅스는 initrd에서 전적으로 실행될 수 있다.

### 다른 운영 체제에서의 유사점

Windows Vista 이후로 Windows는 WIM 디스크 이미지 파일에서 부팅할 수 있으며, 이 파일 형식은 공개되어 있다. 이는 하드 링크, 중복 제거된 청크를 지원하고 청크별 압축을 사용한다는 점을 제외하면 ZIP 형식과 유사하다. 이 경우 전체 WIM이 초기에는 RAM으로 로드된 다음 커널 초기화가 이어진다. 다음으로 로드된 WIM은 할당된 드라이브 문자와 함께 SystemRoot로 사용할 수 있다. Windows 설치 프로그램은 이를 사용하여 BOOT.WIM에서 부팅한 다음 INSTALL.WIM을 설치할 Windows 파일 모음으로 사용한다.

또한 윈도우 사전 설치 환경 (Windows PE)도 동일한 방식을 사용하며, 일부 안티바이러스 및 백업/재해 복구 소프트웨어의 별도 부팅 버전의 기반이 된다.

물리적 드라이브에 있는 WIM 또는 VHD 파일에서 항상 부팅하도록 Windows를 설치하는 것도 가능하다. 그러나 Windows 부트로더는 부팅 시 커널 모듈에 대한 .sys 파일을 직접 로드할 수 있으므로 Linux에서 initrd가 필요한 작업은 거의 사용되지 않는다.

## 같이 보기

* dracut
* booster initramfs 생성기
* 안드로이드 장치의 부팅 프로세스
* 리눅스 시작 프로세스
* RAM에서 실행되는 리눅스 배포판 목록
* EFI 부팅 스텁] (아치 리눅스 위키)

## 각주

## 외부 링크
* 데비안 initramfs-tools
* initrd 생성 툴킷의 상세 비교
* 초기 사용자 공간 지원에 대한 커널 문서
*  대체 URL

분류:부팅
분류:리눅스 커널