Kurzanleitungen/Howtos

Gentoo: Proxmox, Paketverwaltung, LAMP, Software-Downgrade

06.08.2020

Server

In dieser (Kurz)anleitung behandle ich gleich vier Punkte rund um Gentoo Linux:

  1. Gentoo in der Container-"Virtualisierung" von Proxmox
  2. Grundlegende Paketverwaltung
  3. Installation und Einrichtung von Apache, MySQL und PHP
  4. Downgrade auf eine PHP-Version, die nicht mehr im aktuellen Repository von Gentoo vorhanden ist
Gentoo ist eine Rolling-Release-Distribution, in der Software rasch durch neuere Versionsstände ersetzt wird. Dies führt zu einem aktuelleren Softwarestand als z.B. bei Debian, das sich nach der Veröffentlichung fast ausschließlich auf Sicherheitskorrekturen unter Beibehaltung der Versionsstände konzentriert. Bei den häufigen Versionsänderungen sind unter Gentoo allerdings Inkompatibilitäten beim Verwenden von Daten oder Konfigurationsdateien aus vorangegangenen Versionen nicht ausgeschlossen, was es nötig machen kann, mit veralteter Software zu arbeiten, die nicht mehr im aktuellen Repository von Gentoo vorhanden ist.
Eine weitere Eigenart von Gentoo ist es, daß Software beim Installieren aus den Quellen übersetzt wird, was zum einen optimierten Code bedeutet, der schnell ausgeführt wird, aber auch daß das Installieren von Software ein Vielfaches länger, als unter einer Distribution, die dieselbe Software als vorkompiliertes Paket mitbringt, dauert.
Daher ist es nicht verwunderlich, daß sich Gentoo an erfahrene (und geduldige) Benutzer richtet, die ein System bevorzugen, das sich bis ins Kleinste konfigurieren und optimieren läßt und die im Zweifelsfall selbst Probleme beheben können.
Für alle, die sich nicht tagtäglich mit Gentoo beschäftigen, gibt es im Internet viele hilfreiche Quellen wie z.B. den Gentoo Cheat Sheet, der unter anderem Analogien zwischen den Paketverwaltungssystemen verschiedener Distributionen beleuchtet.

Gentoo unter Proxmox

Zwar bringt Proxmox bereits ein Template für Gentoo mit, doch dieses hat leider zwei Einschränkungen: So läßt sich zum einen keine Software nachinstallieren und zum anderen fehlt ein SSH-Server, sodaß man zwingend auf das Proxmox-Terminal angewiesen ist, um auf den Container zugreifen zu können. Über einen in der Proxmox-Oberfläche eingetragenen SSH-Schlüssel ist somit erstmal kein Zugriff möglich.

Der Paketmanager läßt sich durch Setzen eines "Features" dazu bringen, auch in einer Containervirtualisierung zu laufen:

echo 'FEATURES="-pid-sandbox"' >> /etc/portage/make.conf

Das Installieren des SSH-Server geschieht zudem mittels:

# Paketindex aktualisieren
emerge-webrsync

# SSH-Server installieren (fehlt im Proxmox-Template)
emerge --changed-use net-misc/openssh

# SSH-Server beim Booten mitstarten
rc-update add sshd default

# SSH-Server sofort starten
rc-service sshd start

Nach diesen beiden Aktionen ist Gentoo auch im Proxmox-Container voll einsatzbereit.

Paketverwaltung

Gentoo bringt eine Paketverwaltung mit, bei der die Software aus den Quellen kompiliert und installiert wird. Das Bauen der Software wird über sogenannte ebuild-Skripte gesteuert, die Parameter (USE-Flags, make.conf etc.) aus der Systemkonfiguration übernehmen. Bis auf die Gentoo-spezifischen Einstellungsmöglichkeiten finden sich, – analoge, zu den von anderen Distributionen her bekannte – Kommandos zum (De)Installieren und Aktualisieren von Software usw.

Vorbereitungen

# Paketindex aktualisieren
emerge-webrsync

# Paketindex aktualisieren
emerge --sync

# equery installieren
emerge --ask app-portage/gentoolkit

Pakete suchen

# Paket suchen
emerge -s mariadb
Beispielausgabe
Beispielausgabe

# Installierbare Paketversionen auflisten
equery y mariadb
Beispielausgabe
Beispielausgabe

# Suche mit regulären Ausdrücken
emerge -s "%^python$"

Pakete (de)installieren

# Paket in neuester Softwareversion installieren
emerge --ask mysql

# Paket in angegebener Version installieren
emerge --ask =dev-db/mysql-5.7.29

# Paket entfernen
emerge --deselect =dev-db/mysql-5.7.29

# Paket mit Überresten entfernen
emerge --ask --verbose --depclean dev-db/mysql

Paketeinformationen

# In welchem (installierten) Paket befindet sich eine Datei?
equery belongs -e /usr/bin/glxgears

# Installierte Pakete mit Versionsnummern auflisten
qlist -IRv

#USE-Flags eines Paketes ausgeben
equery uses mysql-5.7.29

USE-Flags

Eine Gentoo-Besonderheit sind die USE-Flags, über die Einstellungen für das Kompilieren der Pakete vorgenommen werden. Diese können über Einzeldateien unter "/etc/portage/package.use/" oder in der Datei "/etc/portage/package.use" gespeichert werden.

# Festlegen der PHP-Module, die erstellt werden sollen
echo 'dev-lang/php apache2 bcmath berkdb bzip2 cgi cli ctype curl exif\
 iconv mysql mysqli opcache simplexml ssl threads tokenizer truetype\
 unicode webp xmlreader xmlwriter xpm xslt pdo json session xml filter\
 mhash fileinfo gd zip zlib intl' > /etc/portage/package.use/PHP

# Änderungen (z.B. an den USE-Flags) können Inkompatibilitäten hervorrufen,
# was z.B. durch die Meldung "USE changes are necessary to proceed" angezeigt wird.
# Konfigurationsvorschläge zum Korrigieren (hier für php-7.2.31) werden nach
# /etc/portage/package.use/._cfg00* geschrieben
emerge --autounmask-write =dev-lang/php-7.2.31

# Anschließend die Vorschläge überprüfen und den "richtigen" Vorschlag in die
# betreffende USE-Datei schreiben
mv /etc/portage/package.use/._cfg0000_PHP /etc/portage/package.use/PHP

# Pakete nach Änderungen in /etc/portage/package.use/* neu bauen oder hinzuinstallieren
emerge --ask --changed-use --deep @world

Apache, MySQL und PHP

(Linux), Apache, MySQL und PHP sind eine häufige Kombination zum Betreiben von dynamischen Webseiten.

Apache und PHP

# Zu bauende PHP-Module festlegen
echo 'dev-lang/php apache2 bcmath berkdb bzip2 cgi cli ctype curl exif iconv\
 mysql mysqli opcache simplexml ssl threads tokenizer truetype unicode webp\
 xmlreader xmlwriter xpm xslt pdo json session xml filter mhash fileinfo gd\
 zip zlib intl' > /etc/portage/package.use/PHP

# Zu verwendende PHP-Version auf 7.2 setzen
echo 'PHP_TARGETS="php7-2"' >> /etc/portage/make.conf

# Überprüfen, ob ggf. Pakete wegen geänderter USE-Regeln neu kompiliert werden müssen
emerge --ask --changed-use --deep @world

# Wird einen Fehler werfen...
emerge =dev-lang/php-7.2.31

# Nämlich: USE changes are necessary to proceed
# "--autounmask-write" zum Schreiben der Änderungen nach /etc/portage/package.use/._cfg00*
emerge --autounmask-write =dev-lang/php-7.2.31

# Auswahl+Verschieben der "richtigen" Datei bzw. überprüfen
mv /etc/portage/package.use/._cfg0000_PHP /etc/portage/package.use/PHP

# Nochmal installieren (zieht Apache gleich mit, da über USE definiert)
emerge =dev-lang/php-7.2.31

# Automatische Aktualisierung von MySQL verhindern, was sonst bei einem
# "emerge --ask --changed-use --deep @world" passieren kann
mkdir /etc/portage/package.mask
echo ">dev-db/php-7.2.32" >/etc/portage/package.mask/php

# Immer beim Booten mitstarten
rc-update add apache2 default

# Sofort starten
rc-service apache2 start

# Apache-Modul-Dateien auflisten
ls /etc/apache2/modules.d/*.so

# Konfiguration ansehen
less /etc/apache2/httpd.conf

# Geladene Module auflisten
apache2ctl -M

MySQL

# MySQL 5.7.29 installieren
emerge --ask =dev-db/mysql-5.7.29

# Starten
rc-service mysql start

# Konfigurationsversuch (in dieser MySQL-Version liegt ein Fehler vor, der das
# automatische Anlegen des MySQL-root-Benutzers verhindert)
emerge --config dev-db/mysql

# Korrektur: root-Paßwort setzen
echo "UPDATE mysql.user SET authentication_string = PASSWORD('sqlRootPassword')
WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;" > /tmp/mysql-init.txt

# MySQL-Server (temporär) starten
mysqld_safe --init-file=/tmp/mysql-init.txt

# vvvvv In neuer root-Shell ausführen, um den MySQL-Server zu stoppen
killall -9 mysqld_safe
killall -9 mysqld
# ^^^^^ In neuer root-Shell ausführen, um den MySQL-Server zu stoppen

# MySQL-Server sofort starten
rc-service mysql start

# Immer beim Booten mitstarten
rc-update add mysql default

# Automatische Aktualisierung von MySQL verhindern, was sonst bei einem
# "emerge --ask --changed-use --deep @world" passieren kann
mkdir /etc/portage/package.mask
echo ">dev-db/mysql-5.7.29" >/etc/portage/package.mask/mysql

Alte PHP-Version installieren

Aufgrund des Rolling-Release-Prinzips von Gentoo werden ältere Softwareversionen aus der Paketverwaltung aussortiert und sind somit auf nomalem Wege nicht mehr installierbar. Gentoo speichert die Informationen der Portage-Paketverwaltung allerdings auch in einem git-Repository, in dem alle (ebuild-)Stände seit dem Anlegen des Repositorys enthalten sind. Somit besteht eine gewisse Chance, alte Software zu installieren, die offiziell nicht mehr installierbar ist. Dafür muß allerdings noch der Quellcode der Software verfügbar sein.
Alte Softwarekomponenten sollen ohne triftigen Grund nicht verwendet werden, da sie möglicherweise bekannte Sicherheitslücken besitzen.

Paketverwaltung auf git umstellen

# git installieren
emerge dev-vcs/git

# portage auf git-Benutzung umkonfigurieren
mkdir /etc/portage/repos.conf
echo '[DEFAULT]
main-repo = gentoo

[gentoo]
location = /var/db/repos/gentoo
sync-type = git
sync-uri = https://anongit.gentoo.org/git/repo/sync/gentoo.git
auto-sync = yes' > /etc/portage/repos.conf/gentoo.conf

# Gentoo-Repo-Index löschen
rm -r /var/db/repos/gentoo

# Gentoo-Repo-Index direkt aus git holen
cd /var/db/repos
git clone https://anongit.gentoo.org/git/repo/gentoo.git

PHP downgraden

# Nach dem alten 7.1.22-PHP-Paket suchen
cd /var/db/repos/gentoo
git log | grep -B5 -A5  dev-lang/php-7.1.22

# Ausgabe:
#-----
#commit 4467f434c19d197a8f28a04a70aa92ab05df86cd
#Author: Matt Turner 
#Date:   Tue Sep 18 12:16:09 2018 -0700
#
#    dev-lang/php-7.1.22: ppc64 stable, bug 666256
#-----


# Alten gentoo-Repo-Index wiederherstellen
git checkout 4467f434c19d197a8f28a04a70aa92ab05df86cd

# Altes PHP installieren
emerge =dev-lang/php-7.1.22

# PHP 7.1 als Standard für Apache und CLI machen
eselect php set apache2 php7.1
eselect php set cli php7.1

# Apache neustarten
rc-service apache2 restart

Achtung! Achtung! Die folgenden Anweisungen richten sich ausschließlich an fachkundige Personen. Bei jedem Schritt kann es zum kompletten Datenverlust kommen. Alle Angaben ohne Gewähr!