Tüm çekirdek argümanı çekirdek tarafından gerçekten kullanılıyor mu?


11

Linux neden 'init = / bin / bash' a izin veriyor?

Bunu okudum, cevaplar KERNEL'in bu başlangıç ​​programını çalıştırdığını söylüyor.

Daha sonra merak etmeye başladım, Linux genellikle sonunda ve gerçek kök dosya sistemine pivot_root bağlayacak bir initramfs ile geliyor. Peki bu initargüman ne anlama geliyor? Initramfs içindeki yol? Ya da tahmin ettiğim gibi, çekirdek tarafından değil gerçek init yürütmek için initramfs init tarafından okunuyor.

Ayrıca, root=UUID=xxxxargüman, gerçek çekirdek dosya sistemini bulmak için çekirdek tarafından mı yoksa sadece initramfs tarafından mı okunuyor?

Çekirdek argüman olarak istediğim herhangi bir argümanı geçirebileceğim gibi, hepsi çekirdek tarafından okunuyor mu yoksa en azından bazıları sadece kullanıcı alanı programları için anlamlı mı?

Yanıtlar:


18

Çekirdek Komut satırına geçirilen parametreler çekirdek için anlamlı olması gerekmez: çekirdek parametreleri dokümantasyon diyor

Çekirdek, çekirdek komut satırından parametreleri “-” ye kadar ayrıştırır; bir parametreyi tanımıyorsa ve bir '.' içermiyorsa, parametre init'e aktarılır: '=' ile parametreler init ortamına gider, diğerleri init'e komut satırı bağımsız değişkenleri olarak iletilir. “-” den sonraki her şey başlangıca bir argüman olarak aktarılır.

Bu, çekirdek parametreleri için geçerli değildir initve rootbunlar çekirdek parametreleri tarafından ele alınır. Ayrıca göründükleri için kullanıcı alanı tarafından da kullanılabilirler /proc/cmdline. (Böylece, örneğin systemd quiet, çıktısını azaltmak için çekirdek parametresini dikkate alır .)

Çekirdek bir initramfs ile önyüklendiğinde, rootparametre doğrudan çekirdek tarafından kullanılmaz ve initparametre yalnızca rdinitbaşarısız olursa kullanılır . initbaşlangıç ​​işlenir ve kernel_initaşağıdaki gibi çalışır:

  • “ramdisk yürütme komutu” ( rdinitçekirdek komut satırında verilen değer /init) veya erişilebilir olan bir çekirdek varsa, çekirdek bunu çalıştırmayı dener;
  • bu başarısız olursa ve bir "yürütme komutu" ( initçekirdek komut satırında verilen değer ) varsa, çekirdek bunu çalıştırmayı dener ve yapamazsa panik yapar;
  • son çare olarak, çekirdek çalıştırmayı dener /sbin/init, /etc/init, /bin/initve /bin/sh; bunların hiçbiri çalıştırılamazsa panik yapar .

Bir initramfs olduğunda, bunların hepsi orada olur ve hedef birim çekirdek tarafından monte edilmez. Çekirdek ilk programı çalıştırdıktan sonra ne olur init(genellikle, /initinitramfs içindeki komut dosyası) çekirdeğe değil, programa bağlıdır. Aktarılmayan bağımsız değişkenler , dosya sistemi takılıysa initkullanılabilir ./proc/cmdline/proc


Ayrıca biraz meraklı, init-in-the-initramfs bir set-uid-root olmayan bir dosyaysa? Yürütülebilir biti olmayan bir dosya mı? Yine de kök olarak çalıştırılacak mı? Ya ELF bozulursa veya ld-linux.soELF veya özyineleme çok derin komut dosyası bulamazsa veya herhangi bir şey çalıştırılamazsa ne olur?
德里克 薯条 德里克

3
Çekirdek initramfs "init =" belirtilen programı yüklemez eminim. Bir initramfs kullanımda, o zaman kullanıcı tarafından belirtilen init programı çalıştırılmadan önce normal gibi çalışıyor gibi görünüyor (bunu yapan çekirdek veya initramfs kod mu emin değilim).
plugwash

@ 炸鱼 薯条 德里克/initRamdisk'ten önyükleme yapmak yerine alternatif bir program belirtmek için rdinit=/path/toboot parametresini kullanabilirsiniz .
pizdelect

3

Özel çekirdek bağımsız değişkenlerini iletmek, KickStart yüklemesi sırasında sistemi özelleştirmenin bir yoludur, örneğin bir PXE sunucusu şunları ayarlayabilir:

linuxefi /c7/vmlinuz ks=http://.../ks/c7 lab ksdevice=eth0 net.ifnames=0 biosdevname=0

nerede labdaha sonra diğer sistem kurar için daha farklı şeyler yapmak KickStart yapılandırmasında kullanılır:

%pre
...
case " $(cat /proc/cmdline)" in
   ...
   *\ lab*)
      filesystems_lab
      ;;
   *)
      filesystems_common
      ;;
...

Burada, diğer sistem türlerinde kullanılandan farklı bir dosya sistemi düzeni oluşturmak için. Yerel özelleştirmeler için, ilgili tek ad alanı göz önüne alındığında, çekirdek tarafından kullanılandan farklı etiketler kullanılmasını umuyoruz.

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.