Для чего в опциях загрузки Linux с initrd указывают параметр root?
Не понимаю, с какой целью в любом загрузчике ядро грузится с параметрами initrd и root. Как везде написано, initrd - виртуальная файловая система, которая загружается ядром в память и монтируется в корень на начальном этапе загрузке. Затем там исполняется скрипт, который и монтирует настоящий корневой раздел. Как я понимаю, вся информация о "настоящем" корне должна находится именно в этом скрипте, тогда с какой целью в параметраз загрузки указывается root раздел? Эта информация нужна ядру, по сути, только тогда, когда не используется initrd и монтирование корня происходит при помощи модулей.
Спасибо за ответ. Вы сказали, что "детектор оборудования" грузит драйвера, но разве в ядре есть драйвера для ext4? И тогда почему мы не указываем пути ко всем жестким дискам, чтобы этот детектор их нашел и подгрузил нужные драйвера? Как я понимаю, это все указано в fstab, но чтобы его прочитать сперва нужно примонтировать настоящий корень, а он монтируется из initrd.
с какой целью в любом загрузчике ядро грузится с параметрами initrd и root.
Попробуй-ка загрузиться на FreeBSD на нестандартном железе - вспомнишь как всех чертей зовут, потому что перед этим нужно создать конфиг ядра с описанием устройств и пересобрать ядро по этому конфигу, и пока этого не сделаешь - фиг у тебя что заработает.
Вот загрузка initrd и решает такие проблемы. Сначала грузится некий "детектор оборудования", который проверяет, что натыкано в тачку и грузит соответствующие дрова. А уже потом делает change root и начинает исполнять настоящие стартовые скрипты.
В ядре же нет драйверов для ext4. Тогда что будет грузить "детектор оборудования"? И как он узнает о других жестких дисках, если мы указывает только root-раздел? Они, конечно, указаны в fstab, но для этого сначала нужно же корень смонтировать из initrd...
В ядре же нет драйверов для ext4. Тогда что будет грузить "детектор оборудования"? И как он узнает о других жестких дисках, если мы указывает только root-раздел?
Загрузкой занимается загрузчик, тот же grub имеет поддержку ext2 и может грузить что нужно с дисков. Он знает где находится /boot и загружает все необходимое с него: конфиг, ядро, initrd. Другие жесткие диски на этом этапе не используются.
Станислав Тимошко, В грабе есть необходимые дрова для файлух. У него (граба) довольно большая и весьма развесистая настройка может быть - мне тут как-то довелось восстанавливать машину, в которой /boot из каталога перенесли на отдельный раздел :) - весело было. Граб должен узнать много, чтобы успешно загрузить систему - посмотрите на его стартовую строку :)
Vitsliputsli, Это понятно. Но мы-же передаем зачем-то путь корневого раздела в опциях ядру, а не загрузчику. Зачем это нужно, ведь initrс скрипт и так знает, что ему нужно монтировать?
Станислав Тимошко, initrd - это предварительная система, которая обеспечивает доступ к нужным ресурсам и/или разделам на диске для последующей загрузки основной системы. Она несет модули для доступа к ним. А откуда брать корневой раздел важно уже для ядра, только на этапе запуска ядра будет монтироваться корневая система. Т.е. initrd предоставляет инфраструктуру на основе которой ядро сможет развернуться.
Когда у вас система на разделе ext, то initrd не нужен. Но при более сложных загрузках, может потребоваться дешифратор, доступ к сети и прочее, поэтому для универсальности загрузки его и добавляют.
CityCat4, во FreeBSD в ядро изначально вкомпилено овер до фига драйверов всяческого оборудования. Если там чего-то нет - скорее всего, его для FreeBSD вообще нет.
Karpion, еслиф че, я на FreeBSD работал с 1997 по 2013 год и прекрасно знаю, что там вкомпилено в GENERIC, а что нет. Да, там дофига всякой ерунды, но все (вообще все дрова) вкомпилить невозможно - GENERIC и без того толст офигенно. Но существует приличная часть дров, которая не врезана в GENERIC и скорее всего никогда там не будет:
- примерно половина сетевух, не особо популярных (или новых)
- практически все устройства мультимедиа
- дисковые и прочие контроллеры
GENERIC нужен для того, чтобы хоть что-то стартовало. Пересборка ядра - это часть идеологии FreeBSD, это практически первое, что осваивает админ, в то время как в линухе можно годами работать и не знать, как вообще собирается ведро.
Karpion, Я сейчас спорить не буду, потому как отошел от темы несколько лет назад и возможно сейчас все переменилось до наоборот, хотя судя по тенденции от 2.2.5 до 9.4 существенных изменений в методике построения дистриба не было. Единственное , что я помню из глобальных переделок - замена монолитного инсталлера на модульный (что сделало еще хуже - я тогда матерился безостановочно) и замена утилей по работе с портами (этого я уже фактически не застал). А вот практика настройки GENERIC не менялась все это время.
Чтобы предметно возражать - мне надо посмотреть конфиг нынешнего GENERIC, а мне лениво
Честно говоря, я не понял, зачем вообще надо делать так сложно. Ибо монтировать initrd - ничуть не проще, чем монтировать дисковую корневую систему, ведь в любом случае надо монтировать. А ещё неясно, зачем так скрипт - и соответственно, его интерпретатор.
Команду "монтировать корневой раздел только для чтения" - можно выдать из загрузчика, он же передаст все параметры, т.е. выполнит работу, которую обычно делает программа mount.
Держать на диске два экземпляра корневой системы (один для загрузки в RAM, второй для нормальной работы) - так себе идея.
Ибо монтировать initrd - ничуть не проще, чем монтировать дисковую корневую систему, ведь в любом случае надо монтировать
Нет, initrd не монтируется, в этом весь смысл и есть.
Начальный загрузчик читает initrd и «подсовывает» его ядру.
А ещё неясно, зачем так скрипт - и соответственно, его интерпретатор.
Для универсальности. Скрипт может загрузить нужные модули, или настроить сеть для сетевой файловой системы, или запустить fsck, или запросить пароль для зашифрованной файловой системы…
Karpion
нет, монтировался initrd, сейчас же (уже давно) использузется initramfs. это [опционально сжатый] cpio-архив, который распаковывается в ram-диск.
результат похож, конечно, но называть это монтированием неправильно.
Karpion, именно избавляют.
монтирование — устоявшийся термин, который означает вполне определённое действие («привязка» некоторого ресурса к пути в vfs).
разница между «смонтировали initrd» и «распаковали initramfs» примерно как между «смотрю фильм на ютубе» и «скачал фильм к себе на hdd и смотрю с локального диска».
Держать на диске два экземпляра корневой системы (один для загрузки в RAM, второй для нормальной работы) - так себе идея.
это разные файловые системы. initramfs содержит модули ядра конкретной версии и минимально-необходимое окружение (обычно на базе busybox) для монтирования «настоящего» root.
Ибо монтировать initrd - ничуть не проще, чем монтировать дисковую корневую систему, ведь в любом случае надо монтировать
вот именно, что проще. нам нужен один наперёд известный и простой драйвер (tmpfs), который запустится на любом железе, на котором запустилось ядро. initramfs будет прочитан бутлоадером.
то есть ядру не нужно уметь ничего больше чтобы запустить init из initramfs. а этот init уже может делать разные вещи (подгружать модули для имеющегося оборудования с нужными параметрами, инициализировать сеть, работать с криптографией, etc). в результате один и тот же бинарный образ ядра может запускаться и работать на куче машин (при этом загружать только те модули, rоторые нужны на этой машине).
Можно и не использовать initrd, это вполне нормально, когда работаешь на одном и том же железе. Но, если нужно запускаться на любом железе, то придется все модули всех возможных вариантов железа с которого нужно грузиться засунуть в ядро, держать в памяти такое большое ядро нет смысла, поэтому и создан промежуточный этап при загрузке, когда все эти модули помещаются в initrd..
initrd работает только на этапе загрузки, и не используется во время работы основного ядра, и соответсвтенно ресурсы не расходуются на ненужные модули.