LINUX.ORG.RU
ФорумAdmin

iproute2 tty buffers

 , , , ,


0

1

проблема: Команда ip (a \ r \ не важно) ничего не возвращает в консоль. ifconfig работает без проблем.

C помощью strace было выяснено, что системные вызовы идут

...
write(1, "2898: veth3724fc8@if2897: <BROAD"..., 201) = 201
write(1, "    inet6 fe80::ac85:47ff:fee8:6"..., 98) = 98
getgid()                                = 0
stat("/var/run/netns", 0x7fff9b06be70)  = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/var/run/netns", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = -1 ENOENT (No such file or directory)
write(1, "2527: vethc474d5f@if2526: <BROAD"..., 200) = 200
write(1, "    inet6 fe80::d02b:3dff:fefc:2"..., 98) = 98
exit_group(0)                           = ?
+++ exited with 0 +++
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

но в терминал ничего не попадает, ошибок тоже нет никаких. Логически рассуждая пришли к проблемам с буферизацией консоли, что и подтвердилось переопределением буфера:

# stdbuf -oL ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
...

проблема носит массовый характер вне зависимости от ОС, версии ядра, утилит или хостера. Через виртуальную физическую консоль проблема тоже воспроизводится.

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

Достаточно много задач выполняется через ansible, но там нет никакого криминала на мой взгляд (создать юзера, прописать ключи…), всё достаточно тривиально.

ЧЯДНТ?



Последнее исправление: AnViar (всего исправлений: 1)

Ответ на: комментарий от Anoxemian

Сослуживцев нет, а бьюсь над проблемой я уже не один месяц.

Есть вот ещё интересная статья на тему https://eklitzke.org/stdout-buffering

Судя по поведению у меня включена полная буферизация консоли (not a TTY)

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

у меня

Локализуй проблему. Ты пишешь что он на разных ОС, хостерах итд. При этом у всех остальных на тех же ОС и хостерах её нет. Вряд ли утилита ip как-то узнаёт что это именно ты её запускаешь.

firkax ★★★★★
()

Раз ″setbuf″ помогает, значит ″ip″ не переключает режим буферизации. За буферизацию отвечает libc, которая по завершению main() должна скинуть все буферы (вызвать write()). Так что можете посмотреть, что у вас с версиями libc...

Через pipe работает, типа ″ip route | cat″?

виртуальную физическую консоль

В смысле /dev/ttyX?

У вас хосты физические или виртуалки. Дистрибутив с нуля устанавливали или уже готовые получаете?

Можете попробовать скомпилировать ″ip″ статически и позапускать этот бинарник на разных хостах...

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

что у вас с версиями libc

разные версии, дистрибутивы, ядра…

Version: 2.31-13+deb11u3

Version: 2.28-10+deb10u1

Через pipe работает, типа ″ip route | cat″?

нет, так тоже не работает, пробовал.

В смысле /dev/ttyX?

да. Пробовал чтобы исключить проблемму ssh как-то.

У вас хосты физические или виртуалки. Дистрибутив с нуля устанавливали или уже готовые получаете?

Есть и физические и виртуальные с этими симтомами.

Hetzner, Servers.com, DigitalOcean

Есть Debian (9,10,11) и CentOS 7

да, там собственные образы у них, но как-то не верится что разные хостеры допускают одну и ту же ошибку с одинаковыми симптомами )

Вот снял трейс для полноты: https://pastebin.com/raw/XrMigS4u

UPD: wow

Можете попробовать скомпилировать ″ip″ статически и позапускать этот бинарник на разных хостах…

скомпилировал на одном из хостов iproute2 из сырцов последний… и он работает @_@

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

Трассировка выглядит нормальной. write(1, ...) в конце вызывается, значит в ядро уходит. Странно.

Можете ради интереса сравнить результаты двух strace'ов:

strace -o /tmp/A stdbuf -oL /sbin/ip a
и
strace -o /tmp/B /sbin/ip a
Понятно, что трафик идёт, информация (счётчики) меняются, из netlink-сокета от ядра будет идти разная информация, поэтому различия в recvmsg(3, ..) будут и mmap() даст разные результаты. Наверное, сравнивать глазами, утилита diff тут не поможет.

Ну, и ради интереса, посмотрите, какому пакету пренадлижит /sbin/ip, совпадает его версия с дистрибутивной, проходит ли он проверку (ЕМНИП, rpm -q -V).

mky ★★★★★
()

Тут новые приколы выяснил

root@infra /usr/sbin # which ip
/usr/sbin/ip
root@infra /usr/sbin # /usr/sbin/ip a
root@infra /usr/sbin # ls -l /sbin
lrwxrwxrwx 1 root root 8 Jul  9  2019 /sbin -> usr/sbin
root@infra /usr/sbin # /sbin/ip a
root@infra /usr/sbin # ./ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
...

/bin/ip и /usr/bin/ip тоже работают

root@infra /usr/sbin # ls -lh ip
lrwxrwxrwx 1 root root 7 Dec  3  2020 ip -> /bin/ip
root@infra /usr/sbin # ln -s /bin/ip pp
root@infra /usr/sbin # pp a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
...

и такой фокус проходит тоже

AnViar
() автор топика