Archive for April, 2010

Was bringt Deduplikation?

Heute war ich beim Sun Day in Halle. Detlef Drewanz hat einen interessanten Befehl im Bezug auf Deduplikation genannt: zdb -S <poolname>

Damit lässt sich ermitteln, was eine Deduplikation des zpool bringen würde.


Eigenschaften von Zonen

Ich wurde in Bezug auf diesen Blog-Eintrag gefragt, was es für Zoneneigenschaften gibt, welche man für Regelmentierungen verwenden kann.

Als ersten möchte ich zeigen, wie man den Hauptspeicher limitieren kann.

root@global$ zonecfg -z myzone
zonecfg:myzone> add capped-memory
zonecfg:myzone:capped-memory> set physical=500m
zonecfg:myzone:capped-memory> set swap=1g
zonecfg:myzone:capped-memory> set locked=100m
zonecfg:myzone:capped-memory> end
zonecfg:myzone> exit
physical
Hierbei handelt es sich um eine Limitierung des physischen Hauptspeicher. Wenn mehr Speicher angefordert wird, dann kann dieser ausgelagert werden.
Eine Zone kann diesen Wert überschreiten und mehr Speicher anfordern.
swap
Das ist eine Begrenzung des virtuellen Speicher, d.h. eine Zone kann nicht mehr Speicher anfordern. Wenn ein Prozess in der Zone mehr Speicher anfordert, so schlägt diese Speicheranforderung fehl.
locked
Der allokierte Speicher ein Zone kann bis auf diesen Wert ausgelagert werden

Neben dem Hauptspeicher kann man auch die CPUs regelmentieren. Man dedizierter CPUs zuweisen oder das Scheduling verändern. Hier gibt eine gute Übersicht, bzgl. der Definition der CPU Shares.

root@global$ zonecfg -z myzone
zonecfg:myzone> add dedicated-cpu
zonecfg:myzone:dedicated-cpu> set ncpus=1-4
zonecfg:myzone:dedicated-cpu> end
zonecfg:myzone> exit

Was passiert nun?

  1. Beim booten der Zone werden die CPUs 1-4 werden aus dem default-Pool entfernt
  2. Es wird ein temporäer Pool erstellt mit den CPUs 1-4
  3. Beim stoppen der Zone werden die CPUs 1-4 wieder dem default-Pool zur verfügung gestellt.

Man kann auch sagen, dass eine Zone z.B. maximal 2,5 CPUs benutzen kann. Das sieht wie folgt aus:

root@global$ zonecfg -z myzone
zonecfg:myzone> add capped-cpu
zonecfg:myzone:capped-cpu> set ncpus=2.5
zonecfg:myzone:capped-cpu> end
zonecfg:myzone> exit

Nun möchte ich zeigen, wie man eine Zone 200 CPU-Shares und die FSS (Fair Share Scheduling) Klasse zuweist

root@global$ zonecfg -z myzone
zonecfg:myzone> set cpu-shares=200
zonecfg:myzone> set scheduling-class=FSS
zonecfg:myzone> exit

Als letztes Quota zum Thema CPU möchte ich zeigen, wie man die Anzahl der Threads/Prozesse begrenzt. Die folgende Zone kann maximal 250 Threads ausführen. Ein einzelner Prozess ohne Thredas zählt als ein Thread.

root@global$ zonecfg -z myzone
zonecfg:myzone> add rctl
zonecfg:myzone:rctl> set name=zone.max-lwps
zonecfg:myzone:rctl> add value (priv=privileged,limit=250,action=deny)
zonecfg:myzone:rctl> end

Man kann auf diese Weise auch noch andere Resourcen kontrollieren. Hier findet man eine Übersicher über die Resource Controls

Für Zonen kann es auch interssant sein, den Plattenpatz zu begrenzen. Da in Open Solaris zfs das default-Dateisystem ist, kann man Quotas und Reservations über die entsprechenden zfs-Eigenschaften machen. Die Wurzel der Zone liegt auf dem Dateisystem zones/myzone

root@global$ zonecfg -z myzone zfs set quota=10g zones/myzone
root@global$ zonecfg -z myzone zfs set reservation=5g zones/myzone

Systemmails per Thunderbird abrufen

Manchmal ist schön, wenn man die Systemmail abrufen kann. Bei OpenSolaris gibt es per default keinen Nutzer root und ein normaler Nutzer darf nicht auf Mails von root zugreifen. Die saubere Lösung ist, dass man einen Alias einrichtet. Dazu fügt man der /etc/aliases die folgende Zeilen hinzu. Anschließend werden alle Mails von root an jack weiter geleitet.

#######################
# Local aliases below #
#######################
 
root: jack

Nachdem man das nun gemacht hat muss man die /etc/aliases neu einlesen.

jack@walhalla ~ % pfexec newaliases
/etc/mail/aliases: 13 aliases, longest 10 bytes, 150 bytes total

Nun schicken wir root eine Testmail. Dazu verwenden wir das Kommando mailx. Um es zu beenden muss man . drücken.

jack@walhalla ~ % mailx root
Subject: Hallo
Hallo Welt!
.
EOT

Nun estellt man einen Symlink vom Mailverzeichnis, damit man die Mails auch im Thunderbird lesen kann. Es geht auch jeder ander Mailclient, welcher mit dem mbox-Format umgehen kann

1ss1e32i.default ist das aktuelle Profil, das ist auf jeden Rechner anders.

jack@walhalla ~ % ln -s /var/mail/jack .thunderbird/1ss1e32i.default/Mail/Local\ Folders/System

Fertig! Nun hat man nach dem Neustart von Thunderbird ein Unterverzeichnis System im Verzeichnis Lokale Ordner

bunter Host in der Codeumgebung

Ich wurde gefragt, wie ich den user und den hostname in meinen Code-Umgebungen bunt bekomme. Ich benutze für das Syntaxhighlighting das Plugin WP-Syntax. Dieses wiederrum nutzt GeSHi im Hintergrund.

Damit der Hostname bunt wird, habe ich die Syntax der bash etwas erweitert. Dazu habe ich in der Datei wp-content/plugins/wp-syntax/geshi/geshi ein paar Zeilen hinzu gefügt:

language_data = array (
    'LANG_NAME' => 'Bash',
    // Bash DOES have single line comments with # markers. But bash also has
    // the  $# variable, so comments need special handling (see sf.net
    // 1564839)
    'COMMENT_SINGLE' => array('#'),
    'COMMENT_MULTI' => array(),
    'COMMENT_REGEXP' => array(
        //Variables
        1 => "/\\$\\{[^\\n\\}]*?\\}/i",
        //BASH-style Heredoc
        2 => '/<<-?\s*?(\'?)([a-zA-Z0-9]+)\1\\n.*\\n\\2(?![a-zA-Z0-9])/siU',
        //Escaped String Starters
        3 => "/\\\\['\"]/siU",
	4 => "/(root@[a-z]+)/i",          // root hat sich angemeldet
	5 => "/([a-z]+@[a-z]+)/i"         // ein normaler User hat sich angemeldet
        ),
        ....
'STYLES' => array(
        'KEYWORDS' => array(
            1 => 'color: #000000; font-weight: bold;',
            2 => 'color: #c20cb9; font-weight: bold;',
            3 => 'color: #7a0874; font-weight: bold;'
            ),
        'COMMENTS' => array(
            0 => 'color: #666666; font-style: italic;',
            1 => 'color: #800000;',
            2 => 'color: #cc0000; font-style: italic;',
            3 => 'color: #000000; font-weight: bold;',
  	    4 => 'color: #FF0000; font-weight: bold;',     // Farbe und Font für root
	    5 => 'color: #0000FF; font-weight: bold;'      // Farbe und Font für einen normalen User
            ),
           ...

Es handelt sich hierbei um einen Hack. Wenn man das Plugin updatet, muss man diese Änderung wieder vornehmen.

Kein Upload bei WordPress

Martin hat mich darauf  aufmerksam gemacht, dass bei wordpress die Upload-Funktion für Dateien nicht funktioniert. Also habe ich es promt ausprobiert und siehe da es ging bei mir auch nicht. Die Fehlermeldung Fehler beim Upload der ausgewählten Datei. das hilft einen gar nicht weiter. Die Ursache war, dass man per default in wordpress nur bekannte Dateien hinzufügen darf. Also habe ich in der Datei wp-inludes/functions.php die mime-Typen etwas editiert:

function get_allowed_mime_types() {
	static $mimes = false;
 
	if ( !$mimes ) {
		// Accepted MIME types are set here as PCRE unless provided
		$mimes = apply_filters( 'upload_mimes', array(
		'jpg|jpeg|jpe' => 'image/jpeg',
                ...
                'odf' => 'application/vnd.oasis.opendocument.formula',
		'.*' => 'text/plain', // hinzugefügt
		) );
	}
 
	return $mimes;
}

Eine Zone in 10 Minuten

Ich kam gestern in die Verlegenheit mal schnell eine Zone aufsetzten zu müssen. Ich dachte mir, wenn ich das mal schnell mache, dann wenigsten mit RAM-Quota und CPU-Begrenzung. Es kann evtl. sein, dass man pkg:/service/resource installieren muss. Dieses Paket ist für die Verwaltung von RAM-Resourcen zuständig.

Ressourcenpools anstellen

rennecke@walhalla ~ % pfexec pooladm -e

Aktuelle Konfiguration in der /etc/pooladm.conf sichern

rennecke@walhalla ~ % pfexec pooladm -s

Nun erstellen wir einen Pool mit einem CPU-Set, welches über maximal 2 CPUs verfügt

rennecke@walhalla ~ % pfexec poolcfg -c 'create pset zone-pset (uint pset.min=1; uint pset.max=2)'
rennecke@walhalla ~ % pfexec poolcfg -c 'create pool zone-pool'
rennecke@walhalla ~ % pfexec poolcfg -c 'associate pool zone-pool (pset zone-pset)'

Als nächstes aktivieren wir die Konfiguration und speichern sie

rennecke@walhalla ~ % pfexec pooladm -c
rennecke@walhalla ~ % pfexec pooladm -s
rennecke@walhalla ~ % pfexec pooladm
 
system default
	string	system.comment
	int	system.version 1
	boolean	system.bind-default true
	string	system.poold.objectives wt-load
 
	pool zone-pool
		int	pool.sys_id 1
		boolean	pool.active true
		boolean	pool.default false
		int	pool.importance 1
		string	pool.comment
		pset	zone-pset
 
	pool pool_default
		int	pool.sys_id 0
		boolean	pool.active true
		boolean	pool.default true
		int	pool.importance 1
		string	pool.comment
		pset	pset_default
 
	pset zone-pset
		int	pset.sys_id 1
		boolean	pset.default false
		uint	pset.min 1
		uint	pset.max 2
		string	pset.units population
		uint	pset.load 5
		uint	pset.size 2
		string	pset.comment 
 
		cpu
			int	cpu.sys_id 1
			string	cpu.comment
			string	cpu.status on-line
 
		cpu
			int	cpu.sys_id 0
			string	cpu.comment
			string	cpu.status on-line
 
	pset pset_default
		int	pset.sys_id -1
		boolean	pset.default true
		uint	pset.min 1
		uint	pset.max 65536
		string	pset.units population
		uint	pset.load 562
		uint	pset.size 2
		string	pset.comment 
 
		cpu
			int	cpu.sys_id 3
			string	cpu.comment
			string	cpu.status on-line
 
		cpu
			int	cpu.sys_id 2
			string	cpu.comment
			string	cpu.status on-line

Nun kommen wir zum eigenlichen erstellen der Zone

rennecke@walhalla ~ % pfexec zonecfg -z zone1
zone1: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:zone1> create
zonecfg:zone1> set zonepath=/export/zone/zone1
zonecfg:zone1> set autoboot=true
zonecfg:zone1> add net
zonecfg:zone1:net> set address=192.168.1.10/24
zonecfg:zone1:net> set physical=rge0
zonecfg:zone1:net> set defrouter=192.168.1.1
zonecfg:zone1:net> end
zonecfg:zone1> set pool=zone-pool
zonecfg:zone1> add capped-memory
zonecfg:zone1:capped-memory> set physical=200m
zonecfg:zone1:capped-memory> set swap=400m
zonecfg:zone1:capped-memory> set locked=30m
zonecfg:zone1:capped-memory> end
zonecfg:zone1> verify
zonecfg:zone1> commit
zonecfg:zone1> exit

Ich denke, dass sich alles von selbst erklärt, wenn jedmand Fragen hat, dann bitte einen Kommentar bzw. die Manpage lesen. Als nächsten Schritt installieren wir die Zone und booten sie anschließend.

rennecke@walhalla ~ % pfexec zoneadm -z zone1 install
A ZFS file system has been created for this zone.
   Publisher: Using opensolaris.org (http://pkg.opensolaris.org/dev/ ).
   Publisher: Using pending (http://pkg.opensolaris.org/pending/).
   Publisher: Using contrib.opensolaris.org (http://pkg.opensolaris.org/contrib/).
       Image: Preparing at /export/zone/zone1/root.
       Cache: Using /var/pkg/download.
Sanity Check: Looking for 'entire' incorporation.
  Installing: Core System (output follows)
DOWNLOAD                                  PKGS       FILES    XFER (MB)
Completed                                44/44 12305/12305    85.9/85.9 
 
PHASE                                        ACTIONS
Installationsphase                       17833/17833
Für dieses Abbild sind keine Updates erforderlich.
  Installing: Additional Packages (output follows)
DOWNLOAD                                  PKGS       FILES    XFER (MB)
Completed                                36/36   3233/3233    20.6/20.6 
 
PHASE                                        ACTIONS
Installationsphase                         4329/4329 
 
        Note: Man pages can be obtained by installing SUNWman
 Postinstall: Copying SMF seed repository ... done.
 Postinstall: Applying workarounds.
        Done: Installation completed in 606,736 seconds.
 
  Next Steps: Boot the zone, then log into the zone console (zlogin -C)
              to complete the configuration process.

Die Geschwindigkeit zum erstellen der Zone hängt von der Downloadgewindigkeit maßgeblich ab. Wenn man Pech hat, wartet man sehr lange auf die 100 MB…

Nachdem nun die Zone installiert ist müssen wir sie nur noch booten und initial konfigurieren

rennecke@walhalla ~ % pfexec zoneadm -z zone1 boot
rennecke@walhalla ~ % pfexec zlogin -C zone1
[Connected to zone 'zone1' console]
 
You did not enter a selection.
What type of terminal are you using?
 1) ANSI Standard CRT
 2) DEC VT100
 3) PC Console
 4) Sun Command Tool
 5) Sun Workstation
 6) X Terminal Emulator (xterms)
 7) Other
Type the number of your choice and press Return: 2

Es ist sehr zu empfehlen für die Konfiguration ein VT100 Terminal zu nehmen. Das ich zwar nicht schön, aber man kann auj jeder Konsole ordentlich arbeiten, ohne das was verschoben wird.

wordpress

Ich bin aus Bequemlichkeitsgründen auf wordpress umgestiegen. Ich muss aber sagen der Editor ist echt grausam. Da er mir stellenweise <p>-Tags eingefügt hat, welche ich nicht wollte. Es gibt ein Plugin, welches einen besseren Editor zur Verfügung stellt: TinyMCE Advanced. Damit konnte ich die Fehler im html ausbessern. Unter Einstellungen hat man dann noch eine weitere Registerkarte zum konfigurieren.

korrekte Uhrzeit

Für manche Dinge wie nfs ist es wichtig eine korrekte Uhrzeit auf allen Rechnern zu haben. Dies kann man durch die Sychronisation mit einem Zeit-Server erreichen. Unter Open Solaris müssen in der Datei /etc/inet/ntp.conf die Zeitserver stehen mit den man sich synchronisieren möchte. Anschließend muss man den ntp-Server neu starten. Unten steht meine Konfiguration:

root@walhalla ~ $ cat /etc/inet/ntp.conf
server 0.pool.ntp.org
server 1.pool.ntp.org
server 2.pool.ntp.org
server 3.pool.ntp.org
root@walhalla ~ $ svcadm restart svc:/network/ntp:default
root@walhalla ~ $ ntpq -p
remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+wikisquare.de   129.69.1.153     2 u   58   64  377   28.259  -20.970   2.549
*dexter.wzw.tum. 130.149.17.21    2 u   63   64  377   13.108  -17.224   1.370
+dnscache-frankf 131.188.3.222    2 u   56   64  377   25.993  -20.031   2.900
-draco.fivemile. 192.53.103.108   2 u   63   64  377   20.565  -15.292   1.181

Hier findet man noch einige Information über die verwendeten Zeitserver.

svn und Proxy-Server

Ich sitze dummerweise hinter einem Proxyserver. Als ich ein Repository auschecken wollte hat sich sehr lange nichts getan. Bis ich auf die zündete Idee gekommen bin, dass es vielleicht am Proxy liegt. Einen Proxyserver kann man global in der Datei /etc/subversion/servers oder im Home .subversion konfigurieren

[global]
http-proxy-host=proxyhost
http-proxy-port=3128

Bei den meisten Linux-Distributionen ist das nicht nötig, aber bei (Open) Solaris