Raspbian Lite auf Raspberry Pi bringen ohne Tastatur und Display

Ich wollte Raspbian Stretch Lite auf dem Raspberry Pi zum Laufen bringen, ohne Tastatur und Display an den Pi anzuschließen. Sogenannter „headless“ Betrieb.
Man muss dazu den SSH-Server auf dem Pi zum Hochfahren bringen (was Raspbian nicht automatisch tut) und kann dann per ssh darauf zugreifen.
Voraussetzung ist eine SD-Karte mit mindestens 8 GB. Sie sollte nicht zu langsam sein, also wenigstens Class 10 bzw. UHS-1 haben.
Bei den Modellen Pi Zero, Pi 1 +, Pi B+, Pi 2 und Pi 3 muss es eine micro-SD-Karte sein. Beim Pi 1 A und Pi 1 B eine SD-Karte (ohne micro).


Achtung! Alle Dateien und Verzeichnisse auf der SD-Karte werden im Folgenden gelöscht werden!!!

Das Ganze funktioniert unter Ubuntu (18.04) wie folgt:

  1. Image herunterladen (Im folgenden Beispiel die Datei 2018-10-09-raspbian-stretch-lite.zip. Download-Quellen am Ende)
  2. Prüfsumme der zip-Datei ermitteln und vergleichen:
sha256sum 2018-10-09-raspbian-stretch-lite.zip

Es sollte die gleiche Hex-Zahl angezeigt werden, wie auf der Download-Seite bzw. in der Datei *.zip.sha256 angegeben.

  1. Image auspacken
unzip 2018-10-09-raspbian-stretch-lite.zip

Datei 2018-10-09-raspbian-stretch-lite.img ist nun vorhanden.

  1. Aktuell vorhandene Laufwerke ansehen:
lsblk

oder besser

lsblk | grep -ve loop
  1. SD-Karte in den SD-Karten-Slot des PC stecken.
  2. Normalerweise hängt Ubuntu die SD-Karte automatisch ein (mount).
  3. Alle Partitionen der SD-Karte aushängen (im Dateimanager oder mit umount).
  4. Aktuell vorhandene Laufwerke ansehen:
lsblk

oder:

 lsblk | grep -ve loop
  1. Der Unterschied zwischen der Ausgabe des ersten und zweiten lsblk (Punkte 4 und 8 oben) ist das Gerät (device) der SD-Karte. Bei mir:
mmcblk0 179:0 0 14,5G 0 disk 
├─mmcblk0p1 179:1 0 43,8M 0 part 
└─mmcblk0p2 179:2 0 14,4G 0 part
  1. Image auf SD-Karte schreiben, d. h. auf das soeben ermittelte Gerät, z. B. /dev/mmcblk0.

Parameter if ist die Input-Datei, of die Output-Datei (hier die Geräte-Datei der SD-Karte) des Befehls dd.
Achtung! Beide Parameter dürfen nicht verwechselt werden!

sudo dd bs=4M if=2018-10-09-raspbian-stretch-lite.img of=/dev/mmcblk0 conv=fsync status='progress'

Falls sudo das erste Mal aufgerufen wurde, das eigene Passwort eingeben.
Das Kopieren dauerte bei mir ca. 4 min. (Nicht wundern, wenn dd am Ende scheinbar steht. Einfach warten.)
Dabei werden zwei Partitionen auf der SD-Karte erstellt.

  1. SD-Karte physisch aus dem SD-Karten-Slot des PC entfernen und wieder hineinstecken.
  2. Normalerweise hängt Ubuntu die Partitionen der SD-Karte automatisch ein (mount).
  3. Nur wenn nötig, d. h. wenn Ubuntu die SD-Karte nicht einhängen sollte:

Partitionen der SD-Karte selbst mounten wie folgt (in folgenden Befehlen muss evtl. mmcblk0p1 und mmcblk0p2 angepasst werden):

sudo mkdir /media/$USER/boot
sudo mkdir /media/$USER/rootfs
sudo mount /dev/mmcblk0p1 /media/$USER/boot
sudo mount /dev/mmcblk0p2 /media/$USER/rootfs
  1. Nun der entscheidende Trick: Leere Datei „ssh“ auf der Boot-Partition der SD-Karte anlegen. (Nicht im leeren Verzeichnis boot der größeren Partition!)
sudo touch /media/$USER/boot/ssh

Hintergrund: Raspbian startet normalerweise keinen SSH-Server auf dem Pi. Wenn es aber diese Datei „ssh“ an der genannten Stelle findet, dann startet es einen SSH-Server.

  1. SD-Karte aushängen (im Dateimanager oder mit umount).
  2. SD-Karte physisch aus dem SD-Karten-Slot des PC entfernen
  3. SD-Karte physisch in den Pi hineinstecken.
  4. Pi einschalten (d. h. mit Spannung versorgen).
  5. Der Pi sollte nun vom Router eine IP-Adresse erhalten.

Nun muß man entweder diese IP-Adresse oder den Namen, unter dem der Pi im Netzwerk bekannt ist, herausfinden.
Beides kann man im Router einsehen (z. B. auf einer Fritz!Box unter FRITZ!OS 7 unter Heimnetz / Netzwerk).
Bei mir war der Name „raspberrypi“.
Alternativ könnte man mit nmap das Netzwerk scannen, um den Pi zu finden (z. B.: nmap 192.168.178.0/24).

  1. Nun endlich mit ssh auf den Pi zugreifen:
ssh pi@raspberrypi

„pi“ ist der Benutzer auf dem Pi. „raspberrypi“ ist der Hostname des Pi, den man im Router gefunden hat.

  1. Mögliche Stolpersteine:

Bei mir gab der ssh-Client folgenden Meldungen aus:

The authenticity of host ‚raspberrypi (192.168.178.22)‘ can’t be established.
ECDSA key fingerprint is SHA256:VpSRtvekRkX0zhWfHfne38iCDl6D919hdpf9l+Jn5CQ.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‚raspberrypi‘ (ECDSA) to the list of known hosts.
Warning: the ECDSA host key for ‚raspberrypi‘ differs from the key for the IP address ‚192.168.178.22‘
Offending key for IP in /home/cmc/.ssh/known_hosts:8
Are you sure you want to continue connecting (yes/no)? yes

Die erste bedeutet, dass der ssh-Client den Pi zum ersten Mal sieht und noch nicht kennt.
Die zweite bedeutet, dass der Schlüssel des Pi ein anderer ist, als der bisher von dieser IP-Adresse bekannte.
Beide Male mit „yes“ antworten!

Ich habe an dieser Stelle auch schon von ssh eine Fehlermeldung „… Host key verification failed.“ erhalten.
Falls unter der gleichen IP-Adresse bereits ein anderer Host im Netzwerk lief und man auf diesen von diesem (Ubuntu-)PC aus bereits per ssh zugegriffen hatte.
Dann muss man den in der Fehlermeldung genannten ssh-keygen-Befehl ausführen, um den alten Schlüssel für diesen alten Host aus der Datei der bekannten Hosts zu löschen. Zum Beispiel:

ssh-keygen -f "/home/$USER/.ssh/known_hosts" -R "raspberrypi"

Anschließend wiederholt man den ssh-Befehl von oben (ssh pi@raspberrypi).

  1. Anschließend das Passwort eingeben. Beim Eintippen wird nichts angezeigt!
    Das Passwort lautet: raspberry
  2. Der SSH-Server auf dem Pi gibt nun einen Begrüßungstext aus (z. B. „Linux raspberrypi 4.14.71-v7+ …“) und man ist „drin“!

Der Prompt sollte etwa so aussehen:

pi@raspberrypi:~ $
  1. Aus Sicherheitsgründen sollte man nun noch (auf dem Pi) das Passwort des Benutzers pi ändern wie folgt:
passwd

Altes Passwort und zweimal neues Passwort eingeben (wieder ohne Anzeige).
Das neue Passwort notieren und gut aufbewahren!!

  1. Pi herunterfahren mit:
sudo halt

Die ssh-Verbindung wird dabei getrennt, Ausgabe:

Connection to raspberrypi closed by remote host.
Connection to raspberrypi closed.

Falls der ssh-Client hängen bleibt und das (Ubuntu-)Terminal nicht zu seinem Prompt zurückkehrt, muss man es hart beenden (Fenster schließen).

  1. Nun darf der Pi vom Netzteil getrennt werden.

Hinweis für Windows-Freunde:

Statt dd (bei Ubuntu) würde man unter Windows z. B. ein Programm wie Win32 Disk Imager oder Rufus nehmen. Als ssh-Client z. B. putty.

Download-Quellen:

Raspbian Stretch Lite:
Tools für Windows: