1

Есть вопросы:
1) Собрать ядро просто. Но как его грамотно подрубить к GRUB(конкретней последней Ubuntu) ?
http://forum.ubuntu.ru/index.php?topic=74165.0
мне кажется ключевой тут является конфигурация

menuentry "Ubuntu, Linux 2.6.32-020632rc6-generic" {
        recordfail=1
        if [ -n ${have_grubenv} ]; then save_env recordfail; fi
    set quiet=1
    insmod ext2
    set root=(hd0,5)
    search --no-floppy --fs-uuid --set 0e717c2a-24bd-4abe-acfe-ecf98fc814f8
    linux    /boot/vmlinuz-2.6.32-020632rc6-generic root=UUID=0e717c2a-24bd-4abe-acfe-ecf98fc814f8 ro   quiet splash
    initrd    /boot/initrd.img-2.6.32-020632rc6-generic
}

1.1)  initrd    обязателен?
1.2)  initrd    как собрать?
2) Почему сейчас актуальные ядра уже >3 версий, а на новых дистрах линукса стоят двойки ?
3) где находится Init функция? То есть я хочу скомпилить ядро, подрубить его к грабу и запустить и чтобы после загрузки модулей всех в конце написалось HELLO WORLD! В коде ядра где эта функция(типо main). Вот например программировал для RTEMS там создаешь *.c фаил(по подобию как в семплах) и в мейках прописываешь путь, в мейке говоришь что нужно компилить это, в результате сборке появляется образ-прошивка. Тут как ?

Достойна доля того, кто правый.
Широкий выбор, благое благо.
Вершить заслоны, смотреть под ноги
И оставаться стерильным гостем.

2

gen пишет:

1.1)  initrd    обязателен?

Нет.

Был, был и весь вышел...

3

gen пишет:

1.2)  initrd    как собрать?

man mkinitrd

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Slackware64-current/Xfce/Lenovo G580

4

насчет

3)

или тут имеется ввиду что нужно модуль написать самому и включить его в список последним?

Достойна доля того, кто правый.
Широкий выбор, благое благо.
Вершить заслоны, смотреть под ноги
И оставаться стерильным гостем.

5

gen пишет:

или тут имеется ввиду что нужно модуль написать самому и включить его в список последним?

Ну, что-то типа этого, но я, разумеется, не специалист, тем более, в ядерном кодинге. Да, пишете ядерный модуль, куда-нибудь в init-скрипты вписываете вызов своего модуля, он выводит Hello, world...
Ну, а насчет 2) - насколько я понимаю, наконец-то произошло разделение ядер на десктопные и серверные. Разница в подходе к тем и другим слишком велика - тут и планировщики задач нужны разные, и состав файловых систем, поддержка оборудования... да много всего.

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Slackware64-current/Xfce/Lenovo G580

6

gen пишет:

1) Собрать ядро просто. Но как его грамотно подрубить к GRUB(конкретней последней Ubuntu) ?

в грубе 2 грамотно запустить то, что написано в /etc/default/grub. чтобы он сам его прописал

gen пишет:

1.1)  initrd    обязателен?
1.2)  initrd    как собрать?

нет.
способы сборки есть разные... отличаются зависимостью от дистра и разной степенью применения своих прямых рук...
самый простой это сунуть всё что надо в одну папку и закатать это в cpio архив
я в общем ни разу сам не собирал за ненадобностью, так что за подробностями прошу в гугл...

gen пишет:

2) Почему сейчас актуальные ядра уже >3 версий, а на новых дистрах линукса стоят двойки ?

новых дистрах, это каких?

yars пишет:

Ну, а насчет 2) - насколько я понимаю, наконец-то произошло разделение ядер на десктопные и серверные. Разница в подходе к тем и другим слишком велика - тут и планировщики задач нужны разные, и состав файловых систем, поддержка оборудования... да много всего.

с номерами версий это связано чуть меньше, чем ни как... в серверных версий всегда ядра отставали по версии где-то на 6-12 порядковых номеров
всё перечисленное, кроме планировщиков, идёт модулями. планировщик выбирается при загрузке и может быть изменён. единственная сопутствующая опция, которая ЕМНИП захардкожена, это CONFIG_HZ*

gen пишет:

3) где находится Init функция? То есть я хочу скомпилить ядро, подрубить его к грабу и запустить и чтобы после загрузки модулей всех в конце написалось HELLO WORLD! В коде ядра где эта функция(типо main). Вот например программировал для RTEMS там создаешь *.c фаил(по подобию как в семплах) и в мейках прописываешь путь, в мейке говоришь что нужно компилить это, в результате сборке появляется образ-прошивка. Тут как ?

init выполняется уже в юзерспейсе... а именно просто запускает то, что ядру передали в параметре init или же просто /bin/init
о начальной загрузке написано в толстых букварях по ядру, прошу в приклеенный раздел в шапке. от себя могу порекомендовать Бовет&Чезатти - ядро linux.
ИМХО самое разумное написать модуль... подробности есть в тех же букварях

95% процентов проблем находятся между клавиатурой и стулом.

7

Lupo Alberto пишет:
gen пишет:

1.1)  initrd    обязателен?

Нет.

Ну Вы совсем... Привыкли там у себя в gentoo ab
Не, ну, конечно, собирайте всё ab Это - Ubuntu. Давайте всё впихнём на все случаи жизни ab Для себя - да. Но! нужно знать все железки (хотя бы). А тогда, это уже НЕ Ubuntu...
gen
А если просто пересобрать (ну, там выкинуть лишнее),  initrd не трогать, а пусть будет... А цель махинации?

8

Fat-Zer пишет:

новых дистрах, это каких?

ну например в последней вышедшей убунте, там двойка. Точно сказать не скажу, не помню.

Достойна доля того, кто правый.
Широкий выбор, благое благо.
Вершить заслоны, смотреть под ноги
И оставаться стерильным гостем.

9

Fat-Zer пишет:

init выполняется уже в юзерспейсе... а именно просто запускает то, что ядру передали в параметре init или же просто /bin/init
о начальной загрузке написано в толстых букварях по ядру, прошу в приклеенный раздел в шапке. от себя могу порекомендовать Бовет&Чезатти - ядро linux.
ИМХО самое разумное написать модуль... подробности есть в тех же букварях

Ничего не понял, тему в шапке посмотрю. Хотя отыскание ответа на вопрос может затянуться)
то есть как я понимаю в  /bin/init запихать прогу? Получается нужно 1 образ ОС, и образ проги самой еще. А все втолкнуть в один образ нельзя? в АРМы же люди образ как монолит наверняка грузят.

mvt пишет:

gen
А если просто пересобрать (ну, там выкинуть лишнее),  initrd не трогать, а пусть будет... А цель махинации?

цель собрать свое ядро, написать свои мелку прогу. Потом разбираться в свойствах ядра(мне на практике больше нравится), апи и тд.
В конечном итоге куплю отладочную плату на арме(когда с начальным стартом разберусь) и считай буду писать свои прошивки для армов. Драва уже есть, свои писать не надо)  жизнь малина.
Могу конечно на других ОС это сделать, например на ртемсе том же. Но вот хочу работать с линуксом и все!

Достойна доля того, кто правый.
Широкий выбор, благое благо.
Вершить заслоны, смотреть под ноги
И оставаться стерильным гостем.

10

Возможно, вы уже читали, но мало ли, вдруг пригодится — http://www.ibm.com/developerworks/ru/li … index.html
P.S. Это первая статья цикла статей «Разработка модулей ядра Linux», там их несколько десятков.

Был, был и весь вышел...

11

gen
initrd - это минимизация самого ядра. Это- создание условий для его работы. Если Вы туда вставите всё, что необходимо для данной, конкретной конструкции - он Вам сто лет не нужен. Но это - будет Ваша железка. Можно по другому (часто применяется в слаке). Воткните в ядро всё, что теоретически может пригодится. Тогда всё будет работать и без initrd. Но. Само ядро будет больше по размеру, не?

12

mvt пишет:

Само ядро будет больше по размеру, не?

Конечно. В Slackware есть ядра одной версии, но собранные по-разному: с поддержкой SMP и без нее, так называемое generic-ядро с минимальным набором необходимого для работы, требующее наличия initrd, и huge-ядро, содержащее как можно больше модулей, не требующее initrd. Последнее удобно использовать в процессе установки системы и при восстановительных работах, хотя никто не запрещает использовать это ядро и в повседневной работе. Но я себе ядро пересобрал - generic+initrd замедляет загрузку на несколько секунд, а huge - большое, в нем дофига  ненужного мне ab

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Slackware64-current/Xfce/Lenovo G580

13

yars пишет:
mvt пишет:

Само ядро будет больше по размеру, не?

Конечно. В Slackware есть ядра одной версии, но собранные по-разному: с поддержкой SMP и без нее, так называемое generic-ядро с минимальным набором необходимого для работы, требующее наличия initrd, и huge-ядро, содержащее как можно больше модулей, не требующее initrd. Последнее удобно использовать в процессе установки системы и при восстановительных работах, хотя никто не запрещает использовать это ядро и в повседневной работе. Но я себе ядро пересобрал - generic+initrd замедляет загрузку на несколько секунд, а huge - большое, в нем дофига  ненужного мне ab

Вот видите. "каждому - своё". Советов здесь не может быть... Помните у Андрея: "Каждый выбирает по себе..." ab

gen пишет:

1.1)  initrd    обязателен?

Нет, если поддержка корневой ФС вкомпилирована в ядро.

OS: Gentoo
CPU: Xeon E5450 RAM: 8 Gb DDR2, VGA: GeForce GTX750 Ti
MB: Asus P5Q SE2

15

gen пишет:

ну например в последней вышедшей убунте, там двойка. Точно сказать не скажу, не помню.

дистровотч с вами не согласен...

gen пишет:

то есть как я понимаю в  /bin/init запихать прогу? Получается нужно 1 образ ОС, и образ проги самой еще. А все втолкнуть в один образ нельзя? в АРМы же люди образ как монолит наверняка грузят.

в кратце порядок загрузки:
0. старт загрузчика, загрузка образа ядра в память, передача ему управления.
1. собственно загрузка ядра: самоинициализация и прочие умные вещи. знать полезно и интересно, но грязными ручонками туда лучше не лезть...
2. инициализация драйверов, вкомпиленных в ядро. для каждого модуля выполняется его module_init() функция. напиши свой модуль, вкомпиль в ядро и делай что хочешь...
3. старт инита(находится в юзерспейсе). сам инит это просто программа. может находится как в инитрд так и на диске, ядру в общем то всё равно... сама функциональность инита обычно состоит в запуске скриптов инициализации.

суть в том, что 99,999% задач решаются настройкой/правкой/написанием этих самых скриптов... в редких случаях заменой init'а... и лезть куда-то в ядро совершенно не надо. Задачу при которой это понадобится придумать довольно сложно...

gen пишет:

цель собрать свое ядро, написать свои мелку прогу.

опять же, возьми любой достаточно толстый букварь... что и как там расписано, а уж хеллоу ворлды по модулю ядра сплошь и рядом валяются...

gen пишет:

В конечном итоге куплю отладочную плату на арме(когда с начальным стартом разберусь) и считай буду писать свои прошивки для армов. Драва уже есть, свои писать не надо)  жизнь малина.

это называется «собирать linux», а не «писать прошивку» =))

95% процентов проблем находятся между клавиатурой и стулом.

16

Fat-Zer
Так, строго говорить, между 0 и 1 - initrd. Нет? Или Вы за самодостаточное ядро?

17

gen
Ну да, собрали. Кажется, что не грузится. Хуже, когда когда грузится и что-то отвалилось. Ну да, было. Соберите ещё раз. Смотрите, что забыли... Фигня, выйдет ab

18

Fat-Zer пишет:

дистровотч с вами не согласен...

хмм... хорошо если так. Тогда логика хоть прослеживается. Завтра уточню почему мне привиделась двойка.

ок, буду комментировать, если неправ, правьте.

Fat-Zer пишет:

0. старт загрузчика, загрузка образа ядра в память, передача ему управления.

ну да, grub это и делает как я понимаю. Грузится в рам образ ОС и проц начинает выполнять инструкции образа ядра.

Fat-Zer пишет:

1. собственно загрузка ядра: самоинициализация и прочие умные вещи. знать полезно и интересно, но грязными ручонками туда лучше не лезть...
2. инициализация драйверов, вкомпиленных в ядро. для каждого модуля выполняется его module_init() функция. напиши свой модуль, вкомпиль в ядро и делай что хочешь...

1 пункт скорее всего что-то типо инициализации уровней шин и девайсов наверно, хотя не знаю. Надо залезть будет)
2 видимо каждому уровню определен свой адрес и они начинают инициализацию своих прайвет структур наверо, ну типо описателей драйвера. С модулями все понятно. Только про юзерспейс ты раньше верно подметил. Делать свой хеллоуворлд в модуле и запускать в момент загрузки их всех, как-то не по-христиански мне кажется. 

Fat-Zer пишет:

3. старт инита(находится в юзерспейсе). сам инит это просто программа. может находится как в инитрд так и на диске, ядру в общем то всё равно... сама функциональность инита обычно состоит в запуске скриптов инициализации.

ммм. инитрд... я попутал все в предназначениях видимо. в инитрд можно получается свое юзерприложение писать? я думал он тупо для создания временной ФС,чтобы модули ядра прогрузились благополучно.

Fat-Zer, ладно спасибо. Ну то есть если я напиши мини-программу и запихну ее bin/init и в грабе для загрузки  нового ядра пропишу конфиг для загрузки этого инита(пока не представляю как граб настроить так, буду читать!), то все должно заработать?

Fat-Zer пишет:

опять же, возьми любой достаточно толстый букварь... что и как там расписано, а уж хеллоу ворлды по модулю ядра сплошь и рядом валяются...

ок понял

Достойна доля того, кто правый.
Широкий выбор, благое благо.
Вершить заслоны, смотреть под ноги
И оставаться стерильным гостем.

19

mvt пишет:

Так, строго говорить, между 0 и 1 - initrd. Нет? Или Вы за самодостаточное ядро?

до (3) дочитать стоит... инитрд на/перед ним... смотря что под этим подразумевать...
боюсь соврать, но может конечно ещё загрузчик занимается загрузкой образа в память, но это уже другая история...

1 пункт скорее всего что-то типо инициализации уровней шин и девайсов наверно, хотя не знаю. Надо залезть будет)
2 видимо каждому уровню определен свой адрес и они начинают инициализацию своих прайвет структур наверо, ну типо описателей драйвера. С модулями все понятно. Только про юзерспейс ты раньше верно подметил. Делать свой хеллоуворлд в модуле и запускать в момент загрузки их всех, как-то не по-христиански мне кажется.

подробнее не буду расписывать, дабы не врать... я это из любопытства когда-то читал, так что не очень уверен в своих знаниях...

gen пишет:

ммм. инитрд... я попутал все в предназначениях видимо. в инитрд можно получается свое юзерприложение писать? я думал он тупо для создания временной ФС,чтобы модули ядра прогрузились благополучно.

конечно можно... инитрд это простой cpio архив(возможно пожатый чем-либо), обычный образ файловой системы грубо говоря. туда можно запихнуть что угодно... обычно кроме загрузки модулей он ещё, например, инициализирует raid/lvm... да и модули ядра думаете кто думаете грузит? само ядро  не такое умное, чтобы ещё и модули выбирать/грузить... там обычный(немного облегчённый) удав сидит...

 Консоль:
alexander@debian-vm:/tmp/initrd$ gzip -dc /boot/initrd.img-2.6.32-5-amd64 |cpio -i
alexander@debian-vm:/tmp/initrd$ ls
bin  conf  etc  init  lib  lib64  sbin  scripts

gen пишет:

Fat-Zer, ладно спасибо. Ну то есть если я напиши мини-программу и запихну ее bin/init и в грабе для загрузки  нового ядра пропишу конфиг для загрузки этого инита(пока не представляю как граб настроить так, буду читать!), то все должно заработать?

для начала попробуй просто дописать к опциям ядра init=/bin/bash — посмотришь на результат... (желательно, на ядре без initrd)

95% процентов проблем находятся между клавиатурой и стулом.

20

Fat-Zer пишет:

до (3) дочитать стоит... инитрд на/перед ним... смотря что под этим подразумевать...
боюсь соврать, но может конечно ещё загрузчик занимается загрузкой образа в память, но это уже другая история...

Да не. Вот Вы тянете вторую стадию загрузчика. Да хоть, что выбрать? Какую fs? Какие драйверы? Ядро там в пустоте, пока Вы не подтянете initrd. Не, конечно всё можно встроить в ядро - всё там будет. Но этот вопрос вроде обсудили, не?

21

все я понял. Короче в исходниках ядра папка init в ней main.c его рефакторить надо. Короче разобраться как свой загрузчик сделать еще, типа граба, тока с 1 функций загрузки ядра.
Блин, код вот сложный в ядре. Типо вот такого:

It is useful when implementing generic data structures in C. For example, the Linux kernel uses offsetof() to implement container_of(), which allows something like a mixin type to find the structure that contains it:[4]

#define container_of(ptr, type, member) ({ \
                const typeof( ((type *)0)->member ) *__mptr = (ptr); \
                (type *)( (char *)__mptr - offsetof(type,member) );})

Надо курить мануалы, которые на английском, то есть еще курить английский надо...

Достойна доля того, кто правый.
Широкий выбор, благое благо.
Вершить заслоны, смотреть под ноги
И оставаться стерильным гостем.

22

gen пишет:

2) Почему сейчас актуальные ядра уже >3 версий, а на новых дистрах линукса стоят двойки ?

Что-то путаете. Даже в консервативной Slackware уже 3.2.7.

gen пишет:

1) Собрать ядро просто. Но как его грамотно подрубить к GRUB(конкретней последней Ubuntu) ?

Пример подключения ядра без initrd:

menuentry 'Funtoo' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-simple-1e9d36d3-5418-46ee-bd97-b6a02b4f7ae6' {
    insmod part_msdos
    insmod ext2
    set root='hd0,msdos1'
    linux /funtoo root=/dev/sda6 ro quiet ro vga = normal vt.default_utf8=1
}
gen пишет:

1.1)  initrd    обязателен?

Нет, если файловая система корневого раздела, и, ЕМНИП, драйвер харда подключены монолитно.

gen пишет:

ммм. инитрд... я попутал все в предназначениях видимо. в инитрд можно получается свое юзерприложение писать?

Можно. Обычно только busybox и insmod  кладут вроде бы, но что-либо ещё тоже не возбраняется.

gen пишет:

1.2)  initrd    как собрать?

Тыц. http://www.opennet.ru/base/sys/initrd_intro.txt.html,

Если бы люди умели пользоваться vim, find, sed и awk  то миллионы программных продуктов так никогда и не были бы созданы

23

raven_cler пишет:

Даже в консервативной Slackware уже 3.2.7.

3.2.29, вы хотели сказать?

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Slackware64-current/Xfce/Lenovo G580

24

yars пишет:

3.2.29, вы хотели сказать?

Тьху, спутал. Да, 3.2.29.

Если бы люди умели пользоваться vim, find, sed и awk  то миллионы программных продуктов так никогда и не были бы созданы