저는 Cyanogenmod ROM의 커널 소스 코드를 기반으로 맞춤형 Android 커널을 구축하고 있습니다. 내 운영 체제( )의 루트 폴더에 폴더와 파일을 추가하고 싶습니다 /
. 예를 들어, 커널을 컴파일한 후 toto
(절대 경로 = )라는 추가 폴더를 만들고 싶습니다 ./toto
어떤 파일을 편집해야 하는지, 어떻게 작업해야 하는지 잘 모르겠습니다.
rootfs
참고 : ROM 개발자가 아닌 Android 사용자이고 컴퓨터에 파일을 추가하려는 경우관련 Android.SE 문제대신에.
답변1
Android에서는 많은 Linux 기반 시스템과 마찬가지로 커널이 먼저 다음을 설치합니다.파일 시스템 초기화존재하다 /
. initramfs는 RAM에 저장되며 커널 자체(또는 부트로더가 찾을 수 있는 다른 위치)와 함께 저장되는 CPIO 아카이브에서 로드됩니다.
대부분의 데스크탑 Linux 시스템에는 실제 루트 파일 시스템을 마운트하기에 충분한 프로그램과 구성 파일이 포함된 작은 initramfs가 있으며, 이는 /
initramfs를 대체하기 위해 마운트됩니다. 일부 임베디드 Linux 시스템과 마찬가지로 Android는 항상 initramfs를 설치된 상태로 유지합니다. Android의 initramfs에는 및 일부 구성 파일만 포함되어 /init
있습니다 adbd
.
Cyanogenmod의 경우 빌드 지침은 다음에서 찾을 수 있습니다.마이그레이션 가이드. 더 많은 파일을 램디스크(Android 용어로 initramfs 이미지)에 복사하고 싶으므로 해당 파일을 램디스크 PRODUCT_COPY_FILES
에 추가해야 합니다.device_*.mk
장치에 대한 makefile을 만듭니다.
답변2
커널 문서에서는 이미지를 커널 자체에 패키징하는 방법을 설명합니다. ~에서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 파일은 gzip으로 압축된 파일 시스템 이미지(ext2와 같은 일부 파일 형식의 경우 커널에 드라이버가 내장되어 있어야 함)인 반면, 새 initramfs 아카이브는 gzip으로 압축된 cpio 아카이브(tar와 유사하지만 더 단순함)입니다. , cpio(1)) 및 문서/early-userspace/buffer-format.txt)를 참조하세요. 커널의 cpio 추출 코드가 매우 작을 뿐만 아니라 부팅 프로세스 중에 폐기될 수 있는 __init 텍스트와 데이터입니다.
이전 initrd(/init가 아니라 /initrd라고 함)는 일부 설정을 수행한 다음 커널로 돌아가는 프로그램을 실행한 반면, initramfs의 init 프로그램은 커널로 돌아갈 것으로 예상되지 않았습니다. (/init가 제어권을 넘겨야 하는 경우 /를 새 루트 장치로 덮어쓰고 다른 초기화 프로그램을 실행할 수 있습니다. 아래의 switch_root 유틸리티를 참조하세요.)
다른 루트 장치로 전환할 때 initrdivov_root를 실행한 다음 램디스크를 제거합니다. 하지만initramfs는 rootfs입니다. rootfs를 피봇루트하거나 마운트 해제할 수 없습니다. 대신, rootfs의 모든 항목을 삭제하여 공간을 확보하고(-xdev / -exec rm '{}' ';' 찾기), rootfs를 새 루트로 덮어쓰고(cd /newmount; mount --move . /; chroot .), stdin /stdout/stderr 새 /dev/console에 연결하고 새 초기화를 실행합니다.
이는 매우 까다로운 프로세스이므로(명령을 실행하기 전에 명령을 제거해야 함) klibc 패키지에는 이 모든 작업을 대신 수행하는 도우미 프로그램(utils/run_init.c)이 도입되었습니다. 대부분의 다른 패키지(예: busybox)는 이 명령의 이름을 "switch_root"로 지정했습니다.
initramfs를 채웁니다.
2.6 커널 구축 프로세스항상 gzip으로 압축된 cpio 형식의 initramfs 아카이브를 생성하고 이를 생성된 커널 바이너리에 연결하세요. 기본적으로 아카이브는 비어 있습니다(x86의 경우 134바이트).
구성 옵션CONFIG_INITRAMFS_SOURCE(존재하다일반 설정in
menuconfig,
및 live inusr/Kconfig
)을 사용하여initramfs
아카이브의 소스를 지정할 수 있습니다.생성된 바이너리에 자동으로 병합됩니다. 이 옵션은 *를 가리킬 수 있습니다.기존의gzippedcpio
* 아카이브, a목차보관할 파일이 포함되어 있거나텍스트파일 사양은 다음과 같습니다.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
"(커널 빌드 후)위의 파일 형식을 문서화한 사용법 메시지를 받으세요.프로필의 장점 중 하나는
root
권한을 설정하거나 새 아카이브에 장치 노드를 생성하는 데 액세스가 필요하지 않다는 것입니다.(노트이 두 가지 예제 "file" 항목 은 -2.6.* 디렉토리 아래의 " " 디렉토리에서 " " 및 " "
init.sh
파일을 찾을 것으로 예상합니다. 바라보다busybox
initramfs
linux
문서/초기 사용자 공간/Readme자세한 내용은. )커널이 그랬다아니요외부
cpio
도구에 의존하세요. 구성 파일 대신 디렉터리를 지정하면 커널의 빌드 인프라가 해당 디렉터리에서 구성 파일을 생성합니다.(usr/Makefile
부르다scripts/gen_initramfs_list.sh
),구성 파일을 사용하여 디렉터리를 계속 패키징합니다.( 에 입력하면usr/gen_init_cpio
에서 생성됩니다usr/gen_init_cpio.c
.) 커널의 빌드 시간cpio
생성 코드는 완전히 독립적이며 커널의 부팅 시간 추출기도 (분명히) 독립적입니다.