При сборке ядра не собираются некоторые модули.
Большая просьба помочь новичку в Gentoo.
На работе получил задание разобраться почему не хочет загружаться тонкий клиент на новую машину.
В процессе дознания выяснил, что отсутствует драйвер atl1e для сетевухи на новой машине.
Исходники модуля в /usr/src/linux-2.6.36-zen1/driver/net/ имеются.
Решил собрать и установить модуль. # make modules # make modules_install.
Модули собирались собирались (причём сразу все которые есть в исходниках. Как собрать конкретный модуль?) и собрались.
Однако в /lib/modules/kernel/driver/net необходимый модуль отсутствовал. Я удивился и решил пересобрать всё ядро вместе с модулями.
Командой # genkernel --menuconfig all. Указал необходимый модуль как включаемый в ядро.
Опять всё собиралось собиралось и собралось. Как вы можете догадаться, модуля в библиотеке опять не оказалось.
Тонкий клиент до сих пор не грузится. Я имею бледный вид перед начальством.
Внимание вопрос!
Что я делаю не так?
Как таки собрать модуль драйвера сетевухи и включить его на автозагрузку в ядро?
Очень нужна помощь. Уже пятый день роюсь в нете. Как выйти из ситуации так и не нашёл.
- Для комментирования войдите или зарегистрируйтесь
Цитата: Указал необходимый
По идее это значит, что он прямо в ядро и впилен.
Gentoo: у меня слишком кривые руки и слабые нервы, чтобы пилить Ubuntu...
Нет, они реально не
Нет, они реально не собирались. Когда я его в качестве модуля указывал, в библиотеке его тоже не оказывалось.
А с другими ядрами так же?
А с другими ядрами так же? Вроде здесь нечто подобное описывается.
P. s.. У меня с генкернелом тоже не всё хорошо было, а руками с нуля не очень получалось. Потом просто взял генкернел-ядро и переделал уже руками.
Gentoo: у меня слишком кривые руки и слабые нервы, чтобы пилить Ubuntu...
Давайте сначала определимся в
Давайте сначала определимся в том, как реализован запуск тонкого клиента.
А именно:
- для запуска клиентской машины нужно только ядро или ещё и initrd ?
- откуда загружается ядро и возможно initrd, по сети или ядро и initrd находится на флешке/диске/cd диске ?
Далее, какая материнская плата на новой машине, покажите вывод:
с тонкого клиента.
Вы выполнили последние команды в директории исходных кодов, где собиралось ядро для клиентских машин ? Поздравляю, вы почти "засрали" исходники, теперь будет тяжело с ними работать для досборки модуля.
Что бы дособрать модуль для уже собранного ядра нужно выполнить следующие действия:
1. перейти в директорию с исходными кодами и выполнить 'make menuconfig', затем найти пункт, включающий поддержку нужного модуля и узнать название опции.
Включаете нужный пункт и нажимаете кнопку 'h', смотрите название опции в конфигурационном файле, в данном случае это 'CONFIG_ATL1E', оно нам понадобится для сборки модуля., нажимаете 'escape' до возврата в главное меню конфигуратора, нажимаете ещё раз 'escape' и на вопрос о сохранении конфигурационного файла отвечаете утвердительно.
Если этот пункт был вообще выключен придётся пересобирать ядро:
2. Собственно сама сборка:
3. Создаём директорию под модуль в /lib/modules//kernel/drivers/net/atl1e, копируем в неё модуль и обновляем информацию о доступных модулях для этого ядра:
Ни каких 'make modules' и 'make modules_install' в исходных кодах, где уже собиралось ядро и модули не делайте, иначе собранные модули не получится загрузить.
4. Теперь вам нужно обновить initrd, если вы его используете.
Но это всё так, лирика, если на тонких клиентах вы не используете initrd, в котором реализован функционал загрузки модулей сетевых карт, получения ip адреса и монтирования корня по nfs и дальнейший chroot в него, то вам нужно будет пересобирать ядро и включать этот модуль монолитно.
Если конфигурация загрузчика для тонкого клиента не содержит initrd
, а только ядро то нужно будет пересобирать ядро или попробовать собрать initrd.
А почему собственно вы занимаетесь этим, если не делали этого ранее и слабо понимаете как это работает ?
В "библиотеке" отдельный файл модуля и не должен появиться если вы выбрали включать его непосредственно в ядро.
Надеюсь вы не потеряли конфиг ядра клиента и сможете дать ответы на вопросы заданные выше.
Для корректной сборки
Для корректной сборки драйверов при сборке ядра необходимо было выполнить команду: genkrnel --oldconfig --menuconfig all.
Драйвера собрались, но это не помогло. Ошибка при загрузке тонкого клиента осталась.
Далее ответы по пунктам:
1. Материнская плата - Gigabyte GA-H61M-S2PV
2. Файл initrd не используется при загрузке.
3. Ядро загружается по сети.
4. Занимаюсь этим как единственный имеющий какое-то знакомство с Linux. Правда последний раз в исхниках копался больше десяти лет назад. И всё благополучно забыл. А с Gentoo вообще ренее дела не имел никогда.
5. Ошибка загрузки тонкого клиента выглядит так:
Looking up port of RPC 100003/2 192.168.152.3
rpcbind: server 192.168.152.3 not responding, timed out
Rut-NFS: Unable to get nfsd port number from server, using default
Looking up port of RPC 100005/2 192.168.152.3
rpcbind: server 192.168.152.3 not responding, timed out
Root-NFS: Unable to get nfsd port number from server, using default
Root-NFS: Server returned error -101 while mounting /xxx/yyy
VFS: Unable to mount root fs via NFS, trying floppy
VFS: Cannot open root device "nfs" or unknown-block(2,0)
Please append a correct "root=" boot option: here are the available partitions:
Насколько я знаю, portmap должен быть загружен раньше nfs. Иначе она не примонтируется.
В каком конфиге я могу это прописать на стороне клиента?
Defender написал(а):2. Файл
Поддержку сетевой карты этой материнской платы нужно включить монолитно в ядро, а не модулем, в противном случае нужно использовать initrd.
Второе, зря вы выполняли oldconfig., ну да ладно.
Скопируйте конфиг этого ядра куда либо, очистите исходники и выполните сборку ядра заново.
На этапе make menuconfig не забудьте включить опцию поддержки сетевой карты этой материнской платы монолитно в ядре.
Если процессор многоядерный то собирать ядро лучше многопоточно, будет быстрее:
Где N - число потоков (ядер процессора).
Ядро будет скопировано в директорию /boot под именем /boot/vmlinuz-2.6.36-zen1, модули ядра установятся в директорию /lib/modules/2.6.36-zen1/.
После сборки ядра нужно заменить старый образ ядра новым в директории, откуда оно загружается по сети, новые модули ядра нужно скопировать в директорию, которая по сети подключается в качестве корня тонкого клиента., если конечно у вас не используется ссылка /path_to_diskless_root/lib/modules/2.6.36-zen1/ -> /lib/modules/2.6.36-zen1/.
Узнать путь можно в конфигурации загрузчика pxelinux, ниже, либо в файле /etc/exports, в котором указаны директории, которые будут доступны по nfs.
После сборки ядра нужно разместить новый образ ядра в директории, откуда оно загружается по сети с tftp сервера.
Скорее всего у вас используется net-ftp/tftp-hpa, смотрите его конфигурационный файл в /etc/conf.d/in.tftpd, в нём смотрите переменную INTFTPD_PATH, скорее всего её значение будет INTFTPD_PATH="/var/tftp/"
В этой директории смотрите конфигурацию pxelinux, что бы определить как должен называться файл образа и где он должен находиться относительно директории из переменной 'INTFTPD_PATH'.
В верху файла смотрите значение параметра 'default', оно указывает номер конфигурации загрузчика, которая используется по умолчанию, отсчёт идёт от 0, отсчитываете секции описания конфигурации загрузчика вида:
когда определите секцию смотрите название образа ядра напортив ключевого слова 'kernel' и копируете новый образ с заменой старого.
После замены образа ядра пробуйте загружать эту машину.
Вообще для начала покажите конфигурационный файл pxelinux, который находится по пути, который определён в переменной 'INTFTPD_PATH' файла конфигурации tftp сервера /etc/conf.d/in.tftpd'/pxelinux.cfg/default.
Покажите содержимое '/etc/exports'.
Покажите содержимое корня тонкого клиента, который монтируется по nfs., точнее более интересует директория модулей там является ссылкой или их нужно туда скопировать.
Вообще лучше бы сначала сделать полный бекап сервера тонких клиентов. Т.к. вы уже могли испортить файл конфигурации ядра тонкого клиента, а он вам ещё понадобится.
Это файл /usr/src/linux-2.6.36-zen1/.config, так же если ядро собиралось genkernel его копия есть в /etc/kernels и скорее всего его можно получить из вывод 'zcat /proc/config.gz' загрузившись на тонком клиенте, со старым ядром, разумеется на том компьютере, где тонкий клиент нормально запускается.
Ядро собрал, проблема не
Ядро собрал, проблема не пропала.
Содержимое конфига PXE:
Default /bz1
kernel /boot/kernel
append ip=dhcp root=/dev/nfs nfsroot=192.168.0.106:/diskless/defaultfs init=/sbin/init rw
Содержимое конфига /etc/expots:
/diskless/defaultfs 192.168.0.*(rw, sync, no_root_squash, no_subtree_check, nohide)
Подозреваю что всё дело в том, что служба PORTMAP стартует уже сильно позже чем происходит попытка монтирования по NFS.
Как её настроить на более ранний старт пока непонятно.
Цитата:Ядро собрал,
Как вы собирали ядро ? Куда положили файл образа ядра ?
Если вы ядро собирали с помощью genernel, то файл образа ядра будет /boot/kernel-genkernel-2.6.36-zen1, если собирали ядро командами make bzImage ; make install то файл образа ядра будет /boot/vmlinuz-2.6.36-zen1
Далее, kernel /boot/kernel - здесь указывается путь относительно директории, которая указана в переменной INTFTPD_PATH в конфигурационном файле /etc/conf.d/in.tftpd.
Т.е. к примеру, если переменная INTFTPD_PATH имеет значение INTFTPD_PATH="/var/tftp/", то файл образа ядра должен быть помещён в директорию /var/tftp/boot/
Так же покажите содержимое /bz1, относительно директории в переменной INTFTPD_PATH.
На других тонких клиентах всё нормально запускается ? Думаю да.
Вся проблема в том, что, если вы даже нормально собрали ядро, включив в нём опцию поддержки сетевой карты нового тонкого клиента монолитно [*], а не модулем [M], вы до сих пор не положили новый файл образа ядро в нужное место, что бы оно загружалось во время загрузки тонкого клиента с сети. Он лежит в /boot относительно
корня. Не забудьте показать содержимое /bz1 относительно INTFTPD_PATH.
Файл образа ядра лежит в
Файл образа ядра лежит в директории:
/diskless/defaultfs
Ядро собиралось с помощью genkernel.
Образ ядра изначально лежит в директории /boot и называется kernel-genkernel-х86-2.6.36-zen1
Путём прямого копирования с заменой имени он перемещается в директорию /diskless/defaultfs и превращается в bz1.
Значение переменной INTFTPD_PATH="/diskless".
На других тонких клиентах всё стартует нормально. В чём разница кроме аппаратной начинки - мне непонятно.
Так посмотрел ваше сообщение
Так посмотрел ваше сообщение с ошибкой загрузки тонкого клиента, вот его кусок:
Выше этих строк есть строки вида:
Почему у вас здесь это ip: 192.168.152.3, в то время как здесь у вас указан другой ip nfs сервера:
Или вы nfs-root выдаёте по dhcp ?
bz1 - это не образ ядра, образ ядра указывается вот здесь: kernel /boot/kernel, если вы утверждаете, что INTFTPD_PATH="/diskless"., тогда образ ядра из /boot/kernel-genkernel-х86-2.6.36-zen1 нужно скопировать в /diskless/boot/kernel предварительно сохранив старый файл образа.
Ошибка первоочередно всплыла
Ошибка первоочередно всплыла в филиале. Там айпишник сервера 192.168.152.3.
Клиента передали нам, и у нас естественно другой сервер: 192.168.0.106.
Ошибка одна и таже. Только айпишники сервера поменялись.
bz1 и kernel-genkernel-х86-2.6.36-zen1 - это одно и тоже только с разными именами.
При этом изначально в файле отсутствовала строка kernel /boot/kernel. Это уже результат моих экспериментов.
Тем не менее старые тонкие клиенты как грузились, так и продолжают грузиться.
Новый, как не грузился, так и не грузится.
http://www.gentoo.ru/node/252
http://www.gentoo.ru/node/25220#comment-188486
kostik87 написал(а): С livecd
Не понял вопроса.
Ну, да в менюконфиге выставлял звёздочку путём нажатия клавиши [y].
Ладно, давайте уточним что я понял:
1. Для конфигурирования ядра с нужным мне драйвером, я должен нажать клавишу [y] выбрав нужный драйвер.
2. После сборки ядра, я обнаруживаю его образ в директории /boot за названием kernel-genkernel-х86-2.6.36-zen1.
3. Я копирую образ в директорию /diskless и переименовываю его в bz1.
4. Конфигурация загрузчика PXE:
Default /bz1
kernel /boot/kernel (Изначально этой строки вообще не было.)
append ip=dhcp root=/dev/nfs nfsroot=192.168.0.106:/diskless/defaultfs init=/sbin/init rw
5. Первоначальная загрузка происходит с образа под именем bz1.
6. Конфигурация файла expots на сервере:
/diskless/defaultfs 192.168.0.*(rw, sync, no_root_squash, no_subtree_check, nohide)
7. ОС клиента находится по пути /diskless/defaultfs
8. При попытке монтирования nfs на клиенте происходит следующая ошибка:
Looking up port of RPC 100003/2 192.168.0.106
rpcbind: server 192.168.0.106 not responding, timed out
Rut-NFS: Unable to get nfsd port number from server, using default
Looking up port of RPC 100005/2 192.168.0.106
rpcbind: server 192.168.0.106 not responding, timed out
Root-NFS: Unable to get nfsd port number from server, using default
Root-NFS: Server returned error -101 while mounting /xxx/yyy
VFS: Unable to mount root fs via NFS, trying floppy
VFS: Cannot open root device "nfs" or unknown-block(2,0)
Please append a correct "root=" boot option: here are the available partitions:
Что здесь не так?
По ошибке невозможно понять что виноваты драйвера или не вовремя стартующий портмап или что-то другое.
Понятно только что nfs не монтируется по конкретному адресу и порту.
Цитата:Не понял
Вы пишете: "экспериментально проверено, что с обоими драйверами система загружается с live CD и без ругани в процессе загрузки."
Я имею ввиду, что вы с использованием только что собранного ядра сделали livecd и проверили, что у вас работает на нём сеть ?
Конфиг pxelinux.cfg/default должен выглядеть примерно так:
У вас написано что-то странное.
В идеале посмотрите как настроено на настоящем сервере.
Это значит, что ядру по сети не доступен это ip адрес.
Вот по этому руководству соберите initrd, только busybox, набор символических ссылок и rescues_shell, там указано как сделать, загружаетесь по сети на клиенте и выполняете dhcpd eth0 или ifconfig eth0 *.*.*.* и пингуете 192.168.0.106.
Но я уверен, что ядро либо не видит сетевой интерфейс или у вас просто не запущен nfs сервер.
Если ваш тестовый сервер тоже на gentoo проверьте что запущены эти стартовые сценарии:
или просто так:
Но вручную запускать два последних не нужно, их должен "притянуть" сценарий nfs.
Вот ссылка на страницу wiki по созданию своего initrd: http://en.gentoo-wiki.com/wiki/Initramfs
nfs работает rpcbind
nfs работает
rpcbind остановлен
rpc.statd работает.
rpcbind это аналог портмапа?
На live CD проверяли немного не так:
Есть два диска с убунтой. Тонкий клиент загружается с любого из них.
При проверке сети выходит в нет.
В одном случае показывает что драйвер на eth0 - atl1c, во втором atl1e.
По поводу конфигурации PXE, можно ссылочку на доки по его конфигурированию?
А то не очень понятно какие могут быть параметры у
prompt 0 - запрос на выбор записи параметров загрузки?
label default - первая строка записи (метка) - что в ней указывать нужно?
kernel kenel_name - вторая строка записи (указание ядра) путь к образу ядра? Если да, что должно указываться в default.
Собрал ядро полностью по
Собрал ядро полностью по вашим рекомендациям:
Запустил службу rpcbind на сервере.
Ничего не изменилось в лучшую сторону. Ошибка как была так и осталась.
Как монтировались по сети старые клиенты, так и продолжают монтироваться.
Как не монтировался новый, так и не монтируется. :-(
Читаю про создание initrd...
Создай initramfs с
Создай initramfs с ядром
и монолитно в ядро воткни модуль сетевой карты. Если хочется, что бы не монолитно, то добавь модуль в initramfs (что есть геморно).
genkernel не дурак, он сам все сделает так, что бы pxe boot сработал на ура и что бы стевка послучила ip и что бы / смонтировался по nfs (только про fstab не забудь).
У ТС initrd не используется,
У ТС initrd не используется, на всех тонких клиентах, кроме одного (одной конфигурации) всё работает. По сети загружается одно ядро и передаются параметры: адрес nfs сервера и имя ресурса.
Собственно собрать ещё дополнительный initrd это конечно вариант, но у ТС на остальных клиентах всё работает без initrd. Если ТС в существующем конфиге ядра, который работает на других тонких клиентах, просто включит монолитно поддержку сетевой карты нового тонкого клиента то всё должно заработать и на новом. Если он ещё не потерял исходную конфигурацию ядра тонких клиентов.
Возможно ядро слишком старое, всё же 2.6.36, хотя и zen, и в драйвере atl1c и atl1e этой версии ядра просто нет поддержки сетевой карты ТС, что мало вероятно.
Либо у ТС проблемы с тестовым стендом, т.к. он тестирует новое ядро на тонком клиенте, подключаясь к другому nfs серверу.
Либо он всё же не включил правильно поддержку сетевой карты, что мало вероятно, ошибиться сложно.
append ip=dhcp root=/dev/nfs
У него ip=dhcp. Монолитное ядро без initramfs может получить ip? ЕМНИП это не возможно.
Почитайте документацию я
Почитайте документацию к ядру, для начала можете изучить параметры ядра в menuconfig:
CONFIG_IP_PNP:
This enables automatic configuration of IP addresses of devices and of the routing table during kernel boot, based on either information supplied on the kernel command line or by BOOTP or RARP protocols. You need to say Y only for diskless machines requiring network access to boot (in which case you want to say Y to "Root file system on NFS" as well), because all other machines configure the network in their startup scripts.
CONFIG_IP_PNP_DHCP:
If you want your Linux box to mount its whole root file system (the one containing the directory /) from some other computer over the net via NFS and you want the IP address of your computer to be discovered automatically at boot time using the DHCP protocol (a special protocol designed for doing this job), say Y here. In case the boot ROM of your network card was designed for booting Linux and does DHCP itself, providing all necessary information on the kernel command line, you can say N here.
И никакого initrd не нужно.
Спасибо, работает.
Спасибо, работает.