LXC: IPv6 nach dem Umzug

IPv6, ein Kapitel meines Lebens, dass ich eigentlich mit LXC: Virtualisierung, die Zweite hinter mir gelassen habe.
Dachte ich zumindest.
Dazu später mehr.

Meine LXCs, auf Dateisystem in /var/lib/lxc, sind auf einen neuen Host umgezogen.
Mirgrationsaufwand?

rsync -aAX --numeric-ids --info=progress2 --delete --exclude="*/rootfs"{"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} --exclude="vm-name/rootfs/some_dir_to_exclude/*"  old_host:/var/lib/lxc/ /var/lib/lxc/

Null.
Als Speicher direkt Ordner auf dem Dateisystem zu nutzen, ist zwar primitv, dazu noch ineffizient, aber dafür wirklich einfach im Umgang.
Die Abstrahierung des Systems in eine virtuelle Maschine, einen Container, erlaubt einem eine viel komfortablere Verwaltung des Systems, als auch Flexiblität:
Host egal, prinzipiell kann es sofort überall laufen.

Soweit, so gut. Nur IPv6 hatte nicht mehr funktioniert.
Er ignoriert die pre-up Direktive für den DHCPv6-Client. Von nichts kommt nichts.
Der Host bezieht seine eth0 IP schon im initramfs per DHCP, wahrscheinlich funktioniert es deswegen nicht, da die Schnittstelle dort schon konfiguriert wurde.
dhclient -cf /etc/dhcp/dhclient6.conf -pf /run/dhclient6.eth0.pid -6 -P eth0
sleep 10
ip -6 addr add 2001:123:123b:123::/56 dev eth0 # address as defined in eth0 inet6 static
service radvd restart
service lxc start

Radvd möchte auch neu gestartet werden, sonst bekommen die Clients (LXC-Container) von ihm keine IPv6-Adresse.

Da fängt es auch erst richtig an, Spaß zu machen:
/etc/sysctl.conf
net.ipv6.conf.eth0.accept_ra = 2

net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.default.forwarding = 1
net.ipv6.conf.eth0.forwarding = 1

net.ipv6.conf.default.accept_ra = 2
net.ipv6.conf.all.accept_ra = 2

Zumal der Host gleichzeitig als Client (eth0 bekommt seine IPv6 vom Hoster zugewiesen), als auch Router (LXCs bekommen IPv6 von veth0 zugewiesen) fungiert, ist zum einen
IPv6 Forwarding auf True zu setzen. Würde man ja auch nicht anders erwarten.
accept_ra, das Aktzeptieren von Router-Advertisements zur IPv6 Autokonfiguration, ist per default "1". True also, nicht?

accept_ra ist kein Boolean, sondern kann drei Werte annehmen:
accept_ra - INTEGER
    Accept Router Advertisements; autoconfigure using them.

    It also determines whether or not to transmit Router
    Solicitations. If and only if the functional setting is to
    accept Router Advertisements, Router Solicitations will be
    transmitted.

    Possible values are:
        0 Do not accept Router Advertisements.
        1 Accept Router Advertisements if forwarding is disabled.
        2 Overrule forwarding behaviour. Accept Router Advertisements
         even if forwarding is enabled.

    Functional default: enabled if local forwarding is disabled.
             disabled if local forwarding is enabled.

Quelle: Kerneldocs

Sind forwarding=1, sowie accept_ra=1, bedeutet das tatsächlich accept_ra=0.
Der Wert muss zwingend auf 2 gesetzt werden, sonst werden sämtliche RAs (Router Advertisements) ignoriert, SLAAC (Stateless Autoconfiguration) geht nicht mehr; IPv6 geht nicht.

So hat es nachher einheitlich auszusehen:

sysctl -a | grep ipv6 | grep -v mc_ | egrep "accept_ra |forwarding"  
net.ipv6.conf.all.accept_ra = 2
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.default.accept_ra = 2
net.ipv6.conf.default.forwarding = 1
net.ipv6.conf.eth0.accept_ra = 2
net.ipv6.conf.eth0.forwarding = 1
net.ipv6.conf.lo.accept_ra = 1
net.ipv6.conf.lo.forwarding = 1
net.ipv6.conf.veth0.accept_ra = 2
net.ipv6.conf.veth0.forwarding = 1
# interface generated by LXC
net.ipv6.conf.veth4OFPCK.accept_ra = 2
net.ipv6.conf.veth4OFPCK.forwarding = 1