Raspberry Pi OS installieren

Hardware

Auf diesem Gerät soll ein Headless-System im Dauerbetrieb u.a. als Git-Server laufen.

Alles fängt mit dem Herunterladen des Raspberry Pi OS Lite von der Webseite Raspberry Pi - Operating system images an. Das wird dann erstmal entpackt.
Dann folgt das Übertragen auf eine SD-Karte.
Statt "2023-12-11-raspios-bookworm-armhf-lite.img" ist der Name des heruntergeladenen Images einzusetzen, sdX ist das Laufwerk der SD-Karte

$ sudo dd if=2023-12-11-raspios-bookworm-armhf-lite.img of=/dev/sdX bs=16M status=progress
$ sync

Ab hier auf dem RaspPi

Wenn das alles abgeschlossen ist kommt die SD-Karte in den RaspPi. Der muss zunächst noch mit einer Tastatur ausgerüstet und an einen Monitor angeschlossen sein.
Nach dem Einschalten passt er zuerst das Filesystem an die Größe der SD-Karte an und erledigt ein paar weitere Sachen. Dann bootet er neu.

Als nächstes kommt ein Menü zum Einstellen der Tastaturbelegung. Hier wähle ich dreimal "German" aus. Dann werden der Benutzername und das Passwort eingegeben und bestätigt.

Grundsätzliches Einrichten mit raspi-config

Mit diesen Daten meldet man sich schließlich an und kann dann das erste Einrichten vornehmen.

$ sudo raspi-config

Unter "1 System Options" ist eigentlich nur der Punkt "S4 Hostname" nötig. Hier gibt man den gewünschten Rechner-Name ein. Alle anderen "System Options" spielen auf einem so alten RaspPi im headless-Betrieb keine Rolle.

"2 Display Options" kann man ignorieren, das System soll ja headless laufen.

Bei "3 Interface Options" muss man "I2 SSH" einschalten. Das dauert dann ein bisschen. Den "I5 Serial Port" kann amn abschalten. Alle anderen Sachen stehen schon richtig.

Von den "4 Performance Options" lässt man besser die Finger. So wird der RaspPi im Dauerbetrieb im Gehäuse dann nicht übermäßig warm.

Die "5 Localization Options" sollte man schon durchgehen, die Einstellungen machen das spätere Arbeiten bequemer.
Bei "L1 Locale" stellt man die Systemsprache ein. Bei "de_DE.UTF-8 UTF-8" drückt man einmal die Leertaste. Es erscheint ein Stern im Auswahlkästchen. Den Stern bei "en_GB.UTF-8 UTF-8" entfernt man auf die gleiche Weise.
Im nächsten Menü wählt man wieder "de_DE.UTF-8" aus. Danach passiert erstmal eine ganze Weile nichts, im Hintergrund wird die Lokalisierung eingestellt.
"L2 Timezone" stellt man auf "Europe" und "Berlin". Das Keyboard wurde ja schon vorher richtig eingestellt, zumal man es im headless Mode ohnehin nicht braucht.
Schließlich braucht es noch eine Einstellung bei "6 Advanced Options". Mit "AA Network Config" wird "1 dhcpcd" eingestellt. Auch hier dauert die Reaktion etwas Gibts in "bookworm" nicht mehr.

Alle weiteren Optionen kann man so lassen, wie sie sind. Noch einmal neu booten ...

Nun kommt die Kommandozeile

Jetzt holt man sich die aktuelle IP-Adresse des RaspPi :

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 12:34:56:78:9a:bc brd ff:ff:ff:ff:ff:ff
    inet 192.168.___.___/24 brd 192.168.___.255 scope global dynamic noprefixroute eth0
            :
       valid_lft forever preferred_lft forever

Der Rest geht dann über SSH.

Als erstes wird eine feste IP-Adresse eingestellt.

bullseye

Dazu sichert man die Neztwerkkonfigurationsdatei und editiert sie dann. Anschließend muss man nochmals booten und kann sich zukünftig über die feste Adresse mit dem RaspPi verbinden.

$ sudo cp /etc/dhcpcd.conf /etc/dhcpcd.conf_bak
$ sudo nano /etc/dhcpcd.conf
$ sudo shutdown -r now

Im Block "Example static IP configuration" entfernt man die Kommentarzeichen und ändert die Einstellungen den eigenen Wünschen entsprechend :

# Example static IP configuration:
interface eth0
static ip_address=192.168.___.123/24
static ip6_address=12:34:56:78:9a:bc/64
static routers=192.168.___.234
static domain_name_servers=192.168.___.234

bookworm

$ sudo nmcli -p connection show
=====================================
NetworkManager Verbindungsprofile
=====================================
NAME                         UUID                                  TYPE      DEVICE
--------------------------------------------------------------------------------------------------------------------------
Kabelgebundene Verbindung 1  cff92b52-4201-3e94-b1a5-84e444a61a37  ethernet  eth0
lo                           624c6630-0cfe-43fd-8d5c-f0716186a52e  loopback  lo
$ sudo nmcli c mod "Kabelgebundene Verbindung 1" ipv4.addresses 192.168.___.123/24 ipv4.method manual
$ sudo nmcli con mod "Kabelgebundene Verbindung 1" ipv4.gateway 192.168.___.100
$ sudo nmcli con mod
$ ip addr
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b8:27:eb:44:18:a8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.___123/24 brd 192.168.___.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
            :
       valid_lft forever preferred_lft forever
$ sudo nmcli con down "Kabelgebundene Verbindung 1"
Verbindung »Kabelgebundene Verbindung 1« wurde erfolgreich deaktiviert (aktiver D-Bus-Pfad: /org/freedesktop/NetworkManager/ActiveConnection/2)
$ sudo nmcli con up "Kabelgebundene Verbindung 1"
Verbindung wurde erfolgreich aktiviert (aktiver D-Bus-Pfad: /org/freedesktop/NetworkManager/ActiveConnection/3)
$ ip addr

Als nächstes sind die Updates dran :

$ sudo apt update
$ sudo apt upgrade

Das kann eine ganze Weile dauern ...

Die genaueste Systemzeit erhält man mit dem NTP-Service. Dieser muss erstmal installiert werden.

$ sudo apt install ntp
$ sudo nano /etc/ntpsec/ntp.conf
$ sudo service ntp restart

Da ich einen Zeitserver in der Nähe bevorzuge trage ich den "ptbtime1.ptb.de" noch in die Konfigurationsdatei ein.

# Public NTP servers supporting Network Time Security:
# server time.cloudflare.com nts
server ptbtime1.ptb.de iburst

# pool.ntp.org maps to about 1000 low-stratum NTP servers.  Your server will
# pick a different set every time it starts up.  Please consider joining the
# pool: <https://www.pool.ntp.org/join.html>
pool 0.debian.pool.ntp.org iburst
pool 1.debian.pool.ntp.org iburst
pool 2.debian.pool.ntp.org iburst
pool 3.debian.pool.ntp.org iburst

Dann werden einige System-Services stillgelegt, die nur Zeit und Speicher kosten, aber auf diesem System keinen Sinn machen.

$ sudo systemctl stop wpa_supplicant
$ sudo systemctl disable wpa_supplicant
Removed /etc/systemd/system/dbus-fi.w1.wpa_supplicant1.service.
Removed /etc/systemd/system/multi-user.target.wants/wpa_supplicant.service.
$ sudo systemctl disable triggerhappy
Synchronizing state of triggerhappy.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable triggerhappy
Removed /etc/systemd/system/multi-user.target.wants/triggerhappy.service.stemctl disable triggerhappy
Synchronizing state of triggerhappy.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable triggerhappy
Removed /etc/systemd/system/multi-user.target.wants/triggerhappy.service.
$ sudo systemctl stop triggerhappy
Warning: Stopping triggerhappy.service, but it can still be activated by:
  triggerhappy.socket
$ sudo systemctl stop ModemManager
$ sudo systemctl disable ModemManager
Removed /etc/systemd/system/multi-user.target.wants/ModemManager.service.
Removed /etc/systemd/system/dbus-org.freedesktop.ModemManager1.service.
$ sudo systemctl stop avahi-daemon.socket
$ sudo systemctl stop avahi-daemon
$ sudo systemctl disable avahi-daemon.socket
Removed /etc/systemd/system/sockets.target.wants/avahi-daemon.socket.
$ sudo systemctl disable avahi-daemon
Synchronizing state of avahi-daemon.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable avahi-daemon
Removed /etc/systemd/system/dbus-org.freedesktop.Avahi.service.
Removed /etc/systemd/system/multi-user.target.wants/avahi-daemon.service.
$ # Jetzt noch ein bisschen aufräumen ...
$ sudo apt-get purge avahi-daemon
Paketlisten werden gelesen… Fertig
Abhängigkeitsbaum wird aufgebaut… Fertig
    :
    :
Löschen der Konfigurationsdateien von libnss-mdns:armhf (0.14.1-2) ...
libnss-mdns.postrm: Checking NSS setup...
libnss-mdns.postrm: Removing mdns from NSS setup
Trigger für dbus (1.12.24-0+deb11u1) werden verarbeitet ...
$ sudo apt autoremove
Paketlisten werden gelesen… Fertig
Abhängigkeitsbaum wird aufgebaut… Fertig
Statusinformationen werden eingelesen… Fertig
Die folgenden Pakete werden ENTFERNT:
  bind9-host bind9-libs libavahi-common-data libavahi-common3 libavahi-core7 libdaemon0 libfstrm0 liblmdb0 libmaxminddb0 libprotobuf-c1 libuv1 libxml2
    :
    :
Entfernen von libxml2:armhf (2.9.10+dfsg-6.7+deb11u4) ...
Trigger für man-db (2.9.4-2) werden verarbeitet ...
Trigger für libc-bin (2.31-13+rpt2+rpi1+deb11u5) werden verarbeitet ...
$

Jetzt ist das System konfiguriert und einsatzbereit.

Zur Anzeige der Temperatur hat sich noch der folgende Befehl als nützlich erwiesen :

$ vcgencmd measure_temp
temp=46.5'C

Die USB-Festplatte

Um eine größere Menge Daten speichern zu können ohne die SD-Karte auszureizen will ich eine 2"-Sata-Festplatte einsetzen. Die Platte habe ich vor ein paar Jahren bei einem Laptop gegen eine SSD ausgetauscht. Mit einem schicken Gehäuse mit integriertem SATA-USB-Adapter ist sie für diesen Zweck gut geeignet, hier kommt es nicht so auf Geschwindigkeit an.

Mit gparted habe ich der Platte drei ext4-Partitionen verpasst. Diese sollen jetzt automatisch als eigene Verzeichnisse gemountet werden. Dazu müssen lediglich drei Zeilen in der Datei /etc/fstab ergänzt werden.
Dazu gilt es zunächst festzustellen wie die Partitionen ins System eingebunden werden.

$ # Ohne USB-Festplatte
$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
mmcblk0     179:0    0   7,5G  0 disk
├─mmcblk0p1 179:1    0   256M  0 part /boot
└─mmcblk0p2 179:2    0   7,2G  0 part /
$ # Mit USB-Festplatte
$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda           8:0    0 698,6G  0 disk
├─sda1        8:1    0 232,9G  0 part /srv
├─sda2        8:2    0 232,9G  0 part /dash1
└─sda3        8:3    0 232,9G  0 part /dash2
mmcblk0     179:0    0   7,5G  0 disk
├─mmcblk0p1 179:1    0   256M  0 part /boot
└─mmcblk0p2 179:2    0   7,2G  0 part /

Dann wird die Datei editiert :

$ sudo nano /etc/fstab

proc            /proc           proc    defaults          0       0
PARTUUID=34f4435e-01  /boot           vfat    defaults          0       2
PARTUUID=34f4435e-02  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that
/dev/sda1             /srv            ext4    defaults 0 2
/dev/sda2             /dash1          ext4    defaults 0 2
/dev/sda3             /dash2          ext4    defaults 0 2

Jetzt stehen nach dem Booten die drei neuen Partitionen unter eigenem Namen zur Verfügung. Um sie mit allen Benutzern verwenden zu können müssen noch die Zugriffsrechte angepasst werden.

$ ls -l /
lrwxrwxrwx   1 root root     7 21. Feb 02:02 bin -> usr/bin
drwxr-xr-x   3 root root  4096  1. Jan 1970  boot
drwxrwxrwx   3 root root  4096 22. Jan 16:43 dash1
drwxr-xr-x   3 root root  4096 23. Apr 18:04 dash2
drwxr-xr-x  17 root root  3800 24. Apr 09:06 dev
    :
    :
lrwxrwxrwx   1 root root     8 21. Feb 02:02 sbin -> usr/sbin
drwxr-xr-x   4 root root  4096 23. Apr 18:08 srv
dr-xr-xr-x  12 root root     0  1. Jan 1970  sys
    :
    :
$ sudo chmod 777 /dash2
$ ls -l /
drwxrwxrwx   3 root root  4096 23. Apr 18:04 dash2

© Uwe Jantzen 15.01.24