Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

Заметки пользователя Linux.

(C) В.А.Костромин, kos @ rus-linux dot net

Второй этюд о компиляции ядра из исходных кодов (часть 2).

11 декабря 2003 г., последние изменения внесены 14 декабря 2003 г.

Продолжение. Начало смотри в предыдущей заметке.

Итак, система успешно загрузилась в консольный режим, но отказалась запускать графику. Залез я в файл .config, нашел там строку CONFIG_AGP_NVIDIA и заменил в ней "is not set" на "=y". После чего выполнил компиляцию ядра заново, только на этот раз использовал команду make oldconfig, причем сначала сохранил файл .config в другом каталоге, потом сделал make mrproper, потом восстановил .config, запустил make oldconfig, и далее все остальное. Однако результат и после этого был прежний: при выполнении команды startx появлялось сообщение о том, что недоступен модуль ядра для NVdriver.

Failed to initialize the NVdriver kernel module!

К счастью, старое ядро загружалось без проблем, так что я мог многократно перезагружаться и экспериментировать. Загрузив старое ядро я стал сравнивать протоколы загрузки в том и другом варианте системы. Обнаружилось, что загрузка происходит в разной последовательности. То есть как бы все те же действия выполняются, но в несколько различном порядке. Впрочем, это было просто попутное наблюдение, а какого либо полезного вывода из анализа журналов я сделать не смог. Тогда я заглянул в каталог /usr/src/asplinux с целью найти там какие-то подсказки, и обнаружил там очень интересный подкаталог SOURCES, в котором нашлись образцы конфигурационных файлов для компиляции ядра в различных вариантах, а также архив NVIDIA_kernel-1.0-2960.tar.gz. Заглянув в файл README в этом архиве, я прочитал следующее:

    This directory contains the source code and header files for the
    parts of the NV driver that use the Linux kernel api.

    Since the Linux kernel does not support a binary driver interface, we
    provide for rebuilding these files on the target machine (or distribution)
    and then linking with the binary version of the NV kernel driver.

        $ make

    This will produce one of the following files depending on the system
    include directory used to do the build:

        NVdriver:      which is the installable kernel driver module for
                       single processor Linux systems
Как следует из последнего абзаца, этот архив содержит исходные коды модуля ядра драйвера NVIDIA для одно-процессорных систем. И все, что надо сделать, чтоб его подключить - развернуть архив и выполнить в полученном каталоге команду make. Что я и сделал. После этого, перезагрузившись, я увидел уже привычный экран KDE, чему было немало обрадовался.

Но, как вскоре выяснилось, радоваться опять было рано! Дело в том, что указатель мыши неподвижно замер в центре экрана и клавиатура тоже ни на что не реагировала.

Снова перезагружаюсь (Reset, другого способа нет, слава богу журналируемая файловая система ext3 хоть и ругается при загрузке, но восстанавливается), лезу в протоколы загрузки, ищу mouse и нахожу только

"Detected PS/2 Mouse Port."

А мышь у меня сидит на USB, причем когда я загружаюсь с ядром 2.4.18, то вижу в протоколе следующую строку

input0: USB HID v1.00 Mouse [Logitech USB-PS/2 Mouse M-BA47] on usb1:3.0

которой нет при загрузке с ядром 2.4.23. Эта проблема решилась тем, что я поставил переходник USB -> PS/2 и стал подключать мышь к разъему PS/2. После этого мышь стала видна как в консоли (до этого ее и там не было), так и в X-ах. А запустив команду make xconfig, я обнаружил, что при компиляции я задал USB Human Interface Device Support в разделе USB Support, а в разделе Input core support не была установлена опция Mouse support. Поэтому я решился еще раз перекомпилировать ядро с учетом всех ошибок. Надо сказать, что я их пока еще не все описал.

Еще осталась проблема с монтированием Windows-разделов. В журнале на этот счет появились следующие сообщения

Dec 13 13:20:00 trend modprobe: modprobe: Can't locate module nls_cp866
Дек 13 13:20:00 trend mount: mount: wrong fs type, bad option, bad superblock on /dev/hda1,
Дек 13 13:20:00 trend mount:        or too many mounted file systems
(для /dev/hda9 - аналогичные). Поскольку файл /etc/fstab не изменялся, то причина, видимо, в отсутствии модуля nls_cp866. И, действительно, когда я заглянул в раздел "File Systems / Native Language Support", обнаружилось, что не задана поддержка ни одной из кириллических кодовых страниц. Еще одна причина провести повторно компиляцию ядра.

Но на этот раз я сделал так. Сначала выполнил в каталоге /usr/src/linux-2.4.23 команду make mrproper, удалив тем самым следы предыдущих компиляций. Затем скопировал в этот каталог файл /usr/src/asplinux/SOURCES/kernel-2.4.18.i686.config и переименовал его в .config. А затем вызвал команду make xconfig и стал эту исходную конфигурацию править. Заняло это опять более часа. Хлопотное это дело - компиляция ядра. Но в конце концов компиляция кончилась и новое ядро было скопировано в каталог /boot. Перезагружаемся!

Неудача! После запуска команды startx появилось уже знакомое сообщение

Failed to initialize the NVdriver kernel module!
Ах да, я ведь это уже проходил, надо добавить модуль из архива NVIDIA_kernel-1.0-2960.tar.gz. Снова выполняю эту операцию (даже не перезагружаясь). А вот после, как мне казалось, перезагрузиться необходимо, чтобы загруженное ядро работало уже с этим модулем. Впрочем, после завершения компиляции модуля появилось следующее сообщение:
Module NVdriver loaded, with warnings
NVdriver is loaded successfully 

Поэтому я попробовал запустить графический режим без перезагрузки. И, на мое удивление, графический режим запустился!

И все же это опять не все! Все вроде бы запустилось, но не все еще работает. В частности, не подключается flash-диск, с которым я привык работать. То есть, в настройках ядра я еще где-то ошибся. Открываю свои заметки о работе с USB под Линукс (которые я подготовил для второго издания своей книги, но пока не публиковал) и смотрю, что я там сделал неправильно. Оказывается поддержку UHCI задал только в качестве модуля (CONFIG_USB_UHCI, usb-uhci.o), SCSI generic support (CONFIG_CHR_DEV_SG, sg.o) - тоже. Не включил опрос всех LUN на каждом SCSI-устройстве (CONFIG_SCSI_MULTI_LUN). Задал я эти установки, снова попытался провести компиляцию - и облом! срзу же после запуска команды make bzImage получил такой результат:

[root@trend linux-2.4.23]# make bzImage
gcc -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -o scripts/split-include scripts/split-include.c
In file included from /usr/include/bits/errno.h:25,
                 from /usr/include/errno.h:36,
                 from scripts/split-include.c:26:
 /usr/include/linux/errno.h:4:23: asm/errno.h: Нет такого файла или каталога
 make: *** [scripts/split-include] Ошибка 1
Стал размышлять о причинах и вспоминать, что же изменилось со времени последней успешной компиляции. И вспомнил, что я развернул в каталоге /usr/src исходные коды ядра linux-2.4.18 от ASP. И развернулось оно в подкаталог linux. А поскольку там до того была ссылка с именем linux на подкаталог linux-2.4.18, ее пришлось удалить. К тому же вспомнилось, что в документации на исходные коды ядра не рекомендовалось разворачивать их в каталоге linux. Поэтому я решил переименовать каталог /usr/src/linux в /usr/src/linux-2.4.18-asp, и создал ссылку с именем linux на каталог linux-2.4.23.

После этого я снова повторил все ранее проделанные действия:

[root]# make mrproper
восстановил файл .config из сделанной ранее резервной его копии;
[root]# make xconfig
[root]# make dep
[root]# make bzImage
[root]# make modules
[root]# make modules_install
На сей раз сообщений об ошибках не было. После всего этого я снова поменял имена полученных файлов, перенес их в каталог /boot, перезагрузился, выполнил make в каталоге NVIDIA и запустил графический режим. Теперь и USB flash-диск стал доступен. Но, вероятно, чуть позже может обнаружиться еще какие-нибудь недостатки скомпилированного ядра. В общем, прихожу к выводу, что компиляции ядра можно (и нужно) посвятить еще одну заметку, а также пересмотреть главу о компилировании ядра для второго издания книги.

А эту статью о компиляции ядра пока завершаю! И перехожу к установке VMware (с чего я все это начал) - это будет тема следующей заметки.

Список литературы и ссылки.

  1. В.А.Костромин, "Семь шагов к новому ядру" (обновление ядра до версии 2.4.2), апрель 2001 г.
  2. В.А.Костромин, "Linux для пользователя", изд. БХВ-Петербург, 2002 год, серия "Самоучитель", 650 стр.