Сценарий / 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 жестко закодированы в ядре?

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, если необходимые модули статически связаны с изображением ядра.

  • Получение клавиатуры для работы в debian 6.0 для разблокировки корневого раздела
  • Как изменить загрузочное ядро ​​usb live w / persistent running Kali
  • vmlinuz и initrd не найдены после сборки ядра?
  • Как регистрировать вывод приложения-демона?
  • Почему мой первый ramdisk настолько велик?
  • Как я могу заставить ядро ​​Ubuntu терпеть неудачу при установке / и перейти в оболочку для восстановления initramfs?
  • создание моего собственного initrd, как заполнить каталог dev
  • Как настроить initrd через linuxrc
  • Как я могу удаленно отлаживать сломанный initrd?
  • Использование qemu для загрузки OpenSUSE (или любой другой ОС) с настраиваемым ядром
  • Загружено ли все ядро ​​в память при загрузке?
  • Использование initrd / initramfs в качестве корневой файловой системы
  • Interesting Posts

    Почему баобаб оценивает мое использование менее чем наполовину по сравнению с du или pan_quota?

    Прозрачный прокси с кальмаром 3.1 на RHEL 6

    Изменен SSH-порт, не разрешив его через брандмауэр, заблокированный сейчас – что делать?

    Как команда «top» показывает результаты в реальном времени?

    Можно ли разделить задачу «root» на несколько «более мощных» пользователей?

    Как я могу найти неравномерные разрешения файлов в структуре каталогов?

    Невозможно удалить файлы в качестве пользователя root с использованием последовательного поперечного кабеля RS232

    В Gentoo как найти список пакетов, установленных после определенной даты?

    выполнять команду по движению указателя, ждать и возвращаться?

    ssh localhost без пароля не работает на Fedora 14

    xkbmap remap PrtScr и Insert Keys to Home и Escape

    Замените неисправный жесткий диск на debian

    Как скопировать папку другим, но НЕ путем слияния / добавления

    Попытка выйти из сценария с кодом состояния, но получить «неожиданный конец файла»,

    Установка MPFR предыдущих версий столкновения GMP

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