Donnerstag, 19. April 2018

lxd - Probleme mit der lxd-bridge und dnsmasq

Ergebnis für den eiligen Leser:
Um LXD als Anfänger auf einem VM Ubuntu Server laufen lassen zu können, darf kein weiterer DNS Server auf dem System vorhanden sein. Bind muss unbedingt deaktiviert sein.
Nach der Initialisierung kann die lxd-bridge mit ip a gesehen werden und die beiden LXD-Services sollten im active Status sein.

2018-05-07 Update für Ubuntu 18.04 Desktop am Ende des Posts
-----------------------------------------------------------------------------------------------------------------------

Heute habe ich meine ersten Versuche mit LXD, der Containerplattform von Canonical, hinter mir...




Bei meiner Ubuntu Version war LXD schon vorinstalliert, wobei die Installation unter Ubuntu auch keine Herausforderung darstellt:

$sudo apt-get install lxd lxd-client

Dann der nächste Schritt in der Anleitung:

$sudo lxd init

Es gab verschiedenste Einstellungen, die vorgenommen werden sollten. Ich habe fast alle Fragen mit der default Antwort beantwortet, bis auf die Frage, ob LXD übers Netzwerk erreichbar sein soll. Default war nein und ich wählte ja. Zu diesem Zeitpunkt war es mir auch noch nicht möglich, zfs als storage backend zu verwenden.

Bei der Frage nach der bridge, verwendete ich die Vorschläge, die mir LXD machte. Meine Annahme war, dass LXD freie IP-Adressen und Namen heraus suchen würde.
Die Einstellungen des 1. Versuchs meiner Bridge:
Name:                     lxdbr0
IPv4                        10.175.19.1/24
DHCP Range         10.175.19.2 bis 10.175.19.254
IPv6                        fd56:732c:8095:29a5::1/64

Nachdem ich mich durch alles durchgeklickt hatte, bekam ich die Meldung:

error: Get http://unix.socket/1.0: read unix @->/var/lib/lxd/unix.socket: read: connection reset by peer

Hmmm.... und nu???

Als erstes checkte ich mein System:
lxd.service läuft nicht, aufgrund fehlender Anhängigkeiten; Restart schlägt fehl.

Dann versuchte ich die Fehlermeldung zu googeln. Ich fand einen Post, in dessen Verlauf empfohlen wurde, das Kommando 

$bash -x /usr/lib/lxd/lxd-bridge start 

auszuführen. Das habe ich dann versucht. Meine Ausgabe des Befehls war völlig identisch zu dem Post, nur dass der Ratgeber dort darauf verwies, dass wohl der Kernel nicht in der Lage wäre, eine bridge anzulegen, aufgrund der Meldung 

+ ip link add dev lxdbr0 type bridge
RTNETLINK answers: Operation not permitted


Leider übersah der Ratgeber, dass wenn man versucht das lxd-bridge Skript ohne sudo zu starten, keine Bridge angelegt werden kann...
Daher versuchte ich das Ganze erneut mit sudo... und siehe da, die Fehlermeldung, dass die Bridge nicht angelegt werden könne, erschien nicht mehr ;-)

Dafür kam eine andere Fehlermeldung. Nach ersten Recherchen stolperte ich über die Meldung, dass die IP Adresse schon in Verwendung sei. Das verstand ich nicht wirklich. Das Skript löscht im Nachgang die Bridge wieder komplett.
Daraufhin machte ich ein $ip a : Keine Bridge zu sehen, keine IP Adresse, die passen würde. Keine Möglichkeit etwas zu ändern.

Nun versuchte ich ein ping 10.175.19.1 -> Interessante Reaktion: 1. Ping auf die IP 10.175.19.1, danach jeder weitere Ping auf 172.25.21.2... Hä??? Wo kommt denn die IP her???
traceroute, nslookup, host... egal was ich probierte, ich bekam keine Antwort. (Und diese Antwort habe ich bisher auch noch nicht gefunden)

Dann schaute ich mir das Skript /usr/lib/lxd/lxd-bridge mal genauer an und sah, das es die Datei /etc/default/lxd-bridge gibt. Nachdem ich auch in diese rein geschaut hatte, fand zumindest eine Möglichkeit, die IP-Adresse zu ändern, bzw. LXD sozusagen wieder in einen jungfräulichen Zustand zu versetzen, damit $sudo lxd init erneut ausgeführt werden kann. 

Leider ist die Dokumentation von LXD selbst nicht sehr hilfreich. Ich fand zwar einen Eintrag zum Thema Konfiguration Network, jedoch der dort aufgeführte Befehl "lxc network set blabla" existiert überhaupt nicht. 

Im nächsten Schritt änderte ich das Konfigurationsfile /etc/default/lxd-bridge mit einer neuen IP Adressen. Diesmal wählte ich eine IP Adresse aus dem 192.168.56.x Bereich, da meine VMs untereinander (host-only) in diesem Netzwerk kommunizieren. Leider führte auch diese Änderung nicht zum Erfolg. Gleiche Abfolge von Meldungen. Und wiederum die Fehler-Meldung, dass die IP schon belegt sei.

Bei genaueren Untersuchung der Ausgabe des bash -x Befehls stellte ich fest, dass die Bridge angelegt wird und auch mit den IP-Adressen versorgt wird. Das scheint alles zu funktionieren. Dann kommt ein dnsmasq Befehl, der mit jeder Menge Optionen aufgerufen wird. Und genau an diesem Punkt kommt die Fehlermeldung, dass die IP-Adresse schon belegt ist. Ich habe versucht, den Aufruf mit den Optionen zu verstehen, habe es aber nach geraumer Zeit aufgegeben.

Zwischenzeitlich hatte ich auch noch die VM gewechselt, und dieser eine direkte Verbindung zur Außenwelt über eine normale Netzwerkbrücke gegeben. Aber auch das half nicht.

Dann habe ich nochmal gegoogelt. Und zwar nach der Fehlermeldung dnsmasq: failed to create listening socket in Verbindung mit lxd bridge. Unter den Ergebnissen stieß ich auf einen Eintrag LXD Failing to start der mein Problem beschrieb. Ich habe daraufhin mein System auf zusätzlich deklarierte DNS-Server untersucht (und tatsächlich einen gefunden). Nachdem ich den raus geworfen hatte, war nur noch der Standardeintrag in der /etc/resolv.conf zu finden. Einmal aufräumen (rm /etc/default/lxd-bridge) und ein Reboot. Erneuter Versuch der Initialisierung von LXD -> Möööp... Nö!

Dann habe ich mir nochmal alle Services vorgenommen. Und siehe da, bei mir lief der bind9 service. Dieser Service stellt einen DNS Server dar. Nicht gut, da wir ja dnsmasq verwenden wollen und beide Services auf den gleichen Port zugreifen. Daher habe ich dann mal 

$sudo systemctl stop bind9
$sudo systemctl disable bind9 gemacht

Wieder aufgeräumt und das System neu gestartet...

System vor dem nächsten Versuch:



Dann der nächste Versuch $sudo lxd init:



Und kaum zu glauben!!! Es hat tatsächlich funktioniert!!!!!!!!!!!
Kontrolle mit $ip a und auch die Services



Ergebnis:
Um LXD als Anfänger auf einem Ubuntu Server laufen lassen zu können, darf kein weiterer DNS Server auf dem System vorhanden sein. Bind muss unbedingt deaktiviert sein.
Nach der Initialisierung kann die lxd-bridge mit $ip a gesehen werden und die beiden LXD-Services sollten im active Status sein.
Es war mal wieder ein sehr lehrreicher Tag für mich ;-)

Update 2018-05-07:
Heute habe ich unter Ubuntu 18.04 Desktop lxd erneut installiert und initialisiert. Dabei sind mir ein paar Veränderungen bei der Initialisierung aufgefallen:
Die Abfrage hat sich verändert. Es sind Punkte, wie die Verbindung zu einem MAAS Server und der Frage nach der Aktualisierung alter Images dazugekommen. Meine Antworten seht ihr hier.

ilonka@lpic2:~$ sudo lxd init
Would you like to use LXD clustering? (yes/no) [default=no]: 
Do you want to configure a new storage pool? (yes/no) [default=yes]: 
Name of the new storage pool [default=default]: zfs
Name of the storage backend to use (dir, lvm, zfs) [default=zfs]: 
Create a new ZFS pool? (yes/no) [default=yes]: 
Would you like to use an existing block device? (yes/no) [default=no]: 
Size in GB of the new loop device (1GB minimum) [default=15GB]: 
Would you like to connect to a MAAS server? (yes/no) [default=no]: 
Would you like to create a new network bridge? (yes/no) [default=yes]: 
What should the new bridge be called? [default=lxdbr0]: 
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 
Would you like LXD to be available over the network? (yes/no) [default=no]: yes
Address to bind LXD to (not including port) [default=all]: 
Port to bind LXD to [default=8443]: 
Trust password for new clients: 
Again: 
Would you like stale cached images to be updated automatically? (yes/no) [default=yes] 
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]: 

Leider gab es keinerlei Rückmeldung. Eine kurze Kontrolle ergab:





und mit Hilfe $ ip a s konnte ich auch sehen, dass die bridge angelegt wurde. Allerdings ist mir aufgefallen, dass die Datei /etc/default/lxd-bridge nicht mehr verfügbar ist, was jedoch mit dem Networkmanager, den ich auf dem Server nicht verwendete, zusammenhängen könnte.

Und noch ein kleiner Hinweis :-) Möchte man sich alle verfügbaren Images anschauen, die man aus der Registry laden kann verwendet man den Befehl

$lxc image list images:

Wichtig ist der Doppelpunkt am Ende, sonst gibt es kein Ergebnis ;-)

Keine Kommentare:

Kommentar veröffentlichen