Параметры, передаваемые в командной строке ядра, не должны быть значимыми для ядра: в документации по параметрам ядра сказано
Ядро анализирует параметры из командной строки ядра до «-»; если он не распознает параметр и не содержит «.», параметр передается в 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
файловая система смонтирована.
ld-linux.so
ELF или слишком глубокий сценарий рекурсии или что-то просто не может быть выполнено?