Чи справді всі аргументи ядра використовуються ядром?


11

Чому Linux дозволяє "init = / bin / bash"?

Я читаю це, у відповідях йдеться про те, що KERNEL запускає цю програму init.

Тоді я почав дивуватися, як правило, Linux поставляється з initramfs, який врешті-решт змонтується та перетвориться на реальну кореневу файлову систему. То що означає цей initаргумент? Шлях в інітрамфах? Або, як я здогадався, воно читається не ядром, а init initramfs для виконання справжнього init.

Крім того, root=UUID=xxxxаргумент - це те, що дійсно читається ядром або просто за допомогою initramf, щоб знайти справжню кореневу файлову систему?

Схоже, я можу передавати будь-який аргумент, який я хочу, як аргументи ядра, тому чи всі вони читаються ядром або принаймні деякі з них мають значення лише для програм простору користувачів?

Відповіді:


18

Параметри, передані в командному рядку ядра, не повинні мати значення для ядра: документація щодо параметрів ядра говорить

Ядро аналізує параметри з командного рядка ядра до “-”; якщо він не розпізнає параметр і не містить '.', параметр передається init: параметри з '=' переходять у середовище init, інші передаються як init аргументи командного рядка. Все після "-" передається як аргумент init.

Це не стосується initі rootякі насправді є параметрами ядра, а ядром обробляється. На них також може діяти користувацький простір, оскільки вони з'являються у /proc/cmdline. (Так, наприклад, systemd враховує quietпараметр ядра, щоб зменшити його вихід.)

Коли ядро ​​завантажується за допомогою initramfs, rootпараметр не використовується ядром безпосередньо, а initпараметр використовується лише у разі rdinitвідмови. initзапускається обробка kernel_init, яка працює наступним чином:

  • якщо є доступна команда "виконувати ramdisk" (або значення, вказане rdinitв командному рядку ядра, або /init), ядро ​​намагається виконати це;
  • якщо це не вдається, і є команда "виконати команду" (значення, вказане initв командному рядку ядра), ядро ​​намагається виконати це, і панікує, якщо не може;
  • в крайньому випадку , ядро намагається бігти /sbin/init, /etc/init, /bin/init, і /bin/sh; якщо ніхто з них не може бути запущений, це панікує .

Коли є initramfs, все це відбувається там, і ядро ​​не встановлюється цільовим об'ємом. Що відбувається після запуску ядра першої initпрограми (як правило, /initскрипт в initramfs), залежить від програми, а не ядра. Аргументи, які не передані init, все ще доступні, /proc/cmdlineякщо встановлена /procфайлова система.


Також трохи цікаво, що робити, якщо init-in-the-initramfs - це файл set-uid-non-root? Файл без виконуваного біта? Чи все одно він буде запускатися як root? Що робити, якщо це зламаний ELF або не вдалося знайти ld-linux.soELF або занадто глибокий рекурсійний сценарій, або що-небудь просто неможливо виконати?
炸鱼 薯条 德里克

3
Я впевнений, що ядро ​​не завантажує програму, вказану в "init =", з initramfs. Він використовується initramfs, тоді він, здається, працює як звичайно перед запуском визначеної користувачем програми init (не впевнений, чи це ядро, що робить це чи код у initramfs).
підключення

@ 炸鱼 薯条 德里克 Щоб вказати альтернативну програму замість /initзавантаження з ramdisk, можна скористатися rdinit=/path/toпараметром завантаження.
pizdelect

3

Передача спеціальних аргументів ядра - це один із способів налаштування системи під час встановлення KickStart, наприклад, PXE-сервер може встановити:

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

де labпотім використовується в конфігурації KickStart для того, щоб робити інші речі, ніж для інших збірок системи:

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

Тут можна встановити інший макет файлової системи, ніж використовується для інших типів системи. Сподіваємось, для локальних налаштувань використовуються різні мітки, ніж ядро, враховуючи єдину область імен.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.