Software
-
Raspberry PI SD card corruption
Das Raspberry PI Rootdrive verschieben
Ein Raspberry PI ist ein vollwertiger Klein-Computer. Man kann ihn als Server 24/7 das ganze Jahr über betreiben.
Es gibt nur einen Haken: Früher oder später wird die SD-Karte beim Schreiben beschädigt.
Das Verschieben des Root-Dateisystems Ihres Raspberry PI auf ein externes USB-Laufwerk
umgeht dieses Problem. Dieser Artikel enthält eine Anleitung zum Verschieben des Root-Dateisystems von
SD-Karte auf ein externes USB-Laufwerk, so dass Sie Ihren Raspberry PI mit dem Root-Dateisystem auf dem USB-Laufwerk booten können.Hintergrund
Wenn Sie den Begriff "Raspberry PI SD card corruption" im Internet suchen, werden Sie schnell feststellen das dies ein ernstes Problem ist. Vor allem, wenn Sie Ihren Raspberry PI rund um die Uhr als Server betreiben wollen. Für Sie läuft ihr Raspberry PI Server über ein Jahr lang ohne Probleme, andere, die weniger Glück haben haben, müssen die SD-Karte mehrmals im Jahr austauschen.Wann tritt dieses Problem mit der SD-Karte auf ? Nun, nur bei Schreibvorgängen. Also, wenn wir
einen Weg finden, nicht auf die SD-Karte zu schreiben, ist das Problem gelöst. Eine Lösung besteht darin das Root-Dateisystem des Raspberry PI auf einem USB-Laufwerk statt auf der SD-Karte zu speichern. Dieser Artikel enthält eine klare Schritt-für-Schritt-Anleitung zum Verschieben des Root-Dateisystems von Ihrem Raspberry auf eine externe Festplatte oder einen USB-Stick. Danach können Sie Ihren Raspberry PI mit dem Root-Dateisystem booten.Stellen Sie zunächst sicher, dass Ihr Raspberry PI ausgeschaltet ist. Nehmen Sie die SD-Karte aus dem Raspberry PI und stecken Sie sie in Ihren PC. Schließen Sie dann das USB-Laufwerk an Ihren PC an. Wenn beide Geräte mit dem PC verbunden sind, müssen wir die zugewiesenen Gerätenamen herausfinden. Führen Sie den folgenden Befehl aus, um alle Festplatten und Partitionen auf Ihrem PC aufzulisten. Der Parameter -p sorgt dafür, dass die Befehlsausgabe den vollständigen Gerätenamen enthält:lsblk -p | grep "disk\|part"
Ein Blick auf die Befehlsausgabe verrät uns, dass /dev/sda die Festplatte meines PCs ist und die die wir eigentlich gar nicht anfassen sollten. Beim Einstecken wies Linux dem USB-Laufwerk den Gerätenamen /dev/sdb für das USB-Laufwerk zugewiesen. Das USB-Laufwerk enthält derzeit eine Partition (/dev/sdb1), die keine Rolle spielt, da wir das USB-Laufwerk im nächsten Abschnitt neu formatieren wollen. Linux hat der SD-Karte den Gerätenamen /dev/mmcblk0 zugewiesen. Wie erwartet, enthält die SD-Karte zwei Partitionen: die Boot-Partition (/dev/mmcblk0p1) und die Partition des Root-Dateisystems (/dev/mmcblk0p2).
Für den Rest des Artikels werde ich diese Gerätenamen in den Beispielen verwenden. Allerdings beachten Sie jedoch, dass die Gerätenamen, die Ihr PC zugewiesen hat, unterschiedlich sein können/werden. Stellen Sie sicher, dass Sie
Sie die Gerätenamen entsprechend ersetzen in den folgenden Befehlen.
Da wir nun die Gerätenamen kennen, müssen wir nur noch sicherstellen, dass die Partitionen nicht gemountet sind, bevor wir fortfahren. Um die Partitionen auszuhängen, führen Sie diese Befehle aus:
sudo umount /dev/sdb1
sudo umounten /dev/mmcblk0p1
sudo umounten /dev/mmcblk0p2
Erstellen und Formatieren einer EXT4-Partition auf dem USB-Laufwerk
Bevor wir die Dateien aus dem Root-Dateisystem der SD-Karte auf das USB-Laufwerk kopieren können, müssen wir eine große EXT4-Partition auf dem USB-Laufwerk erstellen und diese neu erstellte Partition dann formatieren. Beachten Sie, dass dabei alle Dateien, die derzeit auf dem USB-Laufwerk gespeichert sind, gelöscht werden. Stellen Sie also sicher, dass Sie eine Sicherungskopie dieser Dateien erstellen, falls sie wichtig sind. Vergewissern Sie sich außerdem dreimal, dass Sie dass Sie in den folgenden Befehlen den richtigen Gerätenamen angeben. Andernfalls könnten Sie die falsche Festplatte unwiderruflich ändern. Erstellen Sie zunächst eine neue Partitionstabelle auf der Festplatte:sudo parted /dev/sdb mklabel msdos
Als nächstes erstellen Sie eine große Partition. Dadurch wird /dev/sdb1 erstellt:
sudo parted /dev/sdb mkpart primary 0% 100%
Nach der Erstellung der neuen Partition /dev/sdb1 formatieren Sie diese als EXT4:
sudo mkfs.ext4 /dev/sdb1Einhängen der Partitionen des USB-Laufwerks und der SD-Karte
In den vorherigen Abschnitten haben wir alle Partitionen des USB-Laufwerks und der SD-Karte ausgehängt.
Außerdem haben wir eine große EXT4-Partition auf dem USB-Laufwerk erstellt. In diesem Abschnitt erstellen wir
neue Einhängepunkte für alle drei Partitionen und hängen die Partitionen manuell ein.
Erstellen Sie die Einhängepunkte mit den folgenden drei Befehlen:sudo mkdir -p /mnt/usbdrive
sudo mkdir -p /mnt/sdboot
sudo mkdir -p /mnt/sdrootfs
Mounten Sie die Partitionen:sudo mount /dev/sdb1 /mnt/usbdrive
sudo mount /dev/mmcblk0p1 /mnt/sdboot
sudo mount /dev/mmcblk0p2 /mnt/sdrootfs
Prüfen Sie ob alles stimmt:lsblk -p | grep "disk\|part"
HowTo: (/home/helmer/Farm/Software/Transfer system disk from SD card to hard disk - eLinux.org.pdf)
-
USB-Port fest Zuordnen
USB-Gerätepersistenz über Reboots hinweg
Von (#547) Theoi-Meteoroi auf Github:Die Verwendung von USB-Geräten, wie z. B. USB-zu-Seriell-Schnittstellen, zum Anschluss eines Sensors ist zwar praktisch, wirft aber ein Problem auf, wenn mehrere Geräte vorhanden sind und das System neu gestartet wird. Nach einem Neustart gibt es keine Garantie dafür, dass das Gerät mit demselben Namen bestehen bleibt.
Wenn beispielsweise Sensor A /dev/ttyUSB0 und Sensor B /dev/ttyUSB1 ist, kann nach einem Neustart Sensor A /dev/ttyUSB1 und
Sensor B kann /dev/ttyUSB0 sein. Dies führt dazu, dass das falsche Gerät für eine Messung abfragt wird, was möglicherweise zu
eine Fehlmessung oder schlimmer noch, eine falsche Messung, weil die Antwort nicht vom richtigen Sensor stammt (ich habe gesehen, dass mein
Temperatursensor aus diesem Grund 700+ Grad Celsius angezeigt!). Befolgen Sie die folgenden Anweisungen, um dieses Problem zu beheben.
Ich verwende udev, um einen dauerhaften Gerätenamen ('/dev/dust-sensor') zu erstellen, der mit dem /dev/ttyUSBn verknüpft wird, das
bei der Start des Geräts im Kernel zugeordnet wird. Die einzige Voraussetzung ist ein vom USB-Gerät zurückgegebenes Attribut, das eindeutig ist. Der
übliche Fall ist, dass keines der Attribute eindeutig ist und man nur mit VID und PID dasteht, was in Ordnung ist, solange
Sie keine anderen Adapter haben, der die gleiche VID und PID meldet. Wenn Sie mehrere Adapter mit der gleichen VID
und PID haben, dann haben sie hoffentlich ein anderes eindeutiges Attribut. Mit diesem Befehl können Sie alle Attribute ermitteln. Führen Sie ihn für jedes USB-Gerät aus
und vergleichen Sie dann die Unterschiede, um möglicherweise ein zu verwendendes Attribut zu finden.pi@raspberry:~ $ lsusb
Bus 001 Device 008: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB light
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubIn diesem Fall lautet die Hersteller-ID 10c4 und die Produkt-ID ea60.
Da ich das Feld für die Seriennummer geändert habe, wird diese eindeutig sein.pi@raspberry:~ $ udevadm info --name=/dev/ttyUSB0 --attribute-walk | grep serial
SUBSYSTEMS=="usb-serial"
ATTRS{serial}=="ZH03B180904"
ATTRS{serial}=="3f980000.usb"
Jetzt habe ich ein Attribut, mit dem ich udev sagen kann, was es tun soll. Ich erstelle eine Datei in /etc/udev/rules.d mit einem Namen wie "99-dustsensor.rules". Unter dieser Datei sage ich udev, welchen Gerätenamen es erstellen soll, wenn es dieses Gerät angeschlossen sieht:
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{serial}=="ZH03B180904"
SYMLINK+="dust-sensor"Zum Testen:
pi@raspberry:/dev $ sudo udevadm trigger
pi@raspberry:/dev $ ls -al dust-sensor
lrwxrwxrwx 1 root root 7 Oct 6 21:04 dust-sensor -> ttyUSB0Jetzt wird der Staubsensor jedes Mal, wenn er eingesteckt wird, unter /dev/dust-sensor angezeigt
Setup für Borgmann Aquaponik Hydroponik
USB-Port finden:lsusb
Bus 001 Device 014: ID 2a03:0043 dog hunter AG Arduino Uno Rev3
Konfiguration in: /etc/udev/rules.d/99-sensor_a.rules
SUBSYSTEM=="tty", ATTRS{idVendor}=="2a03", ATTRS{idProduct}=="0043", SYMLINK+="ponik-sensor-a"
Test mit:
udevadm trigger && ls -l /dev/ponik-sensor-a
root@raspberrypi:/dev# ls -al ponik-sensor-a
lrwxrwxrwx 1 root root 7 17. Jul 04:29 ponik-sensor-a -> ttyACM0ID: 79