LINUX.ORG.RU

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

 , , ,


2

2

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

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

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

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

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

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

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

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

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

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

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

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

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

IOMMU зря придумали, выходит?

Можно хоть 10 разных ядер запустить, и каждому отдать свое pci устройство.

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

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

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

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

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

TheAnonymous ★★★★★
()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

mky ★★★★★
()

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

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

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

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

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

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

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

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

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

raspopov
() автор топика
Ответ на: комментарий от 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 ★★★★★
()