Mein Fileserver wird immer langsamer beim Schreiben. Das kann mehrere Gründe haben. Zum einen kann es daran liegen, dass die Festplatte ziemlich voll ist. Zum anderen kann es sein, dass die Platte langsam ihren Geist aufgibt. Da es eine externe USB-Festplatte ist, komme ich nicht an die S.M.A.R.T-Zähler heran. Alles gute Gründe wieder einmal ein neues Konzept auszuprobieren.
Problemanalyse
Mein aktueller Fileserver läuft in einer virtuellen Maschine. Die Idee war, alle Server in meinem Netz auf einem sparsamen Rechner zu konsolidieren. Das bringt nebenbei auch noch Vorteile bei der Konzeption der unterbrechungsfreien Stromversorgung (USV). Meine USV signalisiert zur Zeit dem Host einen Spannungsausfall und puffert, bis der Host alle Gastsysteme heruntergefahren hat und sich selbst herunterfährt. Die Performanz dieser Lösung ist ausreichend für meine Zwecke. Was mich allerdings deutlich stört ist, dass der Hostrechner nur Platz für eine interne 2,5-Zoll-Platte hat. Der Fileserver braucht aber aktuell deutlich mehr Speicher. USB-Festplatten sterben aber leider meist ohne Vorankündigung.
Ziele der Restrukturierung meines Netzwerks sind:
- Energieeffizienz - der Server wird nicht durchgängig benötigt
- Verbessertes Monitoring, um Ausfälle zu vermeiden
- Erweiterung des Speicherplatzes
Hardwareauswahl
Als Hardware-Plattform habe ich mich für einen ODROID-HC2 entschieden. Das Rechnerchen hat einen ARM-Octacore mit zwei Gigabyte RAM, Gigabit-Ethernet und einer SATA-Schnittstelle. Laut Hardkernel kann man um 100 MB/s bei Samba-Shares erreichen. Mit einer Seagate Ironwolf 14TB sollte das eine ordentlich flotten Fileserver geben.
Betriebssystemauswahl
Hardkernel baut ein eigenes Ubuntu-basiertes Image für ihre XU4-Abkömmlinge. Dieses Image hat den Vorteil, dass es vom Hersteller selbst zusammengestellt wurde. Treiber sollten deshalb ordentlich passen. Allerdings hat das Unternehmen noch recht wenige Mitarbeiter. Die Qualität der Images hat mich in der Vergangenheit nicht immer überzeugt. Der Betrieb war immer etwas hakelig.
Es gibt noch einige Images von Fremdanbietern. Am meisten überzeugt mich Armbian. Mit Armbian habe ich auf einem Cubietruck gute Erfahrungen gemacht. Da es auf vielen verschiedenen ARM-basierten Rechnern gebaut wird, sollte es eine breite Benutzerbasis haben und Fehler deshalb schneller erkannt und beseitigt werden.
Ich plane das Betriebssystem auf der MicroSD-Karte installieren und die Daten auf der SATA-Platte zu lagern. Sowohl das Armbian- als auch das Hardkernel-Image basieren auf Ubuntu 18.04 LTS. Nimm man alles zusammen, sollte ein späterer Austausch des Basissystems leicht möglich sein.
Installation des Basissystems
Die Installation beginnt mit dem Herunterladen des Images. Zur Sicherheit sollte man noch die MD5-Prüfsumme vergleichen, damit man sicher ist, dass das Image beim Laden nicht korrumpiert wurde. Das Auspacken des Images von Hardkernel ist etwas ungewohnt, da es XZ-komprimiert ist. Ein unxz <image.xz>
löst aber das Problem, wenn man unxz
auf seine Rechner installiert hat. Hardkernel beschreibt aber die ganze Installation gut in leicht verständlichem Englisch für aller Standard-Betriebssysteme. Danach kopiert man das Image mit dem Imagewriter seines Vetrauens (oder wie Hardkernel es vorschlägt). Ich vertraue auf Disks unter Gnome.
Jetzt hat man eine MicroSD-Karte mit zwei Partitionen (boot und rootfs) und bei meiner 16 GB MicroSD 13 GB freien Speicher. Die MicroSD-Karte sollte man jetzt auswerfen (unmounten) und in den ODROID-HC2 stecken. Jetzt gibt es zwei Alternativen. Entweder schließt man den USB-nach-Seriell-Wandler an den ODROID an und beobachtet den Boot-Prozess in einem Terminalprogramm (zum Beispiel mit screen /dev/ttyUSB0 115200
) oder probiert es im Blindflug. Ich habe mich erst einmal für den Blindflug entschieden. Wenn das schiefgeht, kann ich immer noch den USB-nach-Seriell-Wandler suchen. Wenn jemand nach dieser Anleitung einen eigenen Versuch starten will, hat er vielleicht selbst keinen Wandler. Ich kann aber einen USB-nach-Seriell-Wandler nur empfehlen.
Blindflug
Nach dem Einschalten der Stromversorgung leuchtet die blaue LED. Nach ein paar Sekunden wacht die Festplatte auf und klappert kurz vor sich hin, bevor sie wieder herunterfährt. Die blaue LED geht wieder aus. Bei diesem ersten Start wird das Dateisystem auf die komplette MicroSD-Karte erweitert (die 13 GB freier Speicher von oben). Laut Hardkernel soll man ein paar Minuten warten, bis die LED ausgeht und dann das Rechnerchen neu starten. Ob es ein paar Minuten in meinem Fall waren weiß ich nicht, bis ich aber hier diesen Text geschrieben hatte, war die LED aber längst wieder aus.
Ich trenne den ODROID-HC2 von der Stromversorgung und stecke ihn nach einer kurzen Pause wieder ein. Das Rechnerchen fährt wohl wieder hoch. Die Festplatte läuft an und die blaue LED blinkt munter vor sich hin. (Aus irgendeinem merkwürdigen Grund sind die Leute bei Hardkernel der Meinung, dass ein nervendes blaues Blinken ein gutes Mittel ist, um zu zeigen, dass das System lebt.)
Ich verbinde mich mit ssh root@odroid
und bekomme einen Fingerprint. Es lebt tatsächlich! Nach einem beherzten ‘yes’ zur Bestätigung des Fingerprints bekomme ich einen ‘broken pipe’-Fehler. ssh odroid@odroid
führt zur Passwortabfrage. Sack und Asche! Das Passwort ‘odroid’ funktioniert nicht! Nachdem ich in der Anleitung bei Hardkernel nur die root-Daten finden kann, probiere ich einfach noch einmal ssh root@odroid
mit ‘odroid’ als Passwort kann ich mich anmelden. Jetzt aber erst einmal das Root-Passwort ändern.
Leichte Verbesserung der Systemsicherheit
Ein Root-Login über Secure-Shell gefällt mir gar nicht. Also lege ich erst einmal einen Standardbenutzer mit sudo
-Zugriff an.
adduser admin
usermod -aG sudo admin
Jetzt als root abmelden und wieder mit ssh admin@odroid
anmelden. Funktioniert, also können wir mit sudo vi /etc/ssh/sshd_config
‘PermitRootLogin no’ setzen. Wer vi nicht mag, darf natürlich auch nano
oder so als Editor benutzen. Nach einem Neustart des sshd (systemctl sshd restart
) kann man sich nicht mehr mit ssh root@odroid
anmelden.
System aktualisieren
sudo apt update
sudo apt upgrade
sudo apt dist-upgrade
sudo reboot
Netzwerkeinstellungen anpassen
Ein Server sollte eine feste IP-Adresse bekommen. Mein alter Fileserver hatte zwar keine feste IP-Adresse, wie ich eben festgestellt habe. Da die Zugriffe normalerweise über DNS aufgelöst werden funktioniert das normalerweise auch. Dieses Mal passe ich aber auf. Mein Konzept ist, dass der Server seinen Namen bekommt, der Name im DHCP-Server mit einer festen IP-Adresse verknüpft wird und bei jedem Booten deshalb die gleiche feste Adresse bekommt. Der Nachteil bei diesem Konzept ist, dass der DHCP-Server vor dem Fileserver laufen sollte. Für mein Heimnetzwerk ist mir das gut genug.
Den Rechnernamen setzt man in Ubuntu am besten mit hostnamectl
.
sudo hostnamectl set-hostname fileserver
sudo hostnamectl set-chassis server
Den zweiten Teil halte ich für eine nette Spielerei. Laut Dokumentation wird von einigen graphischen Anwendung der Rechner dann als Server visualisiert.
Festplatte einrichten
Da das Basissystem auf der MicroSD-Karte liegt, muss noch die Festplatte partitioniert und formatiert werden. Zum Partitionieren verwende ich GNU Parted.
sudo apt install parted
sudo parted -l
Da meine Festplatte /dev/sda
ist:
sudo parted /dev/sda mklabel gpt
sudo parted -a optimal /dev/sda mkpart primary ext4 0% 100%
Die Partition wird mit dem folgenden Kommando formatiert.
sudo mkfs.ext4 -L data /dev/sda1
Einbinden der Partition
Die neu angelegte Partition auf der Festplatte soll bei jedem Neustart automatisch eingebunden werden, deshalb fügen wir mit dem folgenden Kommando einen passenden Eintrag zur /etc/fstab
hinzu und legen ein passendes Verzeichnis an.
echo "LABEL=data /media/data ext4 defaults 0 2" | sudo tee -a /etc/fstab
sudo mkdir /media/data
Jetzt können wir mit sudo mount /media/data
die Partition im laufenden Betrieb einbinden und sie wird beim nächsten Neustart automatisch eingebunden.
Überwachen der Festplatte
Die Geräusche, die die Festplatte abgibt, klingen dabei nicht gut. Hoffentlich bleibt die teure Platte ganz. Ich bin mir nämlich nicht sicher, ob die Stromversorgung des ODROID-HC2 ausreicht. Da sollte man doch die S.M.A.R.T.-Werte der Festplatte beobachten.
sudo apt install smartmontools
Ein smartctl -H /dev/sda
führt leider zu einem Fehler. Mist! Ich habe ganz vergessen, dass der ODROID-HC2 den SATA-Port mit einem eingebauten USB-Adapter realisiert. Zum Glück scheint smartctl
den Adapter zu kennen. Gibt man ihn mit -d sat
an, werden die Werte angezeigt.
Firmware des USB-SATA-Adapters aktualisieren
Obwohl ich keinen Spin-Down eingestellt habe, fährt die Festplatte nach wenigen Minuten herunter und geht in den Standby. Die Dauer ist mir zu kurz. Im ODROID Forum ist dieses Verhalten beschrieben. Es liegt wohl an der Firmware des eingebauten Adapters. Es gibt aber glücklicherweise eine Anleitung, wie man die Firmware aktualisiert.
wget https://wiki.odroid.com/_media/odroid-xu4/software/jms578fwupdater.tgz
tar zxvf jms578fwupdater.tgz
cd JMS578FwUpdater/
./JMS578FwUpdate -v
Der letzte Befehl gibt die vertrauenserweckende Versionsmeldung aus:
JMicron Firmware Update Tool v0.0.0.2
Copyright (C) 2018 JMicron Corp.
Die Version der Firmware war bei meinem ODROID-HC2.
sudo ./JMS578FwUpdate -d /dev/sda -v
Bridge Firmware Version: v173.1.0.1
Die Anleitung im ODROID Wiki gibt mehrere Beispiele, wie man die Firmware aktualisieren kann. Mir scheint die Variante “Example 4 - Update device with setting spin-down timer” als sinnvoll. Das hat den Vorteil, dass ich nicht mit hdparm herumfummeln muss. Der Nachteil ist, dass ich beim Spin-Down normalerweise zu hdparm greifen würde. Bloß nicht vergessen…
Ein Spin-Down nach 30 Minuten erscheint mir sinnvoll. Also frisch ans Werk.
sudo ./JMS578FwUpdate -d /dev/sda -f ./JMS578-Hardkenel-Release-v173.01.00.02-20190306.bin -b ./backup-original.bin -t 30
sudo halt -p
Update Firmware file name: ./JMS578-Hardkenel-Release-v173.01.00.02-20190306.bin
Backup Firmware file name: ./backup-original.bin
Auto spin-down timer: 30 min.
Backup the ROM code sucessfully.
Programming & Compare Success!!
Nachdem die blaue LED aus ist, muss man den ODROID-HC2 von der Stromversorgung trennen, damit er komplett neu startet und die neue Firmware des Adapters verwendet. Schauen wir noch schnell die Version nach.
cd JMS578FwUpdater/
sudo ./JMS578FwUpdate -d /dev/sda -v
Bridge Firmware Version: v173.1.0.2
Die Aktualisierung scheint erfolgreich gewesen zu sein.
Festplatte korrekt herunterfahren
Der ODROID-HC2 trennt beim Herunterfahren hart die Spannungsversorgung der Festplatte. Das ist höchst wahrscheinlich nicht so gut für die Festplatte. Hardkernel beschreibt dies im ODROID-Wiki-Artikel “Hard Drive Disk Parking Safely”. Es gibt aber eine Gegenmaßnahme, die wohl in Armbian schon eingebaut ist, aber in der Hardkernel-Version von Ubuntu noch fehlt… Dadurch wird die Festplatte beim Herunterfahren des Rechners geparkt.
cat << EOF > shutdown.odroid
#!/bin/bash
exec </dev/null </dev/null 2>/dev/null
export LANG=C LC_ALL=C
# In all cases, we want the media to be in quiescent, clean state.
sync
[ -x /sbin/mdadm ] && /sbin/mdadm --wait-clean --scan
# Function used to park all SATA disks.
function ParkDisks() {
if [ -x /sbin/hdparm ]; then
Wait=0
for Dev in /sys/block/sd* ; do
[ -e $Dev ] && /sbin/hdparm -y /dev/${Dev##*/} && Wait=2
sleep $Wait
echo 1 > /sys/class/block/${Dev##*/}/device/delete
done
sleep $Wait
fi
}
case "$1" in
# reboot|kexec)
# Do not park disks when rebooting or switching kernels.
# ;;
*)
ParkDisks
;;
esac
EOF
sudo install -o root -g root -m 0755 odroid.shutdown /lib/systemd/system-shutdown/odroid.shutdown
Samba installieren
Ursprünglich hatte ich die Idee Samba in einen Docker-Container zu verfrachten. Die fertigen Images passen mir aber nicht. Da ich keine Zeit in die Erstellung eines eigenen Images investieren möchte, verwende ich die native Ubuntu-Version.
sudo apt install samba-common samba libpam-heimdal heimdal-clients winbind libnss-winbind libpam-winbind
Die Heimdal-Pakete werden benötigt, da mein Fileserver in meiner Windows-Domain eingebunden werden soll. Bei der Installation von Heimdal wird schon der Domain-Name abgefragt. Wenn man keine hat, müsste der Rest auch funktionieren, wenn man hier den Standard übernimmt. Natürlich muss man dann die Schritte zum Einfügen des Rechners in die Domain auslassen.
Konfiguration über die Registry
Da ich den Rechner in die Domain einbinden will, wähle ich auch die Konfiguration über die Registry. Die sollte aber auch ohne Domain funktionieren. Vor allen Änderungen halte ich aber noch die Samba-Dienste an.
sudo systemctl stop smbd
sudo systemctl stop nmbd
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.orig
cat << EOF | sudo tee /etc/samba/smb.conf
[global]
config backend = registry
EOF
Die Einträge für die Registry habe ich in der Datei smb.import
vorbereitet:
[global]
workgroup = EXAMPLE
winbind enum users = yes
winbind enum groups = yes
winbind use default domain = yes
winbind refresh tickets = yes
idmap config * : range = 10000 - 19999
inherit acls = yes
store dos attributes = yes
vfs objects = acl_xattr
template shell = /bin/bash
realm = example.net
idmap config EXAMPLE : range = 20000 - 1999999
security = ADS
idmap config EXAMPLE : backend = rid
template homedir = /media/data/users/%ACCOUNTNAME%
logon drive = H:
logon home = \\fileserver.example.net\users\%U
[Example]
path = /media/data/mexample
guest ok = yes
read only = yes
write list = EXAMPLE\user
[users]
path = /media/data/users/
guest ok = no
read only = no
create mask = 700
directory mask = 700
comment = User Directories
browseable = no
[profile]
path = /media/data/profiles/
comment = User Profile
guest ok = no
read only = no
browseable = no
profile acls = yes
[admin-share]
path = /media/data/admin-share/
comment = Admin-Share
guest ok = no
read only = no
browseable = no
Diese Datei wird mit dem folgenden Kommando in die Registry importiert.
sudo net conf import smb.import
Einbinden des Rechners in die Windows-Domain
sudo net ads join -Uadministrator
sudo net ads testjoin
Das letzte Kommando liefert:
Join is OK
Das Rechnerchen sollte in der Domain sein.
Damit die Domain-Benutzer auch Rechte im Dateisystem bekommen können, füge ich in der /etc/nsswitch.conf
an die Einträge passwd und group noch winbind an.
passwd: compat systemd winbind
group: compat systemd winbind
Starten des Samba-Services
Beim nächsten Neustart sollten die Samba-Dienste mit gestartet werden. Man kann sie aber auch mit den folgenden Kommandos starten.
sudo systemctl start smbd
sudo systemctl start nmbd
Fazit
Ich bin mir nicht sicher, ob das Hardkernel-Image die beste Wahl war. Mir gefällt nicht, dass ein Root-Login über Secure Shell als Standard möglich ist. Andere Systeme legen einen Standard-Benutzer an, der sich mit sudo
Administratorprivilegien verschaffen kann. Vermutlich ist bei einem automatischen Update, der Kernel mit einem defekten Kernel ersetzt worden. Jedenfalls stirbt der ODROID mit einer Kernel-Panik. Ich kopiere den originalen Inhalt der Boot-Partition aus dem Installationsabbild zurück auf die Boot-Partition der MicroSD-Karte und der ODROID bootet wieder. Mal sehen wie lange…