Init'in gömülü veya harici initramf ile yürütülmesindeki fark nedir?


10

Sadece çekirdek (v4.1-rc5) ve busybox (v1.23.2) ile doldurulmuş bir initramfs içeren çok az bir Linux sistemi inşa ediyorum. Çoğunlukla iyi çalışıyor, ancak harici bir initramfs mi yoksa harici bir initramfs mi kullanacağım / init içinde komut yürütme davranışında bir fark gözlemliyorum.

/ İnit betiği:

#!/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

Sonra, .config çekirdeğinde CONFIG_INITRAMFS_SOURCE seçeneğini initramfs için tüm klasörleri içeren dizine ayarlıyorum veya çalıştırıyorum

find . | cpio -H newc -o | gzip > ../rootfs.cpio.gz

inşa etmek.

Daha sonra, CONFIG_INITRAMFS_SOURCE ayarlı veya ayarsız çekirdeği derlediğimde, sistemimin iki varyantı ile karşılaşıyorum:

  1. Initramfs gömülü görüntü

  2. bzImage + rootfs.cpio.gz (harici initramfs)

şimdi kullanmaya başladığımda qemu

qemu-system-x86_64 -enable-kvm -kernel bzImage

veya

qemu-system-x86_64 -enable-kvm -kernel bzImage -initrd rootfs.cpio.gz

Aşağıdaki davranış farkını alıyorum:

sürüm 2 (harici initramfs) ile her şey iyi çalışıyor, "Hoş Geldiniz" görüntülenir ve bir istem alırsınız. Ancak sürüm 1 ile (gömülü initramfs) uyarıyı alıyorum

unable to open an initial console

"Hoş Geldiniz" görüntülenmiyor ve istemimi alıyorum.

Süreci anladığım kadarıyla, initramfs'ın bu iki sürümü aynı dosyaları içermelidir, çünkü aynı klasörden oluşturduğumdan (veya çekirdeği oluşturduğumdan).

Acaba kimse bana bu davranış için bir açıklama ile yardımcı olabilir mi?

* GÜNCELLEME *

mikeserv'in yorumlarda belirttiği gibi, Çekirdek varsayılan olarak minimal gömülü initramfs içerir. Harici bir tane kullanırken bu hala mevcuttur, ancak kendiniz gömülürseniz üzerine yazılır. Spesifikasyonun aksine, bu gerçekten boş değil, ama bir dev klasörü, bir kök klasör ve / dev / konsol cihazı içeriyor. Bu cihaz daha sonra harici bir initramfs kullanılırken kullanılır, ancak kendiniz gömülürseniz üzerine yazılır. Bu yüzden mknod -m 622 initramfs_src/dev/console c 5 1, kendi cihazınızı yerleştirirken initramfs kaynağınıza / dev / console cihazını eklemeniz gerekir.

Mikeserv, frostschutz ve JdeBP'ye kafamı bulamamda yardımcı oldukları için çok teşekkürler!


/dev/consoleYerleşik olanınızda izin verilen izinler nelerdir ? Bence fark , iki durumda ambalajın kim tarafından yapılmasıyla ilgili olabilir .
mikeserv

Benzer bir soru elbette stackoverflow.com/questions/10437995 .
JdeBP

mikeserv konsol cihazı her iki derlemede de aynı izinlere ve sahipliğe sahiptir.
clw

@JdeBP Bu kadar benzer olup olmadığından emin değilim, çünkü her iki durumda da önyükleme yapıyorum, bir komut istemi alıyorum ve bir konsol cihazım var. Sadece bir initte yankıyı yürütür ve diğerinde yapamaz.
clw

1
İnitramf'larda izinlere sahip olmasanız bile izinler nasıl aynı olabilirdi?
mikeserv

Yanıtlar:


2

Gerçekten özdeş mi?

/usr/src/linux/usr/initramfs_data.cpio.gzYerleşik olanı burada açıklandığı gibi bzImage'den bulabilir veya çıkarabilirsiniz: https://wiki.gentoo.org/wiki/Custom_Initramfs#Salvaging

Bu yerleşik olanı kullanır ve bunun yerine harici olanı kullanırsanız, çalışır mı?

Hala farklıysa, çekirdeğin kendisi aynı mıdır? ( /proc/config.gzher ikisini de karşılaştırın )

Biraz fark olmalı. İnitramflerin nereden geldiğinin çekirdeğin umurunda olmadığının farkında değilim. Parametreyi qemugeçerken farklı ayarları kullanma şüphesi var -initrd...

Bir tesadüf, /initbana sonsuz yumurtlama benziyor. setsiddeğil exec. Yanlış mıyım?


1
Bu cevap tüm sorular gibi görünüyor.
JdeBP

1
@JdeBP: Dördüncü boyutlu düşünmüyorsun!
frostschutz

1
@frostschutz Cevabınız için çok teşekkürler! Çekirdeğin oluşturduğu initramfs'ı (usr / initramfs_data.cpio.gz) harici olarak kullandığımda da iyi çalışıyor! Ayrıca, katıştırılmış initramfs ile derlenmiş çekirdeği harici bir tanesiyle beslediğimde, dış katıştırılmışın üzerine yazılsa bile uyarı görünür ( kernel.org/doc/Documentation/filesystems/… ). Yani muhtemelen qemu -initrd değil ama çekirdeğin içindeki bir şey. Yine de CONFIG_INITRAMFS_SOURCE dışında başka bir şey değiştirmedim ..
clw

@frostschutz Yanıtlayan On a sidenote, your /init looks like its spawning infinite shells to me. setsid is not exec. Am I wrong?: Döngü, getty veya benzeri araçları taklit eder, çünkü sho kabuk çıkana kadar blokları çağırır .
stefanjunker

@ setefanjunker ve bu iyi olurdu, setid hiç engellemiyor ...
frostschutz

1

Ayrıca, Buildroot 2018.02'nin bununla nasıl başa çıktığıyla da ilgilenebilirsiniz.

İnitramfs ( BR2_TARGET_ROOTFS_INITRAMFS=y) veya initrd ( BR2_TARGET_ROOTFS_CPIO=n) yöntemini her kullandığınızda /init, kök dosyalarınıza aşağıdakileri ekler https://github.com/buildroot/buildroot/blob/2018.02/fs/cpio/init

#!/bin/sh
# devtmpfs does not get automounted for initramfs
/bin/mount -t devtmpfs devtmpfs /dev
exec 0</dev/console
exec 1>/dev/console
exec 2>/dev/console
exec /sbin/init "$@"

Kopyalama https://github.com/buildroot/buildroot/blob/2018.02/fs/cpio/cpio.mk tarafından yapılır :

# devtmpfs does not get automounted when initramfs is used.
# Add a pre-init script to mount it before running init
define ROOTFS_CPIO_ADD_INIT
    if [ ! -e $(TARGET_DIR)/init ]; then \
        $(INSTALL) -m 0755 fs/cpio/init $(TARGET_DIR)/init; \
    fi
endef

Ayrıca, init yolunun /initinitramfs için olduğunu bilmek de yararlıdır /sbin/init: Aksi gibi init = / path / to / program komutunun init olarak başlatılmamasına ne sebep olabilir?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.