FreeBSD – ZFS – Netatalk

Vorweg

Dies ist kein Howto bis auf den letzten Befehl herunter. Deshalb werde ich ab und zu andere Sachen verlinken statt selbst in ermüdender Weise alles noch mal aufzuschreiben. Trotzdem lasst es mich in den Kommentaren wissen, falls was Wichtiges fehlt, viel zu kurz dargestellt wurde oder falsch/veraltet ist. Danke!

Warum FreeBSD – ZFS – Netatalk? Ich bin Macfan seit geraumer Zeit, alle meine nicht-Server sind seit langem Macs, Windows und Linux spielen bei mir nur eine marginale Rolle. Netatalk kann das von Apple entworfene Apple Filing Protocol (AFP) und kann sich einem Mac als Time Machine Server ausgeben. Es ist also also der Fileserver der Wahl. Mit Mavericks (OS X 10.9) hat Apple SMB 2 Support eingebaut, wir werden also in Zukunft wahrscheinlich Samba haben wollen, besonders, wenn das dann Time Machine kann, aber momentan ist da der Status noch unklar. Wenn es soweit ist werde ich mich auf jeden Fall hier und bei der Freak Show dazu äußern.

Hardware

Bei dieser Updaterunde des Homeservers wollte ich mich nicht mehr mit den maximal 4 GB RAM der Atomboards begnügen. Das liegt vor allem daran, dass ZFS richtig viel Speicher haben will, die CPU-Performance der Atom Prozessoren würde dagegen dicke reichen. Ich habe mich also nach was besserem umgeschaut. Hängen geblieben bin ich beim Sockel 1150 und dem H87 Chipsatz im Allgemeinen und beim Gigabyte H87M-D3H im Besonderen. Mit 32 GB RAM Maximalausbau und 6 onboard SATAports kann man schon was anfangen. Dazu den ab Werk heruntergetakteten Core i3 4130T von Intel in der Boxed Variante. Ich hatte noch nie einen Prozessor selber gesteckt, aber Jahrzehnte der selbermachwütigen Idioten haben ganz offensichtlich ihre Spuren hinterlassen. Ich hätte Schwierigkeiten gehabt absichtlich was falsch zu machen. Was ich aber falsch gemacht habe ist die Motherboardgröße. Es gibt einen Unterschied zwischen mini-ITX und micro-ATX. Der ist an der kritischen Stelle meines bisherigen Gehäuses etwa 2 1/2 cm groß. Also musste ein neues Gehäuse her. Ich habe das Lian Li PC-V358 Micro-ATX Cube in schwarz gewählt, denn es versprach in meinen Schubkastenschrank zu passen. Gut, wie sich herausgestellt hat, nur mit abgeschraubten Füßen und einem abgewinkelten Kaltgerätestecker, aber hey…!

FreeBSD

FreeBSD 10 ist frisch released, da habe ich genau das heruntergeladen und per dd auf einen USB-Stick gepackt. Beim Booten dann die erste positive Überraschung:

20131222-204355.jpg
Der (seit FreeBSD 9 neue) Installer kann jetzt Root-on-ZFS installieren! Das war vorher per Hand doch sehr mühsam. Steht zwar „Experimental“ dran, hat in meinem Fall aber gut funktioniert. Ich dachte ich probier’s mal mit zwei Platten im Mirror:

20131222-205204.jpg
Der Installer tut genau das Richtige und bietet auch keine unnützen Optionen an. Mit dem Kommando gpart show kann man sich anschauen, wie die beteiligten Laufwerke partitioniert worden sind:

root@server:~ # gpart show
=>       34  976773101  ada3  GPT  (466G)
         34          6        - free -  (3.0K)
         40       1024     1  freebsd-boot  (512K)
       1064   41943040     2  freebsd-swap  (20G)
   41944104  934829024     3  freebsd-zfs  (446G)
  976773128          7        - free -  (3.5K)

=>       34  976773101  ada6  GPT  (466G)
         34          6        - free -  (3.0K)
         40       1024     1  freebsd-boot  (512K)
       1064   41943040     2  freebsd-swap  (20G)
   41944104  934829024     3  freebsd-zfs  (446G)
  976773128          7        - free -  (3.5K)

Also genau wie man es haben will. Auch die angelegten ZFS Filesysteme sehen sehr vernünftig aus:

root@server:~ # zfs list
NAME                 USED  AVAIL  REFER  MOUNTPOINT
zroot               5.14G   432G   144K  none
zroot/ROOT          1.81G   432G   144K  none
zroot/ROOT/default  1.81G   432G  1.32G  /
zroot/tmp            560K   432G   176K  /tmp
zroot/usr           2.79G   432G   144K  /usr
zroot/usr/home       272K   432G   184K  /usr/home
zroot/usr/ports     2.79G   432G  1.96G  /usr/ports
zroot/usr/src        144K   432G   144K  /usr/src
zroot/var            542M   432G   518M  /var
zroot/var/crash      148K   432G   148K  /var/crash
zroot/var/log        728K   432G   356K  /var/log
zroot/var/mail       232K   432G   144K  /var/mail
zroot/var/tmp        360K   432G   152K  /var/tmp

Nun sollte man bei dem Pool den Failmode auf continue umschalten, sonst bleibt er beim Booten hängen, wenn etwas faul ist: zpool set failmode=continue zroot

Ports

Damit wir überhaupt richtig loslegen können brauchen wir eine aktuelle Portscollection. Also los:

root@server:~ # portsnap fetch ; portsnap extract

Das kann jetzt dauern, aber es lohnt sich! Um die Ports später auf dem neusten Stand zu halten, benutze ich immer portupgrade also:

root@server:~ # portsnap fetch ; portsnap update ; portupgrade -a

SSH

SSH ohne Passwort sondern mit Schlüssel. Einfach machen, und man ist vor den Skriptkiddies wieder ein Tick sicherer.

ZFS

Zu ZFS muss man ja an sich nicht viel sagen. Wer sich die Mühe macht FreeBSD zu installieren tut es in der Regel um von den Vorteilen von ZFS zu profitieren. Wer noch nicht überzeugt ist, schaue sich folgenden Output an:

root@server:~ # zpool status
  pool: zroot
 state: DEGRADED
status: One or more devices are faulted in response to persistent errors.
	Sufficient replicas exist for the pool to continue functioning in a
	degraded state.
action: Replace the faulted device, or use 'zpool clear' to mark the device
	repaired.
  scan: resilvered 20.7M in 0h0m with 0 errors on Sun Dec 22 20:02:57 2013
config:

	NAME                                    STATE     READ WRITE CKSUM
	zroot                                   DEGRADED     0     0     0
	  mirror-0                              DEGRADED     0     0     0
	    diskid/DISK-1240000000000464p2      ONLINE       0     0     0
	    diskid/DISK-4C532000000319101264p2  FAULTED      0    94     0  too many errors

errors: No known data errors

Ich hatte testweise FreeBSD auf zwei USB-Sticks installiert und der eine ist offensichtlich direkt gestorben. Hey, der war nagelneu! Aber kein ernstes Problem wenn man von einem ZFS-Mirror bootet, woanders würde man von vorne anfangen. Übrigens hat es sich ausgezahlt, Datenträger von verschiedenen Herstellern zu beziehen. Gilt auch für Festplatten! Ich würde schwer davon abraten mehrere baugleiche Platten vom gleichen Hersteller zu beziehen, am Besten noch aus der gleichen Charge… Keine gute Idee!

Den Datenpool habe ich mit 6 Platten und Raidz2 angelegt. Beim ersten Versuch hat ZFS gemecktert, dass eine Platte 4k-Sektoren benutzt und die Performance leiden würde. Wem das auch passiert, hier entlang: Pool anlegen mit Festplatten die intern 4K-Sektoren benutzen.
Kleiner Tip: Ich habe unter FreeBSD ganz normal einen User angelegt und ihm dann auf dem Datenpool ein eigenes ZFS-Dateisystem kreiert und es mit zfs set mountpoint=/usr/home/... an die Stelle gelegt, wo es auf dem Root-Volume angelegt wurde. So erspart man sich das Konfigurieren des Useraccounts. Und Dank ZFS muss man auch nicht in der /etc/fstab herummurksen um etwas irgendwo hin zu mounten.

Netatalk

Ein zentraler Sinn der ganzen Übung ist, wie ja bereits erwähnt, dass ich mein Time Machine Backup auf den Server machen will und dazu braucht er Netatalk. Ich habe mich gleich auf Netatalk 3.1 gestürzt. Man installiert dazu den Netatalk 3 port in /usr/ports/net/netatalk3

cd /usr/ports/net/netatalk3
make install

Bei der Installation hat man die Wahl zwischen Avahi und dem Apple mDNSResponder als Bonjour-Provider. Ich habe Avahi gewählt, aber Vorsicht, da hängt ein ganzer Rattenschwanz an Abhängigkeiten dran und wenn man nicht aufpasst bekommt man auch noch einen X-Server installiert.

In /etc/rc.conf muss man einen ganzen Sack Services starten sonst funktioniert das alles nicht:

dbus_enable="YES"
avahi_daemon_enable="YES"
netatalk_enable="YES"
cnid_metad_enable="YES"
afpd_enable="YES"

Als nächstes kreiert man das File /usr/local/etc/avahi/services/afpd.service und tut in etwa den folgenden XML-Code hinein:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">Mein Server</name>
  <service>
   <type>_afpovertcp._tcp</type>
   <port>548</port>
  </service>
  <service>
   <type>_device-info._tcp</type>
   <port>0</port>
   <txt-record>model=Xserve</txt-record>
  </service>
  <service>
   <type>_adisk._tcp</type>
   <port>9</port>
   <txt-record>sys=waMA=xx:xx:xx:xx:xx:xx,adVF=0x100</txt-record>
  </service>
</service-group>

Avahi annonciert mit dieser Datei einen Fileserver namens Mein Server. Wichtig ist, dass man die MAC-Adress seiner Netwerkkarte dort einfügt wo im Beispiel xx:xx:xx:xx:xx:xx steht. Im Netz findet man noch weitere Anleitungen, in denen die Volumes mit Hilfe von <txt-record> Tags konfiguriert werden, aber Netatalk 3 bekommt das auch ohne hin.

Zum Schluss brauchen wir noch eine /usr/local/etc/afp.conf damit Netatalk weiß, was es tun soll. Ich schmeiße mal meine (leicht zensierte) afp.conf in die Runde:

;
; Netatalk 3.x configuration file
;

[Global]
; Global server settings
hostname = server
;login message = "Welcome"
 
mimic model = Xserve
zeroconf = yes
uam list = uams_guest.so uams_dhx.so uams_dhx2.so
guest account = nobody 
 
[Time Server]
path = /TimeServer
valid users = roddi
time machine = yes

[Homes]
basedir regex = /usr/home
valid users = roddi

[Server]
path = /server
valid users = roddi

Fertig

So das war es erstmal. Wenn es Anregungen, Korrekturen oder so gibt, immer her damit. Ich hoffe der Artikel ist eine Hilfe für jeden, der es mit FreeBSD mal versuchen möchte. In diesen Sinne: Viel Spaß am Gerät!

— UPDATE —

FreeNAS

Ich wurde von diversen Seite auf FreeNAS hingewiesen worden und Ihr habt recht. Wem das hier zu viel Umstand ist, der sollte ein Blick auf FreeNAS werfen. Da bekommt man FreeBSD – ZFS – Netatalk fertig verpackt mit Webconfigurationsoberfläche auf einem USB-Stick.

NAS4Free

Außerdem kam noch der Hinweis auf NAS4Free rein. Dazu kann ich aber nichts sagen.

iOS-Entwicklung für Quereinsteiger

Eine schöne Augustwoche lang saß ich mit Timo Hetzel in dessen Studio und habe einen Workshop zum Thema iOS für Quereinsteiger erbrütet. Jetzt ist er endlich im Kasten und kann in der Undsoversity bestaunt werden.

Ich empfinde den Workshop als recht vollständig und deshalb ist er auch fast 8 Stunden lang geworden, quasi: „einmal alles to go“. Was tatsächlich dabei ist beschreibt Timo aber viel besser als ich es könnte.

Auf jeden Fall sind wir beide stolz wie Bolle und ich kann den Workshop guten Gewissens jedem ans Herz legen, der „immer schon mal was für iOS machen wollte, aber …“

undsoversity-ios1-banner-blog

Diskussion gerne hier in den Kommentaren.

[Update] Fusion Drive – some conjectures

so Apple introduced Fusion Drive along with their new Macs yesterday. How does it work? A question that pestered me since. Fortunately Apple published a support document that leaks a few infos. The most interesting piece of information is revealed by this image:

In the lower left hand corner it says „Type: Logical Volume Group“. This is Core Storage for sure, the technology that Apple uses for the Vile Fault 2 full disk encryption. When you have FV 2 enabled and enter the command diskutil CS list in the Terminal, you can see Core Storage at work:

In my example a Logical Volume Group (426BC…) consists of one drive (or rather partition, in this case disk0s2) and publishes a Logical Volume Family (the encryption layer 9E2650…) which contains a logical volume (disk1 C5779B…)

This is an elaborate way of plugging an encryption layer between a physical volume (disk0s2) and the filesystem which thinks it resides on disk1. disk1 is not a physical device but the file system doesn’t know.

So assume you would build a Logical Volume Group consisting of two physical drives, how would the file system know? Well if you look at other logical volume managers it usually doesn’t and if you are following The Pure Teachings of LVMs (TM) it is not supposed to know anyway.

Well, but Phil Schiller said yesterday Fusion Drive would keep the hot files on the SSD while pushing the cold files to the HDD moving them back as soon as you would use them more often again. This means either HFS+ must have a way to know which virtual disk blocks end up on the SSD or Core Storage must have an intimate knowledge of HFS+ and map the blocks accordingly.

I think the second possibility can be ruled out on the basis of not being viable. Core Storage would reimplement half of HFS+. No way.

But Core Storage marking certain blocks faster than other blocks would make sense. It would break the layering only a little bit, it is easy to implement and HFS+ already does some moving of files to faster parts of a disk together with auto-defragmenting for a long time anyway.

So my conjecture is: Fusion Drive is a special Logical Volume Group that publishes which blocks are fast and HFS+ maps the files accordingly on those blocks.

[Update]: I was a bit surprised how accurate my predictions were but on the other hand nothing else made sense. Here a link to jollyjinx‘ tumbler. He did a good job reversing this from a user persective.

[Update] (Mountain) Lion Keychain erstellt kaputte Passworte

Ich habe ’ne Weile Zeit verbracht, ein merkwürdiges Phänomen mit Passworten bei Webmail und Mailclients zu debuggen, bis ich draufgekommen bin was schief läuft:

Der Mountain Lion Keychain Passwortgenerator ist kaputt für deutsche Passworte.

Was schief läuft sieht man hier:

Eigentlich müsste das Passwort „pöbel1{highstem“ heißen, aber statt einem Ö werden zwei nicht angezeigte Zeichen erstellt! Wie sagt man so schön: Scheiß Encoding!

P.S.: ein Bug ist bei Apple eingereicht unter der Bug ID# 11955599.

[Update] Ich dachte das wäre ein neues Problem von Mountain Lion (OS X 10.8) aber Lion (10.7) hat das gleiche Problem. Wenn ich mal Zeit habe oder eh gerade Snow Leopard booten muss, werde ich es auch da testen, aber ich bin ja ausgesprochen pessimistisch.