Unixery & daemon worship 🔥


It's a Unix system! I know this!

Homserver Schnellanleitung, Teil 2

Ich schreibe mir hier nur ein paar Notizen für die Installation eines Homeservers mit FreeBSD auf. Ohne Anspruch auf Vollständigkeit.

Inhalt:

  • Teil 1: Installation und grundlegende Konfiguration von SSH, E-Mail, Hardware, ZFS, …
  • Teil 2: Fileserver
  • Teil 3: VMs und Jails

Fileserver

ZFS Tuning

Ein paar Infos über ZFS-Tuning finden sich in diesem Tuning-Guide:

ashift      12      4KiB block size
atime       off     Do not update atime on file read
recordsize  64KiB   Smaller record sizes for databases (match the database block size)
recordsize  128Kib  Standard usage (mixture of file sizes)
recordsize  1Mb     Recommended for large files
compression lz4     Set compression to use the lz4 algorithm

ZFS Datasets für Shares erstellen

Für die Datasets kann die Recordsize angepasst werden. Dabei ist 128K die Standardgröße, für Datasets mit großen Dateien bietet sich eine größere Recordsize an. Software, die in festen Datensatzgrößen schreibt (z.B. Datenbanken), profitiert von der Verwendung einer passenden Datensatzgröße, z.B. 16K.

  • Für mittelgroße Dateien (1-50 MiB): 512K
  • Für große Dateien (> 100 MiB): 1M
  • Für Disk-Images von Virtuellen Maschinen: 64K
zfs create -o recordsize=128K -o mountpoint=/mnt/dokumente hellraiser/encrypted/dokumente
zfs create -o recordsize=512K -o mountpoint=/mnt/fotos hellraiser/encrypted/fotos
zfs create -o recordsize=512K -o mountpoint=/mnt/musik hellraiser/encrypted/musik
zfs create -o recordsize=1M -o mountpoint=/mnt/videos hellraiser/encrypted/videos

Daten migrieren

Daten lassen sich mit syncoid sehr einfach von einem Server auf den anderen migrieren. syncoid ist Bestandteil von sanoid:

pkg install sanoid

Auf dem alten Server z.B. ausführen:

syncoid --no-sync-snap --delete-target-snapshots --recvoptions="o recordsize=512K" hellraiser/musik root@newserver:hellraiser/encrypted/musik

Samba

Der Homeserver soll natürlich auch als Fileserver dienen. Dazu wird Samba benutzt:

pkg install samba419
  • Die Samba-Konfigurationsdatei: /usr/local/etc/smb4.conf
  • Alle Samba-Datenbanken liegen in: /var/db/samba4
  • Alle Logs sind in: /var/log/samba4

Eine einfache /usr/local/etc/smb4.conf für den Heimgebrauch erstellen:

[global]
workgroup = WORKGROUP
netbios name = MYSERVER
unix extensions = yes
security = user
encrypt passwords = yes
passdb backend = tdbsam
server signing = mandatory

# Login-Versuche loggen
# log level = 1 auth:3

vfs objects = fruit streams_xattr zfsacl
access based share enum = yes

# DOS attribute stuff
store dos attributes = yes
map hidden = no
map system = no
map archive = no
map readonly = no

# macOS optimization: https://wiki.samba.org/index.php/Configure_Samba_to_Work_Better_with_Mac_OS_X
fruit:metadata = stream
fruit:model = MacSamba
fruit:posix_rename = yes
fruit:veto_appledouble = no
fruit:nfs_aces = no
fruit:wipe_intentionally_left_blank_rfork = yes
fruit:delete_empty_adfiles = yes

[homes]
comment = User %u's Data Share
path = /mnt/homes/%S
browseable = no
valid users = %S
writable = yes
hide unreadable = no

[fotos]
comment = Foto Share
path = /mnt/fotos
writable = yes
hide unreadable = no

[musik]
comment = Musik Share
path = /mnt/musik
writable = yes
hide unreadable = no

[public]
comment = Public Share
path = /mnt/pub
writable = yes
hide unreadable = no

Benutzer erstellen, die Zugriff auf den Samba-Server erhalten sollen:

pw user add -s /usr/sbin/nologin -n usera
pw user add -s /usr/sbin/nologin -n userb
pw user add -s /usr/sbin/nologin -n userc
pw user add -s /usr/sbin/nologin -n userd

Passwörter für Samba erstellen:

smbpasswd -a usera
smbpasswd -a userb
smbpasswd -a userc
smbpasswd -a userd

Samba-Service aktivieren:

sysrc samba_server_enable="YES"
service samba_server start

NFSv4

NFS verwende ich nur, um Ordner mit “öffentlichen” Daten in VMs zu mounten, z.B. die Musiksammlung im Lyrion-Mediaserver. Dazu NFSv4 aktivieren:

sysrc nfs_server_enable="YES"
sysrc nfsv4_server_enable="YES"
sysrc nfsv4_server_only="YES"
sysrc mountd_enable="YES"

Ein ZFS-Dataset readonly freigeben:

zfs set sharenfs=ro hellraiser/encrypted/musik

Und eine /etc/exports erstellen:

# Set nfs sharing in the datasets, e.g. "zfs set sharenfs=ro tank/data"
#
# NFSv4 root filesystem, make sure there are only ZFS datasets mounted below this dir!
V4: /mnt -network 10.0.0.0 -mask 255.255.255.0

Nach dem editieren der /etc/exports muss mountd die Datei neu einlesen: service mountd reload

Backup

Backups lassen sich mit restic erstellen und auf einen externen Server übertragen, z.B. zu einer Hetzner Storagebox:

pkg install restic

Siehe dazu auch das Tool https://github.com/thenktor/restic-dataset-backup