Meine Sun Campus Ambassador Aktivitäten an der Martin-Luther-Universität Halle-Wittenberg Blog von Michael Rennecke

Freitag Okt 30, 2009

Jeder kennt bestimmt VirtualBox. Damit kann man virtuelle Gastsysteme booten, z.B. ein Windows XP. VirtualBox ist bei OpenSolaris im extra-Repository. Dabei handelt es sich um die nicht OpenSource-Version. Sie hat den Vorteil, dass man im virtuellen Gast auch USB-Geräte nutzen kann. Das benötigt man, wenn man einen Scanner hat, welcher nur mit Windows zusammen arbeitet.

Dieser USB-Support wollte bei mir gar nicht funktionen, weil VirtualBox nicht auf das USB-Subsystem zugreifen konnte. Das hat sich u.a. in den folgenen Fehlermeldungen geäußert:

  • VERR_ACCESS_DENIED
  • NS_ERROR_INVALID_ARG (0x80070057)
  • NS_ERROR_FAILURE

Man kann das ganze Quick&Dirty fixen und somit VirtualBox den Zugriff auf das USB-Subsystem zu erlauben.

  1. die letzten beiden Zeilen in der Datei /etc/logindevperm wie folgt ändern (wenn es nicht letzten sind, dann findet man sie schnell)
    /dev/vt/active    0666    /dev/usb/hid[0-9]+    # hid devices should have the same permission with conskbd and consms
    /dev/vt/active    0666    /dev/usb/[0-9a-f]+[.][0-9a-f]+/[0-9]+/* driver=scsa2usb,usb_mid,usbprn,ugen    #libusb/ugen devices
  2. Die Kernelmodule von VirtualBox enladen
    rennecke@walhalla ~ $ pfexec /opt/VirtualBox/vboxdrv.sh stopall
    VirtualBox USB kernel module not loaded.
    VirtualBox NetAdapter kernel module not loaded.
    VirtualBox NetFilter kernel module not loaded.
    VirtualBox Host kernel module unloaded.


    Das klappt mitunter nicht beim ersten mal. Den Befehl wiederholt man so lange, bis man die obige Ausgabe hat.
  3. Kernelmodule für VirtualBox laden
    rennecke@walhalla ~ $ pfexec /opt/VirtualBox/vboxdrv.sh startall
    VirtualBox Host kernel module loaded.
    VirtualBox NetFilter kernel module loaded.
    VirtualBox NetAdapter kernel module loaded.
    VirtualBox USB kernel module loaded.

Dienstag Okt 27, 2009

Ich hatte vor ein paar Tagen eine Begegnung der besonderen Art. Ich wollte skriptgesteuert Zonen erstellen und ich war am verzweifeln, da OpenSolaris (Build 125) einfach nicht die Dateisysteme erstellen wollte. Nach einer Weile habe ich die Zonen in mein Standart-Zonen-Verzeichnis gemacht und plötzlich ging es. Mein Fehler war, dass ich Dateien in dem Verzeichnis hatte, wo die Zonen herein sollten.

Ich weiß jetzt nicht, ob dieses "Problem" nur bei Build 125 besteht. Es ist aber zu empfehlen, dass man für Zonen eine leeres Verzeichnis (zfs-Dateisystem) benutzt, welches ausschließlich für Zonen ist.

Samstag Sep 05, 2009

Manchmal ist erforderlich, dass man einer Zone den Zugriff auf ein Device gewährt. Ich habe z.B. einer Zone mein externes LTO-2 Bandlaufwerk gegeben. Dieses ist über SCSI mit dem Rechner verbunden. Da ich Strom sparen möchte und SCSI hotplugfähig ist, schalte ich das Bandlaufwerk nur ein wenn ich es benötige.

Damit man das Device unter Solaris in der global-Zone ansprechen kann, muss es wie folgt einbinden (mein Laufwerk ist an Controller c17 angeschlossen):

root@walhalla ~ $ cfgadm -c configure c17
root@walhalla ~ $ cfgadm -a c17
p_Id                          Type         Receptacle   Occupant     Condition
c17                            scsi-bus     connected    configured   unknown
c17::rmt/0                     tape         connected    configured   unknown

Wenn man in einer nonglobal-Zone ist geht dieses Verfahren nicht. Solaris sagt aber einen woran es liegt:

cfgadm: Configuration administration not supported: cfgadm can only be run from the global zone

Also muss man Devices, die eine nonglobal-Zone benötigt immer in der global-Zone einbinden bzw. tauschen. Ich vertrete die Auffassung, das man in einer nonglobal-Zone, so weit es möglich ist, keine Devices gibt. Das kann unter Umständen zu Probleme bei der Migration der Zonen führen.

Mittwoch Sep 02, 2009

Ich habe heute endlich mein Projekt Bacula in einer Zone zu ende gebracht. Bacula ist eine Backup-Software, die recht mächtig ist und noch viel schwieriger zu konfigurieren. Ich möchte darauf eingehen, wie ich Bacula installiert habe. Es soll nur ein grober Abriss sein.

Folgende Packte muss man in der Zone installieren: SUNWapch22, SUNWmysql51, SUNWgccruntime, SUNWmysql51lib, SUNWperl584usr, SUNWgd2, SUNWgawk. Ich habe in der backup-Zone das Netzwerk konfiguriert und das Device mein es LTO-2 Bandlaufwerk übergeben. Auf den sollen die Sicherungen gemacht werden.

root@walhalla ~ $  zonecfg -z backup
zonecfg:backup> add device
zonecfg:backup:device> set match=/dev/rmt/*
zonecfg:backup:device> end
zonecfg:backup> info device
device:
            match: /dev/rmt/*
zonecfg:zone1> commit
zonecfg:zone1> exit

Da ich backup-Zone schlank halten möchte, habe ich Bacula in der global-Zone übersetzt. Auf der Bacula-Seite findet man auch welche Packte zum übersetzen notwendig sind. Da Bacula sehr viele configure-Parameter hat, habe ich mir ein wrapper-Skript zum übersetzen geschrieben. Darin kommentiere ich das aus was ich nicht benötigte. Mein Skript sieht wie folgt aus:

#!/bin/bash

export PATH=/usr/bin:/usr/ccs/bin:/etc:/usr/openwin/bin:/usr/local/bin:/usr/sfw/bin:/opt/sfw/bin:/usr/ucb:/usr/sbin
LDFLAGS="-L/usr/mysql/5.1/lib/mysql -R/usr/mysql/5.1/lib/mysql"
export LDFLAGS;

make distclean

export HO=/opt
export USER=bacula
export GROUP=bacula

# create bacula-user and group
groupadd $GROUP
useradd  -g $GROUP -d "/
CFLAGS="-g -O2" ./configure \
--prefix=/opt/bacula \
--with-mysql=/usr/mysql/5.1 \
--enable-smartalloc \
--with-dir-user=$USER \
--with-dir-group=$GROUP \
--with-sd-user=$USER \
--with-sd-group=$GROUP \
--with-fd-user=$USER \
--with-fd-group=$GROUP


# --enable-bat \
# --enable-gnome \
# --enable-tray-monitor \
# --sbindir=$HO/bacula/bin \
# --sysconfdir=$HO/bacula/etc \
# --with-pid-dir=$HO/bacula/var/pid \
# --with-subsys-dir=$HO/bacula/var/subsys \
# --with-working-dir=$HO/bacula/working \

  make
  make install

mkdir -p $HO/bacula/var/pid
mkdir -p $HO/bacula/var/subsys

chown -R $USER:$GROUP $HO/bacula

Nachdem man Bacula übsetzt hat kann man es mit tar packen und in der backup-Zone wieder entpacken. Das geht ganz einfach, da das Filesystem der backup-Zone auch in der global-Zone gemountet ist. Hier ist manchmal Geduld gefragt. Ich müsste öfter Packte in der backup-Zone nachinstallieren, damit Bacula lief. Ich hoffe ich habe oben alle nötigen Packte aufgeschrieben.

Wenn man auf die Weboberfläche verzichen möchte, dann muss man den Apache, Perl und gd nicht installieren. In der global-Zone habe ich dann noch einmal Bacula übsersetzt um bat zu haben. bat muss nicht in der backup-Zone laufen, ich greife über das Netzwerk auf den Director-Daemon von Bacula zu. Durch einen Fehler im Makefile wird bat nicht installiert. Das übersetze bat liegt unter <download-dir>/bacula-3.0.2/src/qt-console. Zum starten muss man angeben, wo sich das config-File, bat.conf befindet.

Wenn man die Weboberfläche bweb nutzen möchte muss man einige Perl-Module per Hand bzw. mit CPAN übersetzten. Dafür ist es notwendig, dass man die Sun Studio-Compiler installiert hat. Eine Fehlermeldung, die drauf hinweißt würde wie folgt lauten:

Ich habe für Bacula noch das folgende Manifest geschrieben:

<?xml version='1.0'?>
<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
<!--

        Michael Rennecke 2009-09-01
        Service manifest for bacula (both server and client)
 -->

<service_bundle type='manifest' name='bacula:bacula'>

<service
name='application/bacula'
type='service'
version='1'>
<create_default_instance enabled='false' />
<single_instance />


<dependency name='fs'
grouping='require_all'
restart_on='none'
type='service'>
<service_fmri value='svc:/system/filesystem/local' />
</dependency>

<dependency name='net'
grouping='require_all'
restart_on='none'
type='service'>
<service_fmri value='svc:/network/loopback' />
</dependency>

<exec_method
type='method'
name='start'
exec='/opt/bacula/sbin/bacula start'
timeout_seconds='-1'>
</exec_method>

<exec_method
type='method'
name='stop'
exec='/opt/bacula/sbin/bacula stop'
timeout_seconds='-1'>
</exec_method>

<exec_method
type='method'
name='restart'
exec='/opt/bacula/sbin/bacula restart'
timeout_seconds='-1'>
</exec_method>

</service>

</service_bundle>

Wenn man Bacula zum ersten mal startet, sollte man die Datenbanken erstellen. Die passenden Skripte liegen sinnvollerweise bei mir unter /opt/bacula/etc. Die Namen sind selbsterklärend. Wenn nun Bacula arbeitet kann man es konfigurieren. Die Konfiguration ist etwas kompliziert. Für die ersten Schritte kann man sich die Kurzanleitung ansehen, das folgende pdf ist auch ganz gut. Mein Client verschlüsselt seine Daten, wie das geht kann man hier erfahren. Wenn man die Kompression nutzen möchte muss das FileSet z.B so aussehen:

FileSet {
Name = "Test"
  Include {
    Options {
      signature = MD5
      noatime = yes
      mtimeonly = yes
      compression=gzip
    }   
    File = /export/test
  }
}

Ich hoffe, dass ich an alles gedacht habe. Ich wünsche allen viel Spaß und vor allem Erfolg, wenn sie Bacula mit rumspielen.

P.S.: Wenn es Probleme gibt lohnt es sich, die Daemons einzeln zu starten, sie haben noch zahlreiche Parameter.