LINUX.ORG.RU

А как ядро при страте монтирует rootfs?

 , ,


0

2

Как то не приходилось задумываться на эту тему, а тут при очередном ковырянии с не intel железками стало интересно.

Положим в cmdline ядру при старте передается в том числе что-то типа rootfs=/dev/mmcblk0p1. Но до того, как смонтирована rootfs никакого /dev/mmcblk0p1 быть не может. Понятно, что /dev/mmcblk0p1 это лишь некая абстракция для доступа к устройству из userspace. Если драйвер вкомпилен в ядро, то он подцепляет устройство, и из ядра с ним можно работать. Но было бы интересно понять механизм монтирования rootfs самим ядром. Может там есть какие интересные нюансы.

При запуске ядро разбирает строку параметров ядра и ищет там параметр «root=...», в нём указывается расположение корневой файловой системы.

В процессе запуска ядро инициализирует драйверы в своём составе и эти драйверы наполняют виртуальную файловую систему devtmpfs файлами устройств.

Далее если есть файл устройства указанный в параметре root, то ядро пробует его смонтировать.

Если так же есть поддержка файловой системы на устройстве корневой файловой системы, то она монтируется и ядро начинает процедуру запуска, вызывая сценарий Init (/sbin/init, /init).

Если драйвер для доступа к устройству корневой файловой системы собран модулем, то для запуска в такой конфигурации используется Initramfs.

Initramfs - это минимальный образ Linux системы в который помещаются нужные драйверы (модули) для запуска и содержится свой небольшой сценарий Init (/sbin/init, /init).

В этом сценарии так же написан код для монтирования устройства корневой файловой системы указанном в параметре root=.

Далее вызывается сценарий Init из Initramfs и в этом сценарии вызывается утилита смены корневой файловой системы switch_root или pivot_root. Т.к. в данный момент корнем является файловая система в Initramfs.

Так же помимо загрузки модулей из Initramfs в нём же могут выполняться прочие действия перед монтированием корневой файловой системы. Например, поднятие группы томов LVM, открытие шифрованного контейнера с файловой системой, монтирование корня по UUID файловой системы, прочее.

Помимо некоторых параметров, обрабатываемых самим ядром, например тот-же параметр «root=», прочие параметры rootfs=, dolvm, прочее обрабатываются сценарием Init в Initramfs или сценарием Init уже на корневой файловой системе.

anonymous
()

Но до того, как смонтирована rootfs никакого /dev/mmcblk0p1 быть не может.

Ну почему же? initramfs как минимум.

Но в контексте твоего вопроса — да, root= парсится вручную и /dev/ просто отрезается, если есть.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)

Для упрощения нахождения ядром корневого раздела загрузчики могут передавать цифровые значения у root=NNN. Это шестнадцатеричное значение мажор_минор корневого раздела. Для /dev/sda1 мажор 8, минор - 1, получается root=801. Это касается и режима vga. Когда-то (во времена первых ядер) так передавалась информация и о swap, почему — объяснять долго.

vodz ★★★★★
()
Ответ на: комментарий от targitaj

у арча отличная вики

Чего там отличного? По предложению в каждом пункте ни о чём.

vodz ★★★★★
()
Ответ на: комментарий от targitaj

Мало того, что в этом вики излагаются практически общеизвестные вещи, так сразу понеслись с порога всякие efi/uefi, которые в данном случае совсем не в тему.

zloy_starper ★★★
() автор топика

Пока ждал ответов сам заглянул в name_to_dev_t(...). Но все равно, всем спасибо за ответы.

zloy_starper ★★★
() автор топика
Ответ на: комментарий от zloy_starper

Мало того, что в этом вики излагаются практически общеизвестные вещи

А какие вещи должны излагаться в вики? Тайные протоколы сионских мудрецов может быть?

anonymous
()
Ответ на: комментарий от intelfx

Ну дык, благодарствуем.

Осталось теперь разобраться, почему не подцепляется rootfs с диска вместо sd/emmc. Может быть конвертер имен не все имена типа /dev/xxx может проглотить.

zloy_starper ★★★
() автор топика

Уби не стартует да ? Ну дык ват оно че наверное , а там на Нибиру стартует даже не с лайва , надо просто подождать идёт апдейт

anonymous
()
Ответ на: комментарий от intelfx

Есть железка с rk3399 на борту. Хочу, чтобы rootfs монтировался не с sdcard/emmc, а с ssd. Дока у них оставляет желать лучшего. Поправил прямо на sdcard путь к rootfs. Получил облом. Вот наконец только сегодня нашел, чем эту железяку цеплять к отладочному порту. Увидел, что uboot выдал ругань: Para CRC failed! Видимо, когда на карточку записываются образы различных компонентов, то вычисляется и записывается куда-то CRC.

zloy_starper ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.