Entwicklungsserver konfigurieren 13.07.2020, 00:00 Uhr

Vom Anwender zum Poweruser

Wer viel mit Windows arbeitet, verkennt leicht die Vorzüge der Kommandozeile. Wie Sie ­einen Entwicklerserver einrichten und wie ein Linux-Profi auf der Kommandozeile arbeiten.
(Quelle: dotnetpro)
Zahlen und Statistiken sind immer mit Vorsicht zu genießen. Aber wenn man einzelnen Berichten Glauben schenken will, läuft mehr Linux als Windows auf Microsoft Azure [1]. Microsoft scheint also zurück zu den Wurzeln zu gehen. Denn bereits in den 1980er Jahren arbeiteten die Redmonder daran, mit Xenix im Unix-Bereich führend zu werden [2]. Vielleicht wird es mit 30-jähriger Verspätung also bald so weit sein.
Windows wird natürlich nicht aussterben. Ziel dieses Artikels ist daher nicht, jeden Entwickler mit prophetischen Worten zu überzeugen, dass in Linux die Zukunft liegt. Es geht vielmehr darum, Wege zu zeigen, wie Windows-Anwender in Linux-Umgebungen Fuß fassen können, damit sie dort, wo es sinnvoll ist, auch mit Linux hantieren können. Daher soll in diesem Artikel gezeigt werden, wie man einen Linux-Entwicklungsserver aufbaut, und es werden auch Werkzeuge vorgestellt, die erfahrene Linux-Anwender täglich nutzen.
Warum Debian?
Die Linux-Familien in Google Trends (Bild 12)
Die Geschmäcker sind verschieden. Viele Entwickler haben ihre Lieblingsdistributionen und wer will, kann auch gerne in die oft geführten Debatten einsteigen, welche die beste Distribution ist. Die Resultate sind immer die gleichen: Es kommt darauf an, was man machen will.
Distrowatch zeigt Distributionen als führend an, die stark auf Desktops fokussiert sind. MX Linux, Mint und Manjaro erweitern oft nur Distributionen mit speziellen UIs. Auch Zorin OS und Elementary OS werden immer wieder aufgrund ihrer schönen UIs erwähnt. Wer UI-fokussiert ist beziehungsweise wer ­einen vom Desktop her ähnlichen Ersatz für Windows oder ­macOS sucht, kann diese Plattformen gerne selbst evaluieren.
Für einen Entwicklungsserver ist die Familie interessant, von denen zwei dominieren: die Red-Hat-Familie (Red Hat, CentOS und Fedora) und die Debian-Familie (Debian, Ubuntu). Wichtig sind hier auch die Google-Trends [19] zu den Familien (Bild 12).
Der auffälligste Unterschied zwischen den Familien aus Anwendersicht sind die verwendeten Paketmanager. Die Debian-Familie nutzt das dpkg-Format und abgeleitet davon APT. Die Red-Hat-Familie setzt auf rpm und davon abgeleitet auf yum oder yums Nachfolger DNF. Debian selbst ist also näher an der Entwicklung als Ubuntu. Das Standard-UI, falls man es installiert, ist schlank und ohne für Entwickler unnötige Zusatzfeatures, wodurch Debian sich allgemein als Entwicklungsserver besser eignet.
Dieser Artikel fokussiert auf die Kommandozeile. Linux wird in den vorgestellten Beispielen ohne UI-Komponenten installiert und jede Verbindung zu Linux wird über SSH auf Kommandozeilenebene aufgebaut. Wer jedoch will, kann auch vollständige Images einer Linux-Distribution mit UIs installieren und dort eine Terminalemulation starten, um das Skript auszuführen, das die vorgestellten Werkzeuge installiert.

Die Virtualisierungssoftware

Um einen lokalen virtuellen Entwicklungsserver einzurichten, ist eine Virtualisierungssoftware notwendig. Das ist eine Software, die auf dem Host-Betriebssystem installiert wird, um isoliert mehrere Client-Betriebssysteme zu kapseln.
VirtualBox ist eine freie Universallösung, die sowohl auf macOS als auch auf Windows weit verbreitet ist. So mancher Windows-Anwender wird vielleicht das kommerzielle Produkt Parallels bevorzugen, Mac-User schwören womöglich auf VMware Fusion. Wer sich die Entscheidung leicht machen will, nimmt VirtualBox aufgrund seiner höheren Verbreitung [3]. Eine höhere Verbreitung bedeutet schließlich auch mehr Antworten auf Stack Overflow, sollte man sich unerwartet mit Problemen konfrontiert sehen.
Eine berechtigte Frage ist, warum nicht gleich Docker oder eine äquivalente Container-Technologie verwendet werden soll. Es ist richtig, dass sich dort mit einem Befehl umgehend ein Ubuntu- oder Debian-Container hochfahren lässt, in dem man genauso gut alle vorgestellten Werkzeuge ausprobieren kann. Will man einen Server jedoch länger nutzen, ist eine Hardwarevirtualisierung sinnvoller als eine Virtualisierung durch Container.

Vagrant

Ist eine Virtualisierungssoftware, auch Hypervisor genannt, installiert, gibt es noch eine zweite Software, die in diesem Artikel vorgestellt wird, um die Arbeitsschritte abzuwickeln. Vagrant ist ein Wrapper um die gewählte Virtualisierungssoftware. Aufgabe von Vagrant ist es, eine Konfiguration von Server-Images über Textdateien bereitzustellen und ein API anzubieten, über das man virtuelle Images aufbauen und verwalten kann. Von der Herstellerseite [4] kann die Software heruntergeladen werden. Sie ist fester Bestandteil in Repositories von Paketmanagern wie Chocolatey oder Homebrew.
Wer will, kann gerne mit Vagrant experimentieren, bevor er mit der Installation beginnt. Der nächste Schritt zum Entwicklungsserver ist, ein Beispiel-Vagrant-File zu laden, indem ein Git-Repository lokal geklont wird [5]. Wer Vagrant und die Virtualisierungssoftware installiert hat, kann bereits loslegen, indem er in das Verzeichnis des lokalen Git-Repositorys und dort in das Verzeichnis des Vagrant-Files wechselt und darin den folgenden Befehl auf der Kommandozeile eingibt:
vagrant up 
Das Vagrant-File beschreibt, was passiert (Bild 1). Den Namen midgard des Host-Computers blendet das Tool iterm ein.
Starten von Vagrant (Bild 1)
Quelle: Autor
# -*- mode: ruby -*- 
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "generic/debian10"
  config.vm.hostname = "devserver"
  config.vm.provider "virtualbox" do |v|
    v.memory = 4096
    v.cpus = 2
    v.name = "devserver"
  end

  config.vm.provision "shell", path: "./provision.sh"
end
Über einen Ruby-Code wird ein Image beschrieben. Ein Detail am Rande ist, dass modernere Systeme eine Beschreibung über JSON oder YAML bevorzugen, aber das soll uns vorerst nicht irritieren. Diese Ruby-Konfiguration beschreibt, dass hier ein Debian-Image aufgebaut werden soll, und auch die Hardware-Konfiguration ist festgelegt.
Im Hintergrund wird nach dem Start von vagrant up das Image von Servern heruntergeladen und aufgebaut. Im Vagrant-File sehen Sie weitere Optionen, das Image zu konfigurieren. Speicher, CPU und auch der Servername werden festgelegt. Ein wesentliches Steuerelement ist die Datei provision.sh, die ein Bash-Skript enthält, um einzelne Dienste zu installieren.
In diesem Skript werden die Z shell (zsh), Vim und der Terminalmultiplexer tmux installiert. Neben diesen drei wichtigen Werkzeugen, auf die später im Detail eingegangen wird, werden weitere Pakete installiert, die praktisch sind und die nicht jeder Linux-Neuling kennt. Übrigens: Eine Liste mit allen möglichen Images kann man unter [6] einsehen.

Mit vagrant ssh ins Image

Wer nun mit vagrant up ein fertiges Image erstellt hat, verbindet sich mit folgendem Befehl mit dem gestarteten Image:
vagrant ssh 
Vagrant ssh ist nicht der einzige Weg, sich mit dem Server zu verbinden. Die Kontaktaufnahme ist auch jederzeit über ein Standard-SSH-Kommando zum Server möglich. Eine Möglichkeit ist demnach auch die Verbindung mit PuTTY.
Ein Detail am Rande ist, dass alle Konfigurationen unter dem Root-User installiert werden. Es ist also notwendig, sich als Root-User anzumelden (Bild 2):
Vagrant ssh – Anmeldung als Root-User (Bild 2)
Quelle: Autor
sudo su - 
Im Server selbst ist keine Passworteingabe nötig, um sich als User anzumelden – die Settings werden automatisch gesetzt.
Ein letzter Schritt ist der folgende Befehl, um alle Pakete auf den tatsächlich neuesten Stand zu bringen:
apt upgrade 
Dieser Befehl ist Teil des Paketmanagers APT. Linux über dieses Kommando beizeiten auf den aktuellsten Stand zu bringen, ist empfehlenswert.

Der Editor Vim

Linux-Kenner wissen, dass die Wahl des Editors zu jahrelangen Debatten geführt hat, die teilweise sehr emotional geführt wurden. Aufgrund der Zahlen auf Slackshare [7] und Stack Overflow [8] wird auf diese Diskussion nicht eingegangen, sondern nur Vim vorgestellt.
Ist man an GUI-Editoren gewöhnt, kann sich mancher mit Vim anfangs in die Steinzeit zurückversetzt fühlen. Neulinge, die Vim gestartet haben, haben meist schon Probleme, diesen Editor normal zu beenden. Doch auch wenn man sich als Neuling verloren vorkommt: Die Produktivität mit diesem Editor steigt konstant mit der Erfahrung. Wer einmal das System versteht und die wesentlichsten Shortcuts kennt, schließt schnell in der Produktivität zu jeder IDE auf. Ab einem bestimmten Zeitpunkt ist man schneller als mit jedem anderen Editor. Auch gibt es immer wieder neue Kniffe, die man lernt, und echte Vim-Profis sind in der Lage, selbst eine komplette IDE zu ersetzen. Zum Glück weisen viele Entwicklungsumgebungen auch eine Vim-Integration [9] auf (Bild 3).
Visual Studio Code und Vim (Bild 3)
Quelle: Autor
Es ist empfehlenswert, sich mit Vim in einem praktischen Beispiel vertraut zu machen. Dazu soll die Datei .zshrc im Root-Home-Verzeichnis editiert werden. Das geschieht über den folgenden Befehl:
vim .zshrc 
Danach sollen diese Tastenkombinationen eingegeben werden:
/ZSH_TH <Enter> 
F"
Df"
i
"powerlevel10k/powerlevel10k"
ESC
ZZ
Es wäre allerdings auch einfacher gegangen:
:%s/robbyrussell/powerlevel10k\/powerlevel10k/ 
ZZ
Dieses Beispiel soll verdeutlichen, dass die Arbeit mit Vim einen Paradigmenwechsel erfordert. Der UI-orientierte Anwender kennt zwar vielleicht auch den einen oder anderen Shortcut, oft ist aber der Standardweg zum Ziel eines Vorhabens der über Mausklicks: Ein Klick auf das Menü Datei, dann auf Öffnen, und dann wählt man eine Datei aus. Danach klickt man auf Bearbeiten | Suchen und Ersetzen und gibt ­robbyrussell im Suchfeld und powerlevel10k/powerlevel10k im Replace-Feld ein. Danach drückt man auf OK.
Der Editor Vim stellt demnach die Arbeitsweisen vieler auf den Kopf. Doch mit jedem Shortcut, der fest im Gedächtnis verankert ist, wird man schneller (Bild 4). Irgendwann tippt man sich zum Beispiel nicht mehr mit dem delete-Key durch, sondern tippt einfach 4dd, um vier Zeilen zu löschen. Man springt mit G zum Ende einer Datei, sucht mit /<begriff> nach einem Begriff und navigiert mit n oder N durch die Datei zu den Suchergebnissen.
Editieren mit Vim (Bild 4)
Quelle: Autor
Man merkt, wie man schneller wird, wenn man beginnt, zum Beispiel Wörter links vom Cursor mit den Shortcuts db zu löschen. Und irgendwann tippt man für mehrere Wörter statt mehrmals db nur mehr einmal db und löscht weitere Wörter mit einem Punkt (.).
Wie schnell ein Entwickler sich umgewöhnt, hängt von vielen Faktoren ab. Manche brauchen vielleicht Wochen dazu, aber bislang war noch jeder Entwickler, der durchgehalten hat, irgendwann einmal schneller. 

Die Shell zsh

Im vorigen Beispiel wurde ein Theme für zsh gesetzt (Bild 5). Wie bei grafischen Benutzeroberflächen können Anwender dadurch Benutzeroberflächen im Look-and-feel modifizieren.
Z-shell-Theme setzen (Bild 5)
Quelle: Autor
Bilder sagen mehr als tausend Worte. Deswegen ist es sinnvoll, zsh neu zu starten, um herauszufinden, was alles durch das Setzen des Themes konfiguriert werden kann:
zsh 
Von Icons bis hin zu Abständen und Farben: Die Z shell ist durch das Theme bunt geworden.
Bevor wir nun weiter in die einzelnen Features von zsh eintauchen, stellt sich die Frage, warum eigentlich eine neue Shell benötigt wird. Kenner der Linux-Welt wissen, dass Bash ein Standard und diese Shell auf jedem System zu finden ist. Abgesehen von der verbesserten Optik durch Plug-ins: Wieso sollte man die Shell wechseln wollen?
Werkzeuge, die fest etabliert sind, verlieren ihre Innova­tionsgeschwindigkeit aufgrund der Anforderung von Rückwärtskompatibilität. In Bash dauert es oft mehrere Jahre, bis ein neues Major Release am Markt ist, und Anwender müssen auf neue Features warten. Somit ist zsh der Rockstar unter den Shells, der den Status des alten, farblosen Vorgängers infrage stellt. Vor allem über viele Plug-ins ist es möglich, zahlreiche zusätzliche Feinheiten in die Arbeit zu integrieren.
Die Datei .zshrc ist dabei sozusagen das Schaltwerk. Sie wird, wenn zsh als Standard-Shell gesetzt ist, bei jedem Log­in gestartet. DOS-Nostalgiker können bei .zshrc einen Vergleich mit der autoexec.bat ziehen. In dieser Datei wird auch der Plug-in-Manager Oh My Zsh [10] geladen. Alle Plug-ins zielen darauf ab, die Arbeit mit der Z shell noch übersichtlicher und besser zu machen.
Neben der Optik gibt es auch einige Features, die ein Entwickler bald nicht mehr missen will. Eines davon ist das Auto­jump-Tool z. Wer dieses Plug-in aktiviert hat, kann mit einem Aufruf von z, gefolgt von einem Namensteil des Verzeichnisses, in diesen Pfad zurückspringen:
z workshop 
Das Beispiel in Bild 6 unterstreicht die Funktionalität von z.
Autojump mit z (Bild 6)
Quelle: Autor
Weitere Werkzeuge und Plug-ins sind auf [11] zu finden. Diese Liste wird kontinuierlich erweitert und Leser können aus einem reichhaltigen Katalog aus Features auswählen.

Der Terminalmultiplexer tmux

Ein weiteres essenzielles Werkzeug im Repertoire eines Linux-Profis ist der Terminalmultiplexer tmux. Mit tmux lassen sich mehrere Kommandozeilenfenster parallel verwalten. Wer tmux mit dem gleichnamigen Befehl gestartet hat, wird einen Screen sehen, der in seiner Darstellung Bild 7 entsprechen sollte.
Der Terminalmultiplexer tmux (Bild 7)
Quelle: Autor
Nun ist es an der Zeit, Ctrl b und dann c zu drücken, um ein neues Fenster zu erstellen. Wir können das Ergebnis veri­fizieren, indem wir in einem Fenster einen beliebigen Text tippen und mit Ctrl b und n zwischen den Fenstern wechseln.
Es ist auch möglich, das Fenster in mehrere Flächen zu unterteilen:
Ctrl b + Shift 5 
Nun haben wir das Fenster vertikal gespalten. Mit folgenden Shortcuts können wir nach oben und unten wechseln:
Ctrl b + <UP, DOWN> 
Analog lassen sich mit weiteren Shortcuts Fenster noch weiter spalten und auch deren Positionen vertauschen.
Eine Session ist eine Sammlung mehrerer Fenster, und sie kann mit folgendem Befehl innerhalb von tmux erstellt werden:
Ctrl b + :new -s test 
Zwischen den Sessions wechselt man mit folgendem Befehl:
Ctrl b + s 
Das Werkzeug tmux wird oft in der Kollaboration zwischen Anwendern verwendet. So kann man Sessions zwischen Usern wechseln. Wer in einer Remotesitzung an einem Server arbeitet, kann sogar im Paired-Programming-Modus arbeiten.
Weitere Werkzeuge gibt es auf [12]. Diese Liste enthält auch Werkzeuge, die beispielsweise Sessions über einen Reboot hinaus erhalten.

Weitere Tools

In diesem Provision-Skript sind noch weitere Pakete enthalten. Werkzeuge wie Wget sollen hier nicht im Detail erklärt werden. Die Pakete git-extras, tig und hub sind jedoch einen Blick wert. Diese und auch zahlreiche weitere Werkzeuge sind übrigens auf einer Webseite zu finden [13], auf der alle Befehle im Detail beschrieben werden.
  • Im Paket git-extras sind Kommandozeilen-Erweiterungen enthalten, die das Arbeiten mit Git erleichtern.  Ein Beispiel ist der Befehl git summary, der eine Zusammenfassung aus dem lokalen Repository zieht (Bild 8).
Der Befehl git summary liefert Infos zum Repository (Bild 8)
Quelle: Autor
  • tig ist ein Browser für eine Commit-History (Bild 9). Ruf man dieses Werkzeug im Repository-Verzeichnis auf, kann man durch eine Historie browsen.
Der Commit-History-Browser tig in Aktion (Bild 9)
Quelle: Autor
  • hub ist ein Werkzeug, um GitHub auf die Kommandozeile zu abstrahieren. Es ist somit möglich, auf der Kommandozeile ein neues entferntes Repository zu erstellen, was man normalerweise online erledigen müsste. Ein analoges CLI gibt es auch für GitLab [14].
  • fd-find ist ein Werkzeug, um die Suche zu erleichtern, da der traditionelle Weg über find manchmal etwas umständlich ist. Die folgenden Befehle sollen einen Vorgeschmack geben:

    fd passwd /etc ⇥fd '^x.*rc$'⇥
    Weitere Beispiele sind auf der Herstellerseite zu finden [15].
Linux-Profis kennen den Befehl grep. Es gibt ein weiteres Werkzeug, dass sich ag nennt und diese Funktionalität vereinfacht. Beispiele liefert die Herstellerseite unter [16].
Der Midnight Commander (mc) ist ein Norton-Commander-Klon für Linux. Ranger ist ebenfalls ein Dateiexplorer. Beide sind im Bild 10 zu sehen. Der Editor mc eignet sich sehr gut, um zwei Verzeichnisse abzugleichen. Ranger bietet mehr Vorzüge beim Durchwandern eines Verzeichnisses.
Die Dateiexplorer Midnight Commander und Ranger (Bild 10)
Quelle: Autor
Peco hilft dabei, die Suche einzugrenzen (Bild 11). Das beste Beispiel ist das Durchforsten der Historie:
Peco als Suchfilter (Bild 11)
Quelle: Autor
history | peco 
Aria2 schließlich ist ein moderner Downloadmanager, der den Download über Links massiv beschleunigt.
Das waren viele kleine Tools und Erweiterungen. Gute Anlaufstellen für mehr Werkzeuge sind die Seiten [17] und [18].

Und die Cloud?

Wer mit Vagrant arbeitet, verfügt damit zwar über ein mächtiges Werkzeug, aber das Argument, etwas oldschool zu sein, trifft ein Stück weit zu.
Auch wenn es manchmal ganz okay ist, oldschool zu sein, und man beileibe nicht jedem Trend folgen sollte, soll doch gezeigt werden, dass es auch mit der Cloud geht. Wenn wir also Vagrant gegen Terraform als Provisioning-Tool austauschen, können wir eine Konfiguration erstellen, über die wir neue EC2-Instanzen erzeugen und auch unser Provisionsskript laufen lassen können:
provider "aws" { 
  region = "eu-central-1"
}

data "aws_ami" "ubuntu" {
  most_recent = true
  filter {
    name  = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-bionic-
      18.04-amd64-server-*"]
  }
  filter {
    name  = "virtualization-type"
    values = ["hvm"]
  }
  owners = ["099720109477"] # Canonical
}

resource "aws_instance" "web" {
  ami          = "${data.aws_ami.ubuntu.id}"
  instance_type = "t2.micro"

  tags = {
    Name = "DevServer"
  }
  provisioner "remote-exec" {
    # Bootstrap script called with private_ip of each
    # node in the cluster
    inline = [
      "provision.sh",
    ]
  }
}
Gestartet wird Terraform mit folgenden Befehlen:
terraform init 
terraform apply
Einzelne Konfigurationen wie ssh keys und access keys müssen dabei individuell gesetzt werden, damit alles einwandfrei funktioniert.

Zusammenfassung

Ein Linux-Server bietet viele Möglichkeiten, um effizient auf der Kommandozeile zu arbeiten. Dieser Artikel hat einige Werkzeuge vorgestellt, die Ihnen genau dabei helfen sollen.
Dieser Artikel bietet eine Starthilfe, doch es gibt natürlich noch zahlreiche weitere Tools und Tricks, die die Produktivität erhöhen, aber im Rahmen dieses Artikels nicht dargestellt werden konnten.
Dokumente
Artikel als PDF herunterladen


Das könnte Sie auch interessieren