Datenhaufen zu IT und Elektronik.

Kategorie: Solaris & Opensolaris (Seite 2 von 4)

IPv6 – Neighbor Discovery – Openindiana – Solaris 11 – Opensolaris

Damit IPv4 im Ethernet funktioniert braucht man das ARP (Address Resolution Protocol) als Unterbau. Denn sonst würden die IPv4 Pakete ja ihren Weg nicht zur richtigen Netzwerkkarte finden. ARP und IPv4 sind dabei völlig unabhängige Protokolle, sie arbeiten nur seit Jahrzenhten Hand in Hand. Das vergessen viele schnell 🙂

Möchte man also nun herausfinden welche MAC Adresse das System (im gleichen Ethernet-Netzwerk) hat, mit welchem man sich gerade unterhält… Ja, dann bemüht man das ARP.

Unter Linux:

$ arp
Address                  HWtype  HWaddress           Flags Mask            Iface
errorgrab.kernel-error.  ether   00:ff:c9:05:01:c7   C                     enp2s0
wurstsuppe.kernel-error. ether   50:ff:5d:85:73:48   C                     enp2s0

Unter Openindiana/Solaris 11:

$ arp -a
Net to Media Table: IPv4
Device   IP Address               Mask      Flags      Phys Addr
------ -------------------- --------------- -------- ---------------
rge0   router.kernel-error      255.255.255.255          00:ff:42:72:2b:a6
rge0   192.168.1.31         255.255.255.255          00:ff:b0:ae:0b:eb
rge0   sebastian-solaris.kernel-error 255.255.255.255 SPLA     80:ff:73:4a:38:c7
rge0   all-routers.mcast.net 255.255.255.255 S        01:ff:5e:00:00:02

Bei IPv6 schaut es nun etwas anders aus. Man könnte sagen, hier wurde ARP direkt mit in IPv6 integriert. Es findet sich im Neighbor Discovery wieder. Möchte man hier seine „Nachbarn“ sehen klappt es so:

Unter Linux:

$ ip -6 neigh show
fe80::1 dev enp2s0 lladdr 50:ff:5d:85:73:48 router STALE
fe80::2ff:c9ff:fe05:1c7 dev enp2s0 lladdr 00:ff:c9:05:01:c7 router REACHABLE

Unter Openindiana/Solaris 11:

$ netstat -pf inet6

Net to Media Table: IPv6
 If   Physical Address    Type      State      Destination/Mask
----- -----------------  ------- ------------ ---------------------------
rge0  33:33:ff:00:00:01  other   REACHABLE    ff02::1:ff00:1             
rge0  00:ff:42:72:2b:a6  dynamic REACHABLE    router.kernel-error
rge0  33:33:00:00:00:01  other   REACHABLE    ff02::1                    
rge0  33:33:00:01:00:02  other   REACHABLE    ff02::1:2                  
rge0  33:33:ff:00:00:06  other   REACHABLE    ff02::1:ff00:6             
rge0  33:33:ff:10:98:82  other   REACHABLE    ff02::1:ff10:9882          
rge0  33:33:ff:ad:7a:dd  other   REACHABLE    ff02::1:ffad:7add          
rge0  33:33:ff:00:00:11  other   REACHABLE    ff02::1:ff00:11            
rge0  33:33:00:00:00:16  other   REACHABLE    ff02::16                   
rge0  46:ff:91:30:98:3d  dynamic REACHABLE    2001:7d8:8001:0:ffff:bdb9:6810:9882
rge0  80:ff:73:4a:38:c7  local   REACHABLE    sebastian-solaris.kernel-error
rge0  80:ff:73:4a:38:c7  local   REACHABLE    fe80::ffff:73ff:fe4a:38c7  
rge0  00:ff:42:72:2b:a6  dynamic REACHABLE    fe80::fff:42ff:fe72:2ba6   
rge0  33:33:ff:4a:38:c7  other   REACHABLE    ff02::1:ff4a:38c7

Früher war es mit dem ARP „einfacher“. Zumindest musste man sich nur einen Befehl merken und dann halt die für das jeweilige Betriebsystem nötigen Schalter herausfinden. Mit IPv6 ist es nun mit in die jeweiligen IP-Tools gewandert. Ich halte es für sauberer auch wenn man sich nun nicht mehr mit den Befehlt „arp“ behelfen kann.

BSD und ihre Ableger nutzen „ndp„.
Bei Linux verschwindet alles in den iproute2-Tools mit dem Befehl: „ip“ (ifconfig, route, usw. usw…. alles im Tool ip)
Microsoft wirft alles in „netsh„.
Unixbasierendes hält sich ans gute alte „netstat„.

Also bis dahin…

OpenSSL ich kann es mir nicht merken

Jetzt mal unter Freunden, was ist bloß los mit meinem Kopf? Da aktiviere ich gerade für einen Kunden am Microsoft Exchangeserver Outlook Anywhere. Der Kunde hat ein selbstsigniertes Zertifikat auf seinem Server. Also quängelt Outlook natürlich bei der Verbindung über https „Das böse Zertifikat vom bösen Proxyserver… bla bla“. Nun will ich einfach mal schnell das Zertifikat haben um es auf der Windose importieren zu können und reiße schnell auf meiner Solariskiste ein Terminalfenster auf und tippe:

# openssl öhm ähhh öhm… *MIST*

Warum kann ich mir das nicht merken? Irgendwas mit sclient slclient?!?! Dann aber sicher -connect und host:port. Es kann doch nicht sein dass ich jedes mal in die Manpage schauen muss oder?

Folgendes ist natürlich der richtige Aufruf:

$ openssl s_client -connect www.kernel-error.de:443

Vielleicht schaffe ich es ja jetzt mir mal zu merken das es s_client heißt, nachdem ich es hier aufgeschrieben habe 🙂 Warum zum Teufel kann ich mir s_client einach nicht merken? Das regt mich auf!

 

 

 

 

Solaris 11 und OpenIndiana: gMTP für die Dateiübertragung einrichten

Ich nenne schon seit einigen Jahren einen Creative ZEN Mozaic mein Eigen. Diesen konnte ich damals gegen einen Creative Muvo v100 eintauschen, welcher seither eine Telefonanlage mit Warteschleifenmusik füttert. Ja, der Muvo war schon ein feines Gerät… Der ZEN Mozaic hat mehr Platz und mehr Möglichkeiten. Für meine Zwecke ein schönes Gerät. Leider lässt sich dieser nur per MTP (http://de.wikipedia.org/wiki/Media_Transfer_Protocol) mit Daten befruchten. Unter Windows natürlich kein Problem, Linux Syteme bringen selbst Fuse Treiber mit usw. usw… Solaris selbst bringt hier erstmal nichts mit.

Jetzt möchte ich natürlich meine Podcast Sendungen und vor allem meine Musik auf den Creative ZEN Mozaic packen. Google hat mir gMTP (http://gmtp.sourceforge.net/) empfholen.

Es installiert sich //fast// von alleine und es funktioniert überraschend gut. Die beste Lösung die ich besher gefunden habe.

Einfach schnell hier herunterladen:

http://gmtp.sourceforge.net/#Downloads

Auspacken:

$ gunzip gmtp-1.3.1-i386.pkg.gz

Installieren:

$ pkgadd -d gmtp-1.3.1-i386.pkg

The following packages are available:
  1  gmtp     gMTP - A Simple MP3 Player Client for Solaris
              (i386) 1.3.0

Select package(s) you wish to process (or 'all' to process
all packages). (default: all) [?,??,q]:

Es fehlen noch ein paar Abhängigkeiten. Diese installiere ich schnell mit:

$ pkg install medialib libid3tag id3lib

Ich habe natürlich vorher das SFE eingebunden!

Libmtp fand sich leider nicht als Paket. Daher musste ich es schnell selbst kompilieren.

Hier ist das Tarball zu finden:
http://sourceforge.net/projects/libmtp/

Auspacken:

$ gunzip libmtp-1.1.1.tar.gz
$ tar xvf libmtp-1.1.1.tar
x libmtp-1.1.1, 0 bytes, 0 tape blocks
x libmtp-1.1.1/missing, 11419 bytes, 23 tape blocks
x libmtp-1.1.1/AUTHORS, 1587 bytes, 4 tape blocks
x libmtp-1.1.1/ChangeLog, 99246 bytes, 194 tape blocks
x libmtp-1.1.1/libmtp.sh, 1257 bytes, 3 tape blocks
x libmtp-1.1.1/libmtp.pc.in, 334 bytes, 1 tape blocks
x libmtp-1.1.1/config.rpath, 0 bytes, 0 tape blocks
x libmtp-1.1.1/libmtp.pc, 334 bytes, 1 tape blocks
x libmtp-1.1.1/configure.ac, 5439 bytes, 11 tape blocks
x libmtp-1.1.1/config.h.in, 5373 bytes, 11 tape blocks
x libmtp-1.1.1/util, 0 bytes, 0 tape blocks
x libmtp-1.1.1/util/mtp-hotplug.c, 10884 bytes, 22 tape blocks
x libmtp-1.1.1/util/Makefile.in, 19249 bytes, 38 tape blocks
x libmtp-1.1.1/util/mtp-probe.c, 2327 bytes, 5 tape blocks
x libmtp-1.1.1/util/Makefile.am, 216 bytes, 1 tape blocks
x libmtp-1.1.1/TODO, 5124 bytes, 11 tape blocks
x libmtp-1.1.1/config.guess, 44892 bytes, 88 tape blocks
x libmtp-1.1.1/install-sh, 13663 bytes, 27 tape blocks
x libmtp-1.1.1/examples, 0 bytes, 0 tape blocks
x libmtp-1.1.1/examples/files.c, 3755 bytes, 8 tape blocks
x libmtp-1.1.1/examples/connect.h, 1523 bytes, 3 tape blocks
x libmtp-1.1.1/examples/pathutils.h, 1147 bytes, 3 tape blocks
x libmtp-1.1.1/examples/getplaylist.c, 2531 bytes, 5 tape blocks
x libmtp-1.1.1/examples/emptyfolders.c, 3117 bytes, 7 tape blocks
x libmtp-1.1.1/examples/newplaylist.c, 3090 bytes, 7 tape blocks
x libmtp-1.1.1/examples/thumb.c, 3181 bytes, 7 tape blocks
x libmtp-1.1.1/examples/getfile.c, 2495 bytes, 5 tape blocks
x libmtp-1.1.1/examples/trexist.c, 1815 bytes, 4 tape blocks
x libmtp-1.1.1/examples/albumart.c, 4283 bytes, 9 tape blocks
x libmtp-1.1.1/examples/playlists.c, 2358 bytes, 5 tape blocks
x libmtp-1.1.1/examples/albums.c, 3433 bytes, 7 tape blocks
x libmtp-1.1.1/examples/common.h, 1143 bytes, 3 tape blocks
x libmtp-1.1.1/examples/connect.c, 4395 bytes, 9 tape blocks
x libmtp-1.1.1/examples/filetree.c, 4062 bytes, 8 tape blocks
x libmtp-1.1.1/examples/util.h, 987 bytes, 2 tape blocks
x libmtp-1.1.1/examples/util.c, 1956 bytes, 4 tape blocks
x libmtp-1.1.1/examples/newfolder.c, 2220 bytes, 5 tape blocks
x libmtp-1.1.1/examples/delfile.c, 2850 bytes, 6 tape blocks
x libmtp-1.1.1/examples/sendtr.c, 12189 bytes, 24 tape blocks
x libmtp-1.1.1/examples/evolution-sync.sh, 3186 bytes, 7 tape blocks
x libmtp-1.1.1/examples/pathutils.c, 7308 bytes, 15 tape blocks
x libmtp-1.1.1/examples/sendfile.c, 2731 bytes, 6 tape blocks
x libmtp-1.1.1/examples/Makefile.in, 25800 bytes, 51 tape blocks
x libmtp-1.1.1/examples/format.c, 2288 bytes, 5 tape blocks
x libmtp-1.1.1/examples/tracks.c, 4804 bytes, 10 tape blocks
x libmtp-1.1.1/examples/folders.c, 3661 bytes, 8 tape blocks
x libmtp-1.1.1/examples/Makefile.am, 1645 bytes, 4 tape blocks
x libmtp-1.1.1/examples/reset.c, 2230 bytes, 5 tape blocks
x libmtp-1.1.1/examples/detect.c, 8427 bytes, 17 tape blocks
x libmtp-1.1.1/depcomp, 18615 bytes, 37 tape blocks
x libmtp-1.1.1/Makefile.in, 27139 bytes, 54 tape blocks
x libmtp-1.1.1/aclocal.m4, 80086 bytes, 157 tape blocks
x libmtp-1.1.1/config.sub, 33387 bytes, 66 tape blocks
x libmtp-1.1.1/README, 36487 bytes, 72 tape blocks
x libmtp-1.1.1/doc, 0 bytes, 0 tape blocks
x libmtp-1.1.1/doc/Doxyfile.in, 46716 bytes, 92 tape blocks
x libmtp-1.1.1/doc/examples.h, 405 bytes, 1 tape blocks
x libmtp-1.1.1/doc/Makefile.in, 10846 bytes, 22 tape blocks
x libmtp-1.1.1/doc/mainpage.h, 528 bytes, 2 tape blocks
x libmtp-1.1.1/doc/Makefile.am, 397 bytes, 1 tape blocks
x libmtp-1.1.1/README.windows.txt, 2878 bytes, 6 tape blocks
x libmtp-1.1.1/libmtp.sh.in, 1257 bytes, 3 tape blocks
x libmtp-1.1.1/configure, 505284 bytes, 987 tape blocks
x libmtp-1.1.1/Makefile.am, 649 bytes, 2 tape blocks
x libmtp-1.1.1/ltmain.sh, 282765 bytes, 553 tape blocks
x libmtp-1.1.1/hotplug.sh.in, 5055 bytes, 10 tape blocks
x libmtp-1.1.1/src, 0 bytes, 0 tape blocks
x libmtp-1.1.1/src/playlist-spl.c, 25484 bytes, 50 tape blocks
x libmtp-1.1.1/src/libmtp.sym, 2551 bytes, 5 tape blocks
x libmtp-1.1.1/src/libmtp.c, 304334 bytes, 595 tape blocks
x libmtp-1.1.1/src/device-flags.h, 11410 bytes, 23 tape blocks
x libmtp-1.1.1/src/libusb-glue.c, 64392 bytes, 126 tape blocks
x libmtp-1.1.1/src/libusb-glue.h, 5990 bytes, 12 tape blocks
x libmtp-1.1.1/src/music-players.h, 69263 bytes, 136 tape blocks
x libmtp-1.1.1/src/libmtp.h, 34743 bytes, 68 tape blocks
x libmtp-1.1.1/src/util.h, 1615 bytes, 4 tape blocks
x libmtp-1.1.1/src/unicode.h, 1546 bytes, 4 tape blocks
x libmtp-1.1.1/src/ptp-pack.c, 60195 bytes, 118 tape blocks
x libmtp-1.1.1/src/util.c, 3223 bytes, 7 tape blocks
x libmtp-1.1.1/src/libmtp.h.in, 34751 bytes, 68 tape blocks
x libmtp-1.1.1/src/playlist-spl.h, 1367 bytes, 3 tape blocks
x libmtp-1.1.1/src/ptp.c, 179847 bytes, 352 tape blocks
x libmtp-1.1.1/src/Makefile.in, 21543 bytes, 43 tape blocks
x libmtp-1.1.1/src/ptp.h, 107562 bytes, 211 tape blocks
x libmtp-1.1.1/src/gphoto2-endian.h, 4610 bytes, 10 tape blocks
x libmtp-1.1.1/src/README, 716 bytes, 2 tape blocks
x libmtp-1.1.1/src/unicode.c, 5492 bytes, 11 tape blocks
x libmtp-1.1.1/src/Makefile.am, 2560 bytes, 5 tape blocks
x libmtp-1.1.1/src/_stdint.h, 76 bytes, 1 tape blocks
x libmtp-1.1.1/INSTALL, 9480 bytes, 19 tape blocks
x libmtp-1.1.1/m4, 0 bytes, 0 tape blocks
x libmtp-1.1.1/m4/ltversion.m4, 686 bytes, 2 tape blocks
x libmtp-1.1.1/m4/ltsugar.m4, 4372 bytes, 9 tape blocks
x libmtp-1.1.1/m4/ltoptions.m4, 11950 bytes, 24 tape blocks
x libmtp-1.1.1/m4/lt~obsolete.m4, 6126 bytes, 12 tape blocks
x libmtp-1.1.1/m4/stdint.m4, 24070 bytes, 48 tape blocks
x libmtp-1.1.1/m4/libtool.m4, 281197 bytes, 550 tape blocks
x libmtp-1.1.1/m4/byteorder.m4, 12349 bytes, 25 tape blocks
x libmtp-1.1.1/m4/iconv.m4, 6865 bytes, 14 tape blocks
x libmtp-1.1.1/COPYING, 26426 bytes, 52 tape blocks

Ins Verzeichnis wechseln, konfigurieren, mit gmake kompilieren und installieren.

$ cd libmtp-1.1.1
$ ./configure --prefix=/usr
$ gmake
$ gmake install

Schon lässt sich gMTP per /usr/local/bin/gmtp starten und nutzen.

Für die Bilderliebhaber:

Screenshot vom gMTP MTP USB auf Solaris.
Screenshot vom Creative ZEN Mozaic mit gMTP - MTP Device Properties
Screenshot vom Creative ZEN Mozaic mit gMTP - Raw Device information

Solaris 11: USB-Kamera und Scanner mit XSane einrichten

Man man man… Jetzt habe ich mich doch tatsächlich 1 Stunde lang in etwas sehr sinnlosem verrannt. *kopfschüttel*

Da will ich mal eben ein Bild mittels xsane von einem USB-Scanner einlesen. Da findet xsane auf dem Solaris 11 System den Scanner nicht. Genau so verhält es sich mit einer USB Digitalkamera…..  Ich habe ja überall nachgeschaut, nur wohl ohne Verstand!

Die Lösung war natürlich recht simpel. Einfach mal das Paket: libusbugen installieren. *Narf*

ZFS iSCSI Share einrichten: Schritt-für-Schritt-Anleitung

Openindiana/Solaris 11 und COMSTAR iSCSI-Target in 5 Minuten

openindiana und iSCSI mit COMSTAR

Die Jungs von SUN haben sich irgedwann einmal gedacht, wäre es nicht toll wenn wir Dinge wie iSCSI, FCoE, FC usw… Einfach in einem großen Framework zusammenfasst.

Damit ersetzt nun COMSTAR den alten iSCSI Target Deamon. Damit ändert sich natürlich auch die Konfiguration… Wie an so vielen Stellen beim Wechsel von Solaris 10 auf Solaris 11 / Opensolaris…

Ich möchte hier im Kurzen die Einrichtung eines einfachen iSCSI Targets basierend auf ZFS für einen Microsoft Windows Host beschreiben. Ich nutze dafür ein Openindiana System. Dieses basiert auf dem letzten Opensolaris welches dann später ins aktuelle Oracle Solrais 11 übergegangen ist.

Na dann mal los!

In diesem Testsystem habe ich für dieses Beispiel eine gesonderte Festplatte vorgesehen. Auf dieser erstelle ich zuerst einen neuen ZFS Pool:

root@iscsi-host:/# zpool create iscsi-target-pool c4t2d0
root@iscsi-host:/# zpool list iscsi-target-pool
NAME SIZE ALLOC FREE EXPANDSZ CAP DEDUP HEALTH ALTROOT
iscsi-target-pool 19,9G 124K 19,9G - 0% 1.00x ONLINE -

In diesem Pool lege ich nun ein weiters ZFS Volume an, welches später das eigentliche Ziel wird:

root@iscsi-host:/# zfs create -V 10g iscsi-target-pool/iscsi_10gb-lun01
root@iscsi-host:/# zfs list iscsi-target-pool/iscsi_10gb-lun01
NAME USED AVAIL REFER MOUNTPOINT
iscsi-target-pool/iscsi_10gb-lun01 10,3G 19,6G 16K -

Wie man sieht habe ich das ZFS Volume auf eine Größe von 10GB begrenzt. Das macht natürlich Sinn wenn man kurz darüber nachdenkt. Sonst würde die Poolgröße das jeweilige Target begrenzen und wenn man mehrere davon in einem Pool hat… Um die nötigen Grundlagen abzuschließen starte ich nun noch die nötigen Dieste.

root@iscsi-host:/# svcs stmf
STATE STIME FMRI
disabled 12:32:40 svc:/system/stmf:default
root@iscsi-host:/# svcadm enable stmf
root@iscsi-host:/# svcs stmf
STATE STIME FMRI
online 13:02:50 svc:/system/stmf:default
root@iscsi-host:/# stmfadm list-state
Operational Status: online
Config Status : initialized
ALUA Status : disabled
ALUA Node : 0

Zuerst schaue ich mir den Status des stmf (SCSI Target Mode Framework) an; es ist deaktiviert. Nach dem aktivieren und prüfen frage ist das stmf mit dem eigenen stmfadm(in) nach dem Status. Es soll ein iSCSI Target werden, dafür fehlt mir noch das folgende Packet:

root@iscsi-host:/# pkg install -v /network/iscsi/target
Zu installierende Pakete: 1
Geschätzter verfügbarer Speicherplatz: 9.91 GB
Geschätzter Speicherplatzverbrauch: 234.32 MB
Boot-Umgebung erstellen: Nein
Sicherung der Boot-Umgebung erstellen: Ja
Zu ändernde Services: 1
Boot-Archiv neu erstellen: Ja

Geänderte Pakete:
openindiana.org
network/iscsi/target
None -> 0.5.11,5.11-0.151.1.8:20130721T131345Z
Services:
restart_fmri:
svc:/system/manifest-import:default
DOWNLOAD PAKETE DATEIEN ÜBERTRAGUNG (MB)
Completed 1/1 37/37 0.3/0.3

PHASE AKTIONEN
Installationsphase 74/74

PHASE ELEMENTE
Paketstatus-Updatephase 1/1
Abbildstatus-Updatephase 2/2

Den Service wieder aktivieren und prüfen:

root@iscsi-host:/# svcs iscsi/target
STATE STIME FMRI
online 13:23:56 svc:/network/iscsi/target:default

Alles läuft, es kann also mit der logical unit weiter gehen. Ich lege also das logische Gerät an mit dem Ziel des vorhin angelegten ZFS Volumes:

root@iscsi-host:/# sbdadm create-lu /dev/zvol/rdsk/iscsi-target-pool/iscsi_10gb-lun01
Created the following LU:

GUID DATA SIZE SOURCE
-------------------------------- ------------------- ----------------
600144f051c247000000523ed0050001 10737418240 /dev/zvol/rdsk/iscsi-target-pool/iscsi_10gb-lun01

Vertrauen ist gut, Kontrolle ist besser! Also mal nachsehen ob alles angelegt ist und ob es auch „online“ ist 🙂 hier hilft wieder der stmfadm(in):

root@iscsi-host:/# stmfadm list-lu -v
LU Name: 600144F051C247000000523ED0050001
Operational Status: Online
Provider Name : sbd
Alias : /dev/zvol/rdsk/iscsi-target-pool/iscsi_10gb-lun01
View Entry Count : 0
Data File : /dev/zvol/rdsk/iscsi-target-pool/iscsi_10gb-lun01
Meta File : not set
Size : 10737418240
Block Size : 512
Management URL : not set
Vendor ID : OI
Product ID : COMSTAR
Serial Num : not set
Write Protect : Disabled
Writeback Cache : Disabled
Access State : Active

Damit der eigentliche Initiator es sehen kann, müssen wir dazu noch einen „view“ erstellen. Ich erstelle diesen mit Hilfe der eindeutigen GUID und prüfe ihn direkt im Anschluss:

root@iscsi-host:/# stmfadm add-view 600144F051C247000000523ED0050001
root@iscsi-host:/# stmfadm list-view -l 600144F051C247000000523ED0050001
View Entry: 0
Host group : All
Target group : All
LUN : 0

Zwischenstand:

– Ich habe alle nötigen Dienste.
– Ich habe 10GB ZFS Volume in einem extra Pool das ich nutzen möchte.
– Ich habe eine logical unit angelegt, welche dieses ZFS Volume wiederspiegelt.
– Ich habe dafür gesorgt das der initiator diese logical unit sehen kann.

Fehlt noch? Genau das Target:

root@iscsi-host:/# itadm create-target
Target iqn.2010-09.org.openindiana:02:6c3939bf-f5e5-4f28-a8d0-d0f0bbb2e1c4 successfully created
root@iscsi-host:/# itadm list-target -v
TARGET NAME STATE SESSIONS
iqn.2010-09.org.openindiana:02:6c3939bf-f5e5-4f28-a8d0-d0f0bbb2e1c4 online 0
alias: -
auth: none (defaults)
targetchapuser: -
targetchapsecret: unset
tpg-tags: default

Wie gehabt… Anlegen und zur Sicherheit noch einmal prüfen. Natürlich könnte ich den Namen des Targets ändern, soll aber schnell und einfach gehen, richtig?

Jetzt kann ich schon fast zur Microsoft Windows Maschine wechseln. Vorher sorge ich mit einem kurzen:

root@iscsi-host:/# devfsadm -i iscsi

…noch dafür dass mein konfiguriertes iSCSI Target ganz sicher im Discovery auftaucht!

Windows….
Ich lasse mich immer wieder von diesem Betriebssystem verarschen! Da will ich nur eben den Microsoft iSCSI-Initiator auf der Windows 7 Pro VM aktivieren um den Windows Part zu zeigen…. Da kommen bei der Installation so hässliche Fehlermeldungen wie:

"You do not have permission to update Windows. Please contact your system administrator."
"Setup could not find the update.inf file needed to update your system."
"Initiator-2.08-build3825-x64fre.exe"

Eine kurze Recherche zeigte mir meinen Fehler. Das Teil ist bei mir bereits installiert. Im Grunde habe ich für diese Erkentniss länger gebraucht als für die komplette Vorbereitung auf der Solaris Kiste 🙁 Nicht falsch verstehen, ich suche die Schuld nicht bei Windows! Ich habe halt einfach keine Ahnung von den Kisten.

Aber weiter im Text. Auf der Windows Seite habe ich folgendes gemacht:
– Das Portal über die IPv6 Adresse ermitteln lassen.
– Das Ziel gesucht und verbunden.
– Die neue „Festplatte“ in der Datenträgerverwaltung inizialisiert und auf diesem ein einfaches NTFS Volume erstellt.

Für den Microsoft Windows Teil habe ich ein paar Bilder erstellt 🙂

Screenshot der Windows Fehlermeldung: You do not have permission to update Windows. Please contact your system administraot.Screenshot der Windows Fehlermeldung: Setup could not find the update.inf File needed to update your systemScreenshot der Windows iSCSI-Initiator - Suche mit einestellung des Zielportales.Screenshot der Windows iSCSI-Initiator - Ziele mit dem erkennten iscsi ziel.
Screenshot der Windows iSCSI-Initiator - Mit Ziel verbinden.Screenshot der Windows iSCSI-Initiator - Volumes und Geräte mit Blick auf die Volumeliste.Screenshot der Windows Datenträgerinitialisierung und dem erkannten Datenträger 1 vom iscsi ziel.Screenshot der Windows Datenträgerverwaltung mit dem ferig konfigurieren COMSTART SCSI device.

ZFS encryption

ZFS Dateisystem verschlüsseln

Ab der ZFS Version 30 gibt es endlich die Möglichkeit sein ZFS Dateisystem zu verschlüsseln. Diese mit AES-128, 192 oder auch 256. Bei Schlüsseln größer 128 Bit macht es natürlich Sinn eine Hardwarebeschleunigung zu haben. SPARC User haben mit z.B.: T2 oder T3 gewonnen, Intel User mit z.B.: der 5600 CPU also den meisten großen Xeon CPUs.

Davon mal abgesehen… Sollte ein AES-128 Schlüssen mehr als ausreichen 🙂 Ich habe da etwas gelesen:

„In the case of AES-128, there is no known attack which is faster than the 2^128 complexity of exhaustive search.“

Für den normalen „Notebook-, Workstation- oder Serverklau“ sollte es reichen!

Wie geht es nun? Tja, so wie bei zfs fast immer. Extrem einfach:

$ zfs create -o encryption=on rpool/export/home/kernel/DatenSafe
Enter passphrase for 'rpool/export/home/kernel/DatenSafe':
Enter again:

Schon habe ich in meinem Homeverzeichnis einen DatenSafe. Natürlich sollte man das Kennwort nicht vergessen (wie immer) sonst hat man ein echtes Problem an seine Daten zu kommen! Starte ich mein System nun neu, kann das ZFS Dateisystem mangels fehlendem Kennwort nicht eingebunden werden. Dieses müsste ich also nachholen wenn ich auf dieses zugreifen möchte:

$ zfs mount rpool/export/home/kernel/DatenSafe
Enter passphrase for 'rpool/export/home/kernel/DatenSafe':

Es geht natürlich auch bequemer. Man könnte beim anlegen des ZFS Dateisystems sagen, der Schlüssel solle bitte als Datei auf dem USB-Stick liegen:

$ zfs create -o encryption=on -o keysource=raw,file:///media/usb-stick/schluessel rpool/export/home/kernel/DatenSafe

Dann müsste man immer diesen USB-Stick von dem eigentlichen System fern halten, damit nicht beides gleichzeitig abhanden kommt. Wäre dann ja so wie die PIN-Nummer auf der EC-Karte zu notieren! Dann müsste man den USB-Stick oder besser den Schlüssel kopieren und diesen zusätzlich sicher ablegen. Der Stick könnte ja mal kaputt gehen oder „verschwinden“. Hier müsste also die Lagerstelle der Sicherungskopie zusätzlich sicher sein. Ein Kennwort im Kopf ist da vielleicht doch besser. Kommt halt wieder darauf an 🙂


Unter Solaris 11 gibt es dieses natürlich auch in „schön“. Es gibt ein PAM Module! Damit kann man extrem einfach verschlüsselte Benutzerverzeichnisse realisieren.

Grob kann man es sich wie folgt vorstellen. Das PAM Module ermöglicht einen Abgleich zwischen dem Unix-Kennwort und dem Encryption Key des ZFS Dateisystems des Benutzerverzeichnisses. Zusätzlich wird beim ersten Login des Benutzers gleich das verschlüsselte Benutzerverzeichnis angelegt. Der Benutzer meldet sich also einfach am System an und das Filesystem wird gleichzeitig entschlüsselt und eingehangen.

Das PAM Module arbeitet dabei Hand in Hand mit ssh, dgm und natürlich dem normalen Konsolenlogin.

Eine erste Konfiguration könnte so aussehen:

Damit PAM diese Fähigkeit nutzt müssen wir dieses noch mitteilen. Dazu muss folgendes in der Konfigurationsdatei /etc/pam.conf ergänzt werden:

login auth     required pam_zfs_key.so.1 create
other password required pam_zfs_key.so.1

sshd-kbdint     auth requisite          pam_authtok_get.so.1
sshd-kbdint     auth required           pam_unix_cred.so.1
sshd-kbdint     auth required           pam_unix_auth.so.1
sshd-kbdint     auth required           pam_zfs_key.so.1 create
sshd-kbdint     auth required           pam_unix_auth.so.1

gdm     auth requisite          pam_authtok_get.so.1
gdm     auth required           pam_unix_cred.so.1
gdm     auth required           pam_unix_auth.so.1
gdm     auth required           pam_zfs_key.so.1 create
gdm     auth required           pam_unix_auth.so.1

Schon lässt sich ein neuer Benutzer anlegen. Diesem verpassen wir gleich ein initiales Kennwort:

$ useradd sebastian
$ passwd sebastian

Damit der Benutzer beim ersten Login sein Kennwort ändert, mit welchem das Homedirectory angelegt bzw. verschlüsselt wird, geben wir noch folgendes mit:

$ passwd -f sebastian

Wenn sich nun der User: „sebastian“ anmeldet passiert folgendes:

errorlap console login: sebastian
Password:
Choose a new password.
New Password:
Re-enter new Password:
login: password successfully changed for sebastian
Creating home directory with encryption=on.
Your login password will be used as the wrapping key.
Last login: Tue Apr 10 21:56:42 on console
Oracle Corporation      SunOS 5.11      11.0    November 2011
$

Schon ist der Benutzer sebastian angemeldet, hat ein encrypted homedirectory und ein Kennwort welches nur er kennt. Damit sind die Daten auf dem ~Notebook~ nun so sicher wie das Kennwort vom User Sebastian.

Mal schauen?

$ zfs get encryption,keysource rpool/export/home/sebastian
NAME                   PROPERTY    VALUE              SOURCE
rpool/export/home/sebastian  encryption  on                 local
rpool/export/home/sebastian  keysource   passphrase,prompt  local

Ich habe bereits einen User inkl. Daten. Ein ZFS Dateisystem lässt sich bisher nicht im Nachhinein verschlüssel. Aus diesem Grund muss die Option der Verschlüsselung beim erstellen des ZFS Filesystems angegeben werden. Ich könnte jetzt meine Daten sichern, den Benutzer löschen, den Benutzer neu anlegen und meine Daten zurücksichern… Leider bin ich faul und habe keinen Bock alle Rollen und Gruppenzugehörigkeiten neu anzulegen. Also habe ich folgendes gemacht:

Ich habe mir einen anderen User gegriffen der das Recht hat in die ROOT-Rolle zu wechseln. Mit diesem User habe ich dann das Homedirectory meines User umbenannt. Dieses musste ich aber erzwingen.

$ zfs rename -f rpool/export/home/kernel rpool/export/home/wurst

Dann soll beim nächsten Login direkt ein neues Kennwort gesetzt werden:

$ passwd -f kernel

Nach dem Login habe ich ein neues und verschlüseltes Benutzerverzeichnis. In dieses kopiere ich nun einfach wieder meine Daten aus /home/wurst und schon ist alles wie zuvor. Nur halt verschlüsselt! Natürlich liegen die Daten nun noch unverschlüsselt auf der Platte und in alten Snapshots. Dieses muss ich alles löschen. Da die Daten damit noch immer nicht zu 100% von der Platte verschwunden sind könnte man sie noch mit etwas Mühe von der Platte herunterknibbeln. Dieses muss man im Hinterkopf behalten. Die Daten werden erst langsam und Stück für Stück überschrieben. Ein wirklich sicherer Weg ist dieses also nicht!


Natürlich habe ich auch noch etwas für die Bilderliebhaber. So schaut der ganze Vorgang am Gnome Display Manager aus. Vom ersten Login des Users, über Kennwortänderung bis hin zur Bestätigung des angelegten und verschlüsselten Benutzerverzeichnis. Wie man sehen kann ist es sogar für den einfallslosen, mausschubsenden Anwender zu bewältigen. Fragt sich nur welcher dieser Anwender an einem Solaris Desktop arbeiten O_o???

ZFS Solaris 11 Homedirectory encryption mit gdm Benutzeranmeldung
ZFS Solaris 11 Homedirectory encryption mit gdm Eingabe des initialen Kennwortes


ZFS Solaris 11 Homedirectory encryption mit gdm Aufforderung zur Kennwortänderung


 

ZFS Solaris 11 Homedirectory encryption mit gdm Eingabe neues Kennwort
ZFS Solaris 11 Homedirectory encryption mit gdm wiederholte Eingabe neues Kennwort


ZFS Solaris 11 Homedirectory encryption mit gdm Kennwort wurde geändert

 

ZFS Solaris 11 Homedirectory encryption mit gdm verschlüsseltes Benutzerverzeichnis wurde angelegt


ZFS SMB

SMB Freigaben erstellen

Bevor ich mit um die Einrichtung von SMB Freigaben kümmern kann muss ich dafür sorgen das die nötigen Grundlagen dafür gegeben sind.

Als erstes installiere ich also die SMB Server kernel root components nach:

$ pkg install SUNWsmbskr
             Zu installierende Pakete:    1  
              Boot-Umgebung erstellen: Nein
Sicherung der Boot-Umgebung erstellen:   Ja
                Zu ändernde Services:    1

DOWNLOAD                                PAKETE     DATEIEN ÜBERTRAGUNG (MB)
Completed                                  1/1       29/29      0.5/0.5

PHASE                                       AKTIONEN
Installationsphase                             84/84

PHASE                                       ELEMENTE
Paketstatus-Updatephase                          1/1
Abbildstatus-Updatephase                         2/2

Installiert ist er damit schon mal. Damit nun am Ende die lokalen Benutzer mittels Benutzername / Kennwort zugriff auf die Freigaben haben muss noch folgende Zeile in die Datei /etc/pam.conf aufgenommen werden:

other password required pam_smb_passwd.so.1 nowarn

So nun nur noch den SMB-Server anwerfen:

$ svcadm enable -r smb/server

Jetzt schaue ich mal schnell nach ob er auch läuft (wenn er sinnlos hängen bleibt sucht man sonst so lange):

$ svcs smb/server
STATE          STIME    FMRI
online         20:11:41 svc:/network/smb/server:default

So gefällt es mir fast schon. Als nächstes hänge ich Kiste noch in die Workgroup meiner wahl:

smbadm join -w kernel-error.de
After joining kernel-error.de the smb service will be restarted automatically.
Would you like to continue? [no]: yes
Successfully joined kernel-error.de

Nun sollte alles bereit sein um SMB-Shares zu erstellen. Für meinen Test erstelle ich einen neues ZFS Dateisystem, welche ich später freigeben möchte:

$ zfs create rpool/windoof-freigabe
$ zfs list rpool/windoof-freigabe
NAME                    USED  AVAIL  REFER  MOUNTPOINT
rpool/windoof-freigabe   31K   190G    31K  /rpool/windoof-freigabe

Die eigentlich Freigabe erstellt sich nun fast von alleine:

$ zfs set sharesmb=on rpool/windoof-freigabe
$ zfs get sharesmb rpool/windoof-freigabe
NAME                    PROPERTY  VALUE     SOURCE
rpool/windoof-freigabe  sharesmb  on        local

Wooohooo….

Auf mehrfache Nachfrage hier noch etwas zu ZFS und CIFS-Shares >>klick<<

ZFS Snapshots

ZFS Snapshots

Eine wirklich geile Funktion von ZFS sind Snapshots. Macht man einen Snapshot friert ZFS den aktuellen Stand des Dateisystems einfach ein. ZFS schreibt so oder so jede Änderung an eine neue Stelle (copy on write). Die Blöcke werden bei einem Snapshot einfach nicht mehr zum überschreiben freigegeben. Somit ist es für ZFS einfacher einen Snapshot zu machen als eine Datei zu speichern. Einen snapshot kann man natürlich einfach wiederherstellen, auf diesen Zugreifen (um sich mal schnell eine versehentlich gelöschte Datei aus diesem heraus zu kopieren), ihn wiederherstellen oder aus ihm einen beschreibbaren Clone erstellen. Wenn gewünscht kann man einen Snapshot oder nur die Veränderung zwischen zwei Snapshots per SSH auf einen anderen Rechner schieben. Dabei werden natürlich alle Einstellungen der Dateisysteme (NFS Shares, SMB Shares, ISCSI Targets, Quotas usw. usw…) übernommen. Man kann also für 0€ seinen Store auf eine andere Maschine Spiegeln. Als Sicherung oder für den failover!

Ich habe mir für meinen Test nun erstmal einen neuen ZFS Pool mit dem Namen wurstpelle angelegt. In diesem habe ich schnell das ZFS Volume bernd angelegt und diesem eine Quota von 10GB sowie eine Reservierung von 3GB verpasst:

$ zpool create wurstpelle c3d0p0
$ zfs create wurstpelle/bernd
$ zfs set quota=10G wurstpelle/bernd
$ zfs set reservation=3G wurstpelle/bernd
$ zfs list
NAME                     USED  AVAIL  REFER  MOUNTPOINT
...
wurstpelle              3,00G  70,3G    32K  /wurstpelle
wurstpelle/bernd          31K  10,0G    31K  /wurstpelle/bernd

In diesem erstelle ich nun schnell 1GB Testdateien (10 Stück je 100MB):

$ dd if=/dev/zero of=/wurstpelle/bernd/image01.img bs=10240 count=10240
10240+0 records in
10240+0 records out
$ ls -lh
total 204833
-rw-r--r--   1 root     root        100M Okt 31 15:21 image01.img

$ cp image01.img image02.img
$ cp image01.img image03.img
$ cp image01.img image04.img
$ cp image01.img image05.img
$ cp image01.img image06.img
$ cp image01.img image07.img
$ cp image01.img image08.img
$ cp image01.img image09.img
$ cp image01.img image10.img
$ ls -lh
total 1993042
-rw-r--r--   1 root     root        100M Okt 31 15:21 image01.img
-rw-r--r--   1 root     root        100M Okt 31 15:21 image02.img
-rw-r--r--   1 root     root        100M Okt 31 15:21 image03.img
-rw-r--r--   1 root     root        100M Okt 31 15:22 image04.img
-rw-r--r--   1 root     root        100M Okt 31 15:22 image05.img
-rw-r--r--   1 root     root        100M Okt 31 15:22 image06.img
-rw-r--r--   1 root     root        100M Okt 31 15:22 image07.img
-rw-r--r--   1 root     root        100M Okt 31 15:22 image08.img
-rw-r--r--   1 root     root        100M Okt 31 15:22 image09.img
-rw-r--r--   1 root     root        100M Okt 31 15:22 image10.img

Mal schauen wie voll der Pool nun ist:

$ zfs list wurstpelle/bernd
NAME               USED  AVAIL  REFER  MOUNTPOINT
wurstpelle/bernd  1000M  9,02G  1000M  /wurstpelle/bernd

Nun erstelle ich vom Dateisystem bernd mal einen Snapshot:

$ zfs snapshot wurstpelle/bernd@Test-snapshot>

Diesem Snapshot muss ich natürlich einen Namen geben, das passiert ab dem @. Mein Snapshot heißt also nun Test-snapshot. Ab diesem Moment gibt es unter /wurstpelle/bernd einen Ordner mit dem Namen „.zfs“ diese ist per default nicht sichtbar. Selbst mit einem ls -lisa nicht:

$ ls -lisa
total 2048352
4    3 drwxr-xr-x   2 root     root          12 Okt 31 15:22 .
4    3 drwxr-xr-x   3 root     root           3 Okt 31 15:17 ..
8 204833 -rw-r--r--   1 root     root     104857600 Okt 31 15:21 image01.img
9 204833 -rw-r--r--   1 root     root     104857600 Okt 31 15:21 image02.img
10 204833 -rw-r--r--   1 root     root     104857600 Okt 31 15:21 image03.img
11 204833 -rw-r--r--   1 root     root     104857600 Okt 31 15:22 image04.img
12 204849 -rw-r--r--   1 root     root     104857600 Okt 31 15:22 image05.img
13 204833 -rw-r--r--   1 root     root     104857600 Okt 31 15:22 image06.img
14 204833 -rw-r--r--   1 root     root     104857600 Okt 31 15:22 image07.img
15 204833 -rw-r--r--   1 root     root     104857600 Okt 31 15:22 image08.img
16 204833 -rw-r--r--   1 root     root     104857600 Okt 31 15:22 image09.img
17 204833 -rw-r--r--   1 root     root     104857600 Okt 31 15:22 image10.img

Ich kann aber mit einem cd einfach in diesen Ordner wechseln. In diesem gibt es einen Ordner snapshot und hier liegt mein Test-snapshot:

$ cd .zfs
cd snapshot/
$ ls -lh
total 3
drwxr-xr-x   2 root     root          12 Okt 31 15:22 Test-snapshot

Cool, hm? Wechsel ich nun in den Snapshot schaut alles aus wie mein Dateisystem zum Zeitpunkt des Snapshots. Ich kann Dateien öffnen, sie herauskopieren, ich könnte den Snapshot sogar als Backup wegsichern!

Snapshot/Backup/wegsichern?!?!? Joar… Wie wäre es mit einem Einzeiler auf der Bash um ein komplettes Dateisystemabbild auf einen anderen Rechner zu schieben? Kein Problem!

Auf dem Quellsystem ist nicht viel zu beachten. Es muss halt einen Snapshot geben, welchen man herüber schieben will. Den zu erstellen ist ja kein Problem 😛 Auf dem Zielsystem ist genau so wenig zu beachten. der SSH-Loginuser muss halt das Recht haben ein neues ZFS-Volume anzulegen.

Ich teste ja mit Openindiana, für einen Test erlaube ich dann mal auf der Openindianakiste den root Login per ssh:

### enable root ssh login ###
$ rolemod -K type=normal root

$ cat /etc/ssh/sshd_config |grep PermitRootLogin
PermitRootLogin yes

Nun lege ich noch schnell einen ZFS Pool an in welchem ich die Daten gerne liegen hätte:

$ zpool create backup c2d1p0
$ zpool list backup
NAME     SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
backup  74,5G   132K  74,5G     0%  1.00x  ONLINE  -

Schon kann es los gehen. Mit folgendem Befehl stoße ich nun also auf meinem Quellsystem die „Kopie“ an:

$ zfs send wurstpelle/bernd@Test-snapshot | ssh root@xxxx:xxxx:8001:0:2e0:4cff:feee:8adb zfs recv backup/daten-ziel@Test-snapshot>
Password:

Fertig? Joar, nun schaue ich mal ob alles angekommen ist:

$ zpool list backup
NAME     SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
backup  74,5G  1001M  73,5G     1%  1.00x  ONLINE  -

$ ls -l /backup/
total 2
drwxr-xr-x 2 root root 12 2011-10-31 15:22 daten-ziel

$ ls -lh /backup/daten-ziel/
total 1001M
-rw-r--r-- 1 root root 100M 2011-10-31 15:21 image01.img
-rw-r--r-- 1 root root 100M 2011-10-31 15:21 image02.img
-rw-r--r-- 1 root root 100M 2011-10-31 15:21 image03.img
-rw-r--r-- 1 root root 100M 2011-10-31 15:22 image04.img
-rw-r--r-- 1 root root 100M 2011-10-31 15:22 image05.img
-rw-r--r-- 1 root root 100M 2011-10-31 15:22 image06.img
-rw-r--r-- 1 root root 100M 2011-10-31 15:22 image07.img
-rw-r--r-- 1 root root 100M 2011-10-31 15:22 image08.img
-rw-r--r-- 1 root root 100M 2011-10-31 15:22 image09.img
-rw-r--r-- 1 root root 100M 2011-10-31 15:22 image10.img

Alles da, alles gut. Nun könnte ich alle 10 Minuten einen Snapshot machen und jeweils den Unterschied der Snapshots auf mein Backupsystem schieben. Damit hätte ich eine genaue Kopie meines Livesystems mit maximal 15 Minuten unterschied. Auf dem Backupsystem könnte ich natürlich genau so Snapshots machen und den Backupstand zusätzlich sicher. Krass oder?

Für den Gnome Dateimanager Nautilus unter Opensolaris basierenden Systemen  gibt es ein ganz nettes Plugin. Den Time Slider… Hier gibt es einen Dienst der alle paar Minuten einen Snapshot vom Sytem macht. Diese werden dann aufgehoben (Stündlich, täglich, wöchentlich, monatlich, jährlich….) Wir die Platte zu voll werden immer die ältesten Snapshots automatisch gelöscht. Durch das Nautilus Plugin kann man dann ganz bequem per GUI durch die Snapshots sliden. Ich habe da mal zwei Screenshots gemacht:

Aber da geht noch mehr… Ich sag nur Solaris boot environment 😀

Macht man ein Update seines Systems, macht der Updater einen Snapshot des root Pools, erstellt davon einen Clone und trägt diesen selbstständig im Grub ein. Dann macht er alle Updates in diesen neuen Pool. Es werden also nicht alle möglichen Dienste während des Updates neu gestartet oder sonstiges Zeugs…. Ist das Update abgeschlossen startet man seine Kiste einfach neu und Bootet in diesen neuen Clone (boot environment). Ein Update ist also in der Zeit eines Reboots erledigt. Ist bei dem Update etwas schief gelaufen, kann man einfach in alte System booten und alles ist wie vor dem Update. Kein Stress mehr, kein Bangen, keine Ausfälle während der Updates.

// Ich kann mich da an Updates auf Linux Servern erinnern, bei denen etwas mit dem Netzwerk oder SSH-Server schief gelaufen ist und man dann zum Server fahren musste (pre IPMI) oder an Windows Server die zwar ihre Updates installieren aber erst nach dem zweiten Reboot wieder (darf man stabil sagen?) stabil laufen. Über die boot environments muss man darüber nicht mehr nachdenken, zumindest bei Solaris und öhm BSD 😛 //

Dabei muss es sich nicht immer um ein Systemupdate handeln. Hin und wieder fummelt man ja gerne in einigen Konfigurationen herum. Warum macht man nicht einfach vor Experimenten ein neues Boot Environment von Hand? Kostet nichts und ist mit einem Befehl erledigt. Verfriemelt man sich, bootet man einfach lächelnd den alten Stand und fertig!

Alles läuft im Grunde über den Befehl beadm….

Was gibt es bisher:

$ beadm list
BE                  Active Mountpoint Space Policy Created
Sebastians-Notebook -      -          36,1M static 2011-10-25 10:49
openindiana         NR     /          11,6G static 2011-09-28 19:06
openindiana-1       -      -          37,3M static 2011-10-27 20:04

Ein neues anlegen:

$ beadm create NAME

Löschen mit destroy… Ach, einfach mal selbst schauen, ist sehr einfach!

« Ältere Beiträge Neuere Beiträge »

© 2025 -=Kernel-Error=-

Theme von Anders NorénHoch ↑