Sonntag, 24. Mai 2020

Datenrettung von einem Synology NAS - foremost

Um aus einem beliebigen Image Daten zu rekonstruieren, empfiehlt sich das Tool foremost. Es geht die ganzen Blöcke durch und sucht nach bekannten Dateiheader.
Die gefundenen Daten werden dann in ein Output Verzeichnis kopiert.
Hat in meine Fall ca. 24 Stunde  gedauert, und im Output Directory waren dann ca. 500GB an Daten.
sudo foremost -i /dev/sdb5 -o recovery/
Das /dev/sdb5 konnte ich nicht mounten, es war als Teil eines linux-raid eingebunden.

Nachteil von foremost, es werden die Dateien nach Typ sortiert im Output Directory abgelegt, in meinem Fall waren es dann 500.000 JPG Fotos in einem Directory. Also mit nautilus kann man das kaum mehr aufmachen.
Auch werden nicht alle Dateitypen erkannt, in meinem Fall fehlten in der default Einstellung mkv Dateien.

Ansonsten scheint mir, dass es sehr viele Daten wieder hervorgebracht hat. Mal sehen ob das ursprünglichen Zustand entspricht.

Freitag, 22. Mai 2020

Datenrettung aus einem Synology NAS - ddrescue

Eine der beiden Platten läuft mal an und zeigt sich im kernel, wenn auch mit Fehlern. Als ersten Schritt versuche ich soviel wie möglich von dieser Platte zu kopieren, dazu habe ich mir eine neue 4TB USB Disk gekauft.
Den Rest kann man mit ddrescue machen
anon@anon:~/Downloads$ sudo ddrescue --force /dev/sdc /dev/sdb rescue.map
GNU ddrescue 1.23
Press Ctrl-C to interrupt
     ipos:    4840 MB, non-trimmed:        0 B,  current rate:       0 B/s
     opos:    4840 MB, non-scraped:        0 B,  average rate:    102 MB/s
non-tried:        0 B,  bad-sector:     4096 B,    error rate:    1536 B/s
  rescued:    3000 GB,   bad areas:        1,        run time:  8h  6m 26s
pct rescued:   99.99%, read errors:        9,  remaining time:         n/a
                              time since last successful read:          2s
Finished                                      
In Summe waren es also ein bad-sector.

Danach sind die Daten vorerst sicher auf der neuen Platte und die originale kann mal verstaut werden.

Next Step - wie komm ich jetzt an die Dateien ran?

Donnerstag, 21. Mai 2020

Datenrettung aus einem Synology NAS - Overlay erzeugen

Ein Bekannter von mir ist mit einem kaputten Synology NAS gekommen,
eine Platte läuft gar nicht mehr an, die andere wird zwar erkannt aber im Kernel Log sind gleich ein paar Errors zu sehen.

[12389.196872] scsi 7:0:0:0: Direct-Access     WDC WD30 EFRX-68EUZN0     8105 PQ: 0 ANSI: 6
[12389.198196] sd 7:0:0:0: Attached scsi generic sg4 type 0
[12389.198420] sd 7:0:0:0: [sdc] Spinning up disk...
[12390.203014] ..........ready
[12399.419688] sd 7:0:0:0: [sdc] 5860533168 512-byte logical blocks: (3.00 TB/2.73 TiB)
[12399.419692] sd 7:0:0:0: [sdc] 4096-byte physical blocks
[12399.419860] sd 7:0:0:0: [sdc] Write Protect is off
[12399.419863] sd 7:0:0:0: [sdc] Mode Sense: 53 00 00 08
[12399.420185] sd 7:0:0:0: [sdc] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[12399.420334] sd 7:0:0:0: [sdc] Optimal transfer size 33553920 bytes not a multiple of physical block size (4096 bytes)
[12399.503865]  sdc: sdc1 sdc2 sdc5
[12399.506543] sd 7:0:0:0: [sdc] Attached SCSI disk
[12400.017949] sd 7:0:0:0: [sdc] tag#3 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[12400.017952] sd 7:0:0:0: [sdc] tag#3 Sense Key : Medium Error [current] 
[12400.017953] sd 7:0:0:0: [sdc] tag#3 Add. Sense: Unrecovered read error
[12400.017955] sd 7:0:0:0: [sdc] tag#3 CDB: Read(16) 88 00 00 00 00 00 00 90 3e e8 00 00 00 08 00 00
[12400.017958] blk_update_request: critical medium error, dev sdc, sector 9453288 op 0x0:(READ) flags 0x80700 phys_seg 1 prio class 0
[12400.527720] sd 7:0:0:0: [sdc] tag#2 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[12400.527750] sd 7:0:0:0: [sdc] tag#2 Sense Key : Medium Error [current] 
[12400.527765] sd 7:0:0:0: [sdc] tag#2 Add. Sense: Unrecovered read error
[12400.527774] sd 7:0:0:0: [sdc] tag#2 CDB: Read(16) 88 00 00 00 00 00 00 90 3e e8 00 00 00 08 00 00
[12400.527785] blk_update_request: critical medium error, dev sdc, sector 9453288 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
[12400.527805] Buffer I/O error on dev sdc5, logical block 1, async page read
Was ich mir von der Platte merke:

Die Platte ist eine 4TB WD Red und wird als sdc erkannt, es werden darauf 3 Partitionen angezeigt sdc1, sdc2 und sdc5

GNU Parted 3.3
/dev/sdc wird verwendet
Willkommen zu GNU Parted! Rufen Sie »help« auf, um eine Liste der verfügbaren Befehle zu erhalten.
(parted) print                                                            
Modell: WDC WD30 EFRX-68EUZN0 (scsi)
Festplatte  /dev/sdc:  3001GB
Sektorgröße (logisch/physisch): 512B/4096B
Partitionstabelle: gpt
Disk-Flags: 

Nummer  Anfang  Ende    Größe   Dateisystem     Name  Flags
 1      131kB   2550MB  2550MB  ext4                  RAID
 2      2550MB  4698MB  2147MB  linux-swap(v1)        RAID
 5      4840MB  3001GB  2996GB                        RAID
Damit die Platte nun nicht noch mehr zerstört wird, leg ich mal zuerst ein Overlay an, damit alle veruche was zu reparieren nicht direkt auf die Platte geschrieben werden.
Als erstes benötige ich die größe der Platte in Blocks

sudo blockdev --getsize /dev/sdc
5860533168
Dann leg ich noch ein 4TB Sparse File an. Sparse Files werden zwar mit einer Größe von 4TB angezeigt, belegen aber nur den Platz der beschrieben wird. In dem Sparse File sollen dann die Änderungen geschrieben werden. Sozusagen als Snapshot File.

truncate -s4000g overlay-sdb.ovr
Als nächstes leg ich ein Loopback Device an, welches das File als Grundlage hat.
sudo losetup -f --show -- overlay-sdc.ovr
Jetzt habe ich sozusagen ein /dev/loop20 Device erstellt das auch das erstellt File zeigt.
Als nächstes binde ich das original Device /dev/sdc mit dem darüber gelegten Loopback device ein. Alle Schreibvorgänge landen damit im Overlay File.

echo 0 5860533168 snapshot /dev/sdc /dev/loop20 P 8 | sudo dmsetup create sdc

Damit wurde dann ein neues Device unter /dev/mapper/ erstellt:
ls /dev/mapper/
control  sdc
Das so erstellte /dev/mapper/sdc kann man wie ein normales Blockdevice verwenden.

So kann mal der darunterliegenden Platte nicht mehr passieren, als ihr schon passiert ist.

Sonntag, 10. Mai 2020

Esp8266 programmieren - first steps und hello world

Im letzten Post hab ich beschrieben wie man ein micropython image auf den Controller kopiert und Kontakt mit dem micropython Interpreter mittels USB aufnimmt. Aber da gibt es mehr zu wissen.

Der ESP8266 startet automatisch einen Access Point, wenn man nach dem Reset (oder einfach USB Kabel ziehen) die Access Point Liste anschaut wir man einen neuen finden.

Unter Linux kann man sich die Daten zu den Access Point wie folgt anschauen

sudo iwlist wlp4s0 scanning

der passenden AP Eintrag schaut bei mir so aus

          Cell 02 - Address: 52:02:91:4E:F1:45
                    Channel:1
                    Frequency:2.412 GHz (Channel 1)
                    Quality=70/70  Signal level=-23 dBm 
                    Encryption key:on
                    ESSID:"MicroPython-4ef145"
                    Bit Rates:5.5 Mb/s; 11 Mb/s; 1 Mb/s; 2 Mb/s; 6 Mb/s
                              12 Mb/s; 24 Mb/s; 48 Mb/s
                    Bit Rates:54 Mb/s; 9 Mb/s; 18 Mb/s; 36 Mb/s
                    Mode:Master
                    Extra:tsf=000000002a90af71
                    Extra: Last beacon: 5944ms ago
                    IE: Unknown: 00124D6963726F507974686F6E2D346566313435
                    IE: Unknown: 01088B9682840C183060
                    IE: Unknown: 030101
                    IE: Unknown: 32046C122448
                    IE: Unknown: DD0918FE34030100000000
                    IE: IEEE 802.11i/WPA2 Version 1
                        Group Cipher : TKIP
                        Pairwise Ciphers (2) : CCMP TKIP
                        Authentication Suites (1) : PSK
                    IE: WPA Version 1
                        Group Cipher : TKIP
                        Pairwise Ciphers (2) : CCMP TKIP
                        Authentication Suites (1) : PSK


Mit dem kann man sich ganz einfach verbinden.
Der ESP8266 verfügt über zwei getrennte WLAN Module (oder so ähnlich), man kann also als Client als aus als Access Point gleichzeitig auftreten. Das ist eine ganz tolle Funktion, wenn man z.B. einen WLAN Repeater bauen möchte.

ACHTUNG: will man das aber nicht, dass der ESP8266 einen Access Point startet, so muss man das explizit so festlegen. 

Aber zuerst mal das Hello World in der Microcontroller Welt: Eine LED blinken lassen.
Glücklicherweise ist auf dem ESP8266 schon eine LED drauf, angeschlossen ist diese fest über den Port 2. An der Elektronik muss man als für das Hello World noch gar nichts machen.

Also mittels screen über USB Kontakt zum Controller aufbauen, dann folgendes eintippen.

>>> from machine import Pin
>>>
>>> led = Pin(2, Pin.OUT)
>>> led.on()  # die LED geht aus, aber OK

>>> led.off()  # die LED geht wieder an

Das mit dem vertauschten ON OFF hat mit der Verkabelung der LED zu tun, ist sie entweder zwischen PIN2 und Vcc (ON = Led ist dunkel, OFF Led ist hell) oder zwischen PIN2 und GND (ON = Led ist hell, OFF = Led ist dunkel)

So direkt mit dem python Interpreter was machen ist zwar für kleinere Dinge sicher nett, aber sicher nicht das was man meistens möchte. Besser ist  es sein Programm in einer Datei abzuspeichern und dieses automatisch mit dem Controller zu starten.

Micropython startet die Datei main.py, wenn es diese auf dem Filesystem findet.

Hier mal die Datei hello_world.py

import time
# mpython specific modules
import machine
import network
def disable_ap():
    """
    per default micropython will enable an AP SSID
    this short function will disable AP Mode on startup
    for more information go to
    http://docs.micropython.org/en/v1.8.7/esp8266/esp8266/tutorial/network_basics.html
    """
    ap_if = network.WLAN(network.AP_IF)
    ap_if.active(False)
def main():
    # do some work
    led = machine.Pin(2, machine.Pin.OUT)
    while True:
        led.on()  # die LED geht aus, aber OK
        time.sleep(1)
        led.off()  # die LED geht wieder an
        time.sleep(1)
if __name__ == "__main__":
    disable_ap()  # disable access point
    while True:
        try:
            main()
        except:
            pass  # ignore exception
        finally:
            time.sleep(60) # wait 60s and try again

In dem Programm ist auch schon der Abschnitt drinnen, der den AP Modus daktiviert.

Damit das flashen von Micropython und das kopieren der Datei auf den Controller als main.py etwas einfach gestaltet, verwendet ich ein Bash script flash_mpython.py

Achtung: das script flash_mpython.py muss man mit sudo ausführen

#!/bin/bash
PORT=/dev/ttyUSB0
esptool.py --port $PORT erase_flash
esptool.py --port $PORT --baud 460800 write_flash --flash_size=detect --verify -fm dio 0x0 esp8266-20190529-v1.11.bin
echo "sleeping for 10s to wait for reset"
sleep 10
ampy -b 115200 -p $PORT put hello_world.py main.py
screen $PORT 115200


Wenn alles durchläuft, so kann man den Controller kurz vom USB trennen dann wieder einstecken und nach ein paar Sekunden sollte die LED anfangen zu blinken.



 

Esp8266 programmieren - micropython installieren

Hier mal ein paar Informationen wie man einen ESP8266 über Ubuntu programmiert und überhaupt damit umgeht.

Ich beschreib hier wie man den ESP8266 mit micropython benutzt. Anleitungen für arduino IDE gibt es schon einige, dazu sag ich nicht viel.

Den ESP8266 zuerst einmal an einem USB Port anschließen, dabei darauf achten, dass man ein vollständiges USB Kabel verwendet, nicht ein Kabel das nur zum Laden gedacht ist (ja die gibt es auch noch, und das hat mich schon mal ein paar Minuten gekostet)

Nach dem anschließen sollte mittels dmesg ein neuer serieller Port auftauchen.

[  690.410618] usb 3-2: new full-speed USB device number 2 using xhci_hcd
[  690.559940] usb 3-2: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice= 2.63
[  690.559945] usb 3-2: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[  690.559947] usb 3-2: Product: USB2.0-Serial
[  690.619457] usbcore: registered new interface driver usbserial_generic
[  690.619500] usbserial: USB Serial support registered for generic
[  690.621565] usbcore: registered new interface driver ch341
[  690.621584] usbserial: USB Serial support registered for ch341-uart
[  690.621606] ch341 3-2:1.0: ch341-uart converter detected
[  690.622318] usb 3-2: ch341-uart converter now attached to ttyUSB0


Danach benötigt man noch einige Programme, damit man etwas auf den ESP8266 übtragen kann, dazu folgendes nachinstallieren.

sudo apt install esptool python3-serial screen

Dann ist noch das Modul ampy notwendig, mit dem lassen sich ganz leicht Daten mit dem ESP8266 über seriell austauschen. Das gibts aber auch bei ubuntu 20.04 noch nicht im Repository.

sudo pip3 install adafruit-ampy

So nun sollte jetzt alles installiert sein um z.B. micropython auf dem ESP8266 zu installieren, das Image findest du hier https://micropython.org/download/esp8266/

Achtung: Wer neu in der Microcontroller Welt ist es vielleicht nicht gewohnt, dass man das Board so genau wissen muß. Es gibt nicht die eine micropython Installation, die sind alle maßgeschneidert für das eine Board.

Ich verwende hier das Image esp8266-20190529-v1.11.bin, das ich mit folgender Abfolge von Befehlen auf das Board bringe:

esptool.py --port /dev/ttyUSB0 erase_flash

Ausgabe schaut so aus

esptool.py v2.8
Serial port /dev/ttyUSB0
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 50:02:91:4e:f1:45
Uploading stub...
Running stub...
Stub running...
Erasing flash (this may take a while)...
Chip erase completed successfully in 7.5s
Hard resetting via RTS pin...


Mit dem Befehl wird der Flash gelöscht.

esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect 0 esp8266-20190529-v1.11.bin

Mit dem Befehl wird das micropython Image nun auf das Board geschrieben, die Ausgabe schaut dann bei mir so aus

esptool.py v2.8
Serial port /dev/ttyUSB0
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 50:02:91:4e:f1:45
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Flash params set to 0x0040
Compressed 617880 bytes to 402086...
Wrote 617880 bytes (402086 compressed) at 0x00000000 in 9.2 seconds (effective 539.8 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin..


Also hab ich jetzt micropython auf meinem ESP8266 drauf, super.
Und was könnte ich jetzt damit machen ...

Mit screen kann man ganz einfach mit dem Python Interpreter am Board aufnehmen und dem mit machen was man mit einem Python Interpreter auch immer machen kann.

screen /dev/ttyUSB0 115200

Dann einfach eine Taste drücken und man ist am Prompt des Interpreters, hier starte ich den Controller dann neu und frag die Frequenz ab.

MicroPython v1.11-8-g48dcbbe60 on 2019-05-29; ESP module with ESP8266
Type "help()" for more information.
>>> machine.reset()
>>>
 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x40100000, len 31024, room 16
tail 0
chksum 0xb4
load 0x3ffe8000, len 1104, room 8
tail 8
chksum 0x74
load 0x3ffe8450, len 824, room 0
tail 8
chksum 0x45
csum 0x45
����o�{��'<�d$l$ c��|;�$�g��o�$ ��s�d�$�d`��;�l�d�l`��{�lǟ�l$ ;l��{d���cĄc|l#��c|��Ą$dc��o�n'��dn���l��$d���$ �g����cdl䄇c���bd�c{l;dr�'�����o�߀�c{����$d�
MicroPython v1.11-8-g48dcbbe60 on 2019-05-29; ESP module with ESP8266
Type "help()" for more information.
>>> machine.freq()
80000000

Das einzige das ich hier dazu noch poste ist die Information, dass automatisch beim Start des Controllers das Fiel main.py ausgeführt  wird, aber dazu in einem anderen Post mehr

OpenWRT 19 und ein Edimax USB WLAN Adapter

Ich kam gerade in die Verlegenheit einen Rapsberry B+ (das erste Modell) als Open-WRT Router für Outdoor neu zu installieren und wollte dabe...