커널 (v4.1-rc5)과 busybox (v1.23.2)로 채워진 initramfs로 구성된 매우 작은 Linux 시스템을 만들고 있습니다. 대부분 잘 작동하지만 임베디드 initramfs와 외부 initramfs 중 어느 것을 사용하는지 / init에서 명령 실행 동작의 차이를 관찰합니다.
/ init 스크립트는 다음과 같습니다.
#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t sysfs none /sys
mount -t proc none /proc
echo "Welcome"
while true
do
setsid cttyhack /bin/sh
done
그런 다음 커널 .config의 CONFIG_INITRAMFS_SOURCE 옵션을 initramfs의 모든 폴더가 들어있는 디렉토리로 설정하거나
find . | cpio -H newc -o | gzip > ../rootfs.cpio.gz
그것을 구축합니다.
그런 다음 CONFIG_INITRAMFS_SOURCE 설정 여부에 관계없이 커널을 컴파일하면 시스템의 두 가지 변형이 발생합니다.
initramfs가 포함 된 이미지
bzImage + rootfs.cpio.gz (외부 initramfs)
내가 지금 사용하는 사람들을 시작할 때 qemu
qemu-system-x86_64 -enable-kvm -kernel bzImage
또는
qemu-system-x86_64 -enable-kvm -kernel bzImage -initrd rootfs.cpio.gz
다음과 같은 동작 차이가 있습니다.
버전 2 (외부 initramfs)를 사용하면 모든 것이 제대로 작동하고 "환영"이 표시되고 프롬프트가 표시됩니다. 그러나 버전 1 (내장 initramfs)에서는 경고 메시지가 나타납니다.
unable to open an initial console
"환영합니다"가 표시되지 않고 프롬프트가 표시됩니다.
프로세스를 이해하는 한, 두 버전의 initramfs는 동일한 폴더에서 파일을 빌드하거나 커널이 빌드하기 때문에 동일한 파일을 포함해야합니다.
이 행동에 대한 설명을 도와 줄 사람이 있는지 궁금합니다.
* 업데이트 *
mikeserv가 의견에서 말했듯이 커널에는 기본적으로 최소 내장 initramfs가 포함되어 있습니다. 이것은 외부를 사용할 때 여전히 존재하지만 직접 포함하면 덮어 씁니다. 사양과 달리 실제로 비어 있지는 않지만 dev 폴더, 루트 폴더 및 / dev / console 장치가 포함되어 있습니다. 그런 다음이 장치는 외부 initramfs를 사용할 때 사용되지만 직접 내장하면 덮어 씁니다. 따라서 mknod -m 622 initramfs_src/dev/console c 5 1
자신을 임베드 할 때 initramfs 소스에 / dev / console 장치를 포함시켜야합니다 .
Mikeserv, frostschutz 및 JdeBP에게 감사의 말을 전합니다.
/dev/console
내장 권한에 어떤 권한이 설정되어 있습니까? 나는 두 가지 경우 에 누가 포장 을 하는지 에 대한 차이점이 있다고 생각합니다 .