LINUX.ORG.RU

iptables на ванильном ядре и ARM процессоре.


0

1

Всем доброго времени суток.

Появилась такая необходимость в сборке из сорцов пакета iptables для ванильного ядра версии 2.6.27.53.

Собирается всё через самосборный toolchain, состоящий из: uClibc-0.9.29, arm-linux-uclibc-{gcc,g++,cpp} - version (GCC) 4.2.4, arm-linux-uclibc-{ld,ar,strip} - version GNU ld (GNU Binutils) 2.18

процессор для которого это собиралось: Processor : ARM920T rev 0 (v4l) Микроконтроллер: AT91RM9200 http://www.gaw.ru/html.cgi/txt/ic/Atmel/micros/arm/AT91RM9200.htm

в качестве утилит используется busybox 1.18.5

Сначала собирал разные версии Iptables, но все попытки заканчивались различными ошибками: более подробно с выводами и кусками кода - можно посмотреть тут! (на лор не влезло «Ошибка: Слишком большое сообщение» 8E)

Решил собрать самую последнюю стабильную версию iptables 1.4.12

после попытки запуска на самом устройстве с ARM процессором, получаем следующую ошибку:

[root@Router7:/mnt/db/updates]# /mnt/db/iptables/sbin/iptables -L
iptables v1.4.3.2: can't initialize iptables table `filter': Invalid argument
Perhaps iptables or your kernel needs to be upgraded.

ясно, что нужно копать в сторону модулей ядра:

lsmod
nf_conntrack_ftp 7296 0 - Live 0xbf054000
iptable_nat 5576 0 - Live 0xbf051000
nf_nat 17622 1 iptable_nat, Live 0xbf04b000
nf_conntrack_ipv4 14956 3 iptable_nat,nf_nat, Live 0xbf046000
nf_conntrack 67916 4 nf_conntrack_ftp,iptable_nat,nf_nat,nf_conntrack_ipv4, Live 0xbf034000
ipt_LOG 5440 0 - Live 0xbf02f000
iptable_raw 2208 0 - Live 0xbf032000
iptable_filter 2752 0 - Live 0xbf02d000
ip_tables 11472 3 iptable_nat,iptable_raw,iptable_filter, Live 0xbf029000
x_tables 15268 3 iptable_nat,ipt_LOG,ip_tables, Live 0xbf024000

но тут видно что модули подгружены и в логах также никаких проблем.

Дошёл до абсурда, пересобрал busybox c поддержкой dpkg утилиты и попробовал поставить пакет http://packages.debian.org/ru/lenny/arm/iptables, но только потом увидел зависимость от libc6, которого конечно у меня нет.

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

почти во всех случаях сборки, проблем с модулями нет - они корректно подгружаются, в

[root@Router7:/mnt/db/updates]# cat /proc/net/ip_tables_names
filter
всё в порядке, но iptables упорно игнорирует наличие таблиц.

после этого решил пересобрать iptables c поддержкой дебаггинга, используя http://www.spinics.net/lists/netfilter-devel/msg00887.html и http://backreference.org/2010/06/11/iptables-debugging/, но также столкнулся с тем, что iptables не хочет писать ничего в kernel log.

Решил открыть тему типа баг http://bugzilla.netfilter.org/show_bug.cgi?id=734, но вряд ли ответ будет раньше, чем через месяц. Также там и представлены strace для этих ошибок и конфиг для ядра, но если нужно могу выложить их и тут

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

Судя по http://backreference.org/2010/06/11/iptables-debugging/, а точнее по последнему абзацу

Also, this could be generated in case you are trying to use a match that is not available, either because you did not load the proper module, it was not compiled into kernel or iptables failed to automatically load the module

возникает вопрос: а как вообще проверить то, что Iptables не может подгрузить модули? (хотя на самом деле модули он подгружает, потому что они не стоят в автозагрузке ядра)

В связи с этим следующий вопрос: может кто то включал дебаггинг по максимуму для iptables и модулей ядра для него.

Ну и может кто то собирал Iptables для таких нужд и возможно поделится опытом.

Буду очень признателен за любую помощь в этих вопросах и могу предоставить всё что попросите.

P.S. данный toolchain является рабочим, на нём были собраны другие пакеты, которые успешно работают. Также все вопросы по поводу обновления каких либо пакетов, не рассматриваются, т.к. это довольно трудоёмкая работа и нерентабельна для данного случая.


Не знаю что у вас за проблемы - iptables прекрасно собирается и работает на arm9 точно (собирал в buildroot, работал на разных системах правда процессор arm926ej-s но это не принципмально), кстати - за каким хреном делать модули ядра динамически подгружаемыми на встраиваемых платформах ?

anonymous
()

Проверить можно через strace, например. Или gdb(если он запускается на arm).

Вообще лучше посмотреть какой iptables «родной» для этой версии ядра. Потому что ты может собрал слишком новый. В нормальных софтинах должны быть проверки на совместимость API, но этож iptables...

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

а можно поподробней по поводу сборки iptables, хотя бы с какими параметрами конфигурировали.

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

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

Проверку и делал через strace, через gdb не пробовал, но спасибо за вариант.

А насчёт версии, актуальная для ядра является версия 1.4.2, если не трудно я по ссылке Тырк описал процесс сборки и для версии 1.4.3.2 и почему не получилось собрать под 1.4.2.

Так же ТУТ я выложил выводы strace, был бы признателен если бы помогли разобраться в них.я в них.

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

Я правильно понимаю что ты strace без -f запускал? Запусти с -f -F -s 256, будет более понятно чем там дело с modprobe заканчивается. Но, судя по getsockopt который не работает. Короткое гугление привело к аналогочной проблеме как у тебя: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=446685 плюс ещё пара репортов в гугле.

В общем, моё мнение совпадает с тем что там написано: что-то не так с API/ABI. Мне кажется ты собираешь iptables с хедерами от другого ядра.

В общем, погугли getsockopt SOL_IP bad file descriptor, там много похожих топиков.

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

Спасибо, обязательно сейчас проверю. Насчёт ABI, есть ещё одна тема, в которой это обсуждается http://www.opennet.ru/openforum/vsluhforumID1/92085.html

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

я прочитал внимательно, что же там такое может быть интересное: в основном читалось отсюда http://wiki.debian.org/ArmEabiPort

и вот что у меня получилось:

t405VM:/home/aidjek/iptables-1.4.12/build/bin/sbin# readelf -h iptables | grep Flags Flags: 0x202, has entry point, GNU EABI, software FP

readelf -h /home/aidjek/iptables-1.4.3.2/build/bin/sbin/iptables | grep Flags Flags: 0x202, has entry point, GNU EABI, software FP

readelf -h net/ipv4/netfilter/ip_tables.ko | grep Flag Flags: 0x200, GNU EABI, software FP

readelf -h net/ipv4/netfilter/ip_tables.ko | grep Flag Flags: 0x200, GNU EABI, software FP

т.е. всё собрано с поддержкой EABI - а значит ИМХО тут проблем не должно быть.

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

>> Мне кажется ты собираешь iptables с хедерами от другого ядра.

Не мог бы подсказать как ему другие хедеры подсунуть ??

в configure для iptables, есть только такие опции для работы с ядром:
--with-kernel=PATH Path to kernel source/build directory
--with-kbuild=PATH Path to kernel build directory [[/lib/modules/CURRENT/build]]
--with-ksource=PATH Path to kernel source directory [[/lib/modules/CURRENT/source]]
--with-xtlibdir=PATH Path where to install Xtables extensions [[LIBEXECDIR/xtables]]
--with-pkgconfigdir=PATH Path to the pkgconfig directory [[LIBDIR/pkgconfig]]

Спасибо

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

>а можно поподробней по поводу сборки iptables, хотя бы с какими параметрами конфигурировали.

В buildroot насчет опций, версий, патчей и прочего не нужно задрачиваться - make menuconfig и ставишь галки где нужно. Для вашего процессора есть готовый дефолтный конфиг
http://git.buildroot.net/buildroot/tree/configs/at91rm9200df_defconfig
патчи маинтейнера автоматом наложатся и ядро по-свежее чем у вас и c iptables будет все ок если еще немного доки посмотрите
http://buildroot.uclibc.org/downloads/buildroot.html
как правильно собирать, что и где потом лежит. Если нужна поддержка nptl в uclibc то есть смысл качать снапшот или релиз-кандидат, хотя думаю вам это ненужно будет а кое-где и вредно - сомневаюсь что все сейчас стабильно работает.

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

К сожалению ядро ванильное, некоторые исходники менялись вручную под определённые операции, документации к сожалению как таковой нет, поэтому приходиться работать с тем, что есть.

Но спасибо за Ваш вариант, на досуге попробую собрать.

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

Всем доброго времени суток.

После продолжительного разговора с Jan Engelhardt, человеком который в развитии iptables занимает далеко не последнее место, была найдена следующая особенность http://bugzilla.netfilter.org/show_bug.cgi?id=734:

отличие в kernelspace и userspace некоторых типов данных и в особенности:

kernelspace:         
TYPE         SIZEOF  ALIGNOF
uint64_t        8        8
userspace:
TYPE         SIZEOF  ALIGNOF
uint64_t        8        4

По его словам именно эти значения должны повлиять на ход работы iptables в лучшую сторону.

В связи с этим возникли пару непонятных для меня вопросов.

Ясно, что менять лучше значения для userspace, т.к. kernelspace может повлиять на работу остальных приложении, но каким образом данный тип данных можно изменить? В моём понимании этот тип данных определяется при компиляции gcc и вероятнее всего в некотором файле stdint.h. К сожалению toolchain в котором это всё собиралось имеет в себе несколько таких файлов - но я смог вытащить из самого бинарника для gcc следующие данные:

/projects/buildroot/toolchain_build_arm/gcc-4.2.4/configure --prefix=/usr --build=i386-pc-linux-gnu --host=i386-pc-linux-gnu --target=arm-linux-uclibc --enable-languages=c,c++ --with-sysroot=/projects/buildroot/build_arm/staging_dir --with-build-time-tools=/projects/buildroot/build_arm/staging_dir/usr/arm-linux-uclibc/bin --disable-__cxa_atexit --enable-target-optspace --with-gnu-ld --enable-shared --with-gmp=/projects/buildroot/toolchain_build_arm/gmp --with-mpfr=/projects/buildroot/toolchain_build_arm/mpfr --enable-threads --disable-multilib --with-float=soft --with-tune=arm920t

К сожалению, меня не натолкнуло на мысль, ничего об изменении данного типа.

Может грамотные программисты на С/C++ смогут натолкнуть меня на мысль о том, куда копать по этим вопросам.

Заранее спасибо.

Aidjek
() автор топика
14 ноября 2011 г.
Ответ на: комментарий от Aidjek

Все проблему решил полной пересборкой toolchain'a, используя этот мануал http://cross-lfs.org/view/clfs-embedded/arm/index.html

Собрал самую последнею версию iptables 1.4.12.1

Всё работает без проблем.

Тему можно закрывать.

Aidjek
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.