Službu vygeneruje nixos, ve zdrojáku vidím grep na File exists. Google říká, že ip addr add někdy vrací RTNETLINK answers: File exists
Myslím si, že přidělování přestalo fungovat, protože se po nějaké aktualizaci změnila chybová hláška a nixos s tím nepočítá. Dává to smysl? Přijde mi to tak, ale nenašel jsem report, a nezdá se mi pravděpodobné, že bych byl první, kdo na to narazí.
Dokážu ty adresy přidat ručně / odfiltrovat duplicity, ale zajímalo by mě, proč to přestalo fungovat.
Nastavení sítě je ve vpsadminos.nix, který máš mít v konfiguraci importovaný. Nic navíc není potřeba řešit, obsahuje to službu, co nahodí IP adresy podle vpsAdminu.
vpsadminos.nix importovaný mám, adresy z VPSadminu se mi načítají. Nastavenou mám /64 adresu
inet6 2a03:3b40:101:6f::1/64 scope global
valid_lft forever preferred_lft forever
Na jednotlivé vhosty v nginxu přiděluju IP adresy z daného rozsahu (např. 2a03:3b40:101:6f::b00:dacc). Pokud je explicitně nepřidám na rozhraní, skončí nginx na
bind() to [2a03:3b40:101:6f::b00:dacc]:80 failed (99: Cannot assign requested address)
Po ip addr add 2a03:3b40:101:6f::b00:dacc dev venet0 naběhne.
nixos-unstable (24.05.20240410.1042fd8 (Uakari) na #24008
Používám to tak už delší dobu, cíl byl generovat IPv6 adresy webů v konfiguraci, abych je nemusel naklikávat v adminu. Pokud to jde jinak líp, klidně to předělám.
Problém je v tom, že máš některé ty adresy přidané přes vpsAdmin a zároveň se je snažíš přidat v networking.interfaces.venet0.ipv6.addresses, konkrétně zrovna ta 2a03:3b40:100::1:218. To je pak race condition mezi network-addresses-venet0.service a networking-setup.service z vpsadminos.nix, kdo to dřív nastaví a kdo dostane chybu. Vyber si jeden způsob, buď vpsAdmin a nebo Nix konfigurace.
Pokud budeš chtít ty adresy z vpsAdminu odebrat, tak v detailu VPS formulář “Interface addresses”. Nech si je v “Routed addresses”.
Tomu rozumím. K chybě dojde, pokud nějakou adresu zkouším přiřadit dvakrát, případně pokud službu spustím dvakrát.
Dělá to služba network-addresses-venet0.service. Ve zdrojáku vidím, že se snaží ošetřit situaci, kdy už některá rozhraní existují, ale že to ošetření nefunguje. Ve skriptu, který volá je toto:
echo -n "adding address 2a03:3b40:101:6f::0b00:dacc/128... "
if out=$(ip addr add "2a03:3b40:101:6f::0b00:dacc/128" dev "venet0" 2>&1); then
echo "done"
elif ! echo "$out" | grep "File exists" >/dev/null 2>&1; then
echo "'ip addr add "2a03:3b40:101:6f::0b00:dacc/128" dev "venet0"' failed: $out"
exit 1
fi
Když File exists nahradím za Address already assigned, přiřadí to jen adresy, které ještě nejsou, což si myslím je záměr.
Řekl bych, že dřív ip addr add vypsalo RTNETLINK answers: File exists, a ošetření fungovalo. Hledám, jestli se chybová hláška opravdu změnila, nebo jestli to ošetřuje něco jiného, než si myslím.
Jo, je to pravděpodobně jak říkáš. Ono na to totiž normálně nenarazíš, když měníš systém a v konfiguraci přidáváš/odebíráš adresy, tak network-addresses-venet0.service nejdřív ty adresy odebere a pak je znovu přidá: