Das System verhält sich komisch? Raspbian bleibt beim Start hängen?
Die SD Card als Datenträger beim Raspberry soll ja häufig den Geist aufgeben. Ich hatte das noch nie, ich behaupte immer das passiert bevorzugt wenn Datenbanken im Spiel sind - aber jetzt hatte es einen Kumpel aus heiterem Himmel getroffen. Ohne Datenbank, ohne aktuellem Backup. Ich konnte ihm helfen und daraus ist dieser Artikel geworden.
Was tun?
Zutaten
- Neue SD Card für das neue System, Größe "egal"
- USB Stick oder zweite SD Card + Reader mit dem Speicherplatz mindestens der alten SD Card.
- Image Tool (win32diskimager, USB Image Tool, Etcher oder mit Linux Bordmitteln dd.)
In jedem Fall eine Kopie der SD Card anfertigen: Imagedatei ablegen.
Die Originalkarte sollte nicht weiter manipuliert werden und meist ist eine Reparatur der defekten Karte weder sinnvoll noch möglich!
Den Raspberry neu machen
- neue SD Card,
- aktuelles Raspbian Image aufspielen,
- starten,
- System und FHEM Setup.
systemctl stop fhem
Dateisystem prüfen und Zugriff herstellen
Die 1:1 Kopie auf dem USB Stick (oder SD Card in SD Reader) in den Raspberry stecken.
Achtung: Das geht bei einem Pi ab Version 2 nach meiner Erfahrung gut. Ein 1er Exemplar würde ich zum Stecken herunterfahren, er wird beim einstecken von selbst neu starten.
Oder die Imagedatei direkt mounten, siehe weiter unten.
Danach sollte sich folgendes Bild ergeben:
pi@raspib31:~ $ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 1 29,8G 0 disk
├─sda1 8:1 1 41,7M 0 part
└─sda2 8:2 1 15G 0 part
mmcblk0 179:0 0 14,9G 0 disk
├─mmcblk0p1 179:1 0 256M 0 part /boot
└─mmcblk0p2 179:2 0 14,7G 0 part /
Der USB "Stick" wird als sda erkannt, die interessante Partition ist sda2.
Für die jetzt folgende Reparatur darf sda2 nicht gemountet sein/werden!
Ein erster Check ohne Optionen erledigt offenbar schon mal alles, mir ist nicht klar in welchem Fall welche zusätzlichen Optionen (oft empfohlen -l, Hilfe mit -h) notwendig sind.
Alle weiteren Befehle erfordern erhöhte Rechte, deswegen erstmal sudo su.
Die Ausgabe ist nur ein Beispiel und kann je nach Fehler völlig anders sein!
sudo su
fsck /dev/sda2
# fsck from util-linux 2.33.1
# e2fsck 1.44.5 (15-Dec-2018)
# /dev/sda2: recovering journal
# Setting free inodes count to 899857 (was 899863)
# Setting free blocks count to 3338902 (was 3339342)
# /dev/sda2: clean, 46703/946560 files, 577130/3916032 blocks
SD Card mounten
Jetzt die interessante Partition mounten und hoffen dass etwas lesbar ist.
mkdir /mnt/sda2
mount /dev/sda2 /mnt/sda2
Alte Dateien kopieren
Alle Dateien von dem alten System werden kopiert und die Rechte entsprechend gesetzt, zuletzt wird das USB Gerät ausgeworfen. In der Hoffnung, dass nichts wichtiges kaputt ist!
Idee: Man könnte die Backup Dateien ausschließen oder rsync verwenden.
cp -R /mnt/sda2/opt/fhem/* /opt/fhem/
chown -R fhem: /opt/fhem/
umount /mnt/sda2
System prüfen
systemctl start fhem
Das kann eine Weile dauern, z.B. wenn Moduldateien fehlerhaft sind. Der Ungeduldige kann derweil ins Log schauen.
tail /opt/fhem/log/fhem-$(date +%Y)-$(date +%m).log
Wenn das System Fehler zu defekten Modulen liefert, nach dem Start in FHEM erstmal ein update versuchen.
update force
Neu starten und System wieder prüfen
systemctl restart fhem
Wenn es doch nicht läuft
- Es fehlen System Pakete? Da hatte ich hier schon mal was geschrieben.
- Wenigsten mit der fhem.cfg neu anfangen, notfalls eine Alte aus dem restoreDir pfad. Siehe Wikiartikel.
- Ist eine Backupdatei in /opt/fhem/backup vorhanden? Einfach das letzte Backup versuchen, siehe hier.
Alternative - Image Datei direkt mounten
sudo su
# SMB Laufwerk mounten
mp="/mnt/daten"
mkdir $mp
mount -t cifs -o username=UserName,password=Passwort //server/sicherung $mp
# Loop Device erstellen
img="$mp/fhem/raspib3/kopieSdDefekt.img"
ldev=$(losetup --show -f -P "$img")
An der Stelle hat man quasi "den USB Stick gesteckt" d.h. man hat einen /dev/ Eintrag den man wie ein angeschlossenes Laufwerk behandeln kann. Dies(e) Gerät(e) anzeigen:losetup -l
Jetzt kann man wie oben beschrieben fsck ausführen. dafür kann man einfach die Variable $ldev verwenden: fsck ${ldev}p2
Ist der Vorgang erfolgreich kann man die Partitionen mounten:#Alle Partitionen mounten
for part in ${ldev}p*
do
dst=/mnt/$(basename $part)
echo "mkdir $dst"
echo "mount $part $dst"
done
Nachdem man analog zu oben die Dateien kopiert hat, kann man alles wieder aufräumen:umount /mnt/loop0*
rm -R /mnt/loop0*
losetup -D
umount $mp