Apakah semua argumen kernel benar-benar digunakan oleh kernel?

11

Mengapa Linux mengizinkan 'init = / bin / bash'?

Saya membaca ini, jawaban mengatakan KERNEL menjalankan program init ini.

Kemudian saya mulai bertanya-tanya, Linux biasanya datang dengan initramfs, yang akhirnya akan me-mount dan pivot_root ke sistem file root yang sebenarnya. Jadi apa arti initargumen ini ? Jalan di initramfs? Atau seperti yang saya duga, itu tidak dibaca oleh kernel tetapi oleh init dari initramfs untuk mengeksekusi init yang sebenarnya.

Juga, root=UUID=xxxxargumen, adalah yang benar-benar dibaca oleh kernel atau hanya dengan init dari initramfs untuk menemukan akar filesystem nyata?

Sepertinya saya bisa memberikan argumen apa pun yang saya inginkan sebagai argumen kernel, jadi apakah semuanya dibaca oleh kernel atau setidaknya beberapa di antaranya hanya bermakna untuk program userspace?

炸鱼 薯条 德里克
sumber

Jawaban:

18

Parameter yang dikirimkan pada baris perintah kernel tidak harus bermakna untuk kernel: dokumentasi parameter kernel mengatakan

Kernel mem-parsing parameter dari baris perintah kernel hingga “-”; jika tidak mengenali parameter dan tidak mengandung '.', parameter akan diteruskan ke init: parameter dengan '=' masuk ke lingkungan init, yang lain dilewatkan sebagai argumen baris perintah untuk init. Semuanya setelah "-" diteruskan sebagai argumen untuk init.

Ini tidak berlaku untuk initdan rootyang benar-benar parameter kernel, dan ditangani oleh kernel. Mereka juga dapat ditindaklanjuti oleh ruang pengguna, karena mereka muncul di /proc/cmdline. (Jadi misalnya systemd memperhitungkan quietparameter kernel untuk mengurangi outputnya.)

Ketika kernel di-boot dengan initramfs, rootparameter tidak digunakan oleh kernel secara langsung, dan initparameter hanya digunakan jika rdinitgagal. initstartup ditangani kernel_init, yang berfungsi sebagai berikut:

  • jika ada "ramdisk execute command" (baik nilai yang diberikan rdinitpada baris perintah kernel, atau /init) yang dapat diakses, kernel mencoba menjalankannya;
  • jika gagal, dan ada "eksekusi perintah" (nilai yang diberikan initpada baris perintah kernel), kernel mencoba untuk menjalankannya, dan panik jika tidak bisa;
  • sebagai upaya terakhir, kernel mencoba untuk menjalankan /sbin/init, /etc/init, /bin/init, dan /bin/sh; jika tidak ada yang bisa dijalankan, itu panik .

Ketika ada initramfs, semua ini terjadi di sana, dan volume target tidak di-mount oleh kernel. Apa yang terjadi setelah kernel menjalankan initprogram pertama (biasanya, /initskrip di initramfs) bergantung pada program, bukan kernel. Argumen yang tidak diteruskan initmasih tersedia /proc/cmdlinejika /procsistem file dipasang.

Stephen Kitt
sumber
Juga sedikit penasaran, bagaimana jika init-in-the-initramfs adalah file set-uid-non-root? File tanpa bit yang dapat dieksekusi? Apakah itu akan tetap dijalankan sebagai root? Bagaimana jika ELF rusak atau tidak dapat menemukan ld-linux.soELF atau skrip terlalu rekursi atau apa saja yang tidak dapat dijalankan?
炸鱼 薯条 德里克
3
Saya cukup yakin kernel tidak memuat program yang ditentukan dalam "init =" dari initramfs. Jika sebuah initramfs digunakan maka tampaknya berjalan seperti biasa sebelum program init yang ditentukan pengguna dijalankan (tidak yakin apakah itu kernel yang melakukan ini atau kode dalam initramfs).
plugwash
@ 炸鱼 薯条 德里克 Untuk menentukan program alternatif alih-alih /initsaat boot dari ramdisk, Anda dapat menggunakan rdinit=/path/toparameter boot.
pizdelect
3

Melewati argumen kernel khusus adalah salah satu cara untuk menyesuaikan sistem selama instalasi KickStart, misalnya server PXE dapat mengatur:

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

di mana labkemudian digunakan dalam konfigurasi KickStart untuk melakukan hal-hal yang berbeda dari untuk membangun sistem lain:

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

Di sini untuk mengatur tata letak sistem file yang berbeda dari yang digunakan pada tipe sistem lainnya. Mudah-mudahan label yang berbeda digunakan untuk kustomisasi lokal daripada yang digunakan oleh kernel, mengingat namespace tunggal yang terlibat.

thrig
sumber