Как в начале работы определяется корневая файловая система (для примонтировывания)?

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Ответить
Аватара пользователя
жучара
Сообщения: 950
ОС: астралинукс

Как в начале работы определяется корневая файловая система (для примонтировывания)?

Сообщение жучара »

Друзья!
Тут сказано:
When booting, the Linux kernel will delegate the task of mounting the root filesystem to the initrd.
А как процесс initrd ищет файловую систему? Описано три способа. Второй и третий способы мне более или менее понятны. Определяется файловая система по UUID или PARTUUID. Ну то есть где-то там находятся идентификаторы, initrd их ищет и сравнивает с заданным в командной строке (или в файле /boot/grub/grub.cfg) значением. Если находит, файловая система (или раздел, в случае с PARTUUID) искомые.
Offtopic
Описан и четвёртый способ, не подсчитанный почему-то:
If ‘GRUB_DISABLE_LINUX_PARTUUID’ is also set to ‘true’, grub-command will identify by its Linux device name.
. Тут речь идёт об именах /dev/sdaN
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Но вот первый способ меня вгоняет в ступор
The first is if an initrd for the target operating system is also present.
Прочёл: где initrd есть, та файловая система монтируется как корневая.

Только не монтируется она чего-то. Запускаю grub так:

Shell

set root='hd0,msdos5'
linux /boot/vmlinuz-3.16.0-6-amd64 ro quiet
initrd /boot/initrd.img-3.16.0-6-amd64
Идентификатор файловой системы отсутствует умышленно. По написанному, файловая система с файлом /boot/initrd.img-3.16.0-6-amd64 искомая. Раз grub может найти один файл (ядро), он так же может найти и другой файл (initrd) и, следовательно, файловую систему. Но он почему-то этого не делает. (бредовую ошибку какую-то выдаёт:

Shell

/bin/sh: can't access tty; job control turned off
) Почему же? Спасибо, кто откликнется.

В файле /etc/default/grub на всякий случай написал:

Shell

GRUB_DISABLE_LINUX_UUID=true
GRUB_DISABLE_LINUX_PARTUUID=true
чтобы файловая система не определялась по *UUID
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Как в начале работы определяется корневая файловая система (для примонтировывания)?

Сообщение Bizdelnick »

Всё намного проще. Путь к устройству, содержащему корневую ФС, передаётся ядру параметром root.
Не надо путать её с root загрузчика Grub, это отдельная сущность.
Добавлено (20:39):
Вообще, Вы смешали даже не два, а три процесса. Первый — генерация конфигурационного файла grub при помощи grub-mkconfig (в работающей системе). Там задействованы хитрые скрипты, которые прописывают, каким образом загрузчик должен искать свой root (это может быть как / системы, так и /boot, если он вынесен на отдельное устройство), и значение root в командную строку ядра. Второй — поиск загрузчиком своего root в соответствии с прописанными в конфиге правилами (на раннем этапе загрузки). Третий — монтирование корневой файловой системы ядром (с участием initramfs или без него; на более позднем этапе загрузки).
То есть Вы ждёте на этапе загрузки выполнения того, что отработало при создании конфига, и, разумеется, не дожидаетесь.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 950
ОС: астралинукс

Re: Как в начале работы определяется корневая файловая система (для примонтировывания)?

Сообщение жучара »

Bizdelnick писал:
11.10.2019 20:31
Путь к устройству, содержащему корневую ФС, передаётся ядру параметром root.
но в книжке-то по-другому написано. Там написано:
The first is if an initrd for the target operating system is also present.
Всё. Я уж не буду, пожалуй, всё первое сообщение переписывать.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Как в начале работы определяется корневая файловая система (для примонтировывания)?

Сообщение Bizdelnick »

жучара писал(а):
11.10.2019 20:46
но в книжке-то по-другому написано.
Прочитайте моё дополнение к первому ответу.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 950
ОС: астралинукс

Re: Как в начале работы определяется корневая файловая система (для примонтировывания)?

Сообщение жучара »

Bizdelnick писал:
11.10.2019 20:48
Прочитайте моё дополнение к первому ответу.
я прочёл. Вы не можете, наверное, объяснить, в чём тут дело. Вопрос открыт.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Как в начале работы определяется корневая файловая система (для примонтировывания)?

Сообщение Bizdelnick »

жучара писал(а):
11.10.2019 20:53
Вы не можете, наверное, объяснить, в чём тут дело.
Более доходчиво — нет. Попробуйте прочитать ещё раз, вдумчиво.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 950
ОС: астралинукс

Re: Как в начале работы определяется корневая файловая система (для примонтировывания)?

Сообщение жучара »

Bizdelnick писал:
11.10.2019 21:02
Более доходчиво — нет. Попробуйте прочитать ещё раз, вдумчиво.
Ерундой не занимайтесь. Первый упомянутый (зачем?!!!) вами процесс- процесс генерации /boot/grub/grub.cfg. Зачем мне перечитывать это в сотый раз, если я в другом месте могу прочесть (и прочёл) про все вот эти вот скрипты, которые в папке /etc/grub.d? Один скрипт за оформление отвечает, два за формирование пунктов меню, другие ещё за что-то. Теперь вы мне говорите- эти скрипты есть. Я знаю, что они есть. Есть и есть и пусть они дальше будут.
...Про поиск загрузчиком своего root. Да вот так он его ищет:

Shell

set root='hd0,msdos1'
А в нём ищет ядро
++++++++++++++++++++++++++++++++++++++++++++++++++++++
Прикольно, да, посылать собеседника читать ВСЁ, будучи заранее уверенным, что собеседник не знает НИЧЕГО? Некрасиво это. Вопрос открыт потому.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Как в начале работы определяется корневая файловая система (для примонтировывания)?

Сообщение Bizdelnick »

жучара писал(а):
11.10.2019 21:23
Первый упомянутый (зачем?!!!) вами процесс- процесс генерации /boot/grub/grub.cfg.
Отлично. Теперь прочитайте, когда этот процесс происходит, сопоставьте с тем, когда Вы хотите получить от него результат, и найдите несовпадение.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 950
ОС: астралинукс

Re: Как в начале работы определяется корневая файловая система (для примонтировывания)?

Сообщение жучара »

Bizdelnick писал:
11.10.2019 21:32
Отлично. Теперь прочитайте, когда этот процесс происходит, сопоставьте с тем, когда Вы хотите получить от него результат, и найдите несовпадение.
происходит он при update-grub (или grub-mkconfig, что то же самое; отрабатывают скрипты из /etc/grub.d данные для них в /etc/default/grub), считывание с него происходит когда работает загрузчик. Вот он начал работать и он считал с файла нужные команды в зависимости от пункта меню.
...А это вообще-то и неважно даже. Нам главное, запустить загрузчик, а содержанием файла можно попуститься. Главное попасть в командную строку загрузчика. Команды можно и руками набрать. Вот эти команды:

Shell

set root='hd0,msdos5'
linux /boot/vmlinuz-3.16.0-6-amd64 <тут идентифицируем root, которая будет корневой файловой системой но наша задача загрузить БЕЗ указания этого ключа> ro quiet
initrd /boot/initrd.img-3.16.0-6-amd64
boot
...А перед тем, конечно, набрать ls -l чтобы получить список хардов/разделов в формате grub.

Считаю потому разговор о моменте генерации файла /boot/grub/grub.cfg неважным, что ли. Содержание файла- да, важно. Пока мы не можем обойтись без него. Мы можем. В сухом остатке остаётся вопрос.
The first is if an initrd for the target operating system is also present.
как этот способ работает, если он у меня ни хрена не работает, то есть файловая система с initrd на борту не определяется как корневая?
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Как в начале работы определяется корневая файловая система (для примонтировывания)?

Сообщение Bizdelnick »

жучара писал(а):
11.10.2019 22:05
как этот способ работает, если он у меня ни хрена не работает, то есть файловая система с initrd на борту не определяется как корневая?
Работает. Она определилась, как корневая, и прописалась в конфиг. Но Вы её оттуда удалили:
жучара писал(а):
11.10.2019 19:12
Идентификатор файловой системы отсутствует умышленно.
Добавлено (23:22):
Впрочем, это я погорячился. Нашёл он её не таким образом. Корневая файловая система находится вовсе не по расположению initrd (что логично, поскольку он может быть на отдельном /boot). Фраза
жучара писал(а):
11.10.2019 19:12
The first is if an initrd for the target operating system is also present.
относится к тому, каким образом будет прописано найденное устройство: в случае отсутствия initrd не используются UUID, поскольку ядро без initrd не сможет понять такую запись.
Для того, чтобы найти нужное устройство, просто проверяется, что смонтировано в / работающей системы.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:

Re: Как в начале работы определяется корневая файловая система (для примонтировывания)?

Сообщение serzh-z »

Ядро не использует никакие эвристики для поиска корня: оно всегда использует аргумент root, переданный, средствами протокола загрузки, через командную строку.

Далее, ядро монтирует корень лишь в одном единственном случае: если не указан initrd/initramfs.

Вот всех остальных случаях решение о монтировании принимает linuxrc или init из initrd/initramfs. И переключение корня, с помощью pivot_root/switch_root, делает он же.

initrd/initramfs может монтировать все что пожелает - это зависит от дистрибутива, какого-нибудь кастомного скрипта и т.д. Общей практикой является использование аргумента root, переданного в командной строке ядра.

То есть, в обычных дистрибутивах linuxrc/init *не смогут* работать, если ядру не передать root. И уж точно ядро не сможет само ничего смонтировать - оно тупое, как пробка.

Что касается загрузчика, в данном случае - это GRUB: у него есть свои эвристики в скриптах /etc/grub.d для определения корня, который он подставит в командную строку ядра в виде аргумента root.
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 950
ОС: астралинукс

Re: Как в начале работы определяется корневая файловая система (для примонтировывания)?

Сообщение жучара »

Ясно всё. В общем-то, где я ошибался, я понял. Я неправильно понял фразу
The first is if an initrd for the target operating system is also present.
Тут по-русски-то не поймёшь, не то, что по английски.
...В общем, они, оказывается, берут три фактора- наличие/отсутствие initrd и значение переменных GRUB_DISABLE_LINUX_PARTUUID и GRUB_DISABLE_LINUX_UUID (true или false). Комбинаций всех значений этих переменных 8 штук. На каждую комбинацию- свой вариант идентификации системы, которая будет корневой. По имени диска, по UUID или по PARTUUID. Таблица приведена в книжке.

+++++++++++++++++++++++++++++++++++++++++++++++++

Возникли три вопроса. Они вторичны и мы их обсуждать не будем. Может, когда-нибудь. Но они есть.

1) Возможное отсутствие initrd везде интересно объясняется. То есть пишется как он важен и нужен и вообще. А потом приписывается- если его нет, то по фиг, ядро само всё смонтирует. Нормальное объяснение, чё.

2) Так я и не смог понять PARTUUID он у меня есть или нет. Найти сам не нашёл. Тот случай, что никто ничё не знает. Ссылок много, а достоверной информации ноль.

3) Таблица-то лжива.
Initrd detected GRUB_DISABLE_LINUX_PARTUUID
Set To
GRUB_DISABLE_LINUX_UUID
Set To
Linux Root
ID Method
true true true dev name
dev name. А по факту?

Shell

user@astra:~$ cat /etc/default/grub | grep GRUB_DISABLE_LINUX
GRUB_DISABLE_LINUX_UUID=true
GRUB_DISABLE_LINUX_PARTUUID=true
user@astra:~$
user@astra:~$
user@astra:~$ sudo update-grub
Generating grub configuration file ...
Найден образ linux: /boot/vmlinuz-4.2.0-24-generic
Найден образ initrd: /boot/initrd.img-4.2.0-24-generic
Найден образ linux: /boot/vmlinuz-4.2.0-23-pax
Найден образ initrd: /boot/initrd.img-4.2.0-23-pax
Найден образ linux: /boot/vmlinuz-4.2.0-23-generic
Найден образ initrd: /boot/initrd.img-4.2.0-23-generic
Найден Windows 7 (loader) на /dev/sda1
Найден Astra Linux SE 1.5 (Smolensk) (1.5) на /dev/sda8
завершено
user@astra:~$
user@astra:~$ sudo kate /boot/grub/grub.cfg > /dev/null 2>&1 &
И вот один из пунктов меню grub
menuentry 'AstraLinuxSE GNU/Linux, with Linux 4.2.0-23-generic (recovery mode) (на /dev/sdb8) (на /dev/sdb5) (на /dev/sda8)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-23-generic-root=UUID=1c25320c-1d26-4ae6-bec7-19b9cb0934ec ro single-1c25320c-1d26-4ae6-bec7-19b9cb0934ec' {
savedefault
insmod part_msdos
insmod ext2
set root='hd0,msdos8'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos8 --hint-efi=hd0,msdos8 --hint-baremetal=ahci0,msdos8 1c25320c-1d26-4ae6-bec7-19b9cb0934ec
else
search --no-floppy --fs-uuid --set=root 1c25320c-1d26-4ae6-bec7-19b9cb0934ec
fi
linux /boot/vmlinuz-4.2.0-23-generic root=UUID=1c25320c-1d26-4ae6-bec7-19b9cb0934ec ro single
initrd /boot/initrd.img-4.2.0-23-generic
}
По факту UUID. Справедливости ради, не во всех пунктах меню написано UUID, в некоторых написано всё же /dev/sdaX
Я просто читаю маны.
Спасибо сказали:
Ответить