Linux Pakete mit fpm bauen

Software installieren

Unter den meisten Linux Distributionen wird Software zumeist via Paketmanager
installiert.
Gerade in der Software-Entwicklung kommt es aber immer wieder dazu, dass
man selbstkompilierte oder selbstentwickelte Software installieren muss.

Der übliche "Installationsmechanismus" via

./configure && make && make install

führt jedoch dazu, dass die Software unversioniert installiert wird und eine
Deinstallation nur in mühseliger Handarbeit möglich ist.
Auch die Installation auf mehreren Rechner erfordert immer wieder den selben
Aufwand und eine Updatemöglichkeit gibt es ebenfalls nicht.

Pakete

Die optimale Lösung für unser Problem ist natürlich die Erstellung eines
eigenen Pakets:
Das Paket wird ein einziges Mal gebaut, kann jederzeit deinstalliert werden
und die Version des Pakets ist ebenfalls protokolliert, so dass später Updates
möglich sind.

Das Problem daran ist, dass das Entwickeln von Paketen recht Aufwändig ist.
Eine Abhilfe schafft hierbei das
Werkzeug fpm.

Installation

Zunächst stellen wir sicher, dass auf unserem Rechner das Paket ruby-dev
installiert ist:

Bei auf Debian basierenden Systemen (z.B. Ubuntu):

sudo apt-get install install ruby-dev

Bei auf RedHat basierenden Systemen (z.B. CentOS):

sudo yum install fpm

Nun können wir mit dem Ruby Paketinstaller gem das Programm installieren:

gem install fpm

Nun sollte das Programm fpm auf der Kommandozeile zur Verfügung stehen.

Paket bauen

Wir haben nun unsere Software wie zuvor und bauen diese - jedoch mit einem
Präfix, z.B.:

mkdir /tmp/place_to_install
./configure && make && make install DESTDIR=/tmp/place_to_install

Wenn wir nun an den Ort /tmp/place_to_install schauen, sehen wir dort die
installierten Daten. Diese sollen nun in unser Paket kommen.
Diese bauen wir mit:

fpm -s dir -t rpm -n myprogram -v 0.1.2 -C /tmp/place_to_install bin lib

Hierbei stehen die Parameter für:

  • -s dir: Das Paket wird aus einem Verzeichnis gebaut (andere Möglichkeiten u.a. Python Module, rpm Dateien usw.)
  • -t rpm: Es soll ein rpm-Paket gebaut werden. Auch deb-Pakete sind möglich
  • -n myprogram: Der Name des Pakets
  • -v 0.1.2: Die Version des Pakets
  • -C /tmp/place_to_install: Das Verzeichnis, in dem sich die Dateien befinden
  • bin lib: Die Dateien/Verzeichnisse in dem Verzeichnis, welche auch wirklich im Zielsystem installiert werden sollen

Nach kurzer Wartezeit purzelt aus dem Werkzeugs ein installierbares Paket heraus.

Fazit

Mit fpm lassen sich bequem, schnell und einfach Pakete bauen.
Natürlich berücksichtigt das hier erstellte Paket keinerlei Abhängigkeiten und
es werden auch nicht alle Möglichkeiten und Funktionen des Paketmanagements genutzt, aber
in der Praxis erleichtert dies die Installation von Software - gerade in Teams
ungemein.

Jetzt nur noch ein Repository-Server aufgesetzt - und schon hat man im Team
eine komfortablen Weg Software bereit zu stellen.

Myrepos: Alle meine Repositories

Repository-Zentrale

Dank VCSH habe ich all meine Dotfiles hübsch in Git-Repositories verpackt.
Das Einbinden eines einzelnen Repositories geht nun zwar schnell von der Hand,
aber wenn nun für vim und mutt und emacs und und und ... lauter
Repositories vorliegen wird es unbequem.
Auch das updaten (pull) jedes einzelnen Repos ist sehr mühselig und damit
fehleranfällig.

Abhilfe schafft hier myrepos (kurz mr),
dass es erlaubt Aktionen auf mehreren Repositories auszuführen.

Read more "Myrepos: Alle meine Repositories"

Shift Lock sinnvoll nutzen

Shift-Lock

Die Shift-Lock Taste alias "Feststelltaste" ist für die meisten Menschen ein Ärgernis und
Relikt aus der Zeit der Schreibmaschinen.

Doch anstatt die Taste zu deaktivieren oder gar auszubauen kann die Taste auch gut für andere
Zwecke verwendet werden.

Ich habe die Shift-Lock Taste auf die "Ctrl" (Steuerung) Taste gemappt, was Shortcuts wie Ctrl+C in vim deutlich attraktiver macht

So gehts

Read more "Shift Lock sinnvoll nutzen"

Konfigurationsdateien verwalten mit VCSH

Einstellungen

Was ist der erste Schritt bei der Benutzung eines Autos, einer Stereoanlage oder eines Schreibtischstuhls?
Die Einstellungen!
Natürlich will man gut aus dem Fahrzeug sehen können, der Lieblings-Musik lauschen und bequem sitzen.

Doch auch Software hat Einstellungen:

  • Welchen Editor setze ich als Standard?
  • Welche Shell-Erweiterungen lade ich in oh-my-zsh?
  • Welches color-theme lade ich in vim?
  • Welche Accounts habe ich in mutt?

Praktischerweise liegen all diese Einstellungen in Dateien (sogenannten "Dotfiles"), welche sich einfach von A nach B kopieren lassen.
Da ich jedoch regelmässig auf unterschiedlichen Rechnern arbeite, möchte ich diese aktuell halten.

Dropbox

Mein erster Ansatz war es, alle Dateien in einen zentralen Dropbox Ordner zu verschieben und Links zu erstellen nach folgendem Schema

~/.vimrc -> ~/Dropbox/config/vimrc

Meine .vimrc wurde durch den Dropbox-Dienst nun auf allen Rechnern synchronisiert und immer aktuell.
Richtete ich einen neuen Rechner ein, so musste ich "nur" Dropbox und den Link erstellen.

Dieser Ansatz hat jedoch einige Nachteile:

  1. Ich bin von der Verfügbarkeit von Dropbox abhängig (ist ok für mich)
  2. Ich muss auf allen Rechnern Dropbox installieren (ist auch noch so ok)
  3. Ich muss alle Dateien händisch verlinken (nicht ok!)
  4. Die Änderungen sind nicht dokumentiert bzw. haben keine definierten Zwischenstände (nicht ok!)
  5. Alle Änderungen werden sofort bei allen Systemen aktualisiert (außer ich stoppe Dropbox)

VCSH

Ich wünschte mir ein System, welches die Versionierung der Konfigurationsdaten übernimmt und bin dabei auf VCHS gestoßen.

Das schöne an VCSH: Es baut einfach auf git auf und bietet somit einerseits ein vertrautes Interface. Zudem kann ich meine Konfigurationsdateien nun einfach in ein zentrales Repository (z.B. auf Github oder auf einem eigenen Server) ablegen.

Installieren

Installieren erfolgt aus dem Repository, Debian/Ubuntu also per

apt-get install vcsh

oder bei Arch Linux via aur (hier mit yaourt)

yaourt -S vcsh

Anlegen

Ich empfehle pro Werkzeug (z.B. emacs, mutt, ...) ein eigenes Repository anzulegen um die Übersicht zu behalten.
Die Syntax hierbei entspricht der von git, jedoch mit Namen des Werkzeugs vorangestellt, also vcsh WERKZEUG GIT-BEFEHL (Ausnahme: init-Befehl)

Wir initialisieren uns erstmal ein Repository für unsere Vim-Einstellungen...

vcsh init vim

... fügen die Datei(en) hinzu, die wir verwalten wollen ...

vcsh vim add ~/.vimrc

... machen unseren ersten commit ...

vcsh vim commit -m "Mein erster Vim-commit"

... und pushen diesen auf unseren Git-Server (z.B. Github)

vcsh vim remote add git@MEINGITSERVER:vim.git
vcsh vim push -u origin master

Klonen

Auf einem neuen Rechner können wir uns die Konfiguration einfach holen:

vcsh clone git@MEINGISERVER:vim.git

.gitignore

Da sich unsere Konfigurationsdateien im Home-Verzeichnis des Users befinden, hat VCSH (bzw. git) keine Chance zu wissen welche Dateien definitiv zu dem Projekt gehören und welche nicht.
Also schaffen wir mit einer .gitignore-Datei Abhilfe: Alle Dateien und Verzeichnisse sollen ignoriert werden, außer den Projektdateien/Ordnern.
Diese erstellen wir automatisch via

vcsh write-gitignore vim

Wie fügen die ignore-Datei selbst auch dem Projekt hinzu...

vcsh vim add -f ~/.gitignore.d/vim

... und schreiben die Datei erneut.

vcsh write-gitignore vim

Nun kontrollieren wir die Datei ~/.gitignore.d/vim ob sie nicht Dateien ignoriert, welche wir versionieren wollen;
Wenn nicht: Ab damit ins Repository!

vcsh vim add ~/.gitignore.d/vim

Alle weiteren Aktionen können wir nun in gewohnter git-manier (commit push pull) erledigen.

Fazit

VCSH erlaubt es bequem Dotfiles zu organisieren und diese versioniert abzulegen.
Im Alltag hilft mir es enorm meine Konfigurationsdateien auf einem Stand zu halten und Änderungen dokumentiert.

Ergänzend zu VCSH bietet sich die Benutzung von myrepos ab um mehrere Repositories gleichzeitig zu verwalten.