Datenhaufen zu IT und Elektronik.

Autor: kernel-error (Seite 42 von 48)

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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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 -
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 -
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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 -
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 -
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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
root@iscsi-host:/# svcs iscsi/target
STATE STIME FMRI
online 13:23:56 svc:/network/iscsi/target:default
root@iscsi-host:/# svcs iscsi/target STATE STIME FMRI online 13:23:56 svc:/network/iscsi/target:default
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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):

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
root@iscsi-host:/# devfsadm -i iscsi
root@iscsi-host:/# devfsadm -i iscsi
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
"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"
"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"
"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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zfs create -o encryption=on rpool/export/home/kernel/DatenSafe
Enter passphrase for 'rpool/export/home/kernel/DatenSafe':
Enter again:
$ zfs create -o encryption=on rpool/export/home/kernel/DatenSafe Enter passphrase for 'rpool/export/home/kernel/DatenSafe': Enter again:
$ 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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zfs mount rpool/export/home/kernel/DatenSafe
Enter passphrase for 'rpool/export/home/kernel/DatenSafe':
$ zfs mount rpool/export/home/kernel/DatenSafe Enter passphrase for 'rpool/export/home/kernel/DatenSafe':
$ 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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zfs create -o encryption=on -o keysource=raw,file:///media/usb-stick/schluessel rpool/export/home/kernel/DatenSafe
$ zfs create -o encryption=on -o keysource=raw,file:///media/usb-stick/schluessel rpool/export/home/kernel/DatenSafe
$ 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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ useradd sebastian
$ passwd sebastian
$ useradd sebastian $ passwd sebastian
$ 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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ passwd -f sebastian
$ passwd -f sebastian
$ passwd -f sebastian

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
$
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 $
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?

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ 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
$ 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
$ 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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zfs rename -f rpool/export/home/kernel rpool/export/home/wurst
$ zfs rename -f rpool/export/home/kernel rpool/export/home/wurst
$ zfs rename -f rpool/export/home/kernel rpool/export/home/wurst

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ passwd -f kernel
$ passwd -f kernel
$ 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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ 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
$ 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
$ 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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
other password required pam_smb_passwd.so.1 nowarn
other password required pam_smb_passwd.so.1 nowarn
other password required pam_smb_passwd.so.1 nowarn

So nun nur noch den SMB-Server anwerfen:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ svcadm enable -r smb/server
$ svcadm enable -r smb/server
$ 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):

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ svcs smb/server
STATE STIME FMRI
online 20:11:41 svc:/network/smb/server:default
$ svcs smb/server STATE STIME FMRI online 20:11:41 svc:/network/smb/server:default
$ 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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zfs create rpool/windoof-freigabe
$ zfs list rpool/windoof-freigabe
NAME USED AVAIL REFER MOUNTPOINT
rpool/windoof-freigabe 31K 190G 31K /rpool/windoof-freigabe
$ zfs create rpool/windoof-freigabe $ zfs list rpool/windoof-freigabe NAME USED AVAIL REFER MOUNTPOINT rpool/windoof-freigabe 31K 190G 31K /rpool/windoof-freigabe
$ 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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zfs set sharesmb=on rpool/windoof-freigabe
$ zfs get sharesmb rpool/windoof-freigabe
NAME PROPERTY VALUE SOURCE
rpool/windoof-freigabe sharesmb on local
$ zfs set sharesmb=on rpool/windoof-freigabe $ zfs get sharesmb rpool/windoof-freigabe NAME PROPERTY VALUE SOURCE rpool/windoof-freigabe sharesmb on local
$ 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 NFS

NFS Freigaben erstellen

Mal eben schnell einen NFS Share anlegen ist mit ZFS überhaupt kein Problem. Ich greife mir mal schnell meinen 8GB USB-Stick und stopfe ihn in den Rechner. Dann lege ich schnell einen ZFS Pool auf diesem an:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zpool create nfs-share c3t0d0p0
$ zpool list
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
nfs-share 7,44G 91K 7,44G 0% 1.00x ONLINE -
platte2 149G 37,5G 111G 25% 1.05x ONLINE -
rpool 464G 46,6G 417G 10% 1.00x ONLINE
$ zpool create nfs-share c3t0d0p0 $ zpool list NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT nfs-share 7,44G 91K 7,44G 0% 1.00x ONLINE - platte2 149G 37,5G 111G 25% 1.05x ONLINE - rpool 464G 46,6G 417G 10% 1.00x ONLINE
$ zpool create nfs-share c3t0d0p0
$ zpool list
NAME        SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
nfs-share  7,44G    91K  7,44G     0%  1.00x  ONLINE  -
platte2     149G  37,5G   111G    25%  1.05x  ONLINE  -
rpool       464G  46,6G   417G    10%  1.00x  ONLINE

Zur besseren Übersicht lege ich hier nun ein weiteres Volume an und gebe das direkt per NFS „frei“:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zfs create nfs-share/freigabe01
$ zfs set sharenfs=on nfs-share/freigabe01
$ zfs get sharenfs nfs-share/freigabe01
NAME PROPERTY VALUE SOURCE
nfs-share/freigabe01 sharenfs on local
$ zfs create nfs-share/freigabe01 $ zfs set sharenfs=on nfs-share/freigabe01 $ zfs get sharenfs nfs-share/freigabe01 NAME PROPERTY VALUE SOURCE nfs-share/freigabe01 sharenfs on local
$ zfs create nfs-share/freigabe01
$ zfs set sharenfs=on nfs-share/freigabe01
$ zfs get sharenfs nfs-share/freigabe01
NAME                  PROPERTY  VALUE     SOURCE
nfs-share/freigabe01  sharenfs  on        local

Einmal kontrollieren welche Exports es nun gibt:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zfs get sharenfs nfs-share/freigabe01
NAME PROPERTY VALUE SOURCE
nfs-share/freigabe01 sharenfs on local
$ zfs get sharenfs nfs-share/freigabe01 NAME PROPERTY VALUE SOURCE nfs-share/freigabe01 sharenfs on local
$ zfs get sharenfs nfs-share/freigabe01
NAME                  PROPERTY  VALUE     SOURCE
nfs-share/freigabe01  sharenfs  on        local

Wunderbar…. Nun könnte man diesen Share schon mounten und nutzen. Ist nicht sonderlich schwer, oder? Natürlich kann man die gängigen NFS Optionen auf einen solchen Share anwenden, alle eine Sache der Optionen 😛 Ganz lustig ist nun folgendes…. Mache ich nun ein:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zpool export nfs-share
$ zpool export nfs-share
$ zpool export nfs-share

Ziehe dann den USB-Stick raus und gehe zu einem anderen Rechner. Dann kann ich diesen dort ja mit:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zpool import nfs-share
$ zpool import nfs-share
$ zpool import nfs-share

Wieder einbinden. Alle ZFS-Einstellungen bleiben ja erhalten. Somit auch der share. Ich habe damit also einen Tragbaren NFS share. Stopfe ich diesen in einen Rechner und importiere den ZFS Pool dann habe ich auch sofort wieder meinen nutzbaren NFS Share 😀 An so einem Punkt wird einem schnell klar welche Möglichkeiten einem ZFS damit bietet diese Konfigurationen mitwandern zu lassen. Mir fällt jetzt zwar gerade kein genaues Einsatzfeld für einen Tragbaren NFS Share auf einem USB-Stick ein, denn noch schön zu wissen das es geht 😛

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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ 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
$ 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
$ 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):

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ 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
$ 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
$ 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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zfs list wurstpelle/bernd
NAME USED AVAIL REFER MOUNTPOINT
wurstpelle/bernd 1000M 9,02G 1000M /wurstpelle/bernd
$ zfs list wurstpelle/bernd NAME USED AVAIL REFER MOUNTPOINT wurstpelle/bernd 1000M 9,02G 1000M /wurstpelle/bernd
$ 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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zfs snapshot wurstpelle/bernd@Test-snapshot>
$ zfs snapshot wurstpelle/bernd@Test-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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ 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
$ 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
$ 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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ cd .zfs
cd snapshot/
$ ls -lh
total 3
drwxr-xr-x 2 root root 12 Okt 31 15:22 Test-snapshot
$ cd .zfs cd snapshot/ $ ls -lh total 3 drwxr-xr-x 2 root root 12 Okt 31 15:22 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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
### enable root ssh login ###
$ rolemod -K type=normal root
$ cat /etc/ssh/sshd_config |grep PermitRootLogin
PermitRootLogin yes
### enable root ssh login ### $ rolemod -K type=normal root $ cat /etc/ssh/sshd_config |grep PermitRootLogin PermitRootLogin yes
### 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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ 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 -
$ 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 -
$ 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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zfs send wurstpelle/bernd@Test-snapshot | ssh root@xxxx:xxxx:8001:0:2e0:4cff:feee:8adb zfs recv backup/daten-ziel@Test-snapshot>
Password:
$ zfs send wurstpelle/bernd@Test-snapshot | ssh root@xxxx:xxxx:8001:0:2e0:4cff:feee:8adb zfs recv backup/daten-ziel@Test-snapshot> Password:
$ 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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ 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
$ 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
$ 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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ 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
$ 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
$ 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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ beadm create NAME
$ beadm create NAME
$ beadm create NAME

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

ZFS RAID

ZFS RAID

ZFS unterstützt natürlich „RAID“ ein einfacher Mirror ist genau so möglich wie eine Art Raid5 (raidz genannt) oder eine Art Raid6 (raidz2 genannt). Natürlich sind spare Platte kein Problem und Striping ist überhaupt kein Problem.

Ich habe ja bereits einen Pool mit dem Namen backup. Wenn ich aus diesem nun lieber einen Mirror über zwei Platten machen möchte geht das so:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zpool attach backup c2d1p0 c3d0p0
Make sure to wait until resilver is done before rebooting.
$ zpool attach backup c2d1p0 c3d0p0 Make sure to wait until resilver is done before rebooting.
$ zpool attach backup c2d1p0 c3d0p0
Make sure to wait until resilver is done before rebooting.

Wichtig ist hier die richtige Reihenfolge der Platten. Denn man Packt ja der Platte c2d1p0 im Pool backup die Platte c3d0p0 als Spiegel hinzu. Vertauscht man die Platten im Befehlt spiegelt ZFS die leere Platte auf die Datenplatte. Auch ein schöner Mirror, sogar genau wie angegeben aber so leer 😛

Mal angenommen alles wurde richtig angegeben, dann beginnt ZFS nun den Pool zu resilvern. Da es bei ZFS keine Trennung mehr zwischen RAID / Volumemanager bzw. Dateisystem gibt, weiss ZFS genau wo Daten liegen und spiegelt nur diese. Sind nur ein paar GB belegt ist der sync das resilvering schnell durch. Andere Systeme würden hier nun stumpf Block für Block herüber schieben. Egal ob in diesem nun Daten liegen oder nicht. Woher soll dieses auch wissen was das Dateisystem macht? Daher kann es je nach Plattengröße sehr lange dauern.
// Schon mal versucht sechs 3TB Platten eines RAID6 per Linux mdadm nach einem Plattentausch im Betrieb zu resilvern? 10 Stunden sind da nichts, selbst wenn nur 1TB belegt ist… //

Zurück zum backup Pool. Um sich den Status des Pools anzuschauen gebe ich folgendes ein:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zpool status backup
pool: backup
state: ONLINE
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Mon Oct 31 13:18:13 2011
444M scanned out of 4,04G at 18,5M/s, 0h3m to go
440M resilvered, 10,72% done
config:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
c2d1p0 ONLINE 0 0 0
c3d0p0 ONLINE 0 0 0 (resilvering)
errors: No known data errors
$ zpool status backup pool: backup state: ONLINE status: One or more devices is currently being resilvered. The pool will continue to function, possibly in a degraded state. action: Wait for the resilver to complete. scan: resilver in progress since Mon Oct 31 13:18:13 2011 444M scanned out of 4,04G at 18,5M/s, 0h3m to go 440M resilvered, 10,72% done config: NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 c2d1p0 ONLINE 0 0 0 c3d0p0 ONLINE 0 0 0 (resilvering) errors: No known data errors
$ zpool status backup
pool: backup
state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Mon Oct 31 13:18:13 2011
444M scanned out of 4,04G at 18,5M/s, 0h3m to go
440M resilvered, 10,72% done
config:

NAME        STATE     READ WRITE CKSUM
rpool       ONLINE       0     0     0
mirror-0  ONLINE       0     0     0
c2d1p0  ONLINE       0     0     0
c3d0p0  ONLINE       0     0     0  (resilvering)

errors: No known data errors

Ja das Testsystem ist LANGSAM 😉 ich habe alte Hardware genommen (sehr alte Hardware). Denn noch sieht man das ZFS nur die eigentlichen Daten resilverd. Hier also knapp 4,04GB. Würde es die ganzen 80GB resilvern hätte ich eine längere Kaffeepause! Nach getaner Arbeit schaut es nun so aus:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zpool status backup
pool: backup
state: ONLINE
scan: resilvered 4,04G in 0h5m with 0 errors on Mon Oct 31 13:33:00 2011
config:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
c2d1p0 ONLINE 0 0 0
c3d0p0 ONLINE 0 0 0
errors: No known data errors
$ zpool status backup pool: backup state: ONLINE scan: resilvered 4,04G in 0h5m with 0 errors on Mon Oct 31 13:33:00 2011 config: NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 c2d1p0 ONLINE 0 0 0 c3d0p0 ONLINE 0 0 0 errors: No known data errors
$ zpool status backup
pool: backup
state: ONLINE
scan: resilvered 4,04G in 0h5m with 0 errors on Mon Oct 31 13:33:00 2011
config:

NAME        STATE     READ WRITE CKSUM
rpool       ONLINE       0     0     0
mirror-0  ONLINE       0     0     0
c2d1p0  ONLINE       0     0     0
c3d0p0  ONLINE       0     0     0

errors: No known data errors

Ein 80GB Mirror in 5 Minuten resilvern und das auf kack Hardware… Schöne Zeit, oder?

Will ich direkt einen Pool als Mirror anlegen geht dieses natürlich mit:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zpool create backup mirror c2d1p0 c3d0p0
Make sure to wait until resilver is done before rebooting.
$ zpool create backup mirror c2d1p0 c3d0p0 Make sure to wait until resilver is done before rebooting.
$ zpool create backup mirror c2d1p0 c3d0p0
Make sure to wait until resilver is done before rebooting.

Sind meine Datenplatten gespiegelt ist dieses gut gegen Datenverlust. Fällt eine Systemplatte aus kommen die User denn noch nicht an ihre Daten. Daher macht es Sinn einen root pool zu mirrorn. Das ist nun etwas aufwändiger, vor allem da man ja grub nicht vergessen darf. Denn was bringt einem ein gespiegelter Root Pool, wenn man den ohne Bootmanager nicht booten kann? Ich habe da nun folgendes gemacht…

So schaut der rpool meines Testsystems aus:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zpool status rpool
pool: rpool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
c2d0s0 ONLINE 0 0 0
errors: No known data errors
$ zpool status rpool pool: rpool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0 c2d0s0 ONLINE 0 0 0 errors: No known data errors
$ zpool status rpool
pool: rpool
state: ONLINE
scan: none requested
config:

NAME        STATE     READ WRITE CKSUM
rpool       ONLINE       0     0     0
c2d0s0    ONLINE       0     0     0

errors: No known data errors

Diesen möchte ich nun auf die Platte c2d1s0 spiegeln. Dafür lege ich auf dieser zuerst ein Lable an:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ format c2d1s0
selecting c2d1s0
NO Alt slice
No defect list found
[disk formatted, no defect list found]
FORMAT MENU: disk - select a disk type - select (define) a disk type partition - select (define) a partition table Total disk size is 9729 cylinders Cylinder size is 16065 (512 byte) blocks Cylinders Partition Status Type Start End Length % ========= ====== ============ ===== === ====== === 1 Active Solaris2 1 9728 9728 100 SELECT ONE OF THE FOLLOWING: 1. Create a partition 2. Specify the active partition 3. Delete a partition 4. Change between Solaris and Solaris2 Partition IDs 5. Edit/View extended partitions 6. Exit (update disk configuration and exit) 7. Cancel (exit without updating disk configuration) Enter Selection: 6 format> quit
$ format c2d1s0 selecting c2d1s0 NO Alt slice No defect list found [disk formatted, no defect list found] FORMAT MENU: disk - select a disk type - select (define) a disk type partition - select (define) a partition table Total disk size is 9729 cylinders Cylinder size is 16065 (512 byte) blocks Cylinders Partition Status Type Start End Length % ========= ====== ============ ===== === ====== === 1 Active Solaris2 1 9728 9728 100 SELECT ONE OF THE FOLLOWING: 1. Create a partition 2. Specify the active partition 3. Delete a partition 4. Change between Solaris and Solaris2 Partition IDs 5. Edit/View extended partitions 6. Exit (update disk configuration and exit) 7. Cancel (exit without updating disk configuration) Enter Selection: 6 format> quit
$ format c2d1s0
selecting c2d1s0
NO Alt slice
No defect list found
[disk formatted, no defect list found]
 FORMAT MENU: disk       - select a disk type       - select (define) a disk type partition  - select (define) a partition table Total disk size is 9729 cylinders Cylinder size is 16065 (512 byte) blocks Cylinders Partition   Status    Type          Start   End   Length    % =========   ======    ============  =====   ===   ======   === 1       Active    Solaris2          1  9728    9728    100 SELECT ONE OF THE FOLLOWING: 1. Create a partition 2. Specify the active partition 3. Delete a partition 4. Change between Solaris and Solaris2 Partition IDs 5. Edit/View extended partitions 6. Exit (update disk configuration and exit) 7. Cancel (exit without updating disk configuration) Enter Selection: 6 format> quit 

Nun die Partitionseinstellungen der s2 von der Hauptplatte auf die zweite Platte übernehmen:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ prtvtoc /dev/rdsk/c2d0s2 | fmthard -s - /dev/rdsk/c2d1s2
fmthard: New volume table of contents now in place.
$ prtvtoc /dev/rdsk/c2d0s2 | fmthard -s - /dev/rdsk/c2d1s2 fmthard: New volume table of contents now in place.
$ prtvtoc /dev/rdsk/c2d0s2 | fmthard -s - /dev/rdsk/c2d1s2
fmthard:  New volume table of contents now in place.

Dann die zweite Platte dem Pool als mirror hinzuzwingen:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zpool attach -f rpool c2d0s0 c2d1s0
Make sure to wait until resilver is done before rebooting.
$ zpool attach -f rpool c2d0s0 c2d1s0 Make sure to wait until resilver is done before rebooting.
$ zpool attach -f rpool c2d0s0 c2d1s0
Make sure to wait until resilver is done before rebooting.

Damit sollte der rootpool gespiegelt sein. Nun fehlt noch der Bootmanager grub auf der zweiten Platte.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c2d1s0
stage2 written to partition 0, 275 sectors starting at 50 (abs 16115)
stage1 written to partition 0 sector 0 (abs 16065)
$ installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c2d1s0 stage2 written to partition 0, 275 sectors starting at 50 (abs 16115) stage1 written to partition 0 sector 0 (abs 16065)
$ installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c2d1s0
stage2 written to partition 0, 275 sectors starting at 50 (abs 16115)
stage1 written to partition 0 sector 0 (abs 16065)

Fertig….

Jetzt reiße ich einfach mal die eigentliche Hauptplatte aus dem Testsystem und starte die Kiste neu. Nach ordentlichem Boot (muuaaahhhhrrrr) schaue ich mal den Status des Pools an:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zpool status
pool: rpool
state: DEGRADED
status: One or more devices could not be used because the label is missing or
invalid. Sufficient replicas exist for the pool to continue
functioning in a degraded state.
action: Replace the device using 'zpool replace'.
see: http://www.sun.com/msg/ZFS-8000-4J
scan: scrub in progress since Mon Oct 31 13:47:29 2011
17,8M scanned out of 4,06G at 261K/s, 4h30m to go
0 repaired, 0,43% done
config:
NAME STATE READ WRITE CKSUM
rpool DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
c2d0s0 FAULTED 0 0 0 corrupted data
c2d1s0 ONLINE 0 0 0
errors: No known data errors
$ zpool status pool: rpool state: DEGRADED status: One or more devices could not be used because the label is missing or invalid. Sufficient replicas exist for the pool to continue functioning in a degraded state. action: Replace the device using 'zpool replace'. see: http://www.sun.com/msg/ZFS-8000-4J scan: scrub in progress since Mon Oct 31 13:47:29 2011 17,8M scanned out of 4,06G at 261K/s, 4h30m to go 0 repaired, 0,43% done config: NAME STATE READ WRITE CKSUM rpool DEGRADED 0 0 0 mirror-0 DEGRADED 0 0 0 c2d0s0 FAULTED 0 0 0 corrupted data c2d1s0 ONLINE 0 0 0 errors: No known data errors
$ zpool status
pool: rpool
state: DEGRADED
status: One or more devices could not be used because the label is missing or
invalid.  Sufficient replicas exist for the pool to continue
functioning in a degraded state.
action: Replace the device using 'zpool replace'.
see: http://www.sun.com/msg/ZFS-8000-4J
scan: scrub in progress since Mon Oct 31 13:47:29 2011
17,8M scanned out of 4,06G at 261K/s, 4h30m to go
0 repaired, 0,43% done
config:

NAME        STATE     READ WRITE CKSUM
rpool       DEGRADED     0     0     0
mirror-0  DEGRADED     0     0     0
c2d0s0  FAULTED      0     0     0  corrupted data
c2d1s0  ONLINE       0     0     0

errors: No known data errors

Passt und funktioniert also wie gewünscht. Weiter gehts!

ZFS compression

ZFS compression und deduplication

Bei Kompression auf Dateisystemebene denken viele direkt an die Implementierung von Microsoft. Mit dem gleichen Gedanken kommt oft ein *UAARRGGGSSS*. Microsoft Kisten mit eingeschalteter Komprimierung sind alles nur nicht mehr performant, es lässt sich kaum Software auf so einer Platte betreiben und man hat schneller Dateisystemfehler als man meep sagen kann. Niemand will das wirklich einschalten! Bei ZFS ist das etwas anders. Natürlich benötigt das komprimieren Systemressourcen und Datenrettungen werden um einiges Aufwändiger…. Bei heutigen CPUs merkt man kaum etwas davon, dass die CPU nun noch den Stream zur Platte komprimieren muss. Diese Funktion bringen viele CPUs schon in Hardware mit. Die CPU ist hier selten das langsamste Gliet in der Kette. Da ist viel eher die Festplatte der Flaschenhals. Mit einer neueren CPU wird es mit eingeschalteter Komprimierung eher schneller als langsamer. Warum? Na, wenn weniger Daten von der Platte gelesen bzw. weniger Daten auf die Platte geschrieben werden müssen, bringt einem das nicht nur mehr Platz auf dem Datenträger sondern zusätzlich noch weniger IOs 😀 Kompression ist also gut, sofern man nicht gerade eine alte Celeron CPU verbaut hat. Zusätzlich werden nicht beim aktivieren stumpf alle Daten komprimiert. Nein, bei aktivierter Komprimierung werden nur die Daten komprimiert abgelegt, welche in diesem Moment geschrieben werden. Schaltet man die Komprimierung wieder ab werden die neuen Daten wieder unkomprimiert gespeichert.Natürlich kann weiterhin aus jedem Zustand auf alle Daten zugegriffen werden. Will man also mal eben viele Daten ablegen / zwischenspeichern könnte man nur dafür kurz die Komprimierung aktivieren.

Dedublication also dedublizierung ist noch so ein extrem cooles Spielzeug. Ist dieses aktiviert werden einmal gespeicherte Blöcke nicht noch einmal auf der Platte gespeichert. Es wird nur hinterlegt wo man die Daten findet. Hat man also auf dem Store virtuelle Maschinen liegen hat man schnell einige gleiche Blöcke. Das kann richtig Platz sparen. Ist der Store als Fileserver oder ähnliches in einem Unternehmen kann man ebenso Platz sparen. Arbeiten viele User an bzw. mit den gleichen Dingen, taucht ein und das gleiche Dokument an den verschiedensten Stellen auf. Egal ob man nun einen Sharepoint-Server oder ähnliches einsetzt oder das ganze nur an einem Ort liegen soll.User sind halt User. Versionierung in der Entwicklung… Hier wird oft mal eine Kopie des alten Baumes angelegt um eine neue Version zu starten.
// Da gibt es bei einem Kunden meines Arbeitgebers einen Administrator. Dieser betreut eine nicht ganz unwichtige Software. Vor jedem Update das er einspielt legt er immer eine Kopie des Programmordners an, jeweils 2 GB… Diese Kopien liegen dann gerne mal noch 2 – 3 weitere Updates herum. Selbst wenn bei einem solchen Update nur 4 – 5 ini Einträge und zwei 500kb exe Dateien getauscht werden. Mit aktivierter dedubplication verbraucht eine solche Kopie nicht mehr 2GB sondern nur noch die Menge der Änderungen 10 MB…. Also soll dieser beratungsresistente Admin seine Kopien machen! 😀 //

Als kleinen Test habe ich Openindiana auf zwei baugleichen Rechnern mit gleichen Einstellungen installiert. Einmal habe ich vor der Installation compression und deduplication aktiviert einmal nicht.

Sobald die Openindianainstallation den zfs Pool (default rpool) angelegt hat führte ich in einer Konsole der LiveDVD folgendes aus:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ sudo -s
$ zfs set compression=on rpool && zfs set dedup=on rpool
$ sudo -s $ zfs set compression=on rpool && zfs set dedup=on rpool
$ sudo -s
$ zfs set compression=on rpool && zfs set dedup=on rpool

Dann lies ich die Installation ganz normal durchlaufen und habe die Kiste nach der Installation neu gestartet. Direkt nach der Anmeldung des frischen Systems habe ich mir angeschaut was an Daten auf der Platte gelandet ist. Ach ja, die Installation mit compression und deduplication (deduplication konnte hier ja noch nicht richtig ausgespielt werden, belegt nur schon mal Platz im RAM :-P) hat ca. 30 Sekunden länger gedauert….

Als erstes lasse ich mir mal den Komprimierungsgrat ausgeben:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zfs get compressratio rpool
NAME PROPERTY VALUE SOURCE
rpool compressratio 1.52x -
$ zfs get compressratio rpool NAME PROPERTY VALUE SOURCE rpool compressratio 1.52x -
$ zfs get compressratio rpool
NAME   PROPERTY       VALUE  SOURCE
rpool  compressratio  1.52x  -

1.52…. Da müsste ich ja fast die Hälfte an Platz gespart haben! Mal schauen was die deduplication gemacht hat:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zpool get dedupratio rpool
NAME PROPERTY VALUE SOURCE
rpool dedupratio 1.01x -
$ zpool get dedupratio rpool NAME PROPERTY VALUE SOURCE rpool dedupratio 1.01x -
$ zpool get dedupratio rpool
NAME   PROPERTY    VALUE  SOURCE
rpool  dedupratio  1.01x  -

Wie zu erwarten nicht _SO_ viel. Es gibt bei der Installation halt kaum doppelte Daten. Denn noch  ist es ein ganz guter Test, denn mit aktivierter deduplication laufen die ganzen Routinen schon mal mit und man sieht wie schnell oder langsam es ist! Schauen wir mal was nun wirklich auf der Platte an Platz verbraucht wurde:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zpool list
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
rpool 74G 2,59G 71,4G 3% 1.01x ONLINE -
$ zpool list NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT rpool 74G 2,59G 71,4G 3% 1.01x ONLINE -
$ zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
rpool    74G  2,59G  71,4G     3%  1.01x  ONLINE  -

2,59GB für die Grundinstallation mit aktivierter compression und deduplication. Mal schauen was ohne diese beiden Funktionen auf der Platte landet:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zpool list
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
rpool 74G 3,93G 70,1G 5% 1.00x ONLINE -
$ zpool list NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT rpool 74G 3,93G 70,1G 5% 1.00x ONLINE -
$ zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
rpool    74G  3,93G  70,1G     5%  1.00x  ONLINE  -

Joar das kann sich sehen lassen, oder? Mit entsprechend viel RAM holt man bei eingeschalteter deduplication natürlich eher mehr als weniger Leistung aus deinem Store. Denn jeder Block der nicht geschrieben werden muss lässt der Platte Luft einen anderen Block zu schreiben 😀


Noch etwas zu ZFS compression. Man sollte natürlich darüber nachdenken für welches Volume man die Komprimieren nun einschaltet und für welches nicht. Denn ein Volume auf welchem bereits komprimierte Daten wie Videos, Bilder oder ähnliches abgelegt werden, da wird zfs compression nichts bringen. Es macht es maximal langsamer! Bei Logfiles sieht es natürlich anders aus.
Jetzt lassen sich die Optionen der Komprimierung aber noch etwas genauer anpassen. Mit einem einfachen: zfs set compression=on zfs Datenset greifen die standard Einstellungen. Zur Komprimierung wird gzip verwendet und zwar mit dem compression level 6. Möchte man nun einen höheren Komprimierungslevel haben, zum Beispiel das Maximum 9. Setzt man es wie folgt:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zfs set compression=gzip-9 home/kernel/textdokumente
$ zfs get compression home/kernel/textdokumente
NAME PROPERTY VALUE SOURCE
home/kernel/textdokumente compression gzip-9 local
$ zfs set compression=gzip-9 home/kernel/textdokumente $ zfs get compression home/kernel/textdokumente NAME PROPERTY VALUE SOURCE home/kernel/textdokumente compression gzip-9 local
$ zfs set compression=gzip-9 home/kernel/textdokumente
$ zfs get compression home/kernel/textdokumente
NAME PROPERTY VALUE SOURCE
home/kernel/textdokumente compression gzip-9 local

Ebenso lässt sich auf einen anderen Algorithmus wechseln:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zfs set compression=zle home/kernel/textdokumente
$ zfs get compression home/kernel/textdokumente
NAME PROPERTY VALUE SOURCE
home/kernel/textdokumente compression zle local
$ zfs set compression=zle home/kernel/textdokumente $ zfs get compression home/kernel/textdokumente NAME PROPERTY VALUE SOURCE home/kernel/textdokumente compression zle local
$ zfs set compression=zle home/kernel/textdokumente
$ zfs get compression home/kernel/textdokumente
NAME PROPERTY VALUE SOURCE
home/kernel/textdokumente compression zle local

Umso stärker die Komprimierung umso mehr CPU Zeit geht für die Berechnung drauf. Ob es jetzt beim default level 6 bleibt oder man auf 9 wechselt, dieses hat in meiner Praxis kaum einen Unterschied gemacht. Als Algorithmus zle zu nutzen macht die Sache etwas schneller, verschlechtert den Komprimierungsgrad aber deutlich. Dieses kann ich mit einem gzip-1 fast ebenfalls erreichen! Was man sich vielleicht noch einmal genauer anschauen sollte ist lzjb oder LZ4….

Es bleibt daher, wie so oft, zu bewerten was wohl in der aktuellen Situation das Beste ist!

….und noch was zu ZFS Deduplication!
Hier bitte ebenfalls darüber nachdenken ob und für welches Volume es sinnvoll ist. Deduplication sorgt zwar für Platz und Ruhe auf den Platten. Verbrennt dafür RAM und CPU Zeit!
Im Standard sorgt folgendes:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zfs set dedup=on home/kernel/vorlagen
$ zfs get dedup home/kernel/vorlagen
NAME PROPERTY VALUE SOURCE
home/kernel/vorlagen dedup on local
$ zfs set dedup=on home/kernel/vorlagen $ zfs get dedup home/kernel/vorlagen NAME PROPERTY VALUE SOURCE home/kernel/vorlagen dedup on local
$ zfs set dedup=on home/kernel/vorlagen
$ zfs get dedup home/kernel/vorlagen
NAME PROPERTY VALUE SOURCE
home/kernel/vorlagen dedup on local

..dafür dass bei jedem zu schreibenden Block eine sha256 Checksumme erstellt wird und wenn die gleich ist mit einem bereits geschriebenen Block wird er nicht geschrieben, sondern es gibt nur eine Art Verweiß auf den bereits geschriebenen. Dieses bedeutet nun aber dass es bei einem von 2\^-256 Blöcken zu einer gleichen Checksumme kommen kann auch wenn die Daten unterschiedlich sind. Wer hier eine höhere Sicherheit haben möchte kann mit einem:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zfs set dedup=sha256,verify home/kernel/vorlagen
$ zfs get dedup home/kernel/vorlagen
NAME PROPERTY VALUE SOURCE
home/kernel/vorlagen dedup sha256,verify local
$ zfs set dedup=sha256,verify home/kernel/vorlagen $ zfs get dedup home/kernel/vorlagen NAME PROPERTY VALUE SOURCE home/kernel/vorlagen dedup sha256,verify local
$ zfs set dedup=sha256,verify home/kernel/vorlagen
$ zfs get dedup home/kernel/vorlagen
NAME PROPERTY VALUE SOURCE
home/kernel/vorlagen dedup sha256,verify local

..dafür sorgen, dass bei einer gleichen Checksumme ein Byte-für-Byte Vergleich der Daten gemacht wird. Damit kommt man dann auch diesem Fall auf die Schliche! Ebenso lassen sich hier wieder andere Algorithmen als sha256 einsetzten. fletcher2 oder fletcher4… Gefühlt bringt hier flechter4 zusammen mit verify etwas mehr Performance. Ich bleibe derzeit denn noch lieber bei sha256!

B.t.w.: fletcher4 habe ich unter BSD und Linux Implementierungen schon ein paar mal vermisst. Ob ich hier nur auf eine „alte“ ZFS Version reingefallen bin?

ZFS Pool

Erstellen eines ZFS Pools und Dateisystem

Das erstellen eines neuen Pools ist schnell und sehr einfach erledigt. Im Grunde muss man sich zur Administration von ZFS zwei Befehle merken. zpool wenn etwas mit dem Pool passieren soll und zfs wenn etwas mit dem Volume „Dateisystem“ passieren soll.

Folgender Befehl legt nun den neuen Pool backup an, c2d1p0 ist dabei das verwendete Device, sprich Festplatte. Man könnte hier auch ein File angeben!

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zpool create backup c2d1p0
$ zpool create backup c2d1p0
$ zpool create backup c2d1p0

ZFS denkt sich bei dem c2d1p0 schon das wir eine Festplatte meinen und ergänzt selbständig /dev/rdsk… ZFS denkt sich zudem das wir wohl Daten im Pool speichern wollen und legt im Pool direkt ein gleichnamiges Volume an. Um dort Daten speichern zu können muss es natürlich gemountet werden. Dieses ist ZFS klar und deswegen hängt es alles gleich unter dem root „/“ ein. Selbstverständlich lassen sich alle diese Dinge (und viele mehr) per Option beim anlegen steuern.

Nun schauen wir uns mal an was ZFS gemacht hat:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zpool list backup
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
backup 74,5G 132K 74,5G 0% 1.00x ONLINE -
$ zpool list backup NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT backup 74,5G 132K 74,5G 0% 1.00x ONLINE -
$ zpool list backup
NAME     SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
backup  74,5G   132K  74,5G     0%  1.00x  ONLINE  -

Schaut gut aus, wir könnten jetzt sofort Daten dort speichern…. Mal angenommen der Pool backup wäre nun auf einer USB-Wechselfestplatte oder einem USB-Stick. Dann könnte man diesen „aushängen“ mit:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zpool export backup
$ zpool export backup
$ zpool export backup

An jedem anderen System ließe er sich wieder einbinden mit:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zpool import backup
$ zpool import backup
$ zpool import backup

Dieses funktioniert natürlich mit jedem anderen Pool genau so!

Solaris CIFS Server

Der OpenSolaris fork Openindiana und SMB CIFS Share mit ZFS

Man hat bei Solaris über CIFS die Möglichkeit die Berechtigungsstruckturen von Microsoft Windows Systemen zusetzten. Ich meine damit, man macht eine Freigabe und kann dann die Datei- und Ordnerberechtigungen auf dieser Freigabe mit seinem Windows Client genau so bearbeiten und setzten, als wenn diese auf einem anderen Windows System liegen. Man hat sogar die Möglichkeit sein Solaris System ins Active Directory seiners ADS zu buchen und dieses zur Rechtevergabe zu nutzen! Ja, ich finde es auch geil 🙂

Hier möchte ich nun einmal in einem kleinen Beispiel beschreiben wie man einen einfachen Share für diesen Zweck aufbaut und wie man die Berechtigungen setzt.

Als Ausgangssystem nehme ich ein OpenIndiana in der Version oi_151a2 und mit lokalen Benutzeraccounts. Wenn ich Zeit finde mache ich noch ein Update mit Active Directory Integration…

Damit ich bei meinen „Spielchen“ Mist bauen darf, erstelle ich mir vor solchen Arbeiten immer ein neues Boot Environment:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ beadm create vor-cifs-test
Created successfully
$ beadm create vor-cifs-test Created successfully
$ beadm create vor-cifs-test
Created successfully

Jetzt kann schon mal nicht mehr viel schief gehen!

Wir brauchen natürlich noch den kernelbasierten Teil des CIFS Server für Solaris, dieser installiert sich wie folgt fast von alleine:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ pkg install storage-server
Zu installierende Pakete: 19
Startumgebung erstellen: Nein
Neu zu startende Dienste: 1
DOWNLOAD PAKETE DATEIEN ÜBERTRAGUNG (MB)
Completed 19/19 750/750 47.9/47.9
PHASE AKTIONEN
Installationsphase 1498/1498
PHASE ELEMENTE
Paketstatus-Aktualisierungsphase 19/19
Abbildstatus-Aktualisierungsphase 2/2
$ pkg install storage-server Zu installierende Pakete: 19 Startumgebung erstellen: Nein Neu zu startende Dienste: 1 DOWNLOAD PAKETE DATEIEN ÜBERTRAGUNG (MB) Completed 19/19 750/750 47.9/47.9 PHASE AKTIONEN Installationsphase 1498/1498 PHASE ELEMENTE Paketstatus-Aktualisierungsphase 19/19 Abbildstatus-Aktualisierungsphase 2/2
$ pkg install storage-server
               Zu installierende Pakete:    19
           Startumgebung erstellen:  Nein
               Neu zu startende Dienste:     1
DOWNLOAD                                PAKETE     DATEIEN ÜBERTRAGUNG (MB)
Completed                                19/19     750/750    47.9/47.9

PHASE                                       AKTIONEN
Installationsphase                         1498/1498

PHASE                                       ELEMENTE
Paketstatus-Aktualisierungsphase               19/19
Abbildstatus-Aktualisierungsphase                2/2

Jetzt sind nun nicht nur die Grundlagen für den CIFS Samba Server gelegt sondern auch für alle anderen denkbaren Storage Ideen 🙂

So dann werfen wir mal die Riemen auf den Samba Server:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ svcadm enable -r smb/server
$ svcadm start network/smb/server:default
$ svcadm enable -r smb/server $ svcadm start network/smb/server:default
$ svcadm enable -r smb/server
$ svcadm start network/smb/server:default

Kurze Kontrolle ob alles läuft:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ svcs |grep smb
online 14:32:45 svc:/network/smb/client:default
online 14:32:46 svc:/network/shares/group:smb
online 14:33:03 svc:/network/smb/server:default
$ svcs |grep smb online 14:32:45 svc:/network/smb/client:default online 14:32:46 svc:/network/shares/group:smb online 14:33:03 svc:/network/smb/server:default
$ svcs |grep smb
online         14:32:45 svc:/network/smb/client:default
online         14:32:46 svc:/network/shares/group:smb
online         14:33:03 svc:/network/smb/server:default

Perfekt, weiter gehts! Damit unsere Windosen die Kiste schneller und einfach finden buchen wir sie noch in eine Workgroup:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ smbadm join -w KERNEL-TEST
After joining KERNEL-TEST the smb service will be restarted automatically.
Would you like to continue? [no]: yes
Successfully joined KERNEL-TEST
$ smbadm join -w KERNEL-TEST After joining KERNEL-TEST the smb service will be restarted automatically. Would you like to continue? [no]: yes Successfully joined KERNEL-TEST
$ smbadm join -w KERNEL-TEST
After joining KERNEL-TEST the smb service will be restarted automatically.
Would you like to continue? [no]: yes
Successfully joined KERNEL-TEST

Samba-Server reboot tut nun gut:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ svcadm restart network/smb/server:default
$ svcadm restart network/smb/server:default
$ svcadm restart network/smb/server:default

Damit normale Systembenutzer auch smb Kennwörter bekommen muss pam_smb_passwd aktiviert werden. Dazu muss folgendes in der Datei /etc/pam.conf ergänzt werden:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
other password required pam_smb_passwd.so.1 nowarn
# echo "other password required pam_smb_passwd.so.1 nowarn" >> /etc/pam.conf
other password required pam_smb_passwd.so.1 nowarn # echo "other password required pam_smb_passwd.so.1 nowarn" >> /etc/pam.conf
other password required pam_smb_passwd.so.1 nowarn
# echo "other password required pam_smb_passwd.so.1 nowarn" >> /etc/pam.conf

Setzt man nun seinem Benutzer ein neues Kennwort, bekommt er zusätzlich auch sein smb Kennwort.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ passwd benutzername
$ passwd benutzername
$ passwd benutzername

Ich habe bereits einen einfachen Datenpool, daher richte ich auf diesem nur noch ein weiteres ZFS Filesystem ein, welches ich später freigeben möchte.

Microsoft unterscheidet normalerweise nicht zwischen Groß- und Kleinschreibung auf Dateisystemebene. Dieses beachte ich natürlich beim Anlegen vom neuen ZFS Filesystem. Sollte man später das gleiche Filesystem noch per NFS freigeben wollen, sollte man das „non-blocking mandatory locking“ aktivieren. Dieses beachte ich natürlich auch direkt beim erstellen des Filesystems. Dieses schaut nun also so aus:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zfs create -o casesensitivity=mixed -o nbmand=on fileserver/daten
$ zfs create -o casesensitivity=mixed -o nbmand=on fileserver/daten
$ zfs create -o casesensitivity=mixed -o nbmand=on fileserver/daten

Jetzt kann ich dieses Filesystem schon freigeben, dieses möchte ich unter dem Namen „DatenShare“ tun. Eine kurze Beschreibung der Freigabe darf natürlich nicht fehlen:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zfs set "sharesmb=name=DatenShare,description=Der Testdaten Share" fileserver/daten
$ zfs set "sharesmb=name=DatenShare,description=Der Testdaten Share" fileserver/daten
$ zfs set "sharesmb=name=DatenShare,description=Der Testdaten Share" fileserver/daten

Dann legen wir einen Testbenutzer an und vergeben ein Kennwort:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ useradd -g cifsshare -s /bin/false -c TestUser -m test
$ passwd test
New Password:
Re-enter new Password:
passwd: password successfully changed for test
$ useradd -g cifsshare -s /bin/false -c TestUser -m test $ passwd test New Password: Re-enter new Password: passwd: password successfully changed for test
$ useradd -g cifsshare -s /bin/false -c TestUser -m test
$ passwd test
New Password:
Re-enter new Password:
passwd: password successfully changed for test

Nun sorgen wir mit folgendem Befehl dafür das unser neues ZFS Filesystem diesem Benutzer gehört:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ chown -R test:cifsshare /fileserver/daten
$ chown -R test:cifsshare /fileserver/daten
$ chown -R test:cifsshare /fileserver/daten

Damit am Ende alle Berechtigungen vererbt werden benötigen wir folgendes:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ zfs set aclinherit=passthrough fileserver/daten
$ zfs set aclmode=passthrough fileserver/daten
$ zfs set aclinherit=passthrough fileserver/daten $ zfs set aclmode=passthrough fileserver/daten
$ zfs set aclinherit=passthrough fileserver/daten
$ zfs set aclmode=passthrough fileserver/daten

Jetzt wird es spannend! Mit folgendem Befehl (diese geht über mehrere Zeilen) vergeben alle Rechte für: Alle Benutzer, Alle Gruppen, Jeden

Zur Verdeutlichung und als Test sicher erst mal gut.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
/usr/bin/chmod A=\
owner@:rwxpdDaARWcCos:fd-----:allow,\
group@:rwxpdDaARWcCos:fd-----:allow,\
everyone@:rwxpdDaARWcCos:fd-----:allow \
/fileserver/daten
/usr/bin/chmod A=\ owner@:rwxpdDaARWcCos:fd-----:allow,\ group@:rwxpdDaARWcCos:fd-----:allow,\ everyone@:rwxpdDaARWcCos:fd-----:allow \ /fileserver/daten
/usr/bin/chmod A=\
owner@:rwxpdDaARWcCos:fd-----:allow,\
group@:rwxpdDaARWcCos:fd-----:allow,\
everyone@:rwxpdDaARWcCos:fd-----:allow \
/fileserver/daten

Hier sollte man darauf achten, wirklich das Solaris chown zu nutzen. Denn das GNU chown versteht die Optionen nicht.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ which chown
/usr/bin/chown
$ which chown /usr/bin/chown
$ which chown
/usr/bin/chown

Jetzt können wir mal testen auf den Share zuzugreifen und Rechte zu setzen (Windows booten….. *schnarch*)!

 

cifs01
cifs02
cifs03

 

cifs04
cifs05
cifs06

 

 

 

Damit es mit dem Vererben der Berechtigungen deutlicher wird erstelle ich noch einen zweiten Share:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ chown -R test:cifsshare /fileserver/daten
$ zfs create -o casesensitivity=mixed -o nbmand=on fileserver/daten2
$ zfs set "sharesmb=name=DatenShare2,description=Der Testdaten Share 2" fileserver/daten2
$ chown -R test:cifsshare /fileserver/daten2
/usr/bin/chmod A=\
owner@:rwxpdDaARWcCos:fd-----:allow,\
group@:rwxpdDaARWcCos:fd-----:allow,\
everyone@:rwxpdDaARWcCos:fd-----:allow \
/fileserver/daten2
$ chown -R test:cifsshare /fileserver/daten $ zfs create -o casesensitivity=mixed -o nbmand=on fileserver/daten2 $ zfs set "sharesmb=name=DatenShare2,description=Der Testdaten Share 2" fileserver/daten2 $ chown -R test:cifsshare /fileserver/daten2 /usr/bin/chmod A=\ owner@:rwxpdDaARWcCos:fd-----:allow,\ group@:rwxpdDaARWcCos:fd-----:allow,\ everyone@:rwxpdDaARWcCos:fd-----:allow \ /fileserver/daten2
$ chown -R test:cifsshare /fileserver/daten
$ zfs create -o casesensitivity=mixed -o nbmand=on fileserver/daten2
$ zfs set "sharesmb=name=DatenShare2,description=Der Testdaten Share 2" fileserver/daten2
$ chown -R test:cifsshare /fileserver/daten2
/usr/bin/chmod A=\
owner@:rwxpdDaARWcCos:fd-----:allow,\
group@:rwxpdDaARWcCos:fd-----:allow,\
everyone@:rwxpdDaARWcCos:fd-----:allow \
/fileserver/daten2

Die erweiterten ACLs lassen sich natürlich ebenfalls auf Systemebene anzeigen, hier muss man auch das Solaris ls nutzen:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ cd /fileserver/daten
$ ls -V
total 4373
-rwxrwxrwx+ 1 test cifsshare 345088 Nov 20 2010 cmd.exe
owner@:rwxpdDaARWcCos:------I:allow
group@:rwxpdDaARWcCos:------I:allow
everyone@:rwxpdDaARWcCos:------I:allow
drwxrwxrwx+ 2 test cifsshare 12 Mär 22 17:39 de-DE
owner@:rwxpdDaARWcCos:fd----I:allow
group@:rwxpdDaARWcCos:fd----I:allow
everyone@:rwxpdDaARWcCos:fd----I:allow
drwxrwxrwx+ 5 test cifsshare 5 Mär 22 17:39 diagnostics
owner@:rwxpdDaARWcCos:fd----I:allow
group@:rwxpdDaARWcCos:fd----I:allow
everyone@:rwxpdDaARWcCos:fd----I:allow
drwxrwxrwx+ 2 test cifsshare 2 Mär 22 17:38 TestOrdner
owner@:rwxpdDaARWcCos:fd----I:allow
group@:rwxpdDaARWcCos:fd----I:allow
everyone@:rwxpdDaARWcCos:fd----I:allow
-rwxrwxrwx+ 1 test cifsshare 1733554 Mär 22 16:37 winrar-x64-411d.exe
owner@:rwxpdDaARWcCos:------I:allow
group@:rwxpdDaARWcCos:------I:allow
everyone@:rwxpdDaARWcCos:------I:allow
$ cd /fileserver/daten $ ls -V total 4373 -rwxrwxrwx+ 1 test cifsshare 345088 Nov 20 2010 cmd.exe owner@:rwxpdDaARWcCos:------I:allow group@:rwxpdDaARWcCos:------I:allow everyone@:rwxpdDaARWcCos:------I:allow drwxrwxrwx+ 2 test cifsshare 12 Mär 22 17:39 de-DE owner@:rwxpdDaARWcCos:fd----I:allow group@:rwxpdDaARWcCos:fd----I:allow everyone@:rwxpdDaARWcCos:fd----I:allow drwxrwxrwx+ 5 test cifsshare 5 Mär 22 17:39 diagnostics owner@:rwxpdDaARWcCos:fd----I:allow group@:rwxpdDaARWcCos:fd----I:allow everyone@:rwxpdDaARWcCos:fd----I:allow drwxrwxrwx+ 2 test cifsshare 2 Mär 22 17:38 TestOrdner owner@:rwxpdDaARWcCos:fd----I:allow group@:rwxpdDaARWcCos:fd----I:allow everyone@:rwxpdDaARWcCos:fd----I:allow -rwxrwxrwx+ 1 test cifsshare 1733554 Mär 22 16:37 winrar-x64-411d.exe owner@:rwxpdDaARWcCos:------I:allow group@:rwxpdDaARWcCos:------I:allow everyone@:rwxpdDaARWcCos:------I:allow
$ cd /fileserver/daten
$ ls -V
total 4373
-rwxrwxrwx+  1 test     cifsshare  345088 Nov 20  2010 cmd.exe
                 owner@:rwxpdDaARWcCos:------I:allow
                 group@:rwxpdDaARWcCos:------I:allow
              everyone@:rwxpdDaARWcCos:------I:allow
drwxrwxrwx+  2 test     cifsshare      12 Mär 22 17:39 de-DE
                 owner@:rwxpdDaARWcCos:fd----I:allow
                 group@:rwxpdDaARWcCos:fd----I:allow
              everyone@:rwxpdDaARWcCos:fd----I:allow
drwxrwxrwx+  5 test     cifsshare       5 Mär 22 17:39 diagnostics
                 owner@:rwxpdDaARWcCos:fd----I:allow
                 group@:rwxpdDaARWcCos:fd----I:allow
              everyone@:rwxpdDaARWcCos:fd----I:allow
drwxrwxrwx+  2 test     cifsshare       2 Mär 22 17:38 TestOrdner
                 owner@:rwxpdDaARWcCos:fd----I:allow
                 group@:rwxpdDaARWcCos:fd----I:allow
              everyone@:rwxpdDaARWcCos:fd----I:allow
-rwxrwxrwx+  1 test     cifsshare 1733554 Mär 22 16:37 winrar-x64-411d.exe
                 owner@:rwxpdDaARWcCos:------I:allow
                 group@:rwxpdDaARWcCos:------I:allow
              everyone@:rwxpdDaARWcCos:------I:allow

Es lassen sich nun also die Berechtigungen vom Windows Client aus setzten.

Solaris ipadm

Der OpenSolaris fork Openindiana und die feste IP-Adresse (static IP-Adress)

Solaris war auf den ersten Blick noch nie so richtig einfach in Sachen IP-Adressen. Auf den zweiten Blick finde ich es aber logischer als bei allen anderen! Wie auch immer, die Meinungen gehen hier wohl auseinander.

Ab OpenSolaris dem SolarisExpress 11 also grob dem aktellen Solaris 11 hat sich etwas hinsichtlich des Netzwerkes geändert. Openindiana ist nun daraus hervorgegangen also muss man dieses hier auch beachten 🙂

So wie der Befehl ifconfig unter Linux von ip abgelöst wird, sieht es wohl unter Solaris mit ipadm aus!

Ich mache es einfach mal ganz kurz und schmerzlos:

Als erstes muss nwam (Network Auto-Magic) deaktiviert werden:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ svcadm disable svc:/network/physical:nwam
$ svcadm enable svc:/network/physical:default
$ svcadm disable svc:/network/physical:nwam $ svcadm enable svc:/network/physical:default
$ svcadm disable svc:/network/physical:nwam
$ svcadm enable svc:/network/physical:default

Dann listen wir uns mal kurz alle Netzwerkinterfaces auf:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ ipadm show-if -o all
IFNAME CLASS STATE ACTIVE CURRENT PERSISTENT OVER
lo0 loopback ok yes -m46-v------ 46-- --
net0 ip ok yes bm46-------- ---- --
$ ipadm show-if -o all IFNAME CLASS STATE ACTIVE CURRENT PERSISTENT OVER lo0 loopback ok yes -m46-v------ 46-- -- net0 ip ok yes bm46-------- ---- --
$ ipadm show-if -o all
IFNAME     CLASS    STATE    ACTIVE CURRENT       PERSISTENT OVER
lo0        loopback ok       yes    -m46-v------  46--       --
net0       ip       ok       yes    bm46--------  ----       --

Schon können wir die feste IP 192.168.1.10 mit der Netmask 255.255.255.0 dem Interface net0 zuteilen:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ ipadm create-addr -T static -a 192.168.1.10/24 net0/v4
$ ipadm create-addr -T static -a 192.168.1.10/24 net0/v4
$ ipadm create-addr -T static -a 192.168.1.10/24 net0/v4

Damit unsere IP-Pakete später den Weg ins „Internet“ finden benötigen wir noch die Defaultroute zum Router:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ route -p add default 192.168.1.254
$ route -p add default 192.168.1.254
$ route -p add default 192.168.1.254

Jetzt noch schnell den System mitteilen wie es mit DNS Auflösungen umzugehen hat:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ cp /etc/nsswitch.dns /etc/nsswitch.conf
$ cp /etc/nsswitch.dns /etc/nsswitch.conf
$ cp /etc/nsswitch.dns /etc/nsswitch.conf

Fehlen nur noch die zu fragenden Nameserver:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ echo "nameserver 192.168.1.254" > /etc/resolve.conf
$ echo "nameserver 8.8.8.8" >> /etc/resolve.conf
$ echo "nameserver 192.168.1.254" > /etc/resolve.conf $ echo "nameserver 8.8.8.8" >> /etc/resolve.conf
$ echo "nameserver 192.168.1.254" > /etc/resolve.conf
$ echo "nameserver 8.8.8.8" >> /etc/resolve.conf

Achtung, 8.8.8.8 ist google. Aber wem schreibe ich dieses und wer macht schon ungeprüftes Copy & Past?

Damit hat unsere Kiste also nun die IP Adresse: 192.168.1.10/24 fragt erst den DNS Server 192.168.1.254 und dann den DNS Server 8.8.8.8. Den Weg aus seinem eigenen Subnetz findet die Kiste über den Router 192.168.1.254

Noch Fragen?

« Ältere Beiträge Neuere Beiträge »

© 2025 -=Kernel-Error=-

Theme von Anders NorénHoch ↑