Aktionen

Ubuntu 24.02 als Docker-Host

Aus znilwiki

Changelog:

  • 01.10.2024 erste Version

Grundinstallation

Important.png
Hinweis: Ich habe die offizielle ISO verwendet: https://ubuntu.com/download/server


CD einlegen und los,
die Fragen beantwortet Ihr wie folgt (sind ggf. die Überschriften der Dialoge):

ClipCapIt-240527-140258.PNG Try or Install Ubuntu Server
ClipCapIt-240527-140440.PNG Deutsch
ClipCapIt-220427-115808.PNG German / German
Wenn er einen neueren Installer findet und fragt ob er auf diesen aktualisieren soll - Ja!
Install Ubuntu2204 Pic2.png Ubuntu Server
ClipCapIt-220427-120131.PNG Jetzt könnt Ihr schon die gewünschte feste IP-Adresse einstellen. Wählt dazu mit den Pfeiltasten den ens160 Eintrag aus und drückt Enter:
ClipCapIt-200521-152546.PNG ens192 => Bearbeite IPv4
ClipCapIt-200521-152642.PNG Manuell
ClipCapIt-200521-152742.PNG Bei Subnetz kommt nicht die Subnetzmaske sondern das Netzwerk mit Suffix. Bei einer 24 Maske (= 255.255.255.0) ist das die IP 0 mit Suffix /24
ClipCapIt-200521-153302.PNG Erledigt
ClipCapIt-220427-120259.PNG Bei Bedarf, sonst leer lassen
ClipCapIt-220427-120335.PNG Erledigt
ClipCapIt-220427-120400.PNG Nutzt die ganze Festplatte ohne LVM (also Haken entfernen). Die Festplatte lässt sich später trotzdem leicht vergrößern
ClipCapIt-220427-120443.PNG Erledigt
ClipCapIt-220427-120505.PNG Fortfahren
ClipCapIt-220427-120827.PNG Den Servernamen festlegen. Ich lege hier den Benutzer installadmin an. Wählt euren Benutzer und Passwort nach Wunsch (Aufschreiben!)
ClipCapIt-240527-140937.PNG Falls Ihr Ubuntu Pro habt, könnet Ihr es hier aktiveren, ansonsten einfach [Fortfahren]
ClipCapIt-240527-141106.PNG OpenSSH-Server auswählen => Erledigt (für Zugriff z.B. mit Putty)
ClipCapIt-240527-141137.PNG Erledigt

Ab jetzt heißt es abwarten. Wenn er kann lädt er gleich ein paar Sicherheitsupdates nach:

ClipCapIt-220427-121943.PNG Jetzt neustarten
ClipCapIt-220427-122036.PNG ISO aus der VM entfernen und Enter drücken
ClipCapIt-220427-122152.PNG Nach dem Reboot wartet ab bis diverse Meldungen abgelaufen sind

PuTTY

Ab dieser Stelle könnt Ihr PuTTY oder den SSH Client eurer Wahl nutzen - was ich dringend empfehle. Denn dann könnt Ihr hier vorgeschlagenen Befehle einfach per Copy&Paste übernehmen.
Die IP-Adresse habt Ihr zu diesem Zeitpunkt ja bereits festgelegt:

ClipCapIt-200521-155245.PNG ClipCapIt-200521-155339.PNG ClipCapIt-200521-160706.PNG

Nach der Anmeldung nutze ich immer gerne ein

sudo -i

Damit wechselt man dauerhaft zum root Benutzer und muss nicht vor jedem Befehl ein sudo stellen.


root wieder freischalten

Important.png
Hinweis: Ob nun wie ich immer als root arbeiten wollt oder aber als einfacher Benutzer und dann immer sudo verwendet müsst Ihr selbst wissen
  • Mit Benutzer installadmin anmelden
sudo -i
  • Kennwort des Benutzer installadmin eintippen
passwd root
  • neues Kennwort für "root" 2x eintippen
ClipCapIt-200521-161108.PNG
  • Lokal Anmelden kann man sich nun mit root - aber eine Anmeldung über SSH funktioniert dann immer noch nicht.
  • Damit diese auch funktioniert müsst ihr die sshd_config bearbeiten:
nano /etc/ssh/sshd_config

sucht nach der Zeile (STRG + W ist Suchen) nach

#PermitRootLogin without-password

und stellt den Cursor in die Zeile.
Drückt nun einmal F9 und 2x F10 - damit erstellt Ihr eine Kopie der Zeile.
Ändert die Kopie wie folgt ab:

PermitRootLogin yes
ClipCapIt-200521-161435.PNG

Speichert die Datei (STRG + x, dann y und Enter) und startet den ssh Dienst neu:

systemctl restart ssh.service

Ab dann klappt es auch mit dem SSH-Login für den Benutzer root, z.B. über puTTY
Jetzt 2x

exit

eintippen wodurch sich das PuTTY Fenster schließt - der (eingeschränkte) Benutzer installadmin hat sich somit abgemeldet

Important.png
Hinweis:

Ja, ich persönlich arbeite gerne als root und habe diesen für die Anmeldung freigeschaltet. Was ich nicht mache ist das Login per SSH mit Passwort zu erlauben. Ich hinterlege also immer einen SSH-Key für die Anmeldung und nutze diesen statt des Kennwortes. Die Lösung hier ist einfach gehalten, der Profi mögen anpassen wie er es braucht. Ein Anmeldung als eingeschränkter Benutzer geht natürlich auch, das erste was ich dann immer mache ist ein sudo -i um dauerhaft zum root zu wechseln

Anmelden als root

Startet PuTTY wieder und meldet euch diesmal gleich als Benutzer root an.


nano & Co auf Deutsch

nano war eben z.B. noch auf Englisch, mit

apt install -y language-pack-de

ist es (und vieles andere) auf deutsch.


root farbiger Prompt

Als root anmelden:

nano ~/.bashrc

Zeile 39 (Alt + C aktiviert Zeilennummernanzeige):

#force_color_prompt=yes

ändern zu (# entfernen):

force_color_prompt=yes


nun wieder Abmelden - ab der nächsten Anmeldung ist der neue Prompt aktiv.

ClipCapIt-200521-162422.PNG

Wer den sofort haben will (ohne neu Anmelden):

source ~/.bashrc

Feste IP-Adresse vergeben

Der Server hat dank des neuen Setupdialoges nun bereits eine feste IP-Adresse.
Solltet Ihr an dieser etwas ändern müssen so müssen wir erst das Cloud-Init deaktivieren:

nano /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg

Inhalt:

network: {config: disabled}

Dann könnte Ihr in der folgenden Datei etwas ändern, die Warnungen das es einen reboot nicht übersteht könnt Ihr ignorieren, dafür haben wir die andere Datei angelegt.

nano /etc/netplan/50-cloud-init.yaml
ClipCapIt-200521-162802.PNG

Updates einspielen

  • wieder anmelden als root bzw. zum root wechseln
  • Updates suchen für Betriebssystem: (aktualisiert den Katalog aus den Update-Quellen)
apt update
  • Updates einspielen:
apt upgrade -y
  • Nach Update überflüssige Pakete entfernen:
apt autoremove -y


Ich mache das normalerweise immer als Einzeiler:

apt update && apt upgrade -y && apt autoremove -y




Multipathing deinstallieren (wenn der Server eine VM ist)

Ab Werk wird nun das

/var/log/syslog

mit Multipath-Meldungen vollgemüllt:

2024-05-27T12:32:47.571374+00:00 ubuntu2404 systemd[1]: Started multipathd.service - Device-Mapper Multipath Device Controller.
2024-05-27T12:32:47.592304+00:00 ubuntu2404 kernel: systemd[1]: Listening on multipathd.socket - multipathd control socket.
2024-05-27T12:32:47.592385+00:00 ubuntu2404 kernel: systemd[1]: Starting multipathd.service - Device-Mapper Multipath Device Controller...
2024-05-27T12:32:48.141146+00:00 ubuntu2404 multipathd[467]: sda: failed to get udev uid: No data available
2024-05-27T12:32:48.141212+00:00 ubuntu2404 multipathd[467]: sda: failed to get path uid
2024-05-27T12:32:48.141278+00:00 ubuntu2404 multipathd[467]: uevent trigger error
2024-05-27T12:32:57.634912+00:00 ubuntu2404 multipathd[467]: sda: triggering change event to reinitialize
2024-05-27T12:32:57.667862+00:00 ubuntu2404 multipathd[467]: sda: failed to get udev uid: No data available
2024-05-27T12:32:57.667930+00:00 ubuntu2404 multipathd[467]: sda: failed to get path uid
2024-05-27T12:32:57.667959+00:00 ubuntu2404 multipathd[467]: uevent trigger error
2024-05-27T12:33:07.637080+00:00 ubuntu2404 multipathd[467]: sda: triggering change event to reinitialize
2024-05-27T12:33:07.676773+00:00 ubuntu2404 multipathd[467]: sda: failed to get udev uid: No data available
2024-05-27T12:33:07.676839+00:00 ubuntu2404 multipathd[467]: sda: failed to get path uid
2024-05-27T12:33:07.676865+00:00 ubuntu2404 multipathd[467]: uevent trigger error
2024-05-27T12:33:17.641466+00:00 ubuntu2404 multipathd[467]: sda: triggering change event to reinitialize
2024-05-27T12:33:17.709843+00:00 ubuntu2404 multipathd[467]: sda: failed to get sysfs uid: No such file or directory
2024-05-27T12:33:17.709915+00:00 ubuntu2404 multipathd[467]: sda: failed to get sgio uid: No such file or directory
2024-05-27T12:33:17.709942+00:00 ubuntu2404 multipathd[467]: sda: failed to get path uid
2024-05-27T12:33:17.709969+00:00 ubuntu2404 multipathd[467]: uevent trigger error
2024-05-27T12:33:28.134951+00:00 ubuntu2404 multipathd[467]: sda: not initialized after 3 udev retriggers
2024-05-27T12:33:29.139933+00:00 ubuntu2404 multipathd[467]: sda: add missing path
2024-05-27T12:33:29.140037+00:00 ubuntu2404 multipathd[467]: sda: failed to get sysfs uid: No such file or directory
2024-05-27T12:33:29.140063+00:00 ubuntu2404 multipathd[467]: sda: failed to get sgio uid: No such file or directory
2024-05-27T12:33:29.140086+00:00 ubuntu2404 multipathd[467]: sda: no WWID in state "undef
2024-05-27T12:33:29.140109+00:00 ubuntu2404 multipathd[467]: ", giving up
2024-05-27T12:33:29.140181+00:00 ubuntu2404 multipathd[467]: sda: check_path() failed, removing

Unter Ubuntu 24.04/22.04 scheint es nicht mehr ganz so schlimm wie unter 20.04 - aber in einer VM macht Multipath keinen Sinn, also deaktivieren und deinstallieren um das Syslog von den Meldungen befreien:

systemctl stop multipathd.service && systemctl disable multipathd.service
apt install kpartx libsgutils2-1.46-2 sg3-utils sg3-utils-udev
apt remove -y multipath-tools && apt purge -y multipath-tools

Die apt install Zeile ist da drin weil diese Pakete ggf. von anderen Anleitung vorausgesetzt werden. Die Pakte werden dadurch auf manuell installiert gesetzt und dann nicht bei einem apt autoremove deinstalliert


Cloud-Init deinstallieren (Wenn es keine VM bei einem Cloudanbieter ist)

Wenn Ihr die VM reboootet und die Console betrachtet tauchen kurz nach dem Reboot (Fehler-)Meldungen zum Cloud-init auf:

ClipCapIt-200521-163633.PNG

Das Cloud-Init ist - wenn ich mich recht erinnere - dafür da falls eure VM z.B. bei Amazon AWS, Azure oder andere Anbieter läuft um z.B. die Netzwerkinformationen vom Hoster/Provider zu erhalten.
Brauchen wir nicht, also weg damit:

echo 'datasource_list: [ None ]' | tee /etc/cloud/cloud.cfg.d/90_dpkg.cfg
apt purge -y cloud-init
rm -rf /etc/cloud/ && sudo rm -rf /var/lib/cloud/
apt install eatmydata libeatmydata1 python-babel-localedata python3-babel python3-jinja2 python3-json-pointer python3-jsonpatch python3-jsonschema python3-markupsafe python3-pyrsistent python3-tz -y
reboot

Die apt install Zeile ist da drin weil diese Pakete ggf. von anderen Anleitung vorausgesetzt werden. Die Pakte werden dadurch auf manuell installiert gesetzt und dann nicht bei einem apt autoremove deinstalliert


Zeitzone setzen

In meiner VM ist die Uhrzeit zu diesem Zeitpunkt falsch (gebt mal probeweise date ein) - weil der ESXi-Host auf UTC Zeit läuft und die Ubuntu in der VM die richtige Zeitzone nicht eingestellt hat.
Wir korrigieren das mit

timedatectl set-timezone Europe/Berlin

ein

date

sollte dann die richtige Uhrzeit ausspucken.


Zeitserver setzen

Important.png
Hinweis: Wenn Ihr diesen Schritt überspringt, wird ntp.ubuntu.com als Zeitserver verwendet

Für die Zeitsynchronisierung ist der Dienst systemd-timesyncd.service zuständig, dieser wird über die Datei

nano /etc/systemd/timesyncd.conf

konfiguriert:

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it under the
#  terms of the GNU Lesser General Public License as published by the Free
#  Software Foundation; either version 2.1 of the License, or (at your option)
#  any later version.
#
# Entries in this file show the compile time defaults. Local configuration
# should be created by either modifying this file (or a copy of it placed in
# /etc/ if the original file is shipped in /usr/), or by creating "drop-ins" in
# the /etc/systemd/timesyncd.conf.d/ directory. The latter is generally
# recommended. Defaults can be restored by simply deleting the main
# configuration file and all drop-ins located in /etc/.
#
# Use 'systemd-analyze cat-config systemd/timesyncd.conf' to display the full config.
#
# See timesyncd.conf(5) for details.

[Time]
NTP=192.168.1.81
FallbackNTP=192.168.1.198 de.pool.ntp.org
RootDistanceMaxSec=30
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048
#ConnectionRetrySec=30
#SaveIntervalSec=60

Sowohl die Liste der NTP= als auch der FallbackNTP= erwartet eine per Leerzeichen getrennte Liste der möglichen Server.
Laut Anleitung hört der Dienst aber beim ersten Treffer auf zu suchen. In der Praxis setzt also einen NTP-Server und ggf. die Fallback. Setzt Ihr einen Wert nicht, lasst diesen also auskommentiert, so gilt der Default-Wert, beim Fallback gilt dann FallbackNTP=ntp.ubuntu.com.
Nach der Änderung müsst Ihr den Dienst einmal neu starten:

systemctl restart systemd-timesyncd.service

und mit folgenden Befehl könnt Ihr den Status abfragen:

timedatectl show-timesync

Beispielausgabe:

LinkNTPServers=fd00::1eed:6fff:fe71:f1c0
SystemNTPServers=192.168.1.81
FallbackNTPServers=192.168.1.198 de.pool.ntp.org
ServerName=192.168.1.81
ServerAddress=192.168.1.81
RootDistanceMaxUSec=30s
PollIntervalMinUSec=32s
PollIntervalMaxUSec=34min 8s
PollIntervalUSec=2min 8s
NTPMessage={ Leap=0, Version=3, Mode=4, Stratum=3, Precision=-23, RootDelay=20.324ms, RootDispersion=28.579ms, Reference=C0A801C6, OriginateTimestamp=Tue 2024-06-04 08:22:24 CEST, 
ReceiveTimestamp=Tue 2024-06-04 08:22:24 CEST, TransmitTimestamp=Tue 2024-06-04 08:22:24 CEST, DestinationTimestamp=Tue 2024-06-04 08:22:24 CEST, Ignored=no, PacketCount=2, Jitter=239us }
Frequency=1158037

Wenn die untere Zeile mit NTPMessage= nicht erscheint, habt Ihr ein Problem!
Mit

journalctl -fu systemd-timesyncd.service

könnte Ihr nach dem Grund suchen. Steht da etwas wie Server has to large root distance. Disconnecting und es gegen einen Domänencontroller geht so stellt sicher das

  • Es der PDC ist
  • Dieser sich auch selbst mit einer externen Quelle synchronisiert
  • Stellt ggf. den Wert von RootDistanceMaxUSec=30s noch höher.

Automatische Updates deaktivieren

Ich persönlich möchte nicht das der Zabbix-Server automatisch Updates einspielt.
Die automatischen Updates aktualisieren - soweit ich das beobachten konnte - nur den Kernel. Aber auch das möchte ich nicht. Ich möchte das geplant durchführen.
Die automatischen Updates verhindern wir mit

apt remove -y unattended-upgrades

Automatischen Neustart von Diensten deaktivieren

Wie schon zuvor beschrieben aktualisiere ich Ubuntu (und andere Software aus Repositorien wie Zabbix) gerne per folgenden Einzeiler:

apt update && apt upgrade -y && apt autoremove -y

In neueren Versionen werden dabei Dienste ggf. automatische neu gestartet, es gibt dann eine Meldung wie diese:

systemctl restart apache2.service cron.service fwupd.service mariadb.service open-vm-tools.service packagekit.service polkit.service rsyslog.service snmptrapd.service snmptt.service udisks2.service upower.service vgauth.service zabbix-agent2.service zabbix-web-service.service

Dienste deren Neustart verschoben wurde:
 systemctl restart ModemManager.service
 /etc/needrestart/restart.d/dbus.service
 systemctl restart getty@tty1.service
 systemctl restart systemd-logind.service

Im Normalfall ist es kein Problem. Allerdings scheinen die Abhängigkeiten der Dienste nicht beachtet zu werden.
Zum Beispiel der Zabbix-Server Dienst ist abhängig von der Datenbank, das steht auch so in der /usr/lib/systemd/system/zabbix-server.service:

After=mysql.service
After=mysqld.service
After=mariadb.service

Der automatische Neustart startet aber z.B. MariaDB gnadenlos durch ohne vorher den Zabbix zu beenden. Dabei hängt sich das ganze gerne mal weg. Per {{Key|STRG} + {Key|C} kann man das abbrechen und rebooten, schön ist das aber nicht.
Als Lösung schalte ich inzwischen den automatischen Neustart der Dienste ab, es wird dann nur eine Liste der Dienste ausgegeben die neu gestartet werden müssten:

nano /etc/needrestart/needrestart.conf

und dort ziemlich am Anfang:

# Restart mode: (l)ist only, (i)nteractive or (a)utomatically.
#
# ATTENTION: If needrestart is configured to run in interactive mode but is run
# non-interactive (i.e. unattended-upgrades) it will fallback to list only mode.
#
# UBUNTU: the default restart mode when running as part of the APT hook is 'a',
# unless a specific UI is configured (see below).
#$nrconf{restart} = 'i';

Bei der letzten Zeile entfernen wir das Kommentarzeichen davor und machen aus dem i ein l, wie es auch in der obersten Zeile beschrieben wird:

$nrconf{restart} = 'l';

So werden notwendige Neustarts nur aufgelistet.



Docker installieren

curl -fsSL https://get.docker.com -o get-docker.sh
sh ./get-docker.sh

Status prüfen:

systemctl status docker.service