Пробовали ли вы использовать tcpdump для прослушивания интерфейса виртуальной машины?
Я не уверен, что вы используете в качестве гипервизора, но вы сможете запустить ip addr
, и если вы видите порты vswitch; в этом выводе вы можете захватить эти порты в tcpdump.
Вы также можете запустить tcpdump -D
, и это скажет вам, что известно libpcap на хост-компьютере для захвата.
Например, если вы используете KVM в качестве гипервизора, вы можете получить MAC-адрес и имя порта, с которым связана виртуальная машина.
# Assuming your xml files for the vms are in the default location also.
cat /etc/libvirt/qemu/{{ name_of_vm }}.xml | grep -A 2 interface
Из этого вывода вы можете сопоставить вывод из ip addr
, используя две последние цифры MAC-адреса в качестве фильтра.
ip a | grep -B 1 -i {{ last_two }}
Возвращаемый интерфейс затем может использоваться tcpdump.
tcpdump -ni {{ vnet_name }} -s0 -vw /var/tmp/{{ vnet_port_out }}.pcap
Это позволит захватить все на этом порту без фильтрации.
Вот хакерское решение, которое работает на GNU awk 4.1.3 и выше. Год жестко закодирован, так как файл журнала не сообщает нам год.
$ cat data
Mar 14 15:41:00 Xps15 gnome-shell[2048]: Removing a network device that was not added
Mar 14 15:41:00 Xps15 NetworkManager[923]: <warn> [1615736460.0861] sup-iface[fc7990f46420f6bc,7,wlp0s20f3]: call-p2p-cancel: failed with P2P cancel failed
Mar 14 15:41:00 Xps15 /usr/libexec/gdm-x-session[1892]: (II) config/udev: removing device PS/2 Logitech Wheel Mouse
Mar 14 15:41:00 Xps15 systemd[1]: fprintd.service: Succeeded.
Mar 14 15:42:00 Xps15 systemd[1]: fprintd.service: Succeeded.
Mar 14 15:43:59 Xps15 systemd[1]: fprintd.service: Succeeded.
Mar 14 15:44:00 Xps15 systemd[1]: fprintd.service: Succeeded.
Mar 14 15:46:00 Xps15 systemd[1]: fprintd.service: Succeeded.
Mar 14 15:48:01 Xps15 systemd[1]: fprintd.service: Succeeded.
Mar 14 15:49:01 Xps15 systemd[1]: fprintd.service: Succeeded.
Mar 14 15:49:31 Xps15 systemd[1]: fprintd.service: Succeeded.
$ cat myscript.awk
#!/usr/bin/awk -f
{ month=(index("JanFebMarAprMayJunJulAugSepOctNovDec",$1)-1)/3+1;
timestamp=sprintf("%s %02d %02d %s %s %s",2021,month,$2,substr($3,0,2),substr($3,4,2),substr($3,7,2))
secs=mktime(timestamp)
if(secs > last + 119 && last) {
print substr($0,0,6),"**"substr($0,8,8)"**",substr($0,17)
} else {
print $0
}
last=secs
}
$./myscript.awk <data
Mar 14 15:41:00 Xps15 gnome-shell[2048]: Removing a network device that was not added
Mar 14 15:41:00 Xps15 NetworkManager[923]: <warn> [1615736460.0861] sup-iface[fc7990f46420f6bc,7,wlp0s20f3]: call-p2p-cancel: failed with P2P cancel failed
Mar 14 15:41:00 Xps15 /usr/libexec/gdm-x-session[1892]: (II) config/udev: removing device PS/2 Logitech Wheel Mouse
Mar 14 15:41:00 Xps15 systemd[1]: fprintd.service: Succeeded.
Mar 14 15:42:00 Xps15 systemd[1]: fprintd.service: Succeeded.
Mar 14 15:43:59 Xps15 systemd[1]: fprintd.service: Succeeded.
Mar 14 15:44:00 Xps15 systemd[1]: fprintd.service: Succeeded.
Mar 14 **15:46:00** Xps15 systemd[1]: fprintd.service: Succeeded.
Mar 14 **15:48:01** Xps15 systemd[1]: fprintd.service: Succeeded.
Mar 14 15:49:01 Xps15 systemd[1]: fprintd.service: Succeeded.
Mar 14 15:49:31 Xps15 systemd[1]: fprintd.service: Succeeded.
$
Я не знаю ни одной встроенной команды, которая делала бы это. Но так как это просто текстовые файлы, вы можете использовать awk
функции:
mktime()
превратит дату в отметку времени. Я добавил 1970 01 , чтобы избежать ложных срабатываний при смене дня, хотя это не идеальное решение, оно все равно не работает при смене месяца. Вы можете передать фактический год и месяц обработки журнала.
Сценарий сохраняет последнюю строку и ее отметку времени и сравнивает ее с текущей. Когда разница превышает 120 (2 секунды ), скрипт печатает предыдущую и текущую строки.
BEGIN {prev_time=-1;prev_line=""}
{
curr_time = mktime("1970 01 " $2 " " gensub(":"," ","g",$3))
if (prev_line && curr_time - prev_time > 120) {print prev_line"\n"$0}
prev_time = curr_time
prev_line = $0
}
Затем вы передаете журнал в awk, используя этот скрипт. Я не особо задумывался об оптимизации, это базовое решение, над которым можно работать.