Sprache auswählen

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"

     lsblk p grep disk

     

    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/sdb1

     

    Einhä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"

     lsblk p

     

    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 hub

    In 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 -> ttyUSB0

    Jetzt 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 -> ttyACM0

     ID: 79