[linux] вопрос о ядре

a10063

в kernel-howto говорится, что при установке ядра нужно его сорсы распаковать в /usr/src/linux (вернее сделать такой софтлинк на папку с сорсами)
а в ридми сорсов нашел вот что:
Do NOT use the /usr/src/linux area! This area has a (usually
incomplete) set of kernel headers that are used by the library header
files. They should match the library, and not get messed up by
whatever the kernel-du-jour happens to be.
1) так как же правильно ставить ядро? после установки нового будут новые хедеры, а библиотека скомпилина со старыми... что за это будет?
2) нужно ли хранить потом сорсовое дерево или удалить можно (проблема с линком из /lib/modules - он же нужен зачем-то)
отцы! научите, плиз!
только прошу советы не "по опыту", а "как положено"

deestr

1) так как же правильно ставить ядро? после установки нового будут новые хедеры, а библиотека скомпилина со старыми... что за это будет?
Читай readme который идет с ядром. С чего ты взял что библиотека скомпилина со старыми?
Прочти Makefile там се линки есть что откуа подключается.
2) нужно ли хранить потом сорсовое дерево или удалить можно (проблема с линком из /lib/modules - он же нужен зачем-то)
после установки ядра сорцы уже не нужны, но советую оставить, если собираешься что-нить разрабытывать - они могут понадобиться.

Marinavo_0507

В наше время должно быть пофиг, так как вменяемый дистрибутив не использует инклуды из /usr/src/linux,
а вместо этого держит их копию в /usr/include/{linux,asm}
Если это не так, то /usr/src/linux лучше не трогать.
> так как же правильно ставить ядро? после установки нового будут новые хедеры, а библиотека скомпилина со старыми... что за это будет?
Будет всё нормально, так как хедеры идут вместе с библиотекой.
Есть небольшое число программ, которые сильно зависят от версии ядра, и их нужно собирать, используя
хедеры от нового ядра - таким программам нужно показать, где лежат правильные хедеры.
> нужно ли хранить потом сорсовое дерево или удалить можно (проблема с линком из /lib/modules - он же нужен зачем-то)
Удалить можно, если не планируется потом собирать программы из вышеупомянутого класса.
К этому классу относятся и отдельно распространяемые модули ядра.
Ссылка в /lib/modules - специально для таких программ.

Makc500

если места достаточно, то зачем удалять?
потом можно будет не париться, если понадобится скомпилить какой-нибудь забытый модуль

Gasparfx

Делай в usr/src/linux и не парься, всё будет норм.

a10063

спасибо за полный ответ!
вменяемый дистрибутив не использует инклуды из /usr/src/linux,
а вместо этого держит их копию в /usr/include/{linux,asm}
а как понять, откуда берут хедеры программы при компиляции?!
как я понимаю, чаще всего этим занимаются братья automake & autoconf, но как это они делают не задумывался
Будет всё нормально, так как хедеры идут вместе с библиотекой.
Есть небольшое число программ, которые сильно зависят от версии ядра.
как их определить? знать? для каждой программы вчитываться в INSTALL?
Удалить можно, если не планируется потом собирать программы из вышеупомянутого класса.
К этому классу относятся и отдельно распространяемые модули ядра.
интересно... получается, можно докомпилить модули? какие на это ограничения есть (чтобы не вызвать конфликт с ядром)?
остальным:
спасибо
библиотека скомпилина с другими хедерами, т.к. сам ее компилил, знаю
удалить дерево хочется, чтобы не загромождать систему (150-200 мб все-таки но, возможно, для ядра нужно делать исключение, что и пытаюсь понять

Julie16

а как понять, откуда берут хедеры программы при компиляции?!
Из стандартных путей и с помощью директивы -I
для каждой программы вчитываться в INSTALL?
А это Еще бы.
получается, можно докомпилить модули?
Можно
какие на это ограничения есть (чтобы не вызвать конфликт с ядром)?
Никаких. Разве что объем винта может это дело ограничить.

Marinavo_0507

> а как понять, откуда берут хедеры программы при компиляции?!
По умолчанию из /usr/include , а все дополнительные пути указываются в Makefile и передаются gcc параметрами командной строки.
> как их определить? знать? для каждой программы вчитываться в INSTALL?
Грубо говоря, да, надо читать INSTALL или что там ещё есть.
Обычно это глубоко системные программы, дающие доступ к каким-то особенным фичам ядра.
Ну iptables например - понятно, что с инклудами от ядра версии 2.2 оно не скомпилируется.
> получается, можно докомпилить модули? какие на это ограничения есть (чтобы не вызвать конфликт с ядром)?
Можно. Некоторые драйвера не включены в ядро, и идут отдельно.
Если им чего-то не хватит, получишь ошибку компиляции.
Можно также и докомпилить модули, которые сразу забыл собрать, да.
Ограничения - ну если например забыл включить в ядро поддержку ethernet, то никакой драйвер ethernet-адаптера не соберёшь и т.д.

a10063

только что нашел раздел в кернел-хавту:
3.3. Howto Install Just A Single Module ?
извратно, но можно!
получается, что дерево сорсов вообще не нужно (только для удобства, но экономия! )
есть ли какие-то причины еше, чтобы оставить дерево сорсов?

Julie16

1) Его можно читать на ночь вместо сказки.

a10063

По умолчанию из /usr/include
странно, что так вшито... почему бы не сделать было аналог $PATH ?
2 ПЖ:
Из стандартных путей
эт че такое?

Julie16

Это и есть /usr/include.

Marinavo_0507

> странно, что так вшито...
ничего странного, вполне в духе традиций

a10063

ну, стандарты же кто-то устанавливает... организации вроде w3c
а про инклюды какой-нибудь FHS диктует?

a10063

у меня еще два вопроса появилось по ходу разбирательства:
1) как при многоядровости обеспечить правильное использование System.map (учитывая, что два ядра могут быть даже одного релиза) - в хавту про это есть, но я не понял
2) насколько оправдана стабильность при компиляции с помощью gcc 2.95.3?
дело в том, что у меня видеокарта nvidia с закрытыми дровами
а они их компилят gcc 3, что конфликтует с ядром, скомпилиным gcc 2

Marinavo_0507

> 1) как при многоядровости обеспечить правильное использование System.map (учитывая, что два ядра могут быть даже одного релиза) - в хавту
> про это есть, но я не понял
При каждой компиляции ядра увеличивается на единицу дополнительный номер сборки, который кладётся в файл .version,
а также показывается командой uname -a
Его нужно дописать к имени System.map: например /boot/System.map-2.6.11-3
> 2) насколько оправдана стабильность при компиляции с помощью gcc 2.95.3?
> дело в том, что у меня видеокарта nvidia с закрытыми дровами
> а они их компилят gcc 3, что конфликтует с ядром, скомпилиным gcc 2
Гораздо больше шансов нарваться на баг в драйвере от nvidia, чем на проблему
из-за неправильной компиляции.

deestr

При каждой компиляции ядра увеличивается на единицу дополнительный номер сборки, который кладётся в файл .version
Ты уверен?
А не в Makefile прописываешь перед компиляцией?

a10063

да, я тоже читал, что в мейкфайле
подозреваю, что EXTRAVERSION в мейфайле - это для папки модулей, а .version - для System.map
2 : правильное предположение?

Marinavo_0507

version просто добавляется к той версии, которая прописана в мейкфайле

a10063

При каждой компиляции ядра увеличивается на единицу дополнительный номер сборки, который кладётся в файл .version
а я сам могу написать туда строку? ну и систем.мап соответственно обозвать?

Marinavo_0507

Для того, чтобы добавлять произвольные строки, есть EXTRAVERSION

a10063

я все пытался найти подтверждение твоим словам...
упоминаний о .version не нашел, везде пишут про EXTRAVERSION!
.version используется в корневом Makefile - вставляется в заголовочные файлы
а еще там написано
 KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)  
так все-таки, нужно называть System.map так:
 System.map-$(KERNELRELEASE)-$(POINTVERSION).map 
так
 System.map-$(KERNELRELEASE)$(POINTVERSION).map 
или так
 System.map-$(KERNELRELEASE).map 
(где $(POINTVERSION) - версия из .version)?

Marinavo_0507

Походу я наврал - не используется .version при поиске System.map
Ну тогда можно, если приспичит, при загрузке определять, что за ядро, и создавать ссылку на правильный System.map
Я обычно просто перезаписываю поверх старого System.map, так что не очень-то он и нужен.
О том, как должен называться System.map, написано например в man ps

sergey_m

Есть небольшое число программ, которые сильно зависят от версии ядра, и их нужно собирать, используя
хедеры от нового ядра - таким программам нужно показать, где лежат правильные хедеры.
Они могут не оказаться в /usr/include/linux ?
Удалить можно, если не планируется потом собирать программы из вышеупомянутого класса.
Правильно ли я понял, что существуют userland программы, которым для сборки нужны исходники ядра? Именно /usr/src/linux, а не /usr/include/linux. Если это так, то это мягко говоря, странновато.

Marinavo_0507

В /usr/include/linux положено лежать тем хедерам, с которыми собиралась glibc, иначе возможны проблемы (хотя обычно их не бывает).
> Правильно ли я понял, что существуют userland программы, которым для сборки нужны исходники ядра? Именно /usr/src/linux, а не /usr/include/linux.
> Если это так, то это мягко говоря, странновато.
Ну это в основном не настоящие программы, а модули ядра, или обёртки вокруг сисколлов.
Но и им должно хватать /usr/src/linux/include/{linux,asm}

a10063

вот что я нашел в BLFS по iptables:
If you are going to patch the kernel, you need to do it before you compile iptables, because during the compilation, the kernel source tree is checked (if it is available at /usr/src/linux-[version] to see which features are available.
странновато
и что мне делать, если я поменяю ядро? перекомпиливать iptables?
про man ps:
клево, там действительно то, что надо, написано!

Marinavo_0507

> и что мне делать, если я поменяю ядро? перекомпиливать iptables?
нет, за исключением случаев, если хочешь какой-то новой фичи в netfilter, которая не поддерживается имеющейся версией iptables

a10063

хорошо
вроде мне понятны стали многие вещи
теперь буду "правильнее" компилить ядра
тебе отдельное спасибо!
спасибо также принимавшим участие!
Оставить комментарий
Имя или ник:
Комментарий: