Comecei a trabalhar com recursos de kernel de VLAN apenas recentemente e descobri um domínio bastante desafiador.
Eu achei que tinha quase tudo no controle, mas depois encontrei um problema que aparentemente não consigo resolver.
Eu tenho alguns scripts automáticos cuidando da criação e destruição de alguns namespaces de rede que devem isolar um domínio de usuário um do outro.
Em um dos meus servidores, esse script está funcionando corretamente há dois meses, mas hoje, de repente, ele começou a se comportar de maneira estranha. A versão do kernel é 3.13.0-24-generic em execução no Ubuntu 14.04 LTS .
Esta é a situação atual:
cat /proc/net/vlan/config
VLAN Dev name | VLAN ID
Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD
Então nada lá.
ip netns ls
TEST
Esse é o meu namespace ainda está lá.
ip netns exec TEST cat /proc/net/vlan/config
VLAN Dev name | VLAN ID
Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD
tap0.105 | 105 | tap0
Eu defini uma interface marcada virtual neste domínio, que está configurada corretamente e funcionando corretamente.
ip netns exec TEST ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
92: tap0.105@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc
noqueue state UP group default
link/ether 5a:ff:b5:98:6f:c2 brd ff:ff:ff:ff:ff:ff
inet 172.16.51.1/32 scope global tap0.105
valid_lft forever preferred_lft forever
inet6 fe80::58ff:b5ff:fe98:6fc2/64 scope link
valid_lft forever preferred_lft forever
Então o problema:
vconfig add eth1 10
ERROR: trying to add VLAN #10 to IF -:eth1:- error: File exists
e, claro:
vconfig rem eth1.10
ERROR: trying to remove VLAN -:eth1.10:- error: No such device
Eu tentei procurar na internet por casos de erro semelhantes, mas sem sucesso. Algumas outras saídas:
ip netns pids TEST
não dá resultado.
Este é um STRACE do comando:
root@d-intfw1:~# strace vconfig add eth1 10
execve("/sbin/vconfig", ["vconfig", "add", "eth1", "10"], [/* 17 vars */]) = 0
brk(0) = 0x1a2a000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f361112c000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=24418, ...}) = 0
mmap(NULL, 24418, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f3611126000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "7ELF%code%%code%%code%%code%%code%%code%%code%%code%%code%%code%>%code%%code%%code%%code%0%code%%code%%code%%code%%code%"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1845024, ...}) = 0
mmap(NULL, 3953344, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f3610b46000
mprotect(0x7f3610d02000, 2093056, PROT_NONE) = 0
mmap(0x7f3610f01000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1bb000) = 0x7f3610f01000
mmap(0x7f3610f07000, 17088, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f3610f07000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f3611125000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f3611123000
arch_prctl(ARCH_SET_FS, 0x7f3611123740) = 0
mprotect(0x7f3610f01000, 16384, PROT_READ) = 0
mprotect(0x601000, 4096, PROT_READ) = 0
mprotect(0x7f361112e000, 4096, PROT_READ) = 0
munmap(0x7f3611126000, 24418) = 0
open("/proc/net/vlan/config", O_RDONLY) = 3
close(3) = 0
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3
ioctl(3, SIOCSIFVLAN, 0x7fffeead1420) = -1 EEXIST (File exists)
write(2, "ERROR: trying to add VLAN #10 to"..., 65ERROR: trying to add VLAN #10 to IF -:eth1:- error: File exists
) = 65
exit_group(3) = ?
+++ exited with 3 +++
Alguém sabe o que a causa pode ser para tal comportamento? Muito obrigado.