Antecedentes
Os sistemas de arquivos /proc
e /sys
são apenas uma visão das estruturas do kernel, ambos os sistemas de arquivos residem na memória. Embora ambos os sistemas de arquivos sejam graváveis (bem, alguns dos arquivos existentes nele são graváveis), não é sensato assumir que eles se comportam da mesma maneira que um sistema de arquivos real.
Operações que permitem escrever em um arquivo dentro de /proc
ou /sys
end como ganchos e depois como chamadas de função. Por exemplo:
# echo 3 > /proc/sys/vm/drop_caches
Não grava realmente nesse arquivo, ele chama uma função de kernel do espaço de usuário.
Se uma função não estiver definida para uma determinada gravação, você terá:
write error: Input/output error
Isso porque não faz sentido escrever nesse arquivo. Não é tão diferente de escrever para o dispositivo de caracteres de um dispositivo USB que não tem nenhum driver associado. O kernel não sabe o que fazer.
Não há nenhuma função definida para gravações em relação a /sys/class/net/enp3s0/address
, portanto, essa não é uma rota viável para alterar o endereço MAC dessa interface.
Posso alterar o endereço MAC sem chamar ifconfig
ou ip link set
?
Sim, você pode.
Se você olhar o código para iproute2
, encontrará muitas análises de argumentos e uma chamada para rtnl_talk
. Parece da seguinte forma (isso é do arquivo ip/iplink.c
):
/* lot of argument parsing and 'req' setting */
if (rtnl_talk(&rth, &req.n, 0, 0, NULL, NULL, NULL) < 0)
exit(2);
return 0;
req.n
em que o endereço MAC está sendo passado para rnetlink
function rtnl_talk
( man rnetlink
é relevante aqui). Se você escrever um programa que execute esta chamada, ele disparará uma chamada do sistema e atualizará o endereço MAC. No entanto, você estará fazendo exatamente o mesmo que ip link set
faz.