Seitenleiste

cd ~/

Home of Daniel Graf

Seiten

Suche

Blog Meta

Dynamo Dresden

Galerie

blog

Blog

Windows 10 IoT Core als VM für VMware Workstation

Da ich gerade an einem privaten Projekt mit einem Raspberry Pi 3 und Windows 10 IoT Core arbeite, und nicht ständig die (wenn auch kleine/minimale) Hardware mit mir herumschleppen möchte, wäre eine VM in meiner VMware Workstation sehr wünschenswert. Microsoft selbst bietet allerdings kein fertiges VM Image an.

Trotzdem kann man sich in wenigen Schritten selbst ein Image bauen. Dazu benötigt man folgendes:

Das heruntergeladene Image hängt man als erstes in sein Windows 10 ein. Anschließend wird der im Image enthaltene MSI Installer ausgeführt und zum Abschluss gebracht. Startet nun eine Konsole und ruft die heruntergeladene Datei ImgMount.exe mit der Datei flash.ffu auf:

C:\Users\daniel\Desktop\ImgMount\ImgMount.exe 'C:\Program Files (x86)\Microsoft IoT\FFU\MinnowBoardMax\flash.ffu'

Damit wird das Flash Image in eine VHD konvertiert und anschließend in das Dateisystem eingebunden. Nach der Konvertierung wird ein neues Explorer Fenster gestartet welches das gemountete VHD Image anzeigt. Dieses Fenster könnt ihr schließen. Startet statt dessen die /Computerverwaltung/. Unter der Datenträgerverwaltung solltet ihr nun einen neuen Datenträger mit 4 Partitionen sehen. Klickt diesen Datenträger mit der rechten Maustaste an und trennt die virtuelle Festplatte. Den Pfad zum VHD Image, der vorher im Dialog noch angezeigt wird, solltet ihr euch kopieren.

Verschiebt dieses VHD Image nun in das Verzeichnis, in dem sich auch eure VMware VMs verschieben. Erstellt in VMware Workstation eine neue (custom) VM mit folgenden vom Standard abweichenden Werten:

  • I Will install the operating system later
  • Guest OS: Microsoft Windows 10
  • Firmware type: EFI
  • Virtual disk type: SATA
  • Use an existing virtual disk
  • Existing Disk File: Pfad zum VHD Image

Das war es auch schon. Die VM könnt ihr nun starten und nach kurzem warten begrüßt euch der Windows 10 IoT Core Installer. Viel Spaß!

2016/10/18 09:27 · Daniel Graf · 6 Kommentare

AWS Route53 Client für Synology DSM

Schon seit längerer Zeit nutze ich meine Synology um meine Webseite zu hosten. Da ich allerdings an meinem Heim-Anschluss, an dem meine Synology steht, keine statische IP Adresse habe die ich im DNS meiner Domains hinterlegen kann, muss es ein CNAME Eintrag auf eine DynDNS Adresse auch tun. Damit ergibt sich allerdings ein Problem. CNAMEs sind auf der obersten Ebene einer Domain nicht zugelassen.

Zitat RFC1912, Abschnitt 2.4: A CNAME record is not allowed to coexist with any other data.

Das heißt, ich kann zwar für www.debian-hell.org einen CNAME hinterlegen, aber nicht für debian-hell.org, was dann irgendwie auch das selfhosting kaputt macht.

Irgendwie bin ich dann wieder bei AWS gelandet und habe mir Route53 angesehen, den Amazon DNS Service. Und der unterstützt via API Updates der Records im DNS :-) Sprich, man könnte sich einen eigenen Client für AWS Route53 schreiben. Das habe ich auch getan, herausgekommen ist ein Bash Script welches sowohl den IPv4 A Record setzt als auch den IPV6 AAAA Record:

update_route53.sh
#!/bin/bash
 
_HOME="/volume1/homes/admin/scripts"
_DOMAIN_RECORDS="HOSTEDZONEID01#domain.de
                 HOSTEDZONEID02#domain2.de"
_CURRENT_IPV4=$( nslookup -query=A dyndns-adresse.der-synology.de 8.8.8.8 | \
                 egrep "^Address:" | \
                 tail -1 | \
                 awk -F" " '{ print $2 }' )
_CURRENT_IPV6=$( nslookup -query=AAAA dyndns-adresse.der-synology.de 8.8.8.8 | \
                 egrep "has AAAA address" | \
                 awk -F' ' '{ print $NF }' )
 
function UpdateRoute53() {
 
  ipcalc -n "${_CURRENT_IPV4}/32" > /dev/null 2>&1
  if [ ${?} -eq 255 ] ; then
 
    for _DOMAIN_RECORD in ${_DOMAIN_RECORDS} ; do
      _DOMAIN_ID=$( echo ${_DOMAIN_RECORD} | awk -F'#' '{ print $1 }' )
      _DOMAIN_NAME=$( echo ${_DOMAIN_RECORD} | awk -F'#' '{ print $2 }' )
      cat >> ${_HOME}/update_route53.tmp << EOF
        {
          "Comment":"$( date +%Y%m%d_%H%M%S )",
          "Changes":[
            {
              "Action":"UPSERT",
              "ResourceRecordSet":{
                "ResourceRecords":[
                  {
                    "Value":"${_CURRENT_IPV4}"
                  }
                ],
                "Name":"${_DOMAIN_NAME}",
                "Type":"A",
                "TTL":300
              }
            },
            {
              "Action":"UPSERT",
              "ResourceRecordSet":{
                "ResourceRecords":[
                  {
                    "Value":"${_CURRENT_IPV4}"
                  }
                ],
                "Name":"*.${_DOMAIN_NAME}",
                "Type":"A",
                "TTL":300
              }
            }
          ]
        }
EOF
      aws route53 change-resource-record-sets --hosted-zone-id ${_DOMAIN_ID} --change-batch file://${_HOME}/update_route53.tmp
 
      rm ${_HOME}/update_route53.tmp
    done
 
    /usr/syno/bin/synodsmnotify admin "Route53 IP update" "The external IP address has changed from ${_SAVED_IP} to ${_CURRENT_IPV4}"
 
    echo ${_CURRENT_IPV4} > ${_HOME}/update_route53.ip4
 
  fi
 
  for _DOMAIN_RECORD in ${_DOMAIN_RECORDS} ; do
    _DOMAIN_ID=$( echo ${_DOMAIN_RECORD} | awk -F'#' '{ print $1 }' )
    _DOMAIN_NAME=$( echo ${_DOMAIN_RECORD} | awk -F'#' '{ print $2 }' )
    cat >> ${_HOME}/update_route53.tmp6 << EOF
      {
        "Comment":"$( date +%Y%m%d_%H%M%S )",
        "Changes":[
          {
            "Action":"UPSERT",
            "ResourceRecordSet":{
              "ResourceRecords":[
                {
                  "Value":"${_CURRENT_IPV6}"
                }
              ],
              "Name":"${_DOMAIN_NAME}",
              "Type":"AAAA",
              "TTL":300
            }
          },
          {
            "Action":"UPSERT",
            "ResourceRecordSet":{
              "ResourceRecords":[
                {
                  "Value":"${_CURRENT_IPV6}"
                }
              ],
              "Name":"*.${_DOMAIN_NAME}",
              "Type":"AAAA",
              "TTL":300
            }
          }
        ]
      }
EOF
    aws route53 change-resource-record-sets --hosted-zone-id ${_DOMAIN_ID} --change-batch file://${_HOME}/update_route53.tmp6
 
    rm ${_HOME}/update_route53.tmp6
  done
 
  echo ${_CURRENT_IPV6} > ${_HOME}/update_route53.ip6
 
}
 
if [ -z "${_CURRENT_IPV4}" ] ; then
  exit
fi
 
if [ ! -e ${_HOME}/update_route53.ip4 ] ; then
  UpdateRoute53
fi
 
_SAVED_IP=$( cat ${_HOME}/update_route53.ip4 )
 
if [ "${_SAVED_IP}" != "${_CURRENT_IPV4}" ] ; then
  UpdateRoute53
fi

Anzupassen sind die Variable _HOME (das Arbeitsverzeichnis für das Script), die Domain(s) in der Variable _DOMAIN_RECORDS (hier muss man die Hosted Zone ID und die dazugehörige Domain eintragen, getrennt mit einem # und pro Zeile nur ein Eintrag) und der DynDNS Name in den Variablen _CURRENT_IPV4 und _CURRENT_IPV6 (statt dyndns-adresse.der-synology.de).

Damit das Script auch läuft benötigt man aber die AWS CLI. Diese lässt sich mit folgenden Commands installieren:

curl -O https://bootstrap.pypa.io/get-pip.py
python get-pip.py
pip install awscli

Anschließent muss die AWS CLI noch konfiguriert werden. Hierzu benötigt man einen Access- und Secret-Key den man in der AWS Web Konsole anlegen muss:

aws configure

Anschließend kann man das Script auch schon nutzen. Ich habe es in meiner Synology als Cronjob eingetragen. Übrigens: Durch den Aufruf von synodsmnotify in dem Script meldet die Synology nach einem Update im Notification Center das Update der DNS Einträge.

2016/09/23 12:39 · Daniel Graf · 0 Kommentare

screen für die Synology DS213+ kompilieren

Eines meiner absoluten Lieblings-Tools unter Linux ist und bleibt screen. Für meine Synology DS213+ gibt es vom Hersteller allerdings kein Paket. Zwar kann man sich screen von SynoCommunity über das Paket Disk Utils installieren, allerdings habe ich Bedenken fremde Paket-Quellen in meine NAS einzubinden.

Deshalb habe ich mich auf die Suche begeben, screen selbst zu kompilieren. Dabei bin ich auf das Synology Dev Center gestoßen, welches eigentlich sämtliche Möglichkeiten bietet, um Software selbst zu kompilieren. Allerdings ist mir entweder der configure oder der make Prozess um die Ohren geflogen.

Deshalb habe ich mir die Paketquelle SynoCommunity noch mal angesehen, und bin dabei auf spksrc gestoßen, ein Cross Compilation Framework für Synology. Bingo :-) Der Rest war dann eigentlich ein Selbstläufer:

git clone https://github.com/SynoCommunity/spksrc.git
cd spksrc/
make setup
cd cross/screen/
make arch-qoriq-5.2

Das Paket lässt sich natürlich auch für andere Plattformen als die DS213+ kompilieren. Dafür muss im make Command statt qoriq der jeweilige Architektur-Code genutzt werden. Die Zuweisung ist hier zu finden.

Anschließend findet sich im Verzeichnis ein Ordner mit dem Namen work-qoriq-5.2 wieder, in dem die Verzeichnis-Struktur install/usr/local/ vorhanden ist. Der Inhalt des Ordners (bin, include, lib und share) wird auf der Synology nach /usr/local/ kopiert. Anschließend kann man auch schon screen aufrufen und damit arbeiten :-)

2016/04/25 09:43 · Daniel Graf · 0 Kommentare

Broadcom QLogic 57810 10G NIC verliert Verbindung bei erhöhter Netzwerk-Last

Bei einem Kunden hatte ich zuletzt Probleme mit einer Broadcom QLogic 57810 10G NIC unter vSphere 5.5.0 3248547 (Lenovo Custom Image) festgestellt.

Wurde auf einem ESXi Host eine Thick Provision Eager-Zeroed vDisk angelegt, z.B. mit einem TB Größe, brach dieser Vorgang bei 80% aller Tests ab. Die ESXi Hosts haben die Pfade und Datastores verloren die auf der 10G NIC verfügbar waren, und die vDisk auf dem Datastore wurden nicht in voller Größe angelegt. VAAI war zu diesem Zeitpunkt nicht aktiviert. Ein Rescan des HBA hat nicht geholfen, um die Pfade wieder verfügbar zu machen.

Im Log /scratch/log/vmkernel.log sind folgende Meldungen zu sehen:

<3>bnx2x: [bnx2x_attn_int_deasserted3:4817(vmnic2)]MC assert!
<3>bnx2x: [bnx2x_mc_assert:938(vmnic2)]XSTORM_ASSERT_LIST_INDEX 0x2
<3>bnx2x: [bnx2x_mc_assert:952(vmnic2)]XSTORM_ASSERT_INDEX 0x0 = 0x00020000 0x00010014 0x0c201160 0x00010053
<3>bnx2x: [bnx2x_mc_assert:966(vmnic2)]Chip Revision: everest3, FW Version: 7_10_51
<3>bnx2x: [bnx2x_attn_int_deasserted3:4823(vmnic2)]driver assert
<3>bnx2x: [bnx2x_panic_dump:1141(vmnic2)]begin crash dump -----------------
<3>bnx2x: [bnx2x_panic_dump:1151(vmnic2)]def_idx(0xc1ee)  def_att_idx(0x4)  attn_state(0x1)  spq_prod_idx(0xd) next_stats_cnt(0xd7f8)
<3>bnx2x: [bnx2x_panic_dump:1156(vmnic2)]DSB: attn bits(0x0)  ack(0x1)  id(0x0)  idx(0x4)
[...]
<3>bnx2x 0000:0b:00.0: vmnic2: bc 7.12.56
<3>begin fw dump (mark 0x3c64b0)
[...]
<3>end of fw dump
<3>bnx2x: [bnx2x_panic_dump:1404(vmnic2)]Idle check (1st round) ----------
<5>[bnx2x_self_test_log:152(vmnic2)]WARNING MISC: pcie_rst_b was asserted without perst assertion.Value is 0x1
<5>[bnx2x_self_test_log:152(vmnic2)]WARNING CSEM: interrupt 0 is active.Value is 0x10010000
<5>[bnx2x_self_test_log:152(vmnic2)]WARNING USEM: interrupt 0 is active.Value is 0x10000000
<5>[bnx2x_self_test_log:152(vmnic2)]WARNING XSEM: interrupt 0 is active.Value is 0x10010000
<3>bnx2x: [bnx2x_panic_dump:1411(vmnic2)]end crash dump -----------------

Hier gibt es einen Treiber-Crash des Moduls bnx2x. Ein Crash und Firmware Dump wird erstellt, ein Reset der Karte wird ausgelöst.

<5>bnx2x: [bnx2x_attn_int_deasserted:5654(vmnic2)]about to mask 0xfffffffe at IGU addr 0x442d10
<5>bnx2x: [bnx2x_attn_int_deasserted:5667(vmnic2)]aeu_mask 116  newly deasserted 1
<5>bnx2x: [bnx2x_attn_int_deasserted:5669(vmnic2)]new mask 117
<5>bnx2x: [bnx2x_attn_int_deasserted:5674(vmnic2)]attn_state 1
<5>bnx2x: [bnx2x_attn_int_deasserted:5676(vmnic2)]new state 0
<3>[bnx2x_queue_chk_transition:5547(vmnic2)]Blocking transition since pending was 80
<3>[bnx2x_queue_state_change:4681(vmnic2)]check transition returned an error. rc -16
<3>bnx2x: [bnx2x_setup_queue:9536(vmnic2)]Queue(4) INIT failed
<3>[bnx2x_esx_setup_queue:607(vmnic2)]Queue 4 setup failed[0xffffffea]
<3>[bnx2x_dynamic_alloc_rx_queue_single:789(vmnic2)]Could not start queue:4
<3>[bnx2x_netq_free_rx_queue_single:681(vmnic2)]Could not restart queue:2 as Tx
<3>[bnx2x_esx_config_rss_pf:299(vmnic2)]Failed to config rss

Die Initialisierung der Karte schlägt fehl, der Status ist unbekannt.

ScsiCore: 63: Starting taskmgmt handler world 2465479/4
WARNING: iscsi_vmk: iscsivmk_TaskMgmtIssue: vmhba33:CH:0 T:3 L:0 : Task mgmt "Abort Task" with itt=0x3565d (refITT=0x3565c) timed out.
ScsiCore: 98: Stopping taskMgmt handler world 330793
ScsiCore: 63: Starting taskmgmt handler world 2465485/4
WARNING: iscsi_vmk: iscsivmk_StopConnection: vmhba33:CH:0 T:2 CN:0: iSCSI connection is being marked "OFFLINE" (Event:4)
WARNING: iscsi_vmk: iscsivmk_StopConnection: Sess [ISID: 00023d000002 TARGET: iqn.1994-04.jp.co.hitachi:rsd.h8m.t.70508.1b002 TPGT: 18 TSIH: 0]
WARNING: iscsi_vmk: iscsivmk_StopConnection: Conn [CID: 0 L: 10.30.96.55:22923 R: 10.30.96.12:3260]
NMP: nmp_ThrottleLogForDevice:2458: Cmd 0x12 (0x413688fa9e40, 0) to dev "naa.20060e8036136c005041122c00000a60" on path "vmhba33:C0:T2:L32" Failed: H:0x2 D:0x0 P:0x0 Possible sense data: 0x0 0x0 0x0. Act:EVAL
WARNING: NMP: nmp_DeviceRequestFastDeviceProbe:237: NMP device "naa.20060e8036136c005041122c00000a60" state in doubt; requested fast path state update...
ScsiDeviceIO: 2331: Cmd(0x413688fa9e40) 0x12, CmdSN 0x14cf1c from world 0 to dev "naa.20060e8036136c005041122c00000a60" failed H:0x2 D:0x0 P:0x0 Possible sense data: 0x0 0x0 0x0.
NMP: nmp_ThrottleLogForDevice:2458: Cmd 0x12 (0x413688fa9e40, 0) to dev "naa.20060e8036136c005041122c00000a60" on path "vmhba33:C0:T2:L32" Failed: H:0x2 D:0x0 P:0x0 Possible sense data: 0x0 0x0 0x0. Act:EVAL
NMP: nmp_ThrottleLogForDevice:2458: Cmd 0x12 (0x413688fa9e40, 0) to dev "naa.20060e8036136c005041122c00000a60" on path "vmhba33:C0:T2:L32" Failed: H:0x2 D:0x0 P:0x0 Possible sense data: 0x0 0x0 0x0. Act:EVAL
NMP: nmp_ThrottleLogForDevice:2458: Cmd 0x12 (0x413688fa9e40, 0) to dev "naa.20060e8036136c005041122c00000a60" on path "vmhba33:C0:T2:L32" Failed: H:0x2 D:0x0 P:0x0 Possible sense data: 0x0 0x0 0x0. Act:EVAL
HBX: 2961: Waiting for timed out [HB state abcdef02 offset 3907584 gen 11 stampUS 575682032674 uuid 21fd9950-f7fe-11e5-a837-0800200c9a66 jrnl <FB 1460400> drv 14.60] on vol 'Datastore'

Da das Netzwerk nicht mehr verfügbar ist, fallen auch die Pfade zu den Datastores weg… APD

Das Gute: In der VMware KB gibt es dazu bereits einen Artikel (ESXi 5.5 host loses network connectivity with Broadcom 10 GB Nics and bnx2x driver loaded under heavy VXLAN traffic) der das Problem beschreibt und auch einen Workaround anbietet.

Das Schlechte: Der Workaround ist ein Workaroung und keine Lösung. Sofern der Treiber von Broadcom nicht gefixed wird, wird man damit leben müssen.

Zum Workaround… Hierbei handelt es sich um folgenden Befehl:

esxcfg-module -s "enable_vxlan_ofld=0" bnx2x

Damit wird das VXLAN Offloading deaktiviert. Nach einem Neustart sollte sich das Problem damit erstmal erledigt haben.

2016/04/01 11:43 · Daniel Graf · 0 Kommentare

iMessage Chats aus Backup extrahieren

Als ich im Juli 2015 bei SVA angefangen habe zu arbeiten, habe ich mich dazu breitschlagen lassen, als Dienst-Handy ein Apple iPhone 5S zu nutzen. Welch grandioser Fehler :-/ :-(

In den letzten 9 Monaten hatte ich sehr viel über die Hard- und Software zu schimpfen:

  • das Aluminium am iPhone sieht zwar nicht schlecht aus, nimmt einem aber jeden Sturz auf harten Untergrund sehr übel
  • von Apple freigegebene Updates wirken unfertig und nicht getestet, oft gibt es nach einem Release schon wieder Patches
  • Cloud-Sync Dienste können scheinbar Dateien nur in ihrem vorgesehenen Space speichern, auf den andere Anwendungen keinen Zugriff haben (Beispiel: DS Cloud wird zur Synchronisierung meiner KeePass Datenbank genutzt, nach einem Sync muss ich die Datenbank aber über die DS Cloud App mit der KeePass Anwendung öffnen)
  • während eines Telefonats eine Mail über das iPhone mit Anhang verschicken funktioniert in den seltensten Fällen, meist stürzt die Mail App ab
  • es gibt Auto-Save kein von Dateien, die man über iMessage empfangen hat
  • mehr fällt mir grad nicht ein, und ich möchte hier auch nicht weiter gegen Apple bashen…

Der vorletzte Punkt, dass es kein Auto-Save von Dateien die ich via iMessage empfangen habe gibt, hat mich seit jeher schon sehr gestört. In der Theorie hätte ich jedes Bild manuell speichern müssen. Mal habe ich dies getan, manchmal aber eben auch nicht… Da ich aber nun eh wieder auf mein Blackberry Q10 umsteige, musste ich mich mit dieser Thematik also ein letztes Mal auseinandersetzen.

Und siehe da, ich habe auch ein passendes Tool gefunden: iOSMessageExport

Mit dem werden die kompletten Chat-Verläufe aus dem letzten iPhone Backup extrahiert, inkl. Texte, Emojis, Bildern und sonstigen Dateien. Sprich, zuerst muss ein aktuelles Backup mittels iTunes (ach ja, noch so eine Komponente, die ich am iPhone echt nicht mochte) erstellt werden, und auf ein Linux System übertragen werden. Das Backup befindet sich unter C:\Users\<user>\AppData\Roaming\Apple Computer\MobileSync\Backup.

ACHTUNG: Ich habe das Tool nur mit einem unverschlüsselten Backup des iPhones getestet. Damit hat es wunderbar funktioniert!

Zur Nutzung des Tools musste ich unter Debian noch ein paar Pakete installieren:

apt-get install make gcc libdbi-perl libdatetime-perl libdigest-perl libdigest-sha-perl libdbd-sqlite3-perl
cpan install Digest::SHA1

Nach der Installation erfolgt nun das Beziehen des Tools von GitHub, entweder via git oder per ZIP Download.

Anschließend ruft man das Script backup.pl mit dem Pfad zum iTunes Backup auf:

perl backup.pl --directory_path ./6dace99743a3fa479b31bca1b33eae153738d49a/

Wenn alle Pakete installiert sind und auch keines fehlte, sollte nach dem Lauf des Tools ein neuer Ordner im aktuellen Verzeichnis erstellt worden sein: _export

Darin befinden sich, sortiert nach Kontakt (entweder Handynummer oder Mail-Adresse des iMessage Partners), nun die kompletten Chats :-)

2016/03/23 12:39 · Daniel Graf · 0 Kommentare
blog.txt · Zuletzt geändert: 2016/04/14 11:30 von Daniel Graf

Seiten-Werkzeuge