Hot-Backup von ESXi VMs

Um Backups von ESXi VMs im laufenden Zustand machen zu können, braucht es

  • Verständnis was VmWare unter einem Snapshot versteht
  • Das Scipt ghettoVCB.sh =>  ghettoVCB

Exkurs VMWare-Snapshot

Bei einem VMware Snapshot wird eine weitere Festplattendatei erstellt welche ab Zeitpunkt des Snapshots alle geänderten Blöcke aufnimmt. Gleichzeitig wird der Exklusiv Zugriff auf die Basis Festplatte aufgehoben so das andere Prozesse lesen koennen.

Dieses “lesen” kann ein Kopierbefehl einens Backupprogramms sein. Da keine Schreibzugriffe mehr in die Datei erfolgen ist der Zustand also konsistent. Snapshots sind also keine Backups. Ein Snapshot “friert” lediglich einen Zustand ein (Basis Festplatte) und schreibt alle ab diesem Zeitpunkt anfallenden Änderungen in eine neue Snapshot Datei (Delta).

 

  • Die Basisplatte und der bzw. die Snapshots zusammen ergeben den akt. Stand. Fehlt ein Element in der Kette ist kein vollstaendiges Restore mehr moeglich. Beides muss zur gleichen Zeiten fuer den HOST zugaenglich sein.
  • Snapshots wachsen bis zur max. konfigurierten Festplattengroesse heran. Die Groesse des Datastores ist also zu ueberwachen.
  • Beim löeschen von mehr als 2 Snapshots ist zu bedenken das ein Helper angelegt wird und immer die Groesse der zusammen zufuehrenden Snaps benoetigt wird.
  • Laufende Snaps kosten ein wenig Performance. Die Gefahr von Fragmentierierung ignorieren wir da die Snaps immer in 16MB Bloecken wachsen.
  • Grosse Snaps loeschen, hier versteht VMware das einpflegen der Aenderungen, dauert lange

Beispiel:

  • Basisplatte
  • Snapshot1
  • Snapshot2
  • Snapshot3
  • Snapshotx

Löscht man jetzt Snapshotx wird dieser (und damit alle davorigen Snapshots) in die Basisplatte eingepflegt.
Löscht man Snapshot2 wird dessen Zustand und der von Snapshot1 in die Basisplatte eingepflegt und Snapshot3 usw. werden zu Snapshot1 usw,

Die .VMDK-Files (Virtuell Maschine Disk Files) können im laufenden Betrieb nicht kopiert oder verschoben werden, da sie ja in Gebrauch sind. Dies sieht aber nach einem Snapshot anders aus. Bei einem Snapshot werden die .VMDK-Files im Prinzip gekappt und neue Files (VMSN und VMSD) angelegt, in welche die kompletten Änderungen des Snapshots geschrieben werden. Wenn man ein Snapshot der VM macht, wird die Basis-Festplatte in den Read-Only Modus gesetzt, wordurch diese nun, da konsisten, kopiert werden kann. Das Verhalten von Snapshots kann also ausgenutzt werden um Backups im laufenden System erstellen zu können (Hilfsmittel zum Backup):

Komplettbackup 1

  1. Das Konfigurations-File der VM sichern/kopieren (VMX-File)-> nach dem Snaphsot der vituellen Maschine ändern sich die Verweise in der Konfiguration.
  2. Man erstellt einen ersten Snapshot einer VM. Es bestehen anonsten keine Snapshots dieser VM. Der Snapshot wird also gemacht, und die Basis-Festplatte kopiert. Anschliessend den Snapshot wieder loeschen. Dieses Vorgehen benötigt entsprechend viel Platz, wenn mehrere Backups der gleichen VM notwendig sind.

Komplettbackup 2

  1. Man macht täglich einen Snapshot und sicherst den Snapshot des Vortages. Bedeutet weniger Platz da quasi nur Aenderungen dann noch anfallen. Aber ein Restore erfordert Knowhow und dein ESX wird mehr belastet.

Soweit der Exkurs… Um ein Backup zu erstellen, können wir das mit den Snapshots manuell machen oder aber mit dem ghettoVCB-Script arbeiten. Das macht nämlich genau das oben beschriebene.

Installation von ghettoVCB

Die Installation ist simple. Einfach ein Verzeichnis auf dem ESXi-Datastore erstellen und die ghettoVCB-Scripts hineinkopieren. Das wird ganz schön auf Youtube gezeigt: http://www.youtube.com/watch?v=mVrjxzKEEu4

ghettoVCB konfigurieren und Backup durchführen

Die Konfigurationsmölgichkeiten findet man hier: http://communities.vmware.com/docs/DOC-8760

ghettoVCB.conf File

Ich habe mein ghettoVCB.conf File folgendermassen konfiguriert (ist eingentlich alles Standard):

VM_BACKUP_VOLUME=/vmfs/volumes/65d7a6db-6bc8d65a/VmBackups
DISK_BACKUP_FORMAT=thin
VM_BACKUP_ROTATION_COUNT=1
POWER_VM_DOWN_BEFORE_BACKUP=0
ENABLE_HARD_POWER_OFF=0
ITER_TO_WAIT_SHUTDOWN=3
POWER_DOWN_TIMEOUT=5
ENABLE_COMPRESSION=0
VM_SNAPSHOT_MEMORY=0
VM_SNAPSHOT_QUIESCE=0
SNAPSHOT_TIMEOUT=15

VMs zum Backup

Habe ein File “vms_to_backup” erstellt, welches eine Liste der Namen der VMs beinhaltet. Bei den Namen handelt es sich um die Namen, welche auch im vSphereClient angezeigt werden:

TestVM32Bit

Backup run

Nun kann die VM im laufenden Zustand gebackuped werden (Option -d dryrun führt einen Testlauf durch):

./ghettoVCB.sh -f vms_to_backup -g ./ghettoVCB.conf -d dryrun

Backup automatisch durchführen (Cron-Tab)

Um das Backup automatisch durchzuführen, kann dies in der Cron-Tab von ESXi konfiguriert werden:

In Crontab registrieren, Job soll jeden Donnerstag um 17:00 Uhr durchgeführt werden

echo "0 17 * * 4 /vmfs/volumes/4a6bb65f-eb654b7b-2525-d8d385ab5bd2/ghettoVCB/ghettoVCB.sh -f /vmfs/volumes/4a6bb65f-eb654b7b-2525-d8d385ab5bd2/ghettoVCB/vms_to_backup -g /vmfs/volumes/4a6bb65f-eb654b7b-2525-d8d385ab5bd2/ghettoVCB/ghettoVCB.conf > /tmp/ghettoVCB.log" >> /var/spool/cron/crontabs/root

Wenn man dies Ausführt, wird der crontab automatisch an die richtige Datei angehängt.
Nun muss crond neu gestartet werden:

ESXi 4.1

/bin/kill $(cat /var/run/crond.pid)
/bin/busybox crond

Die Cron-Tab von ESXi wird bei jedem Start wieder neu geschrieben. Um die Zeile deswegen bei jedem Start auszuführen, muss diese noch in die /etc/rc.local eingetragen werden. Meine rc.local sieht anschliessend so aus:

vi /etc/rc.local
 #! /bin/ash
export PATH=/sbin:/bin

log() {
echo "$1"
logger init "$1"
}

#execute all service retgistered in /etc/rc.local.d
if [ -d /etc/rc.local.d ]; then
for filename in `find /etc/rc.local.d/ | sort`
do
if [ -f $filename ] && [ -x $filename ]; then
log "running $filename"
$filename
fi
done
fi

/bin/kill $(cat /var/run/crond.pid)
/bin/echo "0 17 * * 4 /vmfs/volumes/4a6bb65f-eb654b7b-2525-d8d385ab5bd2/ghettoVCB/ghettoVCB.sh -f /vmfs/volumes/4a6bb65f-eb654b7b-2525-d8d385ab5bd2/ghettoVCB/vms_to_backup -g /vmfs/volumes/4a6bb65f-eb654b7b-2525-d8d385ab5bd2/ghettoVCB/ghettoVCB.conf > /tmp/ghettoVCB.log" >> /var/spool/cron/crontabs/root
crond

ESXi 5.5

kill $(cat /var/run/crond.pid)
crond

Die Cron-Tab von ESXi wird bei jedem Start wieder neu geschrieben. Um die Zeile deswegen bei jedem Start auszuführen, muss diese noch in die /etc/rc.local eingetragen werden. Meine rc.local sieht anschliessend so aus:

vi /etc/rc.local.d/local.sh
#!/bin/sh

# local configuration options

# Note: modify at your own risk! If you do/use anything in this
# script that is not part of a stable API (relying on files to be in
# specific places, specific tools, specific output, etc) there is a
# possibility you will end up with a broken system after patching or
# upgrading. Changes are not supported unless under direction of
# VMware support.
/bin/kill $(cat /var/run/crond.pid)
echo "0 17 * * 4 /vmfs/volumes/54016b12-54a601dc-1d3c-d43d7e942aae/ghettoVCB/ghettoVCB.sh -f /vmfs/volumes/54016b12-54a601dc-1d3c-d43d7e942aae/ghettoVCB/vms_to_backup -g /vmfs/volumes/54016b12-54a601dc-1d3c-d43d7e942aae/ghettoVCB/ghettoVCB.conf > /tmp/ghettoVCB.log" >> /var/spool/cron/crontabs/root
crond
exit 0

Nun nur noch autobackup durchführen, das ganze in der ESXi Konfuguration zu speichern:

/sbin/auto-backup.sh

Das wars! Jetzt werden die VMs automatisch regelmässig gesichert.

Restore durchführen

Um einen Restore druchzuführen, habe ich ein file vms_to_restore erstellt, wobei dieses pro Linie einen Restore-Parameter mit folgendem Format enthalten muss:

";;"
# DISK_FORMATS
# 1 = zeroedthick
# 2 = 2gbsparse
# 3 = thin
# 4 = eagerzeroedthick

z.B.:

"/vmfs/volumes/QnapTSDatastore/VmBackups/TestVM32Bit/TestVM32Bit-2013-01-03_13-25-54;/vmfs/volumes/ESXi Raid1/TestVM;3"

Anschliessend kann das Restore folgendermassen gestartet werden (Option -d 2 = Dryrun):

./ghettoVCB-restore.sh -c vms_to_restore -d 2

Dies stellt das von ghettoVCB erstellte Backup “TestVM32Bit-2013-01-03_13-25-54” unter dem Pfad “/vmfs/volumes/ESXi Raid1/TestVM” her bzw. kopiert diese dahin und registriert die VM neu beim ESXi-Host.

Die Fileformate

zeroedthick (default)

vmdk wird in voller Groesse angelegt – dieser Typ wird bei der Erstellung nicht mit Nullen ueberschrieben – das passiert erst spaeter im Betrieb

eagerzeroedthick

vmdk wird in voller Groesse angelegt – dieser Typ wird bei der Erstellung mit Nullen ueberschrieben

thick

vmdk wird in voller Groesse angelegt – und nie genullt

thin

vmdk waechst nach Bedarf – dies ist ein Feature des VMFS dateisystems – und ist auf den meisten NFS-servern nicht moeglich

2gbsparsed

vmdk wird in maximal 2 Gb grosse Stuecke aufgeteilt – die jeweils nach Bedarf wachsen – dieses Format ist it Workstation kompatibel

JDBC-Verbindung über SSL auf Mysql-Server (Tomcat)

Hier wurde erklärt, wie man den MySQL-Server konfiguriert, so dass in MySQL-Client SSL Verbindungen zum Server aufbauen kann.

Nun möchte ich die SSL-Verbindung in einer Java-Applikation, welche in einem Tomcat läuft, verwenden. Dazu wird eine JDBC-Connection über SSL zum MySQL Server aufgebaut.

Die Server- und Client-Zertifikate wurden hier bereits erstellt.

Dieser Beitrag basiert auf Link

KeyStore

Tomcat-Applikationen müssen die Zertifikate in einem Keystore gespeichert halten.

Client Packet

Ein Paket mit client Zertifikat und client key erstellen

openssl pkcs12 -export -inkey client-key.pem -in client-cert.pem -out client.packet

MyKS.jks

Einen neuen KeyStore “MyKS.jks” erstellen, der das erstellte client paket und die CA Zertifikate enthält. Als Passwort wähle ich immer das gleiche.

sudo keytool -importkeystore -deststorepass password -destkeypass password -destkeystore myKS.jks -srckeystore client.packet -srcstoretype PKCS12 -srcstorepass password -alias tomcat
sudo keytool -importcert -alias mysqlCA -trustcacerts -file /root/ca-cert.pem -keystore myKS.jks

Nicht vergessen die Berechtigung adäquat anzupassen

chmod 440 myKS.jks

Tomcat konfigurieren

JAVA_OPTS

Keystore in Tomcat-Verzeichnis kopieren. SSL konfigurieren und den keystore anmelden. Hierzu ist auch die Angabe des oben genutzen Passwortes notwendig, so dass der Keystore gelesen werden kann. Diese Properties können z.B. in catalina.sh exportiert werden (export).

In Ubuntu 14.04 findet man das startup-File von Tomcat unter

/etc/default/tomcat7
export JAVA_OPTS="-Djavax.net.ssl.keyStore=/usr/local/etc/tomcat/certs/myKS.jks -Djavax.net.ssl.keyStorePassword=password -Djavax.net.ssl.trustStore=/usr/local/etc/tomcat/certs/myKS.jks -Djavax.net.ssl.trustStorePassword=password"

oder als Java-Parameter:

-Djavax.net.ssl.keyStore=path_to_keystore_file
-Djavax.net.ssl.keyStorePassword=password
-Djavax.net.ssl.trustStore=path_to_truststore_file
-Djavax.net.ssl.trustStorePassword=password

oder man könnte dies auch in der Tomcat-Applikation als System-Properties definieren:

System.setProperty("javax.net.ssl.keyStore","path_to_keystore_file");
System.setProperty("javax.net.ssl.keyStorePassword","password");
System.setProperty("javax.net.ssl.trustStore","path_to_truststore_file");
System.setProperty("javax.net.ssl.trustStorePassword","password");

JDBC URL

Dann muss noch die Connection so angepasst werden, dass SSL verwendet wird (useSSL). Dies kann über einen connection-parameter gemacht werden.

Das kann entweder über die URL mit useSSL=true oder aber über die java.util.Properties (propertyuseSSL to true) Instanz, welche dem DriverManager.getConnection() mitgegeben wird, gemacht werden.

jdbc:mysql://mysql.server.com/database?verifyServerCertificate=false&useSSL=true&requireSSL=true

CHECK

Überprüfen ob die Verbindung auch wirklich verschlüsselt daher kommt:

 sudo tcpdump -i any -vv -X src port 3306

Vorher

13:56:05.099198 IP (tos 0x8, ttl 64, id 6943, offset 0, flags [DF], proto TCP (6), length 63)
    localhost.mysql > localhost.50479: Flags [P.], cksum 0xfe33 (incorrect -> 0xab2d), seq 3174702966:3174702977, ack 903431479, win 800, options [nop,nop,TS val 2444442 ecr 2444442], length 11
        0x0000:  4508 003f 1b1f 4000 4006 2190 7f00 0001  E..?..@.@.!.....
        0x0010:  7f00 0001 0cea c52f bd3a 1f76 35d9 4537  ......./.:.v5.E7
        0x0020:  8018 0320 fe33 0000 0101 080a 0025 4c9a  .....3.......%L.
        0x0030:  0025 4c9a 0700 0001 0000 0000 0000 00    .%L............
13:56:05.100525 IP (tos 0x8, ttl 64, id 6944, offset 0, flags [DF], proto TCP (6), length 129)
    localhost.mysql > localhost.50479: Flags [P.], cksum 0xfe75 (incorrect -> 0xec2b), seq 11:88, ack 35, win 800, options [nop,nop,TS val 2444442 ecr 2444442], length 77
        0x0000:  4508 0081 1b20 4000 4006 214d 7f00 0001  E.....@.@.!M....
        0x0010:  7f00 0001 0cea c52f bd3a 1f81 35d9 4559  ......./.:..5.EY
        0x0020:  8018 0320 fe75 0000 0101 080a 0025 4c9a  .....u.......%L.
        0x0030:  0025 4c9a 0100 0001 012c 0000 0203 6465  .%L......,....de
        0x0040:  6600 0000 1640 4073 6573 7369 6f6e 2e74  f....@@session.t
        0x0050:  785f 7265 6164 5f6f 6e6c 7900 0c3f 0001  x_read_only..?..
        0x0060:  0000 0008 8000 0000 0005 0000 03fe 0000  ................
        0x0070:  0000 0200 0004 0130 0500 0005 fe00 0000  .......0........
        0x0080:  00                                       .
13:56:05.105052 IP (tos 0x8, ttl 64, id 6945, offset 0, flags [DF], proto TCP (6), length 1781)
    localhost.mysql > localhost.50479: Flags [P.], cksum 0x04ea (incorrect -> 0x7756), seq 88:1817, ack 143, win 800, options [nop,nop,TS val 2444443 ecr 2444442], length 1729
        0x0000:  4508 06f5 1b21 4000 4006 1ad8 7f00 0001  E....!@.@.......
        0x0010:  7f00 0001 0cea c52f bd3a 1fce 35d9 45c5  ......./.:..5.E.
        0x0020:  8018 0320 04ea 0000 0101 080a 0025 4c9b  .............%L.
        0x0030:  0025 4c9a 0100 0001 0638 0000 0203 6465  .%L......8....de
        0x0040:  6604 7076 7332 0d74 656d 705f 6361 7465  f.pvs2.temp_cate
        0x0050:  676f 7279 0d74 656d 705f 6361 7465 676f  gory.temp_catego
        0x0060:  7279 0269 6402 6964 0c3f 000b 0000 0003  ry.id.id.?......
        0x0070:  0000 0000 003c 0000 0303 6465 6604 7076  .....<....def.pv
        0x0080:  7332 0d74 656d 705f 6361 7465 676f 7279  s2.temp_category
        0x0090:  0d74 656d 705f 6361 7465 676f 7279 046e  .temp_category.n
        0x00a0:  616d 6504 6e61 6d65 0c3f 00ff ffff fffc  ame.name.?......
        0x00b0:  9000 0000 003c 0000 0403 6465 6604 7076  .....<....def.pv
        0x00c0:  7332 0d74 656d 705f 6361 7465 676f 7279  s2.temp_category

Nachher

13:59:58.645194 IP (tos 0x8, ttl 64, id 60639, offset 0, flags [DF], proto TCP (6), length 52)
    localhost.mysql > localhost.50483: Flags [.], cksum 0xfe28 (incorrect -> 0xf2c8), seq 2669811453, ack 3878597006, win 851, options [nop,nop,TS val 2502828 ecr 2502828], length 0
        0x0000:  4508 0034 ecdf 4000 4006 4fda 7f00 0001  E..4..@.@.O.....
        0x0010:  7f00 0001 0cea c533 9f22 16fd e72e b18e  .......3."......
        0x0020:  8010 0353 fe28 0000 0101 080a 0026 30ac  ...S.(.......&0.
        0x0030:  0026 30ac                                .&0.
13:59:58.645264 IP (tos 0x8, ttl 64, id 60640, offset 0, flags [DF], proto TCP (6), length 105)
    localhost.mysql > localhost.50483: Flags [P.], cksum 0xfe5d (incorrect -> 0xbe29), seq 0:53, ack 1, win 851, options [nop,nop,TS val 2502828 ecr 2502828], length 53
        0x0000:  4508 0069 ece0 4000 4006 4fa4 7f00 0001  E..i..@.@.O.....
        0x0010:  7f00 0001 0cea c533 9f22 16fd e72e b18e  .......3."......
        0x0020:  8018 0353 fe5d 0000 0101 080a 0026 30ac  ...S.].......&0.
        0x0030:  0026 30ac 1703 0100 300c 3524 6529 b225  .&0.....0.5$e).%
        0x0040:  01dd ed3f 7cb5 085f 3c80 4a51 c362 e980  ...?|.._<.JQ.b..
        0x0050:  1884 4e40 0d58 d0a3 69a1 b3c1 c979 b142  ..N@.X..i....y.B
        0x0060:  09b6 3603 b43c 8a22 9d                   ..6..<.".
13:59:58.646125 IP (tos 0x8, ttl 64, id 60641, offset 0, flags [DF], proto TCP (6), length 52)
    localhost.mysql > localhost.50483: Flags [.], cksum 0xfe28 (incorrect -> 0xf227), seq 53, ack 107, win 851, options [nop,nop,TS val 2502829 ecr 2502829], length 0
        0x0000:  4508 0034 ece1 4000 4006 4fd8 7f00 0001  E..4..@.@.O.....
        0x0010:  7f00 0001 0cea c533 9f22 1732 e72e b1f8  .......3.".2....
        0x0020:  8010 0353 fe28 0000 0101 080a 0026 30ad  ...S.(.......&0.
        0x0030:  0026 30ad                                .&0.
13:59:58.646188 IP (tos 0x8, ttl 64, id 60642, offset 0, flags [DF], proto TCP (6), length 169)
    localhost.mysql > localhost.50483: Flags [P.], cksum 0xfe9d (incorrect -> 0x6a73), seq 53:170, ack 107, win 851, options [nop,nop,TS val 2502829 ecr 2502829], length 117
        0x0000:  4508 00a9 ece2 4000 4006 4f62 7f00 0001  E.....@.@.Ob....
        0x0010:  7f00 0001 0cea c533 9f22 1732 e72e b1f8  .......3.".2....
        0x0020:  8018 0353 fe9d 0000 0101 080a 0026 30ad  ...S.........&0.
        0x0030:  0026 30ad 1703 0100 7074 359c b82a c838  .&0.....pt5..*.8
        0x0040:  3a69 85b9 b43f 7648 5fe0 88c6 972c 576a  :i...?vH_....,Wj
        0x0050:  84ac c7ac 58f0 ed0c a79c 0c12 1c51 9714  ....X........Q..
        0x0060:  45d3 80ac 1fb6 fbbb 7665 9782 a61f cf0a  E.......ve......
        0x0070:  0b19 1e4e a679 6d1d 3a7b db6d 02f7 2dba  ...N.ym.:{.m..-.
        0x0080:  4c0b 2cfb ad6f b516 2128 2596 9f5f 6ab2  L.,..o..!(%.._j.
        0x0090:  640b 1876 2d52 1d4b ffcf 6a25 08d6 b985  d..v-R.K..j%....
        0x00a0:  cdf0 cd62 cacc 84e1 9a                   ...b.....
13:59:58.646838 IP (tos 0x8, ttl 64, id 60643, offset 0, flags [DF], proto TCP (6), length 52)
    localhost.mysql > localhost.50483: Flags [.], cksum 0xfe28 (incorrect -> 0xf0f8), seq 170, ack 277, win 867, options [nop,nop,TS val 2502829 ecr 2502829], length 0
        0x0000:  4508 0034 ece3 4000 4006 4fd6 7f00 0001  E..4..@.@.O.....

 

Firefox Security

Plugins

Folgende Plugins sind für Firefox empfehlenswert um spurenarmer zu surfen:

Firefox about:config Anpassungen

Suchfeld rechts oben wieder anzeigen

browser.search.widget.inNavBar = true

Anzeige von Vorschlägen bei der Eingabe deaktivieren

browser.urlbar.suggest.searches = false
browser.urlbar.suggest.openpage = false

Suchvorschläge deaktivieren

browser.urlbar.suggest.bookmark = false
browser.urlbar.suggest.history = false

Unterbinden, dass Firefox nach Hause telefoniert um festzustellen aus welchem Land man stammt. Das benutzt Firefox um zu entscheiden, welche Suchmaschine standardmässig genutzt werden soll (USA = Yahoo und alle anderen mit Google)

browser.search.countryCode = CH
browser.search.geoSpecificDefaults = false
browser.search.geoip.url = "" (leerer String)

 

Links

Ubuntu 18.4: Default Klang-Wiedergabegerät setzen

Mein Ubuntu setzt nach einem Reboot immer das falsche Klang-Wiedergabegerät. Das Default Wiedergabegerät kann folgendermassen gesetzt werden, so dass es auch nach einem Reboot noch gesetzt ist:

Als erstes die vorhandenen Wiedergabegeräte auflisten:

pacmd list-sinks

Dies listet die “Indexe” der Wiedergabegeräte auf. Der mit * markierte Index ist das aktuell als Default gesetzte Wiedergabegerät.

Nun den Index des gewünschten Default Wiedergabegerätes merken (bei mir ist es die “2”) und eintragen in

sudo vi /etc/pulse/default.pa
### Make some devices default
set-default-sink 2

Nach einem Reboot ist das Wiedergabegerät Nr. 2 automatisch gesetzt.

Links

https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/DefaultDevice/

Motorola Moto X4 – Installation Lineage OS

Heute wurde mein neues Telefon angeliefert, das Motorola Moto X4. Die Gründe für das Moto X4 waren:

  • Nicht zu gross (5.2″)
  • Dual-Sim
  • Akku 3000 mAh
  • Preis unter CHF 300.00
  • NFC vorhanden
  • Offizieller Build-Release von Lineage OS

Ich möchte das Telefon nicht mit dem Stock-Release von Motorola benutzen. Das Moto X4 soll mit Lineage OS beglückt werden. Dieser Blog-Post basiert auf dem Post von eines Pro-Linux Artikels sowie einem Install-Video und beinhaltet zusätzlich Änderungen aufgrund meinen eigenen Erfahrungen mit dem Moto X4 (Installation TWRP, etc.).

Installation

Mein Installations-Ablauf:

  • Developer-Modus einschalten
  • Handy über adb-Tools (Android Debug Bridge – kurz ADB) starten
  • Bootloader OEM-Sperre entfernen
  • Team Win Recovery Project (TWRP) flashen (Recovery-Modus)
  • Backup des Stock-ROMS erstellen
  • Firmware für Moto X4 aufspielen
  • LineageOS auf SD-Karte aufspielen

Siehe auch

Link

Developer-Modus einschalten

  • Das Telefon beim ersten Start ohne Sim-Karte und ohne Speicher-Karte starten.
  • Durchbooten bis zum Desktop
  • Einstellungen > Über das Telefon aufrufen
  • 7x auf die Build-Nummer Tippen => Das Telefon meldet nun, dass Sie nun “Entwickler” sind => Developer-Modus ist damit aktiviert.
  • Nun erscheint unter den Einstellungen zusätzlich der Eintrag “Entwickleroptionen”
  • Unter den Entwickleroptionen folgende Optionen aktivieren:
    • OEM Entsperrung und
    • USB Debugging

Nun ist das Telefon soweit bereit um es verändern zu können.

Handy über adb-Tools (Android Debug Bridge – kurz ADB) starten

Mit der Android Debug Bridge – kurz ADB – kann man ein Android-Smartphone verwalten. Es ist grundsätzlich für Entwickler gedacht und bietet ein paar coole Funktionen. Ich verwende die adb unter Ubuntu-Linux. Die adb kann folgendermassen installiert werden:

sudo apt-get install android-tools-adb
sudo apt-get install android-tools-fastboot

Nun das Telefon mit dem Linux-Rechner verbinden:

  • Per USB3-Kabel das Telefon mit dem Linux-Rechner verbinden
  • Auf dem Telefon nochmals kurz USB-Debugging de- und wieder aktivieren
  • Nun können über die Linux-Konsole Befehle an das Telefon gesendet werden. Damit das aber funktioniert, muss der Linux-Rechner noch autorisiert werden. Dies geschieht indem ein Befehl an das Telefon gesendet wird.
  • adb reboot bootloader
  • Auf dem Telefon erscheint automatisch die Anfrage ob der Rechner autorisiert werden soll. Hier nun die Genehmigung erteilen:
  • Ein Reboot des Bootloaders zeigt nun folgendes Bild, wobei ersichtlich ist, dass das Gerät “oem_locked” ist:
  • Um Lineage OS aufspielen zu können, muss der auf dem Bootloader der oem-lock entfernt werden.

Bootloader OEM-Sperre entfernen

Motorola bietet Entwicklern die Möglichkeit, den oem-lock zu entfernen. Damit einher geht, dass die Garantie entfällt. Und so geht es:

  • Link zu Motorola aufrufen > Unlock your bootloader > Get started > Next
  • Nun muss man sich anmelden. Das geht entweder mit einem Google-Account oder aber mit einem Motorola-Konto. Ich habe weder noch. Ich verwende deswegen den Link “Mit Motorola ID anmelden”. Hier werde ich aufgefordert eine Motorola-ID zu erstellen.
  • Nun eine Motorola-ID erstellen und anschliessend anmelden. Nach dem Login wird angezeigt, wie man das Device unlocked:
    • fastboot oem get_unlock_data
      ...
      (bootloader) Unlock data:
      (bootloader) 3AasdfaSDddasdf1#5asdd232344839
      (bootloader) 434E5A006DASDFASD678340000#3F14
      (bootloader) BF2C22D54C36CD73EB12C31DF400F1A
      (bootloader) 55769#FE0D752201561568645130000
      (bootloader) 0000000
      OKAY [  0.013s]
      finished. total time: 0.013s

      Daraus muss ein einzeiliger String erstellt werden, den man auf der unlock-Seite von Motorola eingibt:

    • Nun erscheint am Ende der Motorola-Site ein Unlock-Button:
    • Nun wird ein Mail mit dem Unlock-Key zugestellt:
    • Mit dem Key kann nun der Bootloader unlocked werden. Anstelle “UNIQUE_KEY” muss der im Mail zugestellte Key verwendet werden:
    • fastboot oem unlock UNIQUE_KEY
    • Der Befehl muss nun nochmals zwecks Bestätigung wiederholt werden. Anschliessend ist das Gerät offiziell unlocked! 🙂
    • Um zu überprüfen ob der Unlock wirklich geklappt hat, kann das Telefon nochmals gerebooted werden und dann nochmals in den Bootloader gebooted werden:
    • adb reboot bootloader
    • Voilà. “flashing_unlocked” bestätigt dies:

Team Win Recovery Project (TWRP) flashen (Recovery-Modus)

Team Win Recovery Project (TWRP) ist ein Custom-Recovery-System für Android-Geräte. Es wird über unseren unlocked Bootloader in die Recovery-Partition des Telefons geschrieben. Anschliessend kann TWRP über den Bootloader unabhängig vom System gestartet werden. Mit TWRP können wir unser System Backupen, Restoren aber auch ein anderes OS (Custom-Roms) aufspielen:

  • Die TWRP-Version für Moto X4 auf twrp.me suchen und downloaden => https://twrp.me/motorola/motorolamotox4.html
  • Bei einer Erstinstallation müssen zwei Files heruntergeladen werden (twrp-installer-payton-3.2.3-1.zip und twrp-3.2.3-1-payton.img)
  • Nun temporär TWRP auf dem Telefon starten. Das kann durch folgenden Befehl ausgelöst werden:
  • fastboot boot Downloads/twrp-3.2.3-1-payton.img

    Nun kann das ZIP-File auf das Telefon bzw. auf die sdcard kopiert werden:

  • adb push Downloads/twrp-installer-payton-3.2.3-1.zip /sdcard
    [100%] /sdcard/twrp-installer-payton-3.2.3-1.zip

    Nun kann im TWRP über “Installieren” das Installer-ZIP ausgewählt und installiert werden. Damit wird TWRP fix auf der Recovery-Partition installiert:

  • Nun das Telefon neu starten. Dabei installiere ich die TWRP-App als Systemapplikation, so dass zukünftige TWRP-Updates über die App installiert werden können:
  • Das Telefon Startet nun neu.
  • Ab sofort kann beim Aufstarten des Telefons mittles gleichzeitigem Drücken von  “Power Button” und “Lautstärke Down” in den Bootloader gebootet werden.
  • Im Bootloader kann nun mittles Lautstärken-Buttons der Recovery-Mode ausgewählt und bestätigt werden (Power Button). Anschliessend wird in TWRP gebootet:
  • Nun können diverse Funktionen mit TWRP verwendet werden. 🙂

Backup des Stock-ROMS erstellen

Mittles TWRP erstellen wir nun ein Backup unseres Stock-ROMs. Dies, damit wir im “Worst Case” Fall das System wieder in den Ursprungs-Zustand versetzten können:

  • In TWRP booten
  • Löschen/Wipe auswählen
  • Erweitertes Löschen auswählen
  • Optionen auswählen
    • Dalvik / ART Cache
    • Interner Speicher
  • Löschen bestätigen
  • Zurück
  • Diesen Löschvorgang zweimal durchführen => Soll teilweise nötig sein…
  • Zurück zum TWRP Start-Screen gehen.
  • Sichern / Backup auswählen und folgende Partitionen auswählen:
    • Boot (64MB)
    • Data (ohne /data/media)
    • System (2690MB)
  • Name des Backup-Files benennen
  • Speicher auswählen (ich verwende den internen Speicher)
  • Sicherung erstellen
  • In meinem Falle hat das nicht funktioniert (Fehler 255), deswegen hab ich diesen Schritt übersprungen – No Risk No Fun

Firmware für Moto X4 aufspielen

  • Download https://www.androidfilehost.com/?fid=890278863836292604
  • Entpacken und flash-all.sh ausführen. Dies kopiert die Images von Slot A nach Partition B. Das ist notwendig um Lineageos auf Partition B installieren zu können.
  • $ ./flash_all.sh 
    target reported max download size of 536870912 bytes
    sending 'abl_a' (1024 KB)...
    OKAY [  0.024s]
    writing 'abl_a'...
    OKAY [  0.062s]
    ...
    ...
    ...
    OKAY [  0.039s]
    finished. total time: 0.121s

    Jetzt mit fastboot das twrp-image auf das Telefon pushen und booten:

  • fastboot boot twrp-3.2.3-1-payton.img

    Es wird nun TWRP gestartet.

  • Nun das TWRP-ZIP auf das Telefon kopieren
  • adb push twrp-installer-payton-3.2.3-1.zip /sdcard/

    Nun im TWRP über Install das kopierte TWRP auswählen und installieren (swipe to install).

  • Dies installiert das TWRP sowohl auf Slot A als auch auf Slot B.
  • Nun rebooten (keine twrp-Apps installieren). Wenn das Stock Rom wieder sauber bootet, hat alles funktioniert.
  • Wieder in den bootloader booten und Recovery Mode auswählen > Es wird nun TWRP gestartet.
  • Nun das LineageOS Rom und die GApps auf das Telefon kopieren
  • adb push lineage-15.1-20181002-nightly-payton-signed.zip /sdcard/
    [100%] /sdcard/lineage-15.1-20181002-nightly-payton-signed.zip
    ralwet@Z97X-Gaming-5:~/Schreibtisch/Moto X4 Work$ adb push MindTheGapps-8.1.0-arm64-20180808_153856.zip /sdcard/
    [100%] /sdcard/MindTheGapps-8.1.0-arm64-20180808_153856.zip

    Nun im TWRP > Install

  • LineageOs auswählen
  • Add more ZIP auswählen und
  • das TWRP-ZIP File mit auswählen (gem. Video)
  • Dann Swipe to Install
  • Nachdem die Installation abgeschlossen ist, nicht rebooten sondern
  • Wipe Cache auswählen
  • Dann Reboot > Recovery => Dies bootet wieder nach TWRP
  • Nun über Install die GApps mit installieren (Minde the Gapps ZIP)
  • Nun Reboot System

Motorola Moto X4 Stock Rom installieren

Hier habe ich beschrieben, wie man das LOS auf einem Moto X4 installieren kann. Dieser Beitrag beschreibt nun, wie man das alte Stock-Rom wieder aufspielen kann.

Um auf dem Moto X4 das Stock Rom zu installieren kann man diesem Video folgen:

Anleitung

Um das Stock-Rom installieren zu können muss man

Hier noch ein Video, das die A/B Slots auf dem Moto X4 erklärt

Links

WordPress “Nativ-Installation” nach Docker Container umziehen

Nachdem ich nun meine WordPress Docker Container am laufen habe, ist es an der Zeit meine alten WordPress-Installationen umzuziehen. Der Use-Case ist simple:

  • Die WordPress-Installation, welche bisher “nativ” auf www.meinedomäne.ch lief soll nun neu vom neu erstellen Docker-Container beliefert werden.

Das Umziehen einer bestehenden WordPress-Installation war kniffliger als erwartet. Auf diesem Wege hat es dann für mich funktioniert:

  • Als Erstes einen Docker-Container erstellen. Siehe hier. Wichtig war, dass der Container erst ohne die SSL-Erweiterung (inkl. wpinit.sh und apache2vhosts.conf) gestartet wurde.
  • Das so erstellte Image ist nun über http://lokaleIp:port erreichbar.
  • Nun die Installations-Routine von WordPress durchlaufen.
  • Nun auf der WordPress-Installation, welche umgezogen werden soll, das Plugin “All-in-One WP Migration” installieren und damit die WordPress-Export (in ein File) erstellen.
  • Nun wieder auf die Docker-Wordpress Installation wechseln, auch hier das Plugin “All-in-One WP Migration” installieren und anschliessend einen WordPress-Import aus dem erstellten File durchführen.
  • Damit sollte der Umzug schon erledigt sein.
  • Ich habe dann noch das Plugin “SSL Insecure Content Fixer” installiert um sicherzustellen, dass die noch folgende SSL-Aktivierung sicher funktioniert => Das ist evtl. aber gar nicht nötig…
  • Nun Kann die Docker-Instanz gestoppt und wpinit.sh und apache2vhosts.conf im yml-File aktiviert werden. Anschliessend die Docker-Instanz wieder starten:
    docker-compose down
    --- Änderung an yml-File vornehmen (wp-init.sh und apache2-vhosts.conf) ----
    docker-compose up -d

    Damit ist nun auch SSL aktiviert, so dass der Docker-Container über SSL die Seite ausliefert.