Вопрос или проблема
Я новичок в сборке ядра и модулей ядра, поэтому извините, если это плохой вопрос.
У меня установлена Centos 6.8, 2.6.32.642.el6.x86_64. Я пытаюсь изучить драйверы устройств и подобное, и мой справочный текст начинается с сборки ядра. Его инструкции кажутся немного устаревшими, поэтому я также гуглил.
Я пересобрал ядро, внеся небольшое изменение в main.c, после чего переместил полученный bzImage в директорию загрузки:
cp arch/x86/boot/bzImage /boot/vmlinuz-2.6.32-custom.el6.x86_64
Затем я добавил запись в etc/grub.conf, которая идентична уже существующей, но с другим именем ядра.
После этого я перезагрузил систему, и при перезагрузке получил панику ядра, что указывает на то, что он не может найти modules.dep в /lib/modules/2.6.32.
Но всё, что я читал, говорит, что модули должны находиться в /lib/modules/2.6.32-custom.el6.x86_64,
Поэтому я попытался сделать мягкую ссылку с /lib/modules/2.6.32-642.el6.x86_64 на /lib/modules/2.6.32-custom.el6.x86_64:
ln -s /lib/modules/2.6.32-642.el6.x86_64 /lib/modules/2.6.32-642.el6.x86_64
Но, как и ожидалось, это не исправило ошибку, потому что (ядро?) ищет в /lib/modules/2.6.32/ вместо /lib/modules/2.6.32-custom.el6_x86_64.
Мой вопрос: где ДОЛЖНО искать ядро для модулей и/или как я могу это изменить, и/или что заставляет его смотреть туда, где оно смотрит?
Он получает версию из Makefile в корне дерева исходников ядра, объединяя VERSION и EXTRAVERSION вместе (это стандартная часть сборки ядра). Это становится именем поддиректории, используемым для нахождения модулей. RPM Red Hat для ядра создаются с использованием программы rpmbuild, которая помещает правильное значение EXTRAVERSION в этот файл в процессе сборки. Вы можете захотеть собрать ваше кастомное ядро таким образом. В противном случае вам придется редактировать Makefile самостоятельно и применять все патчи вручную.
Ответ или решение
Прежде всего, позвольте поздравить вас с решением заняться весьма увлекательной и познавательной сферой, связанной с ядром и драйверами устройств. Изменение директории модулей, которые ищет ядро, — задача, требующая определенного внимания, и я постараюсь подробно объяснить необходимые действия.
Проблема
Вы правильно указали, что ядро ищет модули в каталоге /lib/modules/<версия_ядра>/
, и это поведение определяется конфигурацией ядра, а именно значением параметров VERSION
и EXTRAVERSION
, которые объединяются для формирования имени подкаталога. В вашем случае, можно заметить, что ядро не может найти файл modules.dep
, что указывает на несоответствие в версиях.
Шаги для изменения директории модулей
-
Изменение
Makefile
вашего ядра:
В корне вашего исходного кода ядра, откройте файлMakefile
. Найдите строки, которые отвечают за определениеVERSION
иEXTRAVERSION
. Вам необходимо установитьEXTRAVERSION
на желаемое значение, например:EXTRAVERSION = -custom.el6.x86_64
После этого, при сборке ядра, оно будет создано с правильной версией, и каталог
/lib/modules/2.6.32-custom.el6.x86_64
будет создан для модулей. -
Сборка и установка нового ядра:
После измененияMakefile
, выполните сборку ядра. Если у вас уже есть скомпилированныйbzImage
, вам нужно также скомпилировать модули и установить их:make modules make modules_install
Команда
make modules_install
создаст нужный каталог и разместит скомпилированные модули в нем. -
Обновление конфигурации загрузчика:
Убедитесь, что в/etc/grub.conf
указано правильное имя вашего нового ядра, например:title Custom Kernel kernel /vmlinuz-2.6.32-custom.el6.x86_64 ro root=/dev/your_root_partition initrd /initrd-2.6.32-custom.el6.x86_64.img
Не забудьте, что если вы создаете начальный RAM-диск (
initrd
), его также необходимо пересоздать и указать правильный путь. -
Проверка работы:
После внесения всех изменений и перезагрузки системы, выполнение команды:ls /lib/modules/
Должно отобразить каталог
2.6.32-custom.el6.x86_64
, и в случае успеха, ваше ядро должно нормально загрузиться без паники.
Заключение
Изменение директории поиска модулей ядра требует внимательности к деталям и точного понимания процесса сборки ядра. Лучше всего использовать подход сборки через RPM, чтобы избежать возможных ошибок. Однако, изменение исходных файлов также вполне допустимо, если вы прибегаете к ручной сборке.
Если у вас возникнут дополнительные вопросы или проблемы в процессе, не стесняйтесь обращаться за помощью на тематические форумы или сообщества, где опытные разработчики смогут предложить вам еще больше рекомендаций и советов.
Как и в любом обучающем процессе, ошибки — это возможность для роста и понимания, поэтому продолжайте изучать и экспериментировать!