Montag, 16. November 2020

S3 Beispiele

Eine Sammlung einiger aws Befehle die ich schon benutzt habe.

Total Object Count ermitteln

aws --endpoint-url http://cloud.messner.click:8000 s3 ls s3://drive-replication --recursive --summarize

Ein Profil angeben

Ein Profile im .credentials File angeben, dazu einen Abschnitt einrichten.

aws --profile docker --endpoint-url http://docker.messner.click:8000 s3 ls s3://drive-replication --recursive --summarize

Ein Bucket anlegen

aws --profile docker --endpoint-url http://docker.messner.click:8000 s3 mb test-bucket

 Alle Buckets listen

aws --profile default --endpoint-url http://cloud.messner.click:8000 s3 ls

Ein Bucket mit einem anderen Bucket syncen

aws --profile docker --endpoint-url http://docker.messner.click:8000 s3 sync s3://webstorage-f6635276-9e5e-4d7a-a034-1e34293c7e28  s3://webstorage-monika

Ein Bucket rekursiv löschen

aws --profile docker --endpoint-url http://docker.messner.click:8000 s3 rb --force s3://webstorage-f6635276-9e5e-4d7a-a034-1e34293c7e28

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

Sonntag, 19. April 2020

Raspberry pi am TV mit Auflösung 1366x768

An einem alten Philips TV hatte ich das Problem, dass der Raspberry Pi nicht die passende Auflösung zur Auswahl anzeigte, das Bild wurde zwar immer dargestellt war aber nie scharf.
Beim googeln fand ich heraus, dass der Fernseher nur 1366x768 kann.

Die ganze Anleitung gibts hier zu lesen.
https://www.elektronik-kompendium.de/sites/raspberry-pi/2101201.htm

Man kann also die HDMI Modi selbst in der config.txt einstellen, in dem Zuge hab auch gleich eingestellt, dass der Sound über HDMI ausgegeben wird.

Also bei:

# HDMI auch ohne Monitor in Betrieb nehmen (optional)
hdmi_force_hotplug=1
# Audio über HDMI ausgeben (optional)
hdmi_drive=2
# DMT-Betriebsmodus aktivieren
hdmi_group=2
# Auflösung: 1366x768 / 60 Hz
hdmi_mode=81 


Zur Info mit den CEA/DMT Modi.

Anscheinend sind die ersten (CEA) die TV Modi, die zweiten die Modi welche bei Bildschirmen am Computer benutzt werden.

Freitag, 3. April 2020

docker redis container

Beim cloudserver gibt es die Möglichkeit einen redis Server anzugeben, hab ich natürlich als docker container auf meinem Raspberrypi installiert, hier das Startscript.

#!/bin/bash
DATA_DIR="/srv/redis"
mkdir $DATA_DIR
docker run -d \
    --name redis-cloudserver \
    -p 6379:6379 \
    -v $DATA_DIR:/data \
    redis



Testen kann man das dann ganz einfach mit einem kurzen python script.




#!/usr/bin/python3
import redis

r = redis.Redis("docker")
r.set("key", "value")
print(r.get("key").decode("utf-8"))




Python modul für redis muss natürlich installiert werden mit


sudo apt install python3-redis


Ob der Cloudserver nun den redis Server verwendet bin ich mir noch nicht ganz sicher, mal schauen woran man das erkennen sollte.

Hier das neue Startscript für den cloudserver mit den Redis Variablen

#!/bin/bash
ACCESS_ID="214398ae-11fb-4fe3-b516-3b566973daffe"
ACCESS_KEY="denrichigenschreibichhiernnichthin"
DATA_DIR="/srv/s3/data"
META_DIR="/srv/s3/metadata"
docker run -d \
    --name cloudserver \
    -p 8000:8000 \
    -e SCALITY_ACCESS_KEY_ID=$ACCESS_ID \
    -e SCALITY_SECRET_ACCESS_KEY=$ACCESS_KEY \
    -v $DATA_DIR:/usr/src/app/localData \
    -v $META_DIR:/usr/src/app/localMetadata \
    -e ENDPOINT=docker \
    -e REMOTE_MANAGEMENT_DISABLE=1 \
    -e S3BACKEND=file \
    -e REDIS_HOST=docker.messsner.click \
    -e REDIS_PORT=6379 \
    cloudserver

Donnerstag, 19. März 2020

VirtualBox unter Ubuntu 19.10

VirtualBox unter Ubuntu 19.10

Homeoffice sei Dank, soll ich mir jetzt Cisco Webex Meeting und Cisco Webex Teams installieren, beides Programme die nativ unter Linux bzw. im Browser nicht so recht funktionieren.
Ich hab für solche Fälle meine Windows Workstation als virtuelle Maschine in VirtualBox laufen.

Auf der Seite findet man eigentlich alle Pakete:

https://download.virtualbox.org/virtualbox/6.1.4/

ich hab mich dazu entschieden die Version von Oracle zu verwenden, damit ich die neueste Version habe (Version 6.0.14 ist im Repository, Version 6.1.4 die aktuellste)

zuerst die Ubuntu version deinstallieren

apt remove virtualbox-*

dann die von Oracle installieren

https://download.virtualbox.org/virtualbox/6.1.4/virtualbox-6.1_6.1.4-136177~Ubuntu~eoan_amd64.deb

die Guest Additions gleich mit runter laden

https://download.virtualbox.org/virtualbox/6.1.4/VBoxGuestAdditions_6.1.4.iso

dann noch das Extention Pack, weil ich die Videokamera und das USB Mikrofon durchschleifen will

https://download.virtualbox.org/virtualbox/6.1.4/Oracle_VM_VirtualBox_Extension_Pack-6.1.4.vbox-extpack

Installation neues .deb ist gar kein Problem, ich hab danach meinen Linux Host neu gestartet, weil auch gleich den Kernel auf den letzten Stand gebracht habe.

Guest Additions dann im Windows installiert und die Extentions bei der Konfiguration von VirtualBox. Danach lassen sich USB Geräte der virtuellen Maschine zuordnen.

Sonntag, 8. März 2020

Retroflag GPICase - Raspberrypi Zero W mit Lakka


Habe eine Retroflag GPICase gekauft, ein sozusagen gameboy Nachbau. War echt einfach zusammen zu bauen, nur wie es dann mit der Software weiter geht, steht nicht so klar in der Anleitung. Ich hab dann etwas gegoogelt und habe mit Lakka runter geladen, das ist sozusagen der Emulator für dieverse Roms, und zusätzlich noch als maßgeschneidertes Image für das Retroflag GPICase.

Beim ersten Start muss man unbedingt geduldig sein, und die vergrößerung des Filesystems abwarten, danach ist man im Hauptmenü von Lakka.

Dort als erstes WIFI konfiguriert und ein Online Update gemacht (alte ITler Krankheit sofort nach dem letzten Update zu suchen). Danach sollte man einige Roms haben, sonst ist das Ding irgendwie langweilig.

Roms Punkt Download könnte man z.B. aufsuchen und wenn man da unter Umständen etwas findet lässt sich das mittels scp auf den RaspberryPi Zero W übertragen.

scp -r . root@192.168.0.529:/storage/roms/downloads/

Benutzer root mit root als Passwort ist die Default Einstellung die man sicher irgendwo ändern kann.

Danach im Menü nach seinen Roms suchen lassen, dann Load Content - damit ist das Rom gemeint - auswählen, danach muss man noch den Emulator auswählen den mit dem Rom benutzen möchte (muss natürlich zusammen passen, sonst klappts nicht) und schon geht der Spaß los.

Tolles Ding.

Dienstag, 25. Februar 2020

Raspberrypi 2 als Docker Host

Raspberry PI 2 als Docker Host verwenden

Wer kommt denn auf so eine Idee mag der ein oder andere sagen, ich finds einfach interessant es auszuprobieren. Folgende Grundvoraussetzungen lege ich fest.
  • Raspberry PI 2 Modell
  • 32 Gb SD Card
  • raspbian buster
  • nur die notwendigsten Pakete nachinstallieren
  • eine SSD am USB Port
  • übertakten was geht, aber zuerst default
  • es sollte der cloudserver container funktionieren
  • Erreichbar über Ethernet mit einer statischen IP

Grundinstallation

Raspian Image runterladen, mit dd auf eine SD kopieren und dann nochmal mounten und folgende Dinge vorbereiten, damit der Rapsberry gleich nach dem ersten Start per Ethernet am Netz ist
  • eine leere ssh Datei in /boot positionieren
  • den hostname in /etc/hostname anpassen
  • die statische IP in /etc/dhcpcd.conf eintragen

Nach dem ersten Start

  • ssh login mittels pi und raspberry
  • passwort von pi ändern
  • ssh-keygen damit SSH Keys generiert werden
  • eigenen public key in ~/.ssh/authorized_keys eintragen
  • sudo apt update && sudo apt -y upgrade

Docker installieren

So jetzt zur eigentlichen Docker Installation, folgende Pakete habe ich dafür nachinstalliert.
  • sudo apt install vim vim-syntax-docker docker-compose docker.io 
Damit man mit dem User pi auch docker ohne sudo bedienen kann noch den User pi zur Gruppe docker hinzufügen
  •  sudo usermod -G docker pi
Damit muss man sich entweder neu einloggen oder mit dem Befehl newgrp docker die aktuelle Session aktualisieren.

Die SSD mit einbauen

Die SSD habe ich schon mittels XFS formatiert auf dieser sollen dann die eigentlichen Daten des Containers aber auch die Docker Images liegen, damit diese schneller arbeiten. Normalerweise liegen alle Files von Docker unter /var/lib/docker und damit auf der SD Karte, und die ist gegen die SSD richtig lahm, auch denn der Raspberry PI 2 nur USB 2.0 kann.
  • sudo systemctl stop docker.service
  • sudo mkdir /data
  • sudo mount /dev/sda1 /data
  • sudo mv /var/lib/docker /data
  • sudo ln -s /data/docker /var/lib
  • sudo systemctl start docker.service
Danach ist z.B. das Image bauen um einiges schneller.

Cloudserver Image bauen

Den Cloudserver gibt es nicht für die armv7 Architektur, daher muss man sich das Image aus dem git repository selbst bauen.
  • git clone https://github.com/scality/S3.git
  • cd S3
  • docker build --label cloudserver .
Das hat jetzt bei mir rund 10 Minuten gedauert

real 10m51.271s
user 0m2.531s
sys 0m0.811s


Cloudserver starten
zum starten des Images verwende ich folgendes Skript

#!/bin/bash
# die beiden nachfolgenden Werte sind nicht die ich verwendet habe
ACCESS_ID="845c339e-9a86-fff2-964c-2613b10902d8"
ACCESS_KEY="464492933asdase08b75c56bb3f99d3e43b52148e598a776d6e89e9139763e243"
DATA_DIR="/data/s3/data"
META_DIR="/data/s3/metadata"
docker run -d \
    --name cloudserver \
    -p 8000:8000 \
    -e SCALITY_ACCESS_KEY_ID=$ACCESS_ID \
    -e SCALITY_SECRET_ACCESS_KEY=$ACCESS_KEY \
    -v $DATA_DIR:/usr/src/app/localData \
    -v $META_DIR:/usr/src/app/localMetadata \
    -e ENDPOINT=docker.messner.click \
    -e REMOTE_MANAGEMENT_DISABLE=1 \
    -e S3BACKEND=file \
    cloudserver


Damit das funktioniert habe ich noch folgendes davor gemacht.
  • mkdir /data/s3
  • mkdir /data/s3/data
  • mkdir /data/s3/metadata
  • uuidgen -> das erzeugt die ACCESS_ID
  • openssl rand -hex 32 -> das erzeigt den ACCESS_KEY

Overclocking

Als erstes einfach über raspi-config das Overclocking auf high setzen und den Raspberry neu starten. Ich probier dann einfach nochmal das Image from scratch zu bauen.

Uups - Netzteil ist zu schwach, ich bekomme im dmesg undevoltage Meldungen, also muss ich den Test wohl verschieben.

Sonntag, 23. Februar 2020

Docker container restart policy ändern

Docker Container Restart Policy ändern

Meist ist in den Beschreibungen drinnen wie man mit docker run einen Container so enstellt, dass er automatisch mit docker startet, aber wie macht man das bei einem bereits gestarteten Container macht, insbesondere wenn man ihn nicht neu starten will, habe ich hier beschrieben.

Zuerst schaut man sich die Config des Containers mit docker inspect cloudserver an, dabei ist der Abschnitt Restart Policy wichtig

            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            }


Also ist bei dem Container nichts gesetzt, das ändere ich mit

docker container update --restart "unless-stopped" cloudserver

und shau mir die Config danach noch einmal an

            "RestartPolicy": {
                "Name": "unless-stopped",
                "MaximumRetryCount": 0
            }


Probe dann mit einem Restart des Hosts.

Disable WIFi and Bluetooth auf einem Rapsberrypi 4

Disable WIFI and BT on Raspberrypi in raspbian

Für manche Projekte braucht man einfach kein WIFI und bei BT, bei mir verwende ich den Raspberrypi 4 mit raspbian drauf als docker host am Ethernet. Mit den zwei Einträgen in der /boot/config.txt kann man beie Module deativieren (deaktivieren ist vielleicht nicht ganz richtig, zumindest werden die Treiber nicht geladen)

# disable WIFI and BT on this server
dtoverlay=disable-wifi
dtoverlay=disable-bt




Donnerstag, 20. Februar 2020

Chromium Snap in Ubuntu 19.10 und Flash

Flashplugin in Chromium Snap in Ubuntu 19.10 aktivieren

Und plötzlich nach dem letzten Update geht das Flashplugin im Chromium nicht mehr. Ja, ich weiß, Flash sollte schon seit Jahren nicht mehr benutzt werden, aber das interessiert anscheinend einige Hersteller von Businesssoftware nicht. Zumindest bei zwei wichtigen Applikationen in meinem Beruf komme ich um Flash nicht umhin.
Also Update gemacht - Flash funktioniert nicht, auch wenn ich es erlaube.

cd ~
find /usr -name libpepflashplayer.so
mkdir snap/chromium/current/.local/lib/
 cp /usr/lib/adobe-flashplugin/libpepflashplayer.so snap/chromium/current/.local/lib/
rm snap/chromium/current/.local/lib/libflashplayer.so 


Die Anleitung hae ich von der Seite https://help.ubuntu.com/stable/ubuntu-help/net-install-flash.html.en - gaanz am Ende der Seite

Dienstag, 11. Februar 2020

Raspberry mit OpenWRT und ZTE MF833V

Raspberry mit OpenWRT und LTE Modem

Bei Hofer das ZTE MF833V gekauft, SIM rein und am Laptop mal ausprobiert das Ding generiert über USB eine Netzwerkschnittstelle, einfach einzurichten - am Laptop.

Am OpenWRT muss man noch was nachinstallieren.

opkg install usb-modeswitch kmod-usb-net-cdc-ether
Danach in luci bei interfaces auf add interface, und es ist eine USB Ethernet Schnittstelle vorhanden, bei advanced settings in die WAN Firewall gruppe geben.

Das Interface am USB Modem hat die IP Adresse 192.168.0.1, man sollte com lokalen LAN auf die Webseite zugreifen können.

Der OpenWRT erhält eine dynamische IP im 192.168.0.0 Netzwerk.

Im Lokalen Netzwerk sollte das Netz 192.168.0.0/24 nicht verwendet werden, sonst bekommt man Routing Probleme.

Raspian Buster Headless mit WLAN

Raspbian Buster Headless mit WLAN

Das Image runterladen und auf eine SD brennen, danach nochmal am Laptop einstecken damit die SD nun gemounted wird (ich hab linux da geht das ganz enfach).

anonymous@ws00007999:~/Downloads$ sudo dd if=2019-09-26-raspbian-buster-lite.img of=/dev/mmcblk0 bs=1M
[sudo] Passwort für mesznera:
2144+0 Datensätze ein
2144+0 Datensätze aus
2248146944 Bytes (2,2 GB, 2,1 GiB) kopiert, 190,292 s, 11,8 MB/s
 
anonymous@ws00007999:~/Downloads$ sudo sync

Am /boot Filesystem eine leere ssh Datei anlegen, das startet den SSH Server.

touch ssh

Am / unter /etc/wpa_supplicant eine wpa_supplicant.conf anlegen, in etwa:

country=AT
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
    ssid="irgendeineSID"
    psk="sowasvongeheim"
}


Danach das Ding einfach starten, vielleicht beim Router mitschauen welche IP der raspberry bekommt und dann den Login probieren.

Wenn der raspberry nicht ans Netz geht, bleibt nicht anderes übrig als auf der SD die Logfiles unter /var/log zu untersuchen. 

MQTT Server mosquitto auf OpenWRT installieren

 MQTT Server am OpenWRT

Für meine IOT habe ich mit einen mosquitto Server auf meinem OpenWRT Router nachinstalliert, dazu auch noch ein Plugin für collectd das statistische Daten vom OpenWRT Router über MQTT verschickt.

opkg install mosquitto
opgk install collectd
opkg install collectd-mod-ping
opkg install collectd-mod-mqtt
opkg install collectd-mod-load

direkt über VPN hat vom ESP nicht funktioniert, deshalb zuerst auf den OpenWRT, dann als Bridge weiter

Brigde ist ziemlich easy in der mosquitto.conf

zum ausprobieren einfach ein einem Terminal ein Subscriber starten

mosquitto_sub -h 192.x.x.3 -t "#"

und in einem anderen einen Publisher
 mosquitto_pub -h 192.x.x.3 -t "som/topic" -m "some_message" 

Die some_message sollte beim Subscriber sichtbar sein.
In dem Beispiel habe ich Security nicht beachtet, jeder aus dem internen LAN kann den MQTT Server erreichen.
 

Samstag, 8. Februar 2020

Docker Images und Container aufräumen

Docker Images und Container aufräumen

Nach einiger Zeit sollte man alte Container und Zwischenimages entfernen um Platz am docker host frei zu bekomme.

Die benötigten Container sollte vor diesem Schritt alle laufen. Dazu verwendet man folgende Befehle.

pi@docker:~ $ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
7c9633c39fdb5279d997e4297d839b62de9e85cfe7c209622c4e6cf09db42f41
9056bacdc968963f8a659b47df6e9f69c70883e2c82ba6c482847f62ae1ae521
53da0935a55d0dfaa1fbd64dbfd7bacc2074b94b377908edf7fa39d0e7833f61
a5b06a8fbc57c20d8f221de0194e1c8d56f190b2be4b5fcc97dc170c0ae76ade
b6ffa7f91fec84b5c0847c802f712d2afb4ab89866d6241f15e5065c7162fba3
48b4128445a2ac8130acd93cf56dc9d2d7da7e9509bc181a9aba21ac9af3d17f
c05271c11ae3daf6712aec5be49a6d75540d1326d99cca9f546ec4fa04a90cff
a6337962cedb07aba8f1684791111faf80c975ef8e5c107333743665824911a2
48cc6ea418c0ca2781f2a0412fe524a64eca2ea7bc3a5a9d715e0c0c279a8512

Total reclaimed space: 159.3MB



und anschließend die Images

pi@docker:~ $ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
deleted: sha256:d0f4d88581ca101cc6a1b68d608f0013ba8b4f7e2384e39545c632cde59a9454
deleted: sha256:ad81b267e96ac7d255ad7dc634ad3e2d26a7738207d652743f02bcc8cab29333
deleted: sha256:fde3d359b89833896dc01442e910bfb4ae06973eb5b4b6fb1da74a8876cc4276
deleted: sha256:f42cff5b5ec22ec82201e30c77724a73d017292315f9184965b3217296effebc
deleted: sha256:79fc19398748c61113ae9bb96008a92d43c9c7ceb539807244704f53aa8d8707
deleted: sha256:51e4fae07fb8b26cdad0ec3e32a37f15f7a03a80e558a29e024899f5a7badc76
...

sha256:658ed93a9c797a04162e28e56a6923e9d8f33e8283a7e74135018e0eed89707b
deleted: sha256:25dfd9da901de564ce1e843fa9b3bff6b495e798c0dbd80450c4620ba41b8805
deleted: sha256:d7a487af9f946299aacb853c8a0db6f0853a45663f34fb60dc22ac769f85c506
untagged: graphiteapp/graphite-statsd@sha256:b5d360c70a1de7e703b72e822f89fa853c99f972193b146ea7b5e981cf5bcf6a
deleted: sha256:5881ff30f9a57993a8f5e9540f43e2590b5c363f3f943316f20133c1e387cf73
deleted: sha256:2b92e4595dc1e32ded5cb90dc917e2b513292559abf78a8451c9cea836a493fd
deleted: sha256:5946270a64248d9aa5dd6717bc8368b77d68c99edc09671e138d8a09e6881e9e
deleted: sha256:f32d301e6e7d5122e3e0005a58bcc642bce10c0447638477005273b26e8d401d
deleted: sha256:77cae8ab23bf486355d1b3191259705374f4a11d483b24964d2f729dd8c076a0

Total reclaimed space: 926.3MB


Hat bei mir auch 1GB gebracht.

Docker mariadb für raspberrypi

Docker mariadb für raspberrypi

Das offizielle Repository hat kein Image für den raspberrypi, also selbst eines machen. Geht ganz einfach, haben wir gleich

pi@docker:~ $ git clone https://github.com/docker-library/mariadb.git
Cloning into 'mariadb'...
remote: Enumerating objects: 28, done.
remote: Counting objects: 100% (28/28), done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 1324 (delta 17), reused 21 (delta 12), pack-reused 1296
Receiving objects: 100% (1324/1324), 252.13 KiB | 952.00 KiB/s, done.
Resolving deltas: 100% (619/619), done.
pi@docker:~ $ cd mariadb/
pi@docker:~/mariadb $ ls
10.1  10.2  10.3  10.4  docker-entrypoint.sh  Dockerfile.template  generate-stackbrew-library.sh  LICENSE  README.md  update.sh
pi@docker:~/mariadb $ cp Dockerfile.template Dockerfile
pi@docker:~/mariadb $ vim Dockerfile





Danach machen wir das Image, haben wir gleich ... !!ACHTUNG!!

Da wwar das haben wir gleich, und alles wird komplizierter.

Das git kann man am raspberrypi leider nicht direkt nutzen, weil es ein mariadb Repository hinzufügt, und dieses Repository leider keine Binary Packages für raspberrypi hat. Also schlägt die Installation von mariadb-server fehl.

Eigentlich ist es mir aber egal, wenn ich nicht die top aktuelle mariab hab, ich bin mit der stock Ubuntu Version auch zufrieden, da nehm ich am liebsten die LTS 18.04

Also eine Kopie des 10.1 Verzeichnisses im mariadb directory angelegt, dann das Dockerfile angepasst.

pi@docker:~ $ diff mariadb/10.1/Dockerfile mariadb/stock/Dockerfile
79c79
< ENV MARIADB_VERSION 1:10.1.44+maria-1~bionic
---
> ENV MARIADB_VERSION 1:10.1.44-0ubuntu0.18.04.1
81,91d80
< # (https://downloads.mariadb.org/mariadb/+releases/)
<
< RUN set -e;\
<     echo "deb http://ftp.osuosl.org/pub/mariadb/repo/$MARIADB_MAJOR/ubuntu bionic main" > /etc/apt/sources.list.d/mariadb.list; \
<     { \
<         echo 'Package: *'; \
<         echo 'Pin: release o=MariaDB'; \
<         echo 'Pin-Priority: 999'; \
<     } > /etc/apt/preferences.d/mariadb
< # add repository pinning to make sure dependencies from this MariaDB repo are preferred over Debian dependencies
< #  libmariadbclient18 : Depends: libmysqlclient18 (= 5.5.42+maria-1~wheezy) but 5.5.43-0+deb7u1 is to be installed
102,104c91
<         "mariadb-server=$MARIADB_VERSION" \
< # mariadb-backup is installed at the same time so that `mysql-common` is only installed once from just mariadb repos
<         mariadb-backup-10.1 \
---
>         mariadb-server \


dann mit

docker build -t mariadb mariadb/stock

erzeugt, hat funktioniert. Sagte ja: "haben wir gleich"

Dann noch ein Startscript run_mariadb.sh

#!/bin/bash
docker run \
    --name mariadb \
    -v /data/mariadb/mysql:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=sagichnicht \
    -d mariadb:latest


und das ganze kann losgehen mit

./run_mariadb.sh

Docker Image updaten

Docker Image updaten

Ich habe seit einiger ein Zeit Docker image für den S3 cloudserver laufen, ich wollte heute mal probieren wie man ein Docker Image updated.

Der Container ist gestartet

pi@docker:~/S3 $ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
81d295a09a05        15ef9ede3b46        "/usr/src/app/docker…"   4 weeks ago         Up 4 weeks          0.0.0.0:8000->8000/tcp   cloudserve


Ich hab das Image selbst aus dem git gebaut, weil es für raspberrpy kein Image gibt. zuerst aktualisier ich ddas git repository

pi@docker:~/S3 $ git pull
remote: Enumerating objects: 202, done.
remote: Counting objects: 100% (202/202), done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 269 (delta 193), reused 198 (delta 192), pack-reused 67
Receiving objects: 100% (269/269), 99.52 KiB | 613.00 KiB/s, done.
Resolving deltas: 100% (206/206), completed with 79 local objects.
From https://github.com/scality/S3
   4332d0a1..fdcbd315  development/8.2                                                      -> origin/development/8.2
 * [new branch]        bugfix/S3C-2502-vault-req-ip-header                                  -> origin/bugfix/S3C-2502-vault-req-ip-header
 * [new branch]        bugfix/S3C-2503-allow-multiple-same-email-address-ACLs-in-single-req -> origin/bugfix/S3C-2503-allow-multiple-same-email-address-ACLs-in-single-req
 * [new branch]        bugfix/S3C-2544-diff-acct-metrics                                    -> origin/bugfix/S3C-2544-diff-acct-metrics
 * [new branch]        bugfix/setup-maven-https-repo                                        -> origin/bugfix/setup-maven-https-repo
   9c524ca9..396f100a  development/7.4                                                      -> origin/development/7.4
   6f0b50a9..8117dd02  development/7.6                                                      -> origin/development/7.6
 * [new branch]        development/7.7                                                      -> origin/development/7.7
   16b65ed2..6b4671b2  development/8.1                                                      -> origin/development/8.1
 * [new branch]        exp/exposeCountItems                                                 -> origin/exp/exposeCountItems
 * [new branch]        exp/perfMetadata                                                     -> origin/exp/perfMetadata
   dfff880a..1b7aa4f7  hotfix/7.4.5                                                         -> origin/hotfix/7.4.5
 * [new branch]        stabilization/7.6.0                                                  -> origin/stabilization/7.6.0
 * [new branch]        w/7.6/bugfix/S3C-2502-vault-req-ip-header                            -> origin/w/7.6/bugfix/S3C-2502-vault-req-ip-header
 * [new branch]        w/7.6/bugfix/S3C-2544-diff-acct-metrics                              -> origin/w/7.6/bugfix/S3C-2544-diff-acct-metrics
 * [new branch]        w/7.7/bugfix/S3C-2502-vault-req-ip-header                            -> origin/w/7.7/bugfix/S3C-2502-vault-req-ip-header
 * [new branch]        w/7.7/bugfix/S3C-2544-diff-acct-metrics                              -> origin/w/7.7/bugfix/S3C-2544-diff-acct-metrics
 * [new branch]        w/8.1/bugfix/S3C-2502-vault-req-ip-header                            -> origin/w/8.1/bugfix/S3C-2502-vault-req-ip-header
 * [new branch]        w/8.1/bugfix/S3C-2544-diff-acct-metrics                              -> origin/w/8.1/bugfix/S3C-2544-diff-acct-metrics
 * [new branch]        w/8.2/bugfix/S3C-2502-vault-req-ip-header                            -> origin/w/8.2/bugfix/S3C-2502-vault-req-ip-header
 * [new branch]        w/8.2/bugfix/S3C-2544-diff-acct-metrics                              -> origin/w/8.2/bugfix/S3C-2544-diff-acct-metrics
 * [new tag]           7.6.0.0_rc1                                                          -> 7.6.0.0_rc1
 * [new tag]           7.4.5.1                                                              -> 7.4.5.1
Updating 4332d0a1..fdcbd315
Fast-forward
 .dockerignore                                       |   3 +-
 Dockerfile                                          |   7 +-
 eve/main.yml                                        |   5 ++
 lib/kms/utilities.js                                |   2 +-
 lib/utilities/aclUtils.js                           |  13 ++--
 package.json                                        |   4 +-
 tests/functional/aws-node-sdk/test/bucket/putAcl.js |  19 +++++
 tests/functional/jaws/pom.xml                       |   4 +-
 tests/unit/api/bucketPutACL.js                      |  44 +++++++++++
 yarn.lock                                           | 451 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------
 10 files changed, 364 insertions(+), 188 deletions(-)


Aha, neue Commits. Dann lese ich mir genau durch was geändert wurde (ist gelogen ich will hier nur mal probieren wie man den Container aktualisiert)

ich baue ein neues Image

docker build -t cloudserver .
< es folgt sehr viel Output, den ich hier nicht reinschreibe >

ich stoppe den laufenden Container

git stop cloudserver

ich lösche den Container - und jetzt stellt sich wohl jeder die Frage ob wohl alle Daten auf einer persistent Storage sind.

git rm cloudserver

ich starte den Container wieder, dazu habe ich ein kurzen Bash Script.

cloudserver_run.sh

in dem Bashscript stehen alle Startparameter drinnen.
Danach ein kleines Skript gestartet, das den S3 Server testet - haut hin

Montag, 3. Februar 2020

Be warned,

'Haben wir gleich' is a german phrase often IT system engineers use if they think this problem is done in a couple of moments, and the solution is trivial.

Often this type of problem appears to be harder than thought, catastrophic and desastrous. The amount of time used to solve this problem will be exponentially larger than initially planed, and the IT system engineer is near loosing his mind about this case.

So in german never use this sentence, it will bring you bad luck.

Speaking of own experience in IT

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...