FreeBSD-Server inkl. Jails auf neue Version upgraden

Ich bin gerade dabei, einen FreeBSD-Server, der als Host für diverse ezjail-Jails dient, auf eine neue FreeBSD-Version upzugraden. Als Referenz für mich dokumentiere ich das ganze hier einfach mal.

Das System läuft aktuell auf 10.1 und wird auf 10.3 gehoben. Bei späteren Upgrades müssen die Versionsnummern entsprechend angepasst werden.

Als erstes bringen wir das aktuell installierte System auf den letzten Stand und aktualisieren die Ports.

freebsd-update fetch
freebsd-update install
portsnap fetch update

Im nächsten Schritt laden wir die neuen Systemfiles herunter, installieren den neuen Kernel und rebooten das System.

freebsd-update upgrade -r 10.3-RELEASE
freebsd-update install
shutdown -r now

Nach dem Reboot installieren wir die restlichen Systemfiles und rekompilieren alle installierten Ports. Anschließend starten wir den Server noch mal neu. Die Option -m DISABLE_VULNERABILITIES=yes setze ich, damit ich nicht mitten im Upgrade aufhören muss, falls bei einem Port Sicherheitslücken bekannt sind. Temporär damit hinter der Firewall zu leben erscheint mir sinnvoller, als ein gebrickter Server. ­čśë

freebsd-update install
portmaster -af -m DISABLE_VULNERABILITIES=yes
shutdown -r now

Nach dem Reboot ist der Server an sich auf 10.3. Nun müssen noch die ezjail-Jails upgegradet werden.

Hierfür laden und installieren wir zunächst die aktualisierten Files für die Basejail und starten anschließend ezjail neu.

ezjail-admin install -r 10.3-RELEASE
env UNAME_r=10.3-RELEASE ezjail-admin update -s 10.1-RELEASE -U
ezjail-admin update -P
service ezjail-admin restart

Jetzt müssen wir nur noch in jeder einzelnen Jail die Ports rekompilieren und einmal neustarten.

portmaster -af -m DISABLE_VULNERABILITIES=yes
service -R

Das war’s. Wenn keine Probleme auftreten und kann man damit in ner Stunde durch sein. Wenn mehrere Jails betrieben werden und viele Ports gebaut werden müssen, dauert es entsprechend länger.

Dynamisches DNS bei INWX mit eigener Domain

Ich verwalte alle meine Domains bei InterNetWorX (welcher nebenbei erwähnt, ein ziemlich schnieker Domain-Registrar ist, den ich uneingeschränkt empfehlen kann).

Dieser bietet unter anderem eine API an, mit der ich Domaineinstellungen ändern kann. Da ich meinen Homeserver gerne von außen erreichen möchte, lag die Idee nahe, beides zu kombinieren.

Mit folgendem Script, welches ich auf Github gestellt habe, ist es mir möglich, die Nameservereinstellungen automatisch so anzupassen, so dass zum Beispiel http://homeserver.meinedomain.de immer auf meinen Server im heimischen Arbeitszimmer zeigt. So bin ich unabhängig von anderen Diensten und kann ihn eben auch mit meiner eigenen Domain nutzen. Nebenbei kostet mich das alles nichts extra, da die Funktion eben bei INWX eingebaut ist.

Das Script nsupdate.sh wird auf dem Server zu Hause stündlich per cron aufgerufen. Es liest dann die WAN-IP des Anschlusses aus und vergleicht sie mit der IP, die im Nameserver für die Subdomain hinterlegt ist. Wenn sich beide unterscheiden, trägt sie die aktuelle IP per XML-Voodo in den Nameserver ein.

#!/bin/bash

# Update a nameserver entry at inwx with the current WAN IP (DynDNS)

# Copyright 2013 Christian Busch
# http://github.com/chrisb86/

# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:

# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

# from which site should we get your wan ip?
IP_CHECK_SITE=http://checkip.dyndns.org

source nsupdate.config

LOG=$0.log

NSLOOKUP=$(nslookup -sil $HOSTNAME - ns.inwx.de | tail -2 | head -1 | cut -d' ' -f2)
WAN_IP=`curl -s ${IP_CHECK_SITE}| grep -Eo '<[[:digit:]]{1,3}(.[[:digit:]]{1,3}){3}>'`

API_XML="nameserver.updateRecord

                  user

                     $INWX_USER

                  pass

                     $INWX_PASS

                  id

                     $INWX_DOMAIN_ID

                  content

                     $WAN_IP

"

if [ ! "$NSLOOKUP" == "$WAN_IP" ]; then
    curl -silent -v -XPOST -H"Content-Type: application/xml" -d "$API_XML" https://api.domrobot.com/xmlrpc/
    echo "$(date) - $HOSTNAME updated. Old IP: "$NSLOOKUP "New IP: "$WAN_IP >> $LOG
else
    echo "$(date) - No update needed for $HOSTNAME. Current IP: "$NSLOOKUP >> $LOG
fi

Konfiguriert wird das ganze in der nsupdate.config. Diese liegt im selber Folder, wie das Script selbst. Hier werden die Zugangsdaten für INWX angegeben. Außerdem steht hier die Subdomain, die wir für DynDNS nutzen wollen und die ID, unter welcher die Domain bei INWX geführt wird.

# nsupdate.config

# Login credentials for the inwx admin interface
INWX_USER="USERNAME"
INWX_PASS="PASSWORD"

# The hostname that you want to update and it's ID from the inwx interface
# You get the ID when you edit the given nameserver entry and hover the save button.
HOSTNAME="subdomain.example.com"
INWX_DOMAIN_ID="123456789"

Diese Lösung läuft bei mir jetzt seit einigen Monaten sehr zuverlässig. Die Aktuelle Version findest Du immer auf meiner Github-Seite. Getestet habe ich es nur auf dem Mac und FreeBSD.

Selbstbau-NAS mit FreeBSD

Wie in Ausgabe 2 von skrupuloes zu hören war, hatte ich Probleme mit dem Speicherplatz auf meinem NAS. Die Synology Diskstation 211J hat nur Platz für zwei Platten, die ich aus Redundanzgründen gespiegelt habe. Ich hatte also effektiv 2 TB Platz. Da die Diskstation auch meine Boxee-Box, Raspberry Pi mit XBMC und diverse iDevices mit Mediendateien versorgt hat, war der Platz relativ schnell voll, wenn man die Time Machine-Backups für zwei MacBooks dazu rechnet. Es musste also etwas neues her.

Die fertigen Lösungen, die es auf dem Markt gibt waren mir alle zu unflexibel und mit Platz für mind. vier Festplatten auch relativ schnell relativ teuer. Ich entschied mich also, etwas selbst zu bauen.

Nach ein wenig Recherche entschied ich mich für folgende Komponenten:

  • Mainboard: ASUS C60M1-I
  • Gehäuse: Fractal Design Array R2
  • RAM: Corsair XMS3 PC-133 8GB (CL9)
  • Festplatten: Western Digital WD20EZRX Green 2TB
  • 320 GB Hitachi 2,5″ HDD aus MacBook Pro

Das Mainboard ist passivgekühlt, kommt mit einem AMD Fusion Dualcore mit 1GHz, Gigabit-LAN und 6 SATA-Ports. Dazu habe ich 8 GB RAM verbaut (man weiß ja nieÔÇŽ). Gespeichert wird auf vier 2 TB-Platten und einer 320 GB-Platte, die ich noch aus meinem MacBook rumliegen hatte. Das Gehäuse ist extra für den Einsatz als NAS entwickelt worden. Es kommt komplett mit einem großen Gehäuse-Lüfter, 300 W-Netzteil und bietet sowohl einen herausnehmbaren Festplattenkäfig für bis zu sechs Platten und die Möglichkeit, zusätzlich eine 2,5″-Platte zu verbauen.

Da ich aus Gründen der Datensicherheit gerne ZFS nutzen wollte, bin ich nun gezwungen, nicht mehr Linux zu benutzen. Da mir fertige NAS-Distributionen zu unflexibel sind, entschied ich mich, mal etwas neues zu wagen und jetzt läuft hier ein schickes FreeBSD.

Als Linux-Umsteiger war FreeBSD kurzzeitig ungewohnt, aber mittlerweile bin ich recht gut drin und lerne die diversen Vorzüge bezüglich Software-Verwaltung mit Ports, Konfigurationsdatein etc. zu schätzen.

Die vier großen Platten laufen als RAIDZ1 (vergleichbar mit RAID5) und bieten mir somit knapp 6 TB Speicherplatz und eine mögliche Wiederherstellung, falls eine Platte ausfällt. Wenn der Speicherplatz knapp wird, kann ich noch zwei weitere Platten verbauen und das RAID einfach erweitern.┬áDie 2,5″-Platte nutze ich als Systemplatte und habe hierauf das BSD installiert.

Alles in allem habe ich jetzt für vergleichsweise wenig Geld ein kleines, Leistungsstarkes, stromsparendes und flexibel einsetzbares System, das auch noch Spaß beim Herumexperimentieren mit einem echten UNIX gibt ­čśë