Setup 2015

Apples aktueller Release-Zyklus gibt nicht nur Anlass zu erregten Diskussionen über Software-Qualität – Lukas Mathis erwägt sogar einen Wechsel auf Ubuntu:

My main computer is still a Mac, but not thanks to anything Apple has done.1 It’s things like Coda, Pixelmator, Sketch, BBEdit, Kaleidoscope, OmniGraffle, or Interarchy that keep me on the Mac — despite the issues I have with Apple’s OS. By now, I’ve stopped using any of Apple’s own applications.

Ubuntu itself is more than good enough to replace my Mac — but despite looking, I haven’t found good alternatives to stuff like Coda, Pixelmator, or Sketch.

Für eine Linux-Installation auf meinem neuen MacBook Pro ist Yosemite allerdings noch deutlich zu attraktiv, so dass ich 2015 mit dem üblichen Setup-Ritual einleite:

  1. SuperDuper-Klon der alten Festplatte
  2. Übertragung der regulären Daten (/Temp, ~/Documents, ~/Sites etc)
  3. Installation der Mac-Anwendungen (Launchbar, 1Password, ExpanDrive, LittleSnitch, Handbrake, Dropbox, BBEdit, Typinator, Things, SuperDuper, MacVim, NVAlt, Yojimbo, Ghostery, Parallels, MacTeX [+ texhash; updmap --enable MixedMap pad.map)
  4. Installation von XCode
  5. Kompilation/Installation der Unix-Anwendungen
  6. Übertragung der Konfigurationsdateien aus ~/ bzw. ~/Library, Generierung von Symlinks in ~/Backup, Rekonstruktion der Network Locations, Einrichtung der Drucker

Die Rückführung des iTunes-Medienordners auf die lokale Festplatte funktioniert natürlich nicht wie geplant, aber iTunes ist ja auch ein Paradebeispiel für den verlorenen funktionalen Hochgrund. Davon abgesehen wird es erst mit Schritt 5 interessant. vim 7.3

./configure --prefix=/usr/local --with-features=huge make sudo make install

– meldet unerwartet conflicting types, die die Anwendung eines Patches für os_unix.c erforderlich machen.

Die Bestandteile von GnuPG 2.1 (mit deutlich verbesserter Agenten-Verwaltung) lassen sich dagegen in dieser Reihenfolge –

  1. libgpg-error-1.17
  2. libksba-1.3.2
  3. libassuan-2.2.0
  4. libgcrypt-1.6.2
  5. pinentry-0.9.0 (now works without --enable-embedded)
  6. npth-1.1
  7. gnupg-2.1.1
  8. gpgme-1.5.3

– reibungslos installieren (./configure --prefix=/usr/local; make; sudo make install), so dass ich lediglich einen Symlink von Hand herstellen (ln -s /usr/local/bin/gpg2 /usr/local/bin/gpg) und die defekten Schlüsselbunde (keydb_search failed: Invalid packet) durch einen Re-Import aller Schlüssel –

[Old MacBook:] gpg2 --export --armor > pubkeys.txt [Old MacBook:] gpg2 --export-secret-keys --armor > seckeys.txt [New MacBook:] gpg2 --import < pubkeys.txt [New MacBook:] gpg2 --import < seckeys.txt

– reparieren muss. Nach einem zaghaften Experiment lässt sich sogar mein S/MIME-Zertifikat importieren, so dass ich GPGME endlich uneingeschränkt nutzen (und meine .muttrc-Datei deutlich vereinfachen) kann. Angesichts dieses Erfolges nehme ich die bekannten Fehler mit ambigen Zertifikatsnamen und nicht validen eigenen Schlüsseln schulterzuckend hin, und mit einer handgestrickten Locale-Definition (en_ISO.UTF-8) gestalte ich die Datumsdarstellung aus GnuPG ISO-konform.

mutt 1.5.23 macht ebenfalls keine Probleme, obwohl ich das Paket etwas umgestalte (lbdb → muttqt [+ sqlite/contacts], BerkeleyDB → gdbm):

tar -xzvf mutt-1.5.21.tar.gz cd mutt-1.5.21 ./configure --enable-imap --enable-smtp --with-curses --with-regex --enable-hcache --with-sasl=/usr --with-ssl --prefix=/usr/local --enable-gpgme make sudo make install

Um Datumsangaben innerhalb von Nachrichten umzuformatieren, müsste ich übrigens jede Nachricht mittels display_filter durch ein Skript leiten.

Der Webstack verursacht im ersten Schritt keine Probleme:

# mod_wsgi tar -xzvf mod_wsgi-4.4.3.tar.gz cd mod_wsgi-4.4.3 ./configure --prefix=/usr/local make sudo make install # nginx tar -xzvf pcre-8.3.6.tar-gz tar -xzvf nginx-1.7.9.tar.gz cd nginx-1.7.9 ./configure --prefix=/usr/local --with-http_gzip_static_module --with-pcre=../pcre-8.36 # Django tar -xzvf Django-1.7.1tar.gz cd Django-1.7.1 sudo python setup.py install # PostgreSQL tar -xzvf postgresql-9.4.0.tar.gz cd postgresql-9.4.0 ./configure --prefix=/usr/local make sudo make install # psycopg2 tar -xzvf psycopg2-2.5.4.tar.gz cd psycopg2-2.5.4 python setup.py build sudo python setup.py install # cmake tar -xzvf cmake-3.1.0.tar.gz cd cmake-3.1.0 ./bootstrap --prefix=/usr/local make sudo make install # MySQL tar -xzvf mysql-5.6.22.tar.gz cd mysql-5.6.22 cmake . -DCMAKE_INSTALL_PREFIX=/usr/local make sudo make install # MySQLdb tar -xzvf MySQL-python-1.2.4.tar.gz cd MySQL-python-1.2.4 python setup.py build sudo python setup.py install # cssmin tar -xzvf cssmin-0.1.4.tar.gz cd cssmin-0.1.4 sudo python setup.py install # libjpeg tar -xzvf jpegsrc.v8d.tar.gz cd jpeg-8d ./configure make make test sudo make install # Python Imaging Library tar -xzvf Imaging-1.1.7.tar.gz cd Imaging-1.1.7 sudo python setup.py install

Und auch die Initialisierung von PostgreSQL bzw. MySQL funktioniert:

# PostgreSQL sudo mkdir /usr/local/data/postgres sudo chown _postgres:wheel /usr/local/data/postgres sudo -u _postgres /usr/local/bin/initdb -D /usr/local/data/postgres sudo -u _postgres /usr/local/bin/postgres -D /usr/local/data/postgres/ # _postgres needs a password psql -U _postgres postgres postgres=# ALTER USER _postgres WITH PASSWORD '...'; ALTER ROLE postgres=# CREATE USER myuser WITH PASSWORD '...'; CREATE ROLE postgres=# CREATE DATABASE db1; CREATE DATABASE postgres=# CREATE DATABASE db2; CREATE DATABASE postgres=# CREATE DATABASE db3; CREATE DATABASE postgres=# GRANT ALL ON DATABASE db1 TO myuser; GRANT postgres=# GRANT ALL ON DATABASE db2 TO myuser; GRANT postgres=# GRANT ALL ON DATABASE db3 TO myuser; GRANT postgres=# \q psql db1 < ~/Sites/site1/dbdump/db1.sql psql db2 < ~/Sites/site1/dbdump/db2.sql psql db3 < ~/Sites/site1/dbdump/db3.sql # MySQL cd /usr/local sudo ./scripts/mysql_install_db --user=_mysql sudo ./bin/mysqladmin -u root password 'new_password' sudo ./bin/mysqladmin -u root - localhost password 'new_password' sudo /usr/local/bin/mysqld_safe & mysql -u root -p GRANT ALL ON db2.* TO myuser@localhost IDENTIFIED BY 'new_password'; exit mysql -u myuser -p CREATE DATABASE db4; exit mysql -u myuser db4 -p < ~/Sites/site4/dbdump/db4.sql

Vor dem Setzen des root-Passwortes darf .my.cnf noch nicht in ~ liegen, sonst verwendet MySQL das dortige Passwort und alles geht schief. httpd.conf muss für Apache 2.4 in einigen Bereichen (→ Authentifizierung) sehr grundlegend umgeschrieben werden, und auch bestimmte Aspekte meiner in die Jahre gekommenen Web-Applikationen harmonieren nicht mit Django 1.7. Allerdings weiß ich beim besten Willen nicht, wann ich eine Erweiterung des User-Modells implementieren soll. Immerhin funktionieren meine LaunchDaemons für nginx/postgres/mysql weiterhin, und nach dem Eintrag der Hostnamen (*.django) in /etc/hosts ist der Webstack einsatzbereit.

Zum Abschluss ergänze ich die veralteten BSD-Werkzeuge durch die GNU core utilities (./configure --prefix=/usr/local; make; sudo make install), um in Notlagen auf ein leistungsfähiges ls zurückgreifen zu können.

Und natürlich:

sudo nvram boot-args="-v"

Im Vergleich zum Setup 2012 gab es weniger Kompilations- und mehr Konfigurationsprobleme, und außer einem hartnäckigen FileVault-Problem und instabilen WLAN-Verbindungen spricht wenig gegen Yosemite.