Я разобрался. Ключевым моментом является использование адреса ipv6 с сетевой маской /128, который будет функционировать как шлюз для ваших виртуальных машин. Начнем с изменения конфигурации Netplan:
network:
version: 2
renderer: networkd
ethernets:
eth0:
addresses:
- x.x.x.x/32
- y.y.y.y/32
- a.a.a.a::00/128
- a.a.a.a::10/128
routes:
- on-link: true
to: 0.0.0.0/0
via: z.z.z.z
gateway6: fe80::1
nameservers:
addresses:
- 1.1.1.1
- 1.0.0.1
- 2606:4700:4700::1111
- 2606:4700:4700::1001
bridges:
xenbr0:
interfaces: []
addresses:
- 192.168.0.1/24
- a.a.a.a::00/125
parameters:
forward-delay: 0
stp: false
xenbr1:
interfaces: []
addresses:
- 192.168.1.1/24
- a.a.a.a::10/125
parameters:
forward-delay: 0
stp: false
Обратите внимание на адреса ipv6, назначенные интерфейсам eth0, xenbr0 и xenbr1. Eth0 получает два отдельных адреса ipv6 (/128 ), а xenbr0 и xenbr1 получают блок из восьми адресов (/125 ), которые можно использовать для ваших виртуальных машин. Сетевая конфигурация ВМ1 выглядит так:
# The loopback network interface
auto lo
iface lo inet loopback
iface lo0 inet6 loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.0.10
netmask 255.255.255.0
broadcast 192.168.0.255
network 192.168.0.0
gateway 192.168.0.1
iface eth0 inet6 static
address a:a:a:a::01
netmask 125
gateway a:a:a:a::00
И конфигурация VM3, которая использует другой мост:
# The loopback network interface
auto lo
iface lo inet loopback
iface lo0 inet6 loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.1.10
netmask 255.255.255.0
broadcast 192.168.1.255
network 192.168.1.0
gateway 192.168.1.1
iface eth0 inet6 static
address a:a:a:a::11
netmask 125
gateway a:a:a:a::10
И последнее, но не менее важное: не забудьте включить переадресацию IP для ipv6.
sudo vim /etc/sysctl.conf
net.ipv6.conf.all.forwarding=1
sudo sysctl -p /etc/sysctl.conf
inotifywait -m -e close_write src/lips.js./test_port.scm |
while read x; do
./test_port.scm </dev/tty
done
Только что нашел это в SuperUser Как выполнить команду при изменении файла?
Есть альтернативный вызов с:
while inotifywait -q -e close_write myfile.py; do./myfile.py; done
Или, чтобы заставить inotifywait
ничего не печатать:
while inotifywait -qq -e...
Общий способ заключается в том, чтобы обернуть весь ваш конвейер в виде списка, дублировать дескриптор файла, используемый в качестве его стандартного ввода, и перенаправить стандартный ввод команды в теле вашего цикла, чтобы он читался из этого нового:
{
inotifywait -m -e close_write src/lips.js./test_port.scm |
while read x; do
./test_port.scm 0<&3
done
} 3<&0
Это в основном эквивалентно использованию /dev/tty
, как ответ Хауке Лагинга , но это также позволяет внешнему стандартному вводу не быть терминалом.
Обратите внимание, однако, что это решение требует, чтобы имена файлов не содержали символы новой строки :они заставят тело цикла выполняться более одного раза для каждого события (с ложным значением переменной x
). В зависимости от вашего варианта использования вы можете запретить inotifywait
печатать имена файлов с помощью опции --format
.