LINUX.ORG.RU

Есть ли способ запустить драйвер от PCI-платы, оформленный в виде модуля ядра Linux старой версии, на новом железе?

 , , ,


2

2

Драйвер в наличии только в виде бинарного файла (.ko), а его исходники в составе программно-аппаратного комплекса не поставлялись изначально. Версия Linux - это, видимо, экстремально обрезанный Debian (т.к. внутри syslinux, busybox и т.п.), где-то между 4 и 5 версиями, причём использовалась нестандартная версия ядра, которая никогда не поставлялась в составе официального релиза Debian-а. Фирма - производитель комплекса давно закрылась.

Я правильно понимаю, что надежды нет, и что из-за монолитности ядра Linux, модули, скомпилированные для конкретного ядра, подходят исключительно только для него, с точностью до не только полной версии ядра, но и до совпадения конфигурации (и опций компилятора)?

Технически, утилита insmod либо отказывается считать файл модулем ядра, если версия ядра не совпадает полностью, либо не хочет загружать модуль из-за «несовпадения символов», если версия ядра совпадает.

Можно. Для запуска старых ядер сиспользуйте KVM.

i586 ★★★★ ()

Скорее всего ничего не выйдет.

программно-аппаратного комплекса

А что, от всего комплекса прям только модуль и плата остались?

apt_install_lrzsz ★★ ()

Ты можешь попробовать форсированно загрузить модуль от другого ядра и даже другой версии ядра в текущее используемое ядро, но может не заработать.

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

На этапе компилирования ядра создаётся файл Module.symvers в котором указывается какие API и ABI предоставляет ядро.

Если в текущем ядре есть все требуемые для работы модуля опции и они не сильно изменились со времён ядра под которое собирался модуль, то всё может даже заработать.

Но скорее всего нет, в первую очередь, если модуль собирался допустим под ядро 3.X, а ты запускаешь на современном ядре.

Другим возможным решением может быть достать ядро из той системы и запустить текущий Linux с этим ядром.

Тебе нужен будет файл с образом ядра и директория с модулями.

Но тут ещё всё зависит от того с какими опциями собиралось ядро и в том ядре может не быть драйверов для твоего другого оборудования.

По сути конечно в идеале тебе нужны исходные коды того модуля.

kostik87 ★★★★★ ()
Ответ на: комментарий от i586

Ну ок, а ты думаешь ему нужно запустить только одно это PCI устройство? К прочему оборудованию системы думаешь доступ не нужен? К дискам там, сети?

kostik87 ★★★★★ ()
Ответ на: комментарий от i586

Т.е. если взять новое железо с поддержкой IOMMU, то через KVM можно будет запустить виртуалку со старым ядром в котором модуль с проброшенной внутрь PCI-платой заработает, гипотетически.

А как быть с сетевой картой (это существнно) в старом ядре? Ведь старая процессорная плата сгорела, и она была со встроенной сетевухой типа Intel PRO 10 (не 100). Поэтому и хотелось взять только старый драйвер PCI-платы, а всё остальное новое…

raspopov ()
Ответ на: комментарий от raspopov

Ты же пробрасываешь в виртуалку, там qemu эмулирует какую-то распространённую сетевуху, типа встройки интел или реалтек. Или в твоём ядре только один драйвер для конкретной сетевухи?

TheAnonymous ★★★★★ ()

Видимо, у тебя модуль для 2.6 ядра.

Найди комп, на котором будут работать 3.xx ядра, и попробуй загрузить модуль.

Попробуй какую-нибудь не очень свежую Slackware или Salix - т.к. оно на ванильном ядре, возможно, будет просто.

Shadow ★★★★★ ()
Последнее исправление: Shadow (всего исправлений: 2 )
Ответ на: комментарий от raspopov

на любой машине с 3.x ядром попробуй insmod -f

Shadow ★★★★★ ()
Ответ на: комментарий от raspopov

Если у вас плата PCI, то вам ещё нужно будет поискать материнку с iommu и pci слотами...

Лучше берите просто плату с PCI слотами, ставьте туда старый дистрмибутив с 2.6 ядром (чтобы не было проблем с компилятором), компилируйте там ваше 2.6.13 и пробуйте подобрать конфигурацию ядра, чтобы хватало вашему закрытому модулю.

Или попробуйте собрать модуль сетёвки для того ядра. Просто есть вариант, что та контора не только модуль написала, но ещё и ядро пропатчила...

Модуль не особо привязывается к ядру и не привязывается к компилятору, но, если модулю нужны какие-то части ядра, они должны быть в нём включены.

mky ★★★★★ ()
Последнее исправление: mky (всего исправлений: 1 )
Ответ на: комментарий от Shadow

Я это прочитал, но не понял зачем. Зачем лишние возможные несовместимости? ТС, вроде, не писал, что у него есть машинки с 3.x, так что ему по затратам времени должно быть примерно одинаково.

И, может, лучше компилить модуль сетевой карты под существующее ядро.

mky ★★★★★ ()

Не зря придумали стандарт на жизненный цикл информационных систем, ох не зря…

Infra_HDC ★★★★★ ()
Ответ на: комментарий от mky

Потому что интерфейс модуля не менялся, зато в 3.x ядре завезли много нового. В большинстве случаев в подобных модулях нет никаких несовместимостей.

Shadow ★★★★★ ()
Ответ на: комментарий от Shadow

Потому что интерфейс модуля не менялся

Внутри ядро менялось. Я видел модули, которые начинали работать криво начиная с какой-то версии ядра, и всё в ветке 2.6.

зато в 3.x ядре завезли много нового.

А ТС'у это нужно?

в подобных модулях нет никаких несовместимостей

ТС пока вобще не озвучил что за плата. Если это TAMS, MOXA и пр. то это одно дело, а если разработчики комплекса сами и PCI плату склепали и драйвер к ней написали, то там может быть всякое.

mky ★★★★★ ()

Да, одно из двух: или обеспечить работу того самого дистрибутива с тем самым ядром на подходящем железе, либо виртуализация.

хотя... *bsd кажется используют некие драйвера от линуксов для некоторого железа. Шансы конечно мизерные, но может стоит посмотреть как именно они это делают и вообще правда ли это?

kirill_rrr ★★★★★ ()
Последнее исправление: kirill_rrr (всего исправлений: 1 )
Ответ на: комментарий от mky

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

Так и есть, плата отечественной разработки - что-то типа захватчика видеокадров, с очень специфического источника «изображений».

Сейчас образ системы лежит на работе, а у меня отпуск 🌴, и на работу в отпуск ходить опасно, сами знаете… 😎

В общем идей накидали много, спасибо.

Ещё нашёл 🌎 такой вариант с правкой версии и символов внутри модуля. Реально сработает такой обман?

И есть ещё «план Б», всё-таки найти старое железо максимально похожее на нужное.

raspopov ()
Ответ на: комментарий от raspopov

Этот скрипт из начала 2000 (а, правильно вспомнил, там как раз дата есть). Может и сработает, ядро как раз оттуда.

Dimez ★★★★★ ()
Последнее исправление: Dimez (всего исправлений: 1 )
Ответ на: комментарий от raspopov

Скрипт не пробовал, вполне допускаю, что он рабочий, но мне не понятно, чем вас не устраивает ядро 2.6.13? Если в вашем 2.6.13 чего-то не хватает и получается «Unknown symbol» при попытке загрузить модуль, то и с другими ядрами может быть аналогично. ИМХО, проще понять какая часть ядра даёт этот символ и скомпилить, чем пробовать разные дистрибутивные ядра. Хотя, вполне может быть, что разработчики патчили ядро и требуемого куска кода вобще нет.

Я ещё допускаю, что разработчики пропатчили ядро не только из-за драйвера, но для защиты. Свою чудо программу, работающую с этой платой приявязали к этом пропатченому ядру, чтобы было сложнее скопировать. Встречал подобное...

Я бы сначала посмотрел имеющиеся модули сетевых адаптеров, может там не всё так плохо и то ядро не только Intel PRO 10 понимает. В то время (2.6.13 в 2005 году) e1000 вовсю на серверах шла. Посмотрите, может в /boot есть конфиг ядра, может конфиг есть в ядре — если загрузиться с этого ядра файл /proc/config.gz и ls -l /sys/modules.

mky ★★★★★ ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.