당신이 무엇을 하든지, 당신은 가지고 있습니다 initramfs
. 그것 없이는 할 일이 없습니다-그것은 당신에게 부과 된 유일한 파일 시스템입니다. 에서 kernel.org :
rootfs 란 무엇입니까?
Rootfs
특별한의 인스턴스 ramfs
(또는 tmpfs
, 하다의가 활성화 된 경우),
항상 2.6 시스템에 존재하는가. 당신은 마운트 해제 할 수 없습니다rootfs
당신은 init 프로세스를 죽일 수 없어 거의 같은 이유; 빈 목록을 확인하고 처리하는 특수 코드가 아닌 커널이 특정 목록을 비워 둘 수 없도록 작고 간단합니다.
대부분의 시스템은 다른 파일 시스템을 마운트 rootfs
하고 무시합니다. 비어있는 ramfs 인스턴스가 차지하는 공간은 아주 작습니다.
경우 * CONFIG_TMPFS *이 활성화되어 rootfs
사용하는 tmpfs
대신 ramfs
기본적으로. 강제로 ramfs
, 추가 "rootfstype=ramfs"
커널 명령 행에.
initramfs 란 무엇입니까?
모든 2.6 Linux 커널 에는 gzip"cpio"
으로압축 된형식의 아카이브 가 있으며 커널이 부팅 될 때 추출됩니다 rootfs
. 추출 후 커널rootfs
은 파일이있는지 확인합니다."init"
, 하고 그것을 실행이 경우 PID 1. 만약 발견,이 init
과정은 위치와 실제 루트 장치를 설치하고, 시스템에게 길의 나머지 부분을 가져 포함 할 책임이있다 ( 만약에 어떠한). 경우 rootfs
포함되지 않은 init
포함 된 후 프로그램을 cpio
아카이브가 그것으로 추출, 커널은 찾아 루트 파티션을 마운트, 다음의 몇 가지 변형 간부 인하는 기존의 코드를 통해 떨어질 /sbin/init
그 중입니다.
이 모든 것은 여러 가지면에서 이전 initrd와 다릅니다.
이전 initrd는 항상 별도의 파일 인 반면 initramfs 아카이브는 Linux 커널 이미지에 연결되어 있습니다. linux-* / usr 디렉토리는 빌드 중에이 아카이브를 생성하는 데 사용됩니다.
이전 initrd 파일은 gzipped 파일 시스템 이미지 (ext2와 같이 커널에 내장 된 드라이버가 필요한 일부 파일 형식) 였지만 새로운 initramfs 아카이브는 gzip으로 압축 된 cpio 아카이브입니다 (tar 만 더 간단 함, cpio (1) 참조). 및 Documentation / early-userspace / buffer-format.txt). 커널의 cpio 추출 코드는 매우 작을뿐만 아니라 부팅 과정에서 버릴 수있는 __init 텍스트 및 데이터이기도합니다.
이전 initrd (/ init가 아니라 / initrd라고 함)가 실행 한 프로그램은 일부 설정을 수행 한 후 커널로 돌아 왔지만 initramfs의 init 프로그램은 커널로 돌아올 것으로 예상되지 않습니다. (/ init 핸드 오프 제어가 필요한 경우 새 루트 장치로 오버 마운트 /하거나 다른 init 프로그램을 실행할 수 있습니다. 아래 switch_root 유틸리티를 참조하십시오.)
다른 루트 장치를 전환 할 때 initrd는 pivot_root를 실행 한 다음 램 디스크를 마운트 해제합니다. 그러나 initramfs는 rootfs입니다. pivot_root rootfs 나 마운트 해제 할 수 없습니다. 대신 rootfs에서 모든 것을 삭제하여 여유 공간을 확보하고 (find -xdev / -exec rm '{}' ';') rootfs를 새 루트 (cd / newmount; mount --move. /; chroot)로 오버 마운트하십시오. stdin / stdout / stderr을 새 / dev / console에 연결하고 새 init를 실행하십시오.
이 프로세스는 놀랍도록 이해하기 쉬운 프로세스이므로 (명령을 실행하기 전에 명령을 삭제해야 함) klibc 패키지에는 이러한 모든 작업을 수행하는 도우미 프로그램 (utils / run_init.c)이 도입되었습니다. busybox와 같은 대부분의 다른 패키지는이 명령의 이름을 "switch_root"로 지정했습니다.
초기화 initramfs :
2.6 커널 빌드 프로세스는 항상 gzipped cpio 형식 initramfs 아카이브를 작성하고 결과 커널 바이너리에 링크합니다. 기본적으로이 아카이브는 비어 있습니다 (x86에서 134 바이트 사용).
config_INITRAMFS_SOURCE 구성 옵션 (menuconfig의 일반 설정 및 usr / Kconfig에 있음)을 사용하여 initramfs 아카이브의 소스를 지정할 수 있으며,이 바이너리는 결과 바이너리에 자동으로 통합됩니다. 이 옵션은 기존 gzipped cpio 아카이브, 아카이브 할 파일이 포함 된 디렉토리 또는 다음 예제와 같은 텍스트 파일 스펙을 가리킬 수 있습니다.
dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
nod /dev/loop0 644 0 0 b 7 0
dir /bin 755 1000 1000
slink /bin/sh busybox 777 0 0
file /bin/busybox initramfs/busybox 755 0 0
dir /proc 755 0 0
dir /sys 755 0 0
dir /mnt 755 0 0
file /init initramfs/init.sh 755 0 0
"usr / gen_init_cpio"(커널 빌드 후)를 실행하여 위 파일 형식을 설명하는 사용법 메시지를 받으십시오.
구성 파일의 한 가지 장점은 새 아카이브에서 권한을 설정하거나 장치 노드를 작성하기 위해 루트 액세스가 필요하지 않다는 것입니다. (이 두 "file"항목의 예는 linux-2.6. * 디렉토리의 "initramfs"라는 디렉토리에서 "init.sh"및 "busybox"라는 파일을 찾을 것으로 예상됩니다. Documentation / early-userspace / README는 자세한 내용은.)
커널은 외부 cpio 도구에 의존하지 않습니다. 구성 파일 대신 디렉토리를 지정하면 커널의 빌드 인프라는 해당 디렉토리에서 구성 파일을 작성하고 (usr / Makefile은 scripts / gen_initramfs_list.sh를 호출) 구성 파일을 사용하여 해당 디렉토리를 패키지화합니다. usr / gen_init_cpio.c에서 작성된 usr / gen_init_cpio). 커널의 빌드 타임 cpio 생성 코드는 완전히 자체 포함되어 있으며 커널의 부트 타임 추출기도 자체적으로 포함되어 있습니다.