Все ли аргументы ядра действительно используются ядром?

11

Почему Linux допускает init = / bin / bash?

Я прочитал это, ответы говорят, что это KERNEL, запускающий эту программу инициализации.

Тогда я начал задаваться вопросом, Linux обычно поставляется с initramfs, который в конечном итоге монтирует и pivot_root в настоящую корневую файловую систему. Так что же означает этот initаргумент? Путь в initramfs? Или, как я догадался, он не читается ядром, а инициализируется initramfs, чтобы выполнить настоящий init.

Кроме того, root=UUID=xxxxаргумент, действительно ли это читается ядром или просто init initffs, чтобы найти настоящую корневую файловую систему?

Кажется, что я могу передать любой аргумент, который я хочу, в качестве аргументов ядра, поэтому все ли они читаются ядром или, по крайней мере, некоторые из них имеют смысл только для программ пользовательского пространства?

炸鱼 薯条 德里克
источник

Ответы:

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).
plugwash
@ 炸鱼 薯条 德里克 Чтобы указать альтернативную программу вместо /initзагрузки с виртуального диска , вы можете использовать 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
      ;;
...

Здесь для настройки другого расположения файловой системы, чем используется в других типах систем. Надеемся, что для локальных настроек используются разные метки, чем те, которые используются ядром, учитывая единственное задействованное пространство имен.

thrig
источник