Озаботился как-то сбором статистики в Munin по доменам Xen на домашнем сервере. В Munin gallery нашел плагины (штатно в дистрибутиве ничего нет на эту тему). Поставил, работают.
За статистику сети отвечали 2 плагина (на тот момент просто поставил все сразу) – xen-multi и xen_traffic_all. Через время второй перестал нормально работать и только сейчас дошли руки разобраться, что с ним не так.
Как сейчас выяснилось, перестал он работать из-за того, что я стал использовать именованные сетевые интерфейсы – это опция vifname в конфигурации домена. Разобрал сегодня код плагина. За получение списка сетевых интерфейсов для домена отвечает строка
dev=$( xl network-list "$dom" | grep '^[0-9]\+' | sed 's@^.*vif/\([0-9]*\)/\([0-9]*\).*$@vif\1.\2@')
Т.е., отображаем список сетей, а дальше из строки формируем название интерфейса (в стиле “vif7.0”). Все бы хорошо, но при использовании vifname этот vif7.0 перестает фигурировать в системе – для того алиас и делается, чтобы были более удобочитаемые имена. Дальнейший же код пытается из /proc/net/dev получить статистику именно по изначальному имени интерфейса. При использовании vifname он обламывается и не возвращает ничего.
Решение – сделать маппинг, используя sysfs. В /sys/devices можно найти оригинальное имя, а в подкаталоге – новое. Используем это:
dev=$(basename $(ls -d /sys/devices/$(xl network-list "${dom}" | awk '/^[0-9]+/{gsub(/.*vif/, "vif", $8); gsub("/", "-", $8); print $8}')/net/*))
Теперь из procfs будут запрашиваться данные по реально существующему интерфейсу и плагин снова начнет работать.
Что интересно, в header’е файла есть строки:
# Changelog:
# Also handle domUs with named network interfaces.
# Ward Vandewege (ward@gnu.org), 2011-04-20
Возможно, тогда именованные интерфейсы возвращались как-то иначе и это работало.