Сценарий / init (или / linuxrc) создает временные узлы устройства в / dev?

Учитывая, что GRUB выполняет следующие строки:

kernel /vmlinuz root=/dev/sda1 ro initrd /initrd 

Что касается загрузки, как ядро ​​Linux узнает о узле устройства /dev/sda1 ?

Я знаю, что изображения initrd / initramfs содержат модули для хранения (и т. Д.) Устройств, которые загружаются в память, чтобы обеспечить доступ к хранилищу. Что меня беспокоит, так это то, как ядро ​​анализирует параметр ядра root=/dev/sda1 .

/linuxrc сценарий /init (или /linuxrc ) в initrd / initramfs каталог /dev а затем узел устройства /dev/sda1 ? Или «основные» и «второстепенные» номера для /dev/sda1 жестко закодированы в ядре?

  • Что эквивалентно mkinitcpio.conf на debian?
  • Правильная настройка операционной системы на зашифрованном диске LUKS с алгоритмом non-aes для дистрибутива на основе yum (CentOS)
  • Зачем нужно указывать два изображения init - initrd и boot - внутри KVM для загрузки в bash?
  • Взаимодействие команд initrd и системных служб, выполняющих то же самое
  • Почему бы нам не включить драйверы файловой системы в ядро, а не использовать Initrd / Initramfs
  • Как настроить initrd через linuxrc
  • Добавление команд в изображение initrd
  • Как запустить процесс в определенном каталоге?
  • 3 Solutions collect form web for “Сценарий / init (или / linuxrc) создает временные узлы устройства в / dev?”

    Если у вас есть initramfs, ядро ​​просто распаковывает и монтирует initramfs и выполняет /init после этого. Все остальное будет обрабатываться исполняемым файлом /init . Это также означает, что ядро ​​не монтирует устройство, указанное в root параметре загрузки.

    В разных дистрибутивах используются разные рамки initramfs, например, dracut для Fedora или initramfs-tools для Debian. Наиболее распространенные решения – либо использовать что-то вроде udev , mdev или devtmpfs . Некоторые могут также просто использовать MAKEDEV для создания статического макета или иметь файлы устройств, уже интегрированные в их изображение.

    Если вы загружаете без initramfs, ядро ​​может просто загружаться с устройств с известными основными / младшими номерами, например /dev/sda1 но не с устройств lvm.

    Основные любые незначительные номера корневого устройства хранятся в изображении ядра (для получения дополнительной информации см. Справочную rdev ).

    Тем не менее аргументы командной строки ядра НЕ интерпретируются ядром. Начальный ramdisk, initrd, содержит файловую систему с минимальным linux, который обычно выполняет часть интерпретации. Как работает initrd, зависит от вашего дистрибутива. Он может просто содержать узел / dev / sda1 или некоторый скрипт / программу, которая создает его во время выполнения.

    Если вы используете Linux на базе Debian, вы можете распаковать свой ramdisk так:

     mkdir /tmp/initrd cd /tmp/initrd zcat /boot/path/to/initrd | cpio -iv 

    Сценарии debian – это скрипты, и вы можете посмотреть, как это работает. После того, как ядро ​​распакует initrd, он запускает скрипт init который вы теперь найдете в /tmp/initrd . Обратите внимание на блок, где он говорит for x in $(cat /proc/cmdline); do for x in $(cat /proc/cmdline); do .

    В /proc/cmdline – аргументы, переданные с помощью Grub (вы можете проверить / проверить, что прямо сейчас с вашей оболочкой!). Если вы захотите немного погрузиться в Debians initrd, вы заметите, что вы можете заставить ваше ядро ​​/ initrd использовать общий ресурс NFS в качестве корневой файловой системы, передав параметр root=/dev/nfs с Grub. Когда вы это делаете, ни один узел /dev/nfs не создается или не монтируется. Он просто говорит initrd, что делать.

    В конце каждый такой initrd будет запускать команду, предоставляемую некоторой опцией, такой как init= или default /sbin/init

    Возвращаясь к исходному вопросу в заголовке: yes / init (скорее всего) создает этот узел во время выполнения. Он использует все виды программ / эвристики / voodoo, чтобы выяснить, как смонтировать корневую файловую систему.

    Начальный код запускает программу под названием mdev которая в основном является сокращенной версией udev . Это сканирует все устройства и создает исходное содержимое папки /dev . Затем ядро ​​может эффективно выполнить mount /dev/sda1 / и начать поиск всей системы.

    Смотрите здесь , вы хотите узнать больше о mdev .

    Основные и младшие номера устройств на самом деле жестко закодированы в те модули ядра, которые являются драйверами устройств и которые используют статические основные номера (см., Например, Documentation / devices.txt в источниках ядра). Большинство (все?) Модулей ядра диска диска попадают в эту категорию. Итак, как говорит @Ulrich Dangel, некоторые ядра могут загружаться без initramfs / initrd, если необходимые модули статически связаны с изображением ядра.

    Linux и Unix - лучшая ОС в мире.