Как это нечем? Вот, например, у меня ядро грузится в режиме UEFI через EFI-stub, без бутлодера. Как оно поймёт, на каком разделе корень системы? Через встроенную командную строку. Там же можно, скажем, заодно задавать параметры монтирования (если тебе нужно data=writeback на корне с ext4, например) и параметры модулей ядра.
Вот только ядро самостоятельно может справиться только с вариантом /dev/sdX, а UUID/LABEL обрабатываются через initrd. Есть ли у кого патчи, чтобы это поправить - и спрашивал ТС.
/*
* Convert a name into device number. We accept the following variants:
*
* 1) device number in hexadecimal represents itself
* 2) /dev/nfs represents Root_NFS (0xff)
* 3) /dev/<disk_name> represents the device number of disk
* 4) /dev/<disk_name><decimal> represents the device number
* of partition - device number of disk plus the partition number
* 5) /dev/<disk_name>p<decimal> - same as the above, that form is
* used when disk name of partitioned disk ends on a digit.
* 6) PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF representing the
* unique id of a partition if the partition table provides it.
* The UUID may be either an EFI/GPT UUID, or refer to an MSDOS
* partition using the format SSSSSSSS-PP, where SSSSSSSS is a zero-
* filled hex representation of the 32-bit "NT disk signature", and PP
* is a zero-filled hex representation of the 1-based partition number.
* 7) PARTUUID=<UUID>/PARTNROFF=<int> to select a partition in relation to
* a partition with a known unique id.
* 8) <major>:<minor> major and minor number of the device separated by
* a colon.
*
* If name doesn't have fall into the categories above, we return (0,0).
* block_class is used to check if something is a disk name. If the disk
* name contains slashes, the device name has them replaced with
* bangs.
*/
Получается, это UUID не файловой системы, а раздела. У меня вообще таблицы разделов нет, придётся создавать.
Ну вот вы сами и нашли правильную документацию :-)
У меня вообще таблицы разделов нет
С этого и надо было начинать. Патч, поддерживающий UUID/LABEL, должен быть не сложным, можно выдернуть кусок кода из команды mount. Команда mount, когда ей дают UUID=xxx, сама читает/парсит суперблоки доступных блочных устройств, поэтому патч получится не завязаным на код драйверов ФС, но в ванильное ядро его врядли включат.
Хотя создать таблицу разделов будет попроще, чем писать патч.
Как оно поймёт, на каком разделе корень системы? Через встроенную командную строку.
Прими разупорин! В случае UEFI встроенная командная строка нужна вовсе не для того чтобы „ядро понимало на каком разделе корень системы“. А как ты сам сказал „отсутствие загрузчика“ на UEFI приводит к тому что нет того через что можно передавать параметры загрузки и в этом случае встроенная командная строка единственный выход.
Это я всё знаю. Мне не важно, что на вид это будет один файл, мне важно отсутствие initramfs.
И почему ты считаешь, что «монтирование по UUID это вообще не задача ядра»?
Ок. Ещё раз для особо одаренных и понятливых. То чего ты желаешь а именно --> монтирование корневого раздела по UUID или метке файловой системыделает не ядро. Всё. Большая и жирная точка. Эту задачу у людей решает что угодно inird/initramfs да хоть чёрт с ушами но не ядро потому что ядро к этому не имеет вообще никакого отношения. Далее если люди не хотят видеть отдельный файл inird/initramfs они включают его при помощи CONFIG_INITRAMFS_SOURCE в состав самого ядра и таким образом добиваются того что отдельного inird/initramfs попросту не существует.
Если всё вышесказанное к тому же подкреплённое вполне конкретными примерами до тебя не доходит я раскланиваюсь и удаляюсь из этого треда. И за одно желаю всяческих успехов.
Я не понимаю, почему ты так категоричен. Почему ядро не должно читать метки FS?
Ведь иксы в ядро засунули? Засунули. А веб-сервер засунули? Засунули. Так что мешает сделать монтирование корня по метке файловой системы?
У меня CONFIG_BLK_DEV_INITRD=n и менять это значение я не собираюсь, потому CONFIG_INITRAMFS_SOURCE я включить не могу. Я прекрасно знаю, как эта опция работает, много раз её использовал, но в данном случае мне это не нужно.
В данном случае задача называется «смонтировать раздел по UUID, не используя initramfs», потому использовать initramfs для этого не получится. А если initramfs будет вкомпилена в ядро, она никуда не пропадёт.
Ну хорошо, допустим, командная строка нужна вовсе не для этого. Ладно. Но как тогда в условиях отсутствия бутлодера указать ядру на корень? Или всё-таки «root=${ROOT_DEVICE}» — это тоже один из параметров ядра, как считаешь?
Ну хорошо, допустим, командная строка нужна вовсе не для этого.
Бессмысленно повторять… Ещё раз перечитай внимательно. И да есть такая хрень как «командная строка» но к изначальному вопросу «монтирования корневого раздела по UUID или метке файловой системы» она, так же как и ядро, не имеет вообще никакого отношения. «Командная строка» != «командной строке в командной оболочке sh/bash/tsh/zsh/…»!!! «Командная строка» ядра в случае UEFI или embedded системы лишь способ передачи параметров в систему {минуя/заменяя собой} передачу параметров через загрузчик.
И да я не спорю с root=${ROOT_DEVICE}… Тем не менее не глядя на то, что дистрибутивы на базе gnu/linux можно грузить с mdadm, cryptsetup, lvm2, NFS, ftp и т.д. для чистого ядра без initrd/initramf эти всё перечисленные способы загрузки невозможны по причине отсутствия в нем всего необходимого функционала. Но даже без всей этой экзотики кроме этого есть немалое количество случаев когда чистое ядро linux без initrd/initramf даже загрузится с заданного ROOT_DEVICE не сможет потому что модули этого устройства по той или иной причине не в составе ядра.
А вот равно как для всех этих способов mdadm, cryptsetup, lvm2, NFS, ftp и прочих устройств у которых нет модулей в составе самого ядра так и для загрузки с корневого раздела с определенным UUID или меткой файловой системы используется initrd/initramf.
Ты так то не пугай. Это называется не засунули а кто-то, давным давно дурью маялся. Бегло глянул, нашел только патч на 2.6.18. Отдельный. Т.е. в ядре этой бяки никогда небыло. Ну выдь правда? А если кто там в сторонке тюненгует ядро повсякому, так это того кто личное дело.
Через него передаются параметры в систему? Т.е. «командная строка» ядра либо «командная строка» любого другого загрузчика попросту не нужна? И система их корректно читает?
Через него передаются параметры в систему? Т.е. «командная строка» ядра либо «командная строка» любого другого загрузчика попросту не нужна? И система их корректно читает?
Да. Да. Да.
Поскольку это требует наличия в ядре EFI Stub, то логично предположить, что он с этим и разбирается.
Поскольку это требует наличия в ядре EFI Stub, то логично предположить, что он с этим и разбирается.
Значит уже исправлено. Раньше всё это не работало что и требовало костыли в виде «командной строки». А вообще «командная строка» это больше именно к embedded системам там где либо вообще никаких загрузчиков нет либо ограничения такие что…
В fstab «UUID» и «LABEL» дополнительно обрабатывает mount. Если ты запишешь «/dev/disk/by-label/ROOT», то это будет не совсем то же, что «LABEL=ROOT». Хотя на конечный результат не повлияет. Это насколько я понимаю.
Потому что в последнее время в ядре много чего делали возможно и это тоже уже сделали… Однако даже если это не так я точно знаю что с initrd/initramf это вообще не проблема.