In dieser (Kurz)anleitung behandle ich gleich vier Punkte rund um Gentoo Linux:
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.
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.
# Paketindex aktualisieren
emerge-webrsync
# Paketindex aktualisieren
emerge --sync
# equery installieren
emerge --ask app-portage/gentoolkit
# Paket suchen
emerge -s mariadb
# Installierbare Paketversionen auflisten
equery y mariadb
# Suche mit regulären Ausdrücken
emerge -s "%^python$"
# 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
# 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
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
# 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 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
# 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
# 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