Библиотека сайта rus-linux.net
Заметки пользователя Linux.
(C) В.А.Костромин, kos @ rus-linux dot net
Второй этюд о компиляции ядра из исходных кодов (часть 2).
Продолжение. Начало смотри в предыдущей заметке.
Итак, система успешно загрузилась в консольный режим, но отказалась запускать графику. Залез я в файл .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 (с чего я все это начал) - это будет тема следующей заметки.
Список литературы и ссылки.
- В.А.Костромин, "Семь шагов к новому ядру" (обновление ядра до версии 2.4.2), апрель 2001 г.
- В.А.Костромин, "Linux для пользователя", изд. БХВ-Петербург, 2002 год, серия "Самоучитель", 650 стр.