Raspberry PI und FreeBSD Basissetup
FreeBSD
FreeBSD ist ein UNIX® ähnliches Betriebssystem, das auf 4.4BSD-Lite basiert. Es ist anders als Linux, das ja eigentlich nur der Kernel ist, ein komplettes Betriebssystem. Ursprünglich war BSD (Berkeley Software Distribution) als Erweiterung des von AT&T entwickelten Betriebssystems UNIX® gedacht. Verschiedene Open-Source Projekte basieren auf dieser als 4.4BSD-Lite bekannten Quelltextausgabe. In dieser Softwareausgabe sind auch Quelltexte anderer Open-Source Projekte enthalten, insbesonders jene des GNU-Projekts. Das Komplette Betriebssystem umfasst:
- Den BSD-Kernel, der sich um Prozess-Scheduling, die Unterstützung mehrerer Prozessoren (SMP – Symmetric Mulit-Processing), Speicherverwaltung, Datenträgerverwaltung, Gerätetreiber und einiges mehr kümmert. Im Gegensatz zu Linux gibt es verschiedene BSD-Kernels mit unterschiedlichen Fähigkeiten.
- Die C-Bibliothek, die die grundlegende API (Application Programming Interface) für Programme ist. Die C-Bibliothek basiert auf Berkeley-Code und nicht auf Quelltexten des GNU Projekts
- Nützliche Programme wie z.B. Shells, Programme für Dateioperationen, Compiler und Linker. Einige dieser Programme stammen noch aus dem GNU-Projekt, andere hingegen nicht.
- Andere nützliche Programme und Services, wie z.B. Sendmail, SSH, FTP und einige mehr.
- Eine Ports-Kollektion, die Programme und Bibliotheken enthält und die über 30.000 Ports enthält.
FreeBSD eignet sich, da keine Desktopumgebung vorinstalliert ist, besonders als Server. Eine Desktopumgebung lässt sich aber nachinstallieren, wenn das erwünscht ist.
Für das Raspberry PI gibt es ein fertiges FreeBSD 13.1 Image für das RaspberryPI 3 bzw. 4, das direkt auf der FreeBSD Webseite zum Herunterladen angeboten wird. Wenn man ein Raspberry PI 4 benutzt, sollte man mindestens Version 13.1 vwerwenden, da 13.0 noch einen älteren u-boot Bootloader verwendet, und man da noch einige Schritte von Hand machen muss, um das Raspberry PI 4 zum Hochfahren zu bewegen.
Installieren des Images
Hat man das Image heruntergeladen, muss es noch auf eine SD-Karte geschrieben werden. Ich empfehle eine mit mindestens 8 GB Speicher zu verwenden, da diese noch genug Platz für weitere Programme hat. Zu groß sollte sie auch nicht sein, da hierbei ein Backup lange dauern kann und es, je nach SD-Karten Größe, einiges Platz auf dem Backup-Medium einnimmt. Hat man die passende SD-Karte gewählt, muss man noch das Image auf selbige 'brennen'.
Unter Unix geht das ganz einfach mit der Kommandozeile. ${device} steht für das zu beschreibende Gerät. (z. B. /dev/sdc)
root# xzcat --keep FreeBSD-13.1-RELEASE-arm64-aarch64-RPI.img.xz | dd of=${device} bs=4M
Unter Windows muss man ein Programm zum Beschreiben des Images herunterladen. Mit Win32 Disk Imager ist es möglich Image-Dateien auf eine SD-Karte zu brennen. Das FreeBSD-Image muss vor dem Brennen noch entpackt werden. Das geht mit sowohl 7-Zip als auch mit WinRAR.
Ist das Beschreiben der SD-Karte erledigt, kann sie bereits ins Raspberry PI gegeben werden und man kann schon loslegen, den Einplatinencomputer für seine Zwecke zu konfigurieren. Wenn man keine Tastatur und Bildschirm ans Raspberry PI anschließen will, kann man sich auch per SSH (Secure SHell) am Gerät anmelden. Da ein DHCP-Client standardmäßig aktiviert ist, findet man auch im eigenen Netzwerk das Gerät. Eine Voraussetzung dafür ist, dass man bereits einen DHCP-Server (z. B. im Router) betreibt. Hat man das Gerät im eigenen Netzwerk gefunden, z. B. in den Netzwerkeinstellungen des Routers, kann man sich mit dem Standardnutzer freebsd mit dem Passwort freebsd anmelden. Das root-Passwort ist root.
user@localhost$ ssh freebsd@${ip_adresse}
Um sich unter ssh zum Systemadministrator zu machen, gibt man in der Kommandozeile su ein.
freebsd@generic$ su
Wenn man Hilfe zu einem Befehl benötigt, erhält man diese mit dem Befehl man.
freebsd@generic$ man man
Basiskonfiguration
Bevor man loslegt, einen eigenen Server aufzusetzen, sollte man einige Grundkonfigurationen vornehmen, da einige Sicherheitslücken zu Beginn geschlossen werden sollten. Einige Grundeinstellungen lassen sich mit dem Dialog-basierten Tool bsdconfig erledigen. Dieses Programm trägt die benötigten Einträge in die entsprechenden Dateien ein. Das System wird vor allem über die Datei /etc/rc.conf gesteuert. Hier werden die Netzwerkeinstellungen und die Services, die es beim Hochfahren zu starten gilt, eingetragen. Diese Datei kann auch von Hand editiert werden.
man rc.conf gibt Informationen über diese Konfigurationsdatei aus.
Wenn man eine Bourne kompatible Shell gegenüber der csh bevorzugt kann man mit dem Befehl pw die Login Shell des jeweiligen Benutzers ändern.
root@generic# pw usermod root -s /bin/sh
Installieren eines Editors
Für diejenigen, die mit vi oder ed nicht gewohnt sind, empfiehlt es sich einen Editor wie nano zu installieren. Wenn man mit dem Raspberry PI bereits Internet Zugang hat kann man einen Editor wie folgt installieren.
root@rpi# pkg install -y nano
Um den installierten Editor als Standardeditor zu nutzen, editiert man die ~/.profile und ändert die Variable EDITOR.
EDITOR=nano; export EDITOR
Um den Editor gleich zu aktivieren, muss man die Datei ~/.profile erneut laden.
user@rpi$ . ~/.profile
Sollte man auch für root den Standardeditor ändern wollen, sind die oben genannten Schritte auch unter den Nutzer root auszuführen.
root Passwort ändern und Benutzer anlegen
Das root-Passwort gehört unbedingt geändert, da ansonsten jeder in der Lage ist, über das Standardpasswort Administrator Rechte zu erlangen. Man kann sich zwar nicht über Secure Shell als root anmelden, man hat aber dennoch Zugriff auf den Benutzer freebsd mit dem Standardpassword freebsd. Selbiger befindet sich noch in der Gruppe wheel, was einem ermöglicht su auszuführen. Das root-Passwort kann man mit bsdconfig geändert werden oder in der Shell.
root@generic# passwd
FreeBSD beginnt mit der Vergabe der User-IDs bei 1001, die meisten Linux-Distributionen allerdings bei 1000. Man sollte sich seinen Standardnutzer mit der UID 1000 anlegen und ihn zumindest in die Gruppe wheel aufnehmen. Des Weiteren empfiehlt es sich, die Nutzer-IDs von seiner Linux-Distribution, sofern man eine hat, im FreeBSD-System zu übernehmen. Sollte man ein NFS (Network File System) am Laufen haben, macht es sich bezahlt, da hier die Zugriffsrechte über die Nutzer- und Gruppen-IDs vergeben werden.
Die Nutzer können sowohl mit dem Tool bsdconfig angelegt werden als auch in der Shell. In der Shell geht es sowohl mit pw als auch mit dem Befehl adduser.
Passwortlose Anmeldung mit SSH
Wenn man einen neuen Nutzer angelegt hat, kann man sich als Nutzer freebsd abmelden. Das geht mit dem Befehl exit. Und sich als neuer User anmelden. Um sich ohne Passwort anmelden zu können, kann man sich ein Secure-Shell Schlüsselpaar mit ssh-keygen erstellen, was auch unter Windows gelingt. Danach muss der öffentliche Schlüssel der Datei ~/.ssh/authorized_keys im Zielsystem angehängt werden. Unter Unix/Linux geht das mit dem Befehl ssh-copy-id.
user@connect-from$ ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
Unter Windows hat man entweder MSys2 oder Cygwin installiert oder man geht einen längeren Weg. Die zuvor genannten Programme bringen eine Unix/Linux ähnliche Umgebung nach Windows. Der längere Weg sieht wie folgt aus: Kopieren der id_rsa.pub Dateien in den Benutzerordner des Zielsystems und selbige danach an die authorized_keys-Datei anhängen.
c:\Users\self> sftp user@host sftp> put .ssh/id_rsa.pub self.sshkey sftp> exit c:\Users\self> ssh user@host user@generic$ cat self.sshkey >> ~/.ssh/authorized_keys
Ist das erledigt, kann man sich ohne Passwortauthentifizierung am Raspberry PI mit Secure-Shell anmelden.
Sollte man sich einen anderen Nutzer angelegt haben, kann man den freebsd-Account löschen. Das geht mit pw.
root@generic# pw userdel freebsd
System einrichten
Die Basiskonfiguration des Systems lässt sich am einfachsten mit dem Tool bsdconfig einrichten.
Zeitzone (Timezone)
Die Zeitzoneneinstellung bestimmt, in welcher Zeitzone man sich befindet und damit die Systemzeit in der lokalen Zeit angezeigt wird. Für uns ist das wahrscheinlich Europe -@gt; Germany oder Europe -> Austria.
Network Management
In den Netzwerkeinstellungen gilt es zuerst den Hostnamen zu bestimmen. Die Einstellung hierfür befindet sich in bsdconfig unter Network Management -> Hostname/Domain. Man kann den Namen mit vollständiger Domäne angeben. Man sollte aber keine Domäne erfinden, sondern sich eine eigene Domäne registrieren lassen, wenn man eine braucht. Eine eigene Domain kostet normalerweise keine 20 € im Jahr. Bei den meisten Webhosting angeboten ist sogar eine Domain inkludiert. Wenn man seinen eigenen DNS-Server am laufen hat und eine bestehende Domäne überschreibt, kann man nicht mehr auf die Services dieser Domäne im Internet zugreifen. Hier ist also etwas Vorsicht geboten. Ich nutze hierfür aber meine eigene Domain, da ich hier auch die DNS-Daten des Internet-DNS-Servers übernehme.
Network Devices
Hier gilt es, die IP-Adresse des Rechners zu bestimmen. Das Netzwerkgerät heißt am Raspberry PI 3 ue0 und am Raspberry PI 4 genet0. Man sollte im Router oder am DHCP-Server nachsehen, in welchen Bereich die IP-Adressen vergeben werden, um Netzwerkkollisionen zu vermeiden. Man kann das Gerät auch auf DHCP stellen, um eine automatisch vergebene IP-Adresse zu erhalten. Will man das Raspberry PI aber als Server betreiben, empfiehlt es sich eine statische IP-Adresse zu wählen (z. B. 192.168.1.254). Die Adressen x.x.x.0 sind für das Netzwerk selbst und die Adressen x.x.x.255 sind als Broadcastadressen reserviert und sollten möglichst nicht genommen werden. Man sollte auch, wenn man nicht weiß, was man tut, im zugewiesenen Adressbereich des DHCP-Servers bleiben. Wenn z. B. bereits zugewiesene die Adresse mit 192.168.1. beginnt, sollte man auch in diesem Bereich bleiben.
Die Netzmaske, die normalerweise 255.255.255.0 ist, sollte man auch so belassen, damit man im selben Adressraum des eigentlichen Netzwerks bleibt.
Wireless Networks
Diese Einstellung kann man getrost auslassen, da dar Drahtlos-Netzwerkadapter des Raspberry PI nicht unterstützt wird.
Default Router/Gateway
Hier gibt man die IP-Adresse des Internet-Routers ein. Die Adresse des Routers steht normalerweise auf der Unter- bzw. der Rückseite des Routers. Wenn man eine falsche Adresse angibt, kann man sich später nicht mit dem Internet verbinden.
Startup
Unter Startup -> Toggle Startup Services sollte man growfs deaktivieren, da dieser Dienst nur einmal zum Vergrößern der Hauptpartition auf die Größe der gesamten SD-Karte benötigt wird und das Raspberry PI ansonsten bei jedem Neustart versucht, diese Partition zu vergrößern. Das wurde aber bereits beim ersten Starten erledigt. Des weiteren sollten die Services ntpdate, zum synchronisieren der Uhr mit der Atomuhr und powerd, um dem Raspberry PI es zu ermöglichen den Prozessortakt auf 1200 MHz (RPI3) bzw. 1500 MHz (RPI4) anstelle der ansonsten nur 600 MHz erhöhen zu können.
Da da Raspberry PI über keine Echtzeituhr verfügt sollte man ntpdate via cron-job mindestens ein mal pro Tag neu starten. Dazu aber später mehr.
Dateisystemeinstellungen
Die Dateisysteme unter Unix ähnlichen Betriebssystemen werden nicht wie unter Windows in Laufwerke aufgeteilt, sondern sie werden direkt ins Dateisystem, d.h. ein Verzeichnis, eingebunden. Angefangen von der root-Dateisystem (/) können auch andere Verzeichnisse auf eine eigene Partition verweisen. Zum Beispiel kann /home auf einer eigenen Partition liegen. Die Deteisystemtabelle befindet sich in der Datei /etc/fstab. Das Layout dieser Tabelle ist, in einer Reihe mit Leerzeichen getrennt:
- Partition/Ursprung
- Einbindepunkt (Mountpint)
- Dateisystemformat
- Optionen
- Dump-Frequenz (in Tagen)
- Pass Nummer für paralellen fsck
Da die Option noatime standardmäßig nicht für das root-Dateisystem gesetzt ist, und das Raspberry PI somit jeden Dateizugriff mit protokolliert, was die Lebenserwartung der SD-Karte, auf der das sich Betriebssystem befindet, stark verkürzt, werden wir das ändern. Als root führen wir nano /etc/fstab aus und editieren die Datei. In der Zeile mit dem Mountpoint / fügen wir die Option noatime hinzu. Die Zeile sollte danach wie folgt aussehen:
/dev/ufs/rootfs / ufs rw,noatime 1 1
Swap Datei erstellen
Wenn man ein Raspberry PI als Server einsetzen möchte, kann das Erstellen einer Auslagerungsdatei sinnvoll sein, denn wenn ein Prozess zu viel Arbeitsspeicher verbraucht, könnte dieser abrupt beendet werden, was bei einem Server nicht gerade gut ist. Da das Raspberry PI 3 nur über 1 GB RAM verfügt, kann das durchaus Sinn machen, wenn ein Prozess kurzzeitig mehr Arbeitsspeicher verbraucht als er sollte. Wenn man eine Auslagerungsdatei erstellen möchte, muss man zuerst die Datei erzeugen (im Beispiel eine 2 GB große Datei) und dann der Datei die richtigen Zugriffsrechte zuweisen.
root@rpi# dd if=/dev/zero of=/var/swap.bin bs=4M count=512 root@rpi# chmod 0600 /var/swap.bin root@rpi# sysrc swapfile=/var/swap.bin
Nach dem Neustart des Systems wird die Swap-Datei eingebunden.
Man kann aber auch die Swap-Datei ohne Neustart aktivieren:
root@rpi# mdconfig -a -t vnode -f /var/swap.bin -u 99 root@rpi# swapon /dev/md99
Um die Eingebundenen Swap-Bereiche anzuzeigen gibt man als root swapinfo -k im Terminal ein.
System neu starten
Die Basiseinstellungen sind nun abgeschlossen und das System kann neu gestartet werden, um sicherzustellen, dass alles funktioniert wie geplant und das System auch nach einem Stromausfall wieder hochfährt.
root@rpi# reboot
Cronjobs
Cronjobs sind Programme und Scripte, die periodisch ausgeführt werden. Einen Cronjob erstellt man, indem man crontab -e als jeweiliger Benutzer ausführt und anschließend die dabei geöffnete Datei editiert. Das Format eines Cronjobs ist:
- Minute (0-59) oder * für jede Minute
- Stunde (0-23) oder * für jede Stunde
- Tag des Monats (1-31) oder * für jeden Tag
- Monat (1-12) oder * für jeden Monat
- Wochentag (0-7), wobei 0 und 7 Sonntag ist oder *
man 5 crontab gibt eine genaue Auskunft über das verwendete Format.
Um Cronjobs zu erstellen, die den Service ntpdate um jeden Tag um 11:00 und 23:00, nach dem Verstreichen einer zufälligen Zeit zwischen 0 Sekunden und einer Stunde, neu starten, um die Systemzeit zu aktualisieren fügt man folgende Zeile in die, als root durch crontab -e geöffnete Datei folgende Zeilen ein:
0 11,23 * * * sleep $(( RANDOM % 3600 ))s && service ntpdate restart
Softwareinstallation
Unter FreeBSD ist die Software von Drittanbietern in Ports gegliedert. Die Binärpakete unter FreeBSD sind so erstellt, dass sie so wenig Abhängigkeiten wie möglich haben. Wenn man jedoch eine Quelltextinstallation vorzieht, ist dies natürlich auch möglich. Die Ports-Kollektion lässt sich mit portsnap herunterladen und installieren. Die Ports werden in das Verzeichnis /usr/ports installiert.
root@rpi# portsnap fetch install
Mit portsnap lässt sich auch die Ports-Kollektion updaten.
root@rpi# portsnap fetch update
Um einen Port zu bauen, wechselt man in das Verzeichnis des gewählten Ports und führt make aus.
root@rpi# cd /usr/ports/security/sudo root@rpi# make config-recursive root@rpi# make install
Das Erstellen der Ports aus den Quellen kann einige Zeit in Anspruch nehmen und es verringert die Lebensdauer der SD-Karte maßgeblich, da viele Schreibvorgänge zum Erstellen erforderlich sind. Was nicht heißen soll, dass es nicht möglich ist, sein System aus den Quellen zu erstellen.
Wer Binärpakete bevorzugt, kann mit pkg seine Programme installieren und aktuell halten.man pkg gibt Auskunft über die genaue Benutzung des Paketmanagers.
pkg install paketname ... installiert die genannten Pakete.
pkg search paketname sucht nach dem gewünschten Paket.
pkg update macht ein Update des Paket-Repositorys.
pkg upgrade macht ein Update der installierten Pakete.
sudo/doas
Wer Linux nutzt, kommt früher oder später mit dem Programm sudo in Kontakt. Mit sudo lassen sich Programme als ein anderer Nutzer ausführen. Das ist praktisch, wenn man nicht immer mit su zum Nutzer root wechseln will oder muß. doas ist eine einfache sudo-Alternative. Eine falsche Konfiguration dieser Programme kann eine erhebliche Sicherheitslücke sein!
sudo
Um sudo wie unter Linux gewohnt nutzen zu können, muss man die sudo zuerst installieren und danach Konfigurieren. Um sudo in seinen gewohnten Editor zu editieren, sollte man ihn zuerst zuvor beschrieben in der Datei .profile einstellen.
root@rpi# pkg install -y sudo root@rpi# visudo
In der jetzt geöffneten Datei, die gut dokumentiert ist, fügt man folgende Zeile hinzu:
%wheel ALL=(ALL:ALL) ALL
Somit können alle, die sich in der Gruppe wheel befinden, sudo, wie unter Linux gewohnt, benutzen.
doas
doas ist wie zuvor schon erwähnt eine sudo-Alternative. Um doas nutzen zu können, muss man zuerst die Datei /usr/local/doas.conf anlegen. Wenn man den folgenden Zeile in die Datei einfügt, kann man doas wie sudo nutzen und erlaubt das wechseln der Gruppe wheel auf alle Nutzer.
permit :wheel
Um einen Nutzer ohne Passwortabfrage Programme mit erhöhten Berechtigungen mit doas ausführen zu lassen, gibt fügt man folgende Zeile in die /usr/local/doas.conf ein:
permit nopass username
Eine genaue Anleitung über diese Datei erhält man mit man doas.conf.
