Bug 10350

Summary: vethXXX.X/sysctl.conf is being misprocessed
Product: Sisyphus Reporter: Michael Shigorin <mike>
Component: etcnetAssignee: Andrew Kornilov <hiddenman>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: minor    
Priority: P2 CC: dubrsl, evg, ldv, rider, sem, shaba, vseleznv, vsu, vvk
Version: unstable   
Hardware: all   
OS: Linux   
Attachments:
Description Flags
ifup-common patch none

Description Michael Shigorin 2006-12-01 15:36:41 MSK
имеется (TYPE=eth):
$ cat /etc/net/ifaces/veth199/sysctl.conf 
proxy_arp=1

получается:
# ifup veth199 
error: "net.ipv4.conf.veth199/proxy_arp" is an unknown key

(если не veth199, а veth199.0, как предполагается в документации OpenVZ -- то
пытаемся пойти в /proc/sys/net/ipv4/conf/veth199/0, а есть .../veth199.0;
насколько понимаю, насчёт предложенной нотации неправы авторы openvz)
Comment 1 Evgenii Terechkov 2006-12-26 08:11:53 MSK
Да оно вообще сломано полностью:

$R -q etcnet
etcnet-0.8.4-alt2
$R -V etcnet
$su -
Password:
#echo 'log_martians=0' > /etc/net/ifaces/atl/sysctl.conf
#service network reload
...
error: "net.ipv4.conf.atl/log_martians" is an unknown key
...
#cat /proc/sys/net/ipv4/conf/atl/log_martians
1
#echo 'net.ipv4.conf.atl.log_martians=0' >| /etc/net/ifaces/atl/sysctl.conf
#service network reload
...
#cat /proc/sys/net/ipv4/conf/atl/log_martians
1

Причём если в /etc/net/scripts/ifup-common в функций
process_sysctl_file приводить строчки с VARPREFIX к общему знаменателю
(точке либо слэшу), содержание sysctl.conf для интерфейса по прежднему
не действует. Почему, мне непонятно.

reload или stop&&start вроде роли не играет.
Comment 2 Michael Shigorin 2006-12-26 18:42:50 MSK
Выставлю ящик пива (средне-разумной категории) в Киеве за исправление. :)
Comment 3 Andrew Kornilov 2006-12-26 18:56:28 MSK
Сейчас включаю свободный тазик, где можно со всем этим поэкспериментировать.
Заодно и QoS проверю, потому как у меня работает вроде как. По ходу эксперимента
буду тут вопросы задавать. Поддержки ovz пока нет, желающие помочь welcome.
Comment 4 Andrew Kornilov 2006-12-26 18:58:09 MSK
Миша, не подумай, что это из-за пива я оживился :-D
Comment 5 Andrew Kornilov 2006-12-26 21:30:04 MSK
Вот лог общения с Сергеем. Все понятно, в принципе :)

===================
<hiddenman> vsu|x86_64: и еще: /sbin/sysctl -q -w net/ipv4/conf/eth0.proxy_arp=1
  раньше, судя по всему, работало. сейчас не работает. я про точку после имени
интерфейса. у Pilot-а так в исходниках. мож это в 2.4 только было?
<hiddenman> vsu|x86_64: без адреса никак? гм
<vsu|x86_64> hiddenman: вообще-то в мане как раз '.' написано
<hiddenman> /sbin/sysctl -q -w net/ipv4/conf/eth1.proxy_arp=1
<hiddenman> error: "net.ipv4.conf.eth1/proxy_arp" is an unknown key
<vsu|x86_64> hiddenman: возможно, если '/', надо все так писать?
<hiddenman> /sbin/sysctl -q -w net/ipv4/conf/eth1/proxy_arp=1 работает
<vsu|x86_64> пошёл RTFS...
<hiddenman> vsu|x86_64: возможно. тут просто баги на etcnet висят. вижу, что
Денис заменил все 
<hiddenman> -     VARPREFIX="net/ipv4/neigh/$NAME."
<hiddenman> +     VARPREFIX="net.ipv4.neigh.$NAME."
<hiddenman> и тд
<hiddenman> типа поддержка точки для чего-то там. но, похоже, неправильно что-то
<vsu|x86_64> slashdot(tmpname+strlen(PROC_PATH),'.','/')
<vsu|x86_64>   p = strpbrk(p,"/.");
<vsu|x86_64>   if(!p) return;            /* nothing -- can't be, but oh well */
<vsu|x86_64>   if(*p==new) return;       /* already in desired format */
<vsu|x86_64> hiddenman: т.е., если последний разделитель такой, как надо, ничего
не делается
<vsu|x86_64> hiddenman: а в данном случае переводится из '.' в '/'
* ^emp^ is now known as emp|powerpc
<vsu|x86_64> ой, там вообще фигня какая-то
<vsu|x86_64>   while(p){
<vsu|x86_64>     char c = *p;
<vsu|x86_64>     if(c==old) *p=new;
<vsu|x86_64>     if(c==new) *p=old;
<vsu|x86_64>     p = strpbrk(p+1,"/.");
<hiddenman> vsu|x86_64: такой как надо - это какой?
<vsu|x86_64>   }
<vsu|x86_64> hiddenman: короче, все разделители должны быть одинаковые, иначе
будет жопа
<hiddenman> vsu|x86_64: ясно. баг Дениса, значит. а может поменяли просто недавно
<vsu|x86_64> хотя чего ещё ждать от функции с именем slashdot :)
<vsu|x86_64> hiddenman: вообще прикол в том, что никто не запрещает иметь '.' в
имени интерфейса
<hiddenman> :)
<vsu|x86_64> net.ipv4.conf.dummy/iface.forwarding = 1
<hiddenman> vsu|x86_64: так как быть лучше?
<vsu|x86_64> вот что получается
<vsu|x86_64> а '/' всё-таки запрещено
<vsu|x86_64> hiddenman: работает либо net.ipv4.conf.dummy/iface.forwarding, либо
net/ipv4/conf/dummy.iface/forwarding
<vsu|x86_64> hiddenman: из имени интерфейса, очевидно, проще сделать второе
<vsu|x86_64> hiddenman: но в выводе sysctl оно всё равно преобразуется в первое
<vsu|x86_64> hiddenman: короче, это очередные недокументированные грабли
<hiddenman> ага, спасибо
<vsu|x86_64> hiddenman: в том куске патча менять следовало не '/' на '.', а наоборот
<henker> bb all
* henker has quit ("Покидаю")
<vsu|x86_64> hiddenman: или он там правит $NAME ?
<hiddenman> vsu|x86_64: не, name не трогает вроде
<vsu|x86_64> hiddenman: короче, я понял логику sysctl... последний символ [/.]
определяет, какие символы используются как разделители
<vsu|x86_64> hiddenman: т.е, у тебя получилось ("net/ipv4/conf/eth0" "proxy_arp")
<hiddenman> vsu|x86_64: ясно. запишу сейчас весь твой текст в баг, там посмотрим
<vsu|x86_64> hiddenman: а когда он преобразовал это в имя файла -
("net.ipv4.conf.eth0" "proxy_arp")
<vsu|x86_64> hiddenman: баг-то где?
<hiddenman> vsu|x86_64: преобразовывает sysctl, денис ничего не преобразовывает
<vsu|x86_64> hiddenman: ну тогда лучше использовать '/'
<vsu|x86_64> hiddenman: чтобы на интейфейсах с точками не глючило
<hiddenman> $SYSCTL -q -w $VARPREFIX$VARNAME=$VARVALUE
<vsu|x86_64> мда
Comment 6 Michael Shigorin 2006-12-26 23:52:51 MSK
Да ладно, прям нельзя уж хоть какой-то подниматель настроения предложить за
хорошее дело :-)

2 vsu: офигеть oO
Comment 7 Evgenii Terechkov 2006-12-27 05:32:11 MSK
(In reply to comment #5)
> Вот лог общения с Сергеем. Все понятно, в принципе :)
> 

А вот мне что-то не очень. Я пробовал ставить везде и точки и слеши (и писал об
этом здесь). Пробовал и абсолютный путь в sysctl.conf прописывать. У меня не
заработало никак. :-(
Comment 8 Sergey Vlasov 2006-12-27 10:05:53 MSK
(In reply to comment #7)
> А вот мне что-то не очень. Я пробовал ставить везде и точки и слеши (и писал об
> этом здесь). Пробовал и абсолютный путь в sysctl.conf прописывать. У меня не
> заработало никак. :-(

Все разделители в имени sysctl должны быть одного типа (либо '.', либо '/');
используемый разделитель определяется по последнему присутствующему в строке
символу из набора [/.].  При этом, если используется разделитель '/', символы
'.' рассматриваются как часть элемента пути; если используется разделитель '.',
символы '/' при преобразовании имени в путь в /proc/sys заменяются на '.'.

Т.е., в данном случае есть два варианта работы с sysctl:

1) Использовать разделитель '.', при этом все символы '.' в имени интерфейса
(которые там вполне могут встречаться) необходимо заменять на '/'.

2) Использовать разделитель '/', при этом в имени интерфейса ничего заменять не
надо (символы '/' в имени интерфейса встречаться не могут).
Comment 9 Evgenii Terechkov 2006-12-27 10:47:31 MSK
(In reply to comment #8)
> (In reply to comment #7)
> > А вот мне что-то не очень. Я пробовал ставить везде и точки и слеши (и писал об
> > этом здесь). Пробовал и абсолютный путь в sysctl.conf прописывать. У меня не
> > заработало никак. :-(
> 
> Все разделители в имени sysctl должны быть одного типа (либо '.', либо '/');
> используемый разделитель определяется по последнему присутствующему в строке
> символу из набора [/.].  При этом, если используется разделитель '/', символы
> '.' рассматриваются как часть элемента пути; если используется разделитель '.',
> символы '/' при преобразовании имени в путь в /proc/sys заменяются на '.'.
> 
> Т.е., в данном случае есть два варианта работы с sysctl:
> 
> 1) Использовать разделитель '.', при этом все символы '.' в имени интерфейса
> (которые там вполне могут встречаться) необходимо заменять на '/'.
> 
> 2) Использовать разделитель '/', при этом в имени интерфейса ничего заменять не
> надо (символы '/' в имени интерфейса встречаться не могут).


Я читал копию IRC-беседы и понял это. Но попытки сделать и так (могу показать
применяемые тривиальные патчи) к положительному результату не привели. Судя по
логу (ставил set -x в скриптах) sysctl выполняется с нужными параметрами. Но cat
упорно твердит, что log_martians не изменился (его менял). Точки в имени
интерфейса, как видно, нет. Не знаю, куда ещё копать.

Если всё так просто, как говорите, может патчем поделитесь?
Comment 10 Andrew Kornilov 2006-12-27 14:46:45 MSK
Собственно, патч простой, дозаменить последнюю точку везде на /. Толи Денис не
заметил их, толи чем-то другим руководствовался. Патч прикладываю и начинаю
разыскивать Дениса :-)
Comment 11 Andrew Kornilov 2006-12-27 14:49:54 MSK
Created attachment 1735 [details]
ifup-common patch
Comment 12 Evgenii Terechkov 2006-12-27 21:14:05 MSK
(In reply to comment #11)
> Created an attachment (id=1735) [edit]
> ifup-common patch
> 

Посмотрел патч. Я дела такой же (вернее, два, ещё один с точками а не слешами).
Но у меня не работает. И абсолютный путь не работает. log_martians упорно не
меняется.
Comment 13 Evgenii Terechkov 2006-12-28 05:43:44 MSK
(In reply to comment #11)
> Created an attachment (id=1735) [edit]
> ifup-common patch
> 
~$ R -q etcnet
etcnet-0.7.16-alt1

На работе старый etcnet из Campact-а. Те же яйца. Не работает ни относительный
ни абсолютный пути в /etc/net/ifaces/eth0/sysctl.conf.  ifup-common патчить не
нужно (одни точки).

Оно вообще то тестировалось? Или руки?
Comment 14 Denis Ovsienko 2006-12-28 05:55:23 MSK
Всем привет.
Когда я вводил тасовку точек и наклонок, я решал проблему с интерфейсами, имена
которых содержат точку (и решил, насколько я помню). Впрочем, если вы сообща
раскопали другие ньюансы, то на здоровье (я могу сам всё проверить, но это
сейчас неудобно). Перевешиваю на Андрея, он может залить пакет с тем патчем,
который посчитает нужным. Только работающее не сломайте пожалуйста.
Comment 15 Evgenii Terechkov 2006-12-28 07:08:15 MSK
(In reply to comment #14)
> Когда я вводил тасовку точек и наклонок, я решал проблему с интерфейсами, имена
> которых содержат точку (и решил, насколько я помню). Впрочем, если вы сообща
> раскопали другие ньюансы, то на здоровье (я могу сам всё проверить, но это
> сейчас неудобно). Перевешиваю на Андрея, он может залить пакет с тем патчем,
> который посчитает нужным. Только работающее не сломайте пожалуйста.

Пожалуйста, убейте меня кто-нибудь! Я ССЗБ, который
редко думает головой! Разобрался. Патч работает.
Comment 16 Michael Shigorin 2006-12-28 12:39:13 MSK
(In reply to comment #15)
> Пожалуйста, убейте меня кто-нибудь!
"Не дождётесь"
Comment 17 Andrew Kornilov 2006-12-28 18:07:34 MSK
В общем, баг исправил и в trunk и в tag. В trunk еще кучка исправлений и
нововведений. Даже не знаю, что лучше залить. Денис предлагал уже 0.8.5 pre
какой-нибудь сделать. Как думаете? Вот Changelog из 0.8.5:
        bugfix: name managements broke ethtool calls
        bugfix: DHCP did not work for Fedora 5
        bugfix: file permissions in Makefile
        bugfix: system iptables chains were not flushed
        bugfix: wrong sysctl options handling
        new feature: bash arrays IPV4ADDRESS and IPV6ADDRESS in the firewall rules
Comment 18 Evgenii Terechkov 2006-12-28 18:41:04 MSK
(In reply to comment #17)
> В общем, баг исправил и в trunk и в tag. В trunk еще кучка исправлений и
> нововведений. Даже не знаю, что лучше залить. Денис предлагал уже 0.8.5 pre
> какой-нибудь сделать. Как думаете? 

Стойт обновить, ИМХО.
Comment 19 Denis Ovsienko 2007-02-17 16:39:31 MSK
Можно закрывать?
Comment 20 Michael Shigorin 2007-02-17 17:30:04 MSK
Сейчас попробую вспомнить да проверить...
Comment 21 Evgenii Terechkov 2007-02-19 07:17:24 MSK
(In reply to comment #19)
> Можно закрывать?

Можно. Только за OpenVZ ничего сказать не могу. А так - УМВР. :-)
Comment 22 Denis Ovsienko 2007-02-21 09:00:24 MSK
Чудно.