Mittwoch, 30. November 2011

Oracle Enterprise Linux und VirtualBox: den richtigen Kernel wählen

Wer in letzter Zeit regelmässig sein Oracle Enterprise Linux Image und seine VirtualBox aktualisiert hat, z.B. das Image aus dem 'BPMN und SOA Governance Handson Workshop', hat möglicherweise eine böse Überraschung erlebt.
Zum Installieren der Gasterweiterungen wird im Menü der VirtualBox unter 'Geräte' der Punkt 'Gasterweiterungen Installieren' ausgewählt.


Beim Installieren der VBox-Extensions nach Kernel- oder VBox-Update z.B. per
sh /media/VBOXADDITIONS_4.1.6_74713/VBoxLinuxAdditions.run
bricht das Skript mit folgender Fehlermeldung ab

[root@oel5r5 ~]# sh /media/VBOXADDITIONS_4.1.6_74713/VBoxLinuxAdditions.run
Verifying archive integrity... All good.
Uncompressing VirtualBox 4.1.6 Guest Additions for Linux.........
VirtualBox Guest Additions installer
Removing installed version 4.1.6 of VirtualBox Guest Additions...
Removing existing VirtualBox DKMS kernel modules        [  OK  ]
Removing existing VirtualBox non-DKMS kernel modules    [  OK  ]
Building the VirtualBox Guest Additions kernel modules
The headers for the current running kernel were not found. If the following
module compilation fails then this could be the reason.
The missing package can be probably installed with
yum install kernel-devel-2.6.32-200.23.1.el5uek

Building the main Guest Additions module                [FAILED]
(Look at /var/log/vboxadd-install.log to find out what went wrong)

Doing non-kernel setup of the Guest Additions           [  OK  ]
Installing the Window System drivers
Installing X.Org 7.1 modules                            [  OK  ]
Setting up the Window System to use the Guest Additions [  OK  ]
You may need to restart the hal service and the Window System (or just restart
the guest system) to enable the Guest Additions.

Installing graphics libraries and desktop services componen[  OK  ]
Das zum Übersetzen der VBox-Extensions benötigte Packet kernel-devel-2.6.32-200.23.1.el5uek fehlt also. Leider führt die vorgeschlagene Lösung, das Packet einfach per yum nachzuinstallieren auch nicht zum Erfolg:

[root@oel5r5 ~]# yum install kernel-devel-2.6.32-200.23.1.el5uek
Loaded plugins: security
file:///media/Enterprise%20Linux%20dvd%2020100405/Server/repodata/repomd.xml: [Errno 5] OSError: [Errno 2] No such file or directory: '/media/Enterprise Linux dvd 20100405/Server/repodata/repomd.xml'
Trying other mirror.
Setting up Install Process
No package kernel-devel-2.6.32-200.23.1.el5uek available.
Nothing to do

Im Repository Repository von Oracle liegt also kein Developer-Package für den Kernel, der mit el5uek bezeichnet ist. Hintergrund ist, dass Oracle für Enterprise Linux 5.7 als Alternative zum relativ alten Kernel 2.6.18, der auch von RedHat Linux benutzt wird, auch einen aktuelleren Kernel 2.6.32 anbietet. Einzelheiten  dazu finden sich auf Oracle.com. Dieser Kernel wurde nun im Rahmen der Updates installiert, aber es gibt zumindest in Oracle's Repository kein dazu passendes devel-package, so dass sich die VBox-Extensions nicht mehr übersetzen lassen. Andererseits sind die Optimierungen des UEK für ein Entwicklungs-/Testsystem in einer VBox ohnehin nicht relevant, so hier einfach weiter der Kernel 2.6.18 genutzt werden kann.
Hierzu muss einfach in der Datei /boot/grub/grub.conf der zu verwendende Kernel ausgewählt werden. Ich habe den (ggf. sind auch mehrere Einträge vorhanden) 2.6.32 Kernel einfach an das Ende der Liste wie folgt verschoben.

default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Oracle Linux Server (2.6.18-274.7.1.0.1.el5)
    root (hd0,0)
    kernel /vmlinuz-2.6.18-274.7.1.0.1.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
    initrd /initrd-2.6.18-274.7.1.0.1.el5.img
title Oracle Linux Server (2.6.18-274.0.0.0.1.el5)
    root (hd0,0)
    kernel /vmlinuz-2.6.18-274.0.0.0.1.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
    initrd /initrd-2.6.18-274.0.0.0.1.el5.img
title Oracle Linux Server (2.6.18-238.19.1.0.1.el5)
    root (hd0,0)
    kernel /vmlinuz-2.6.18-238.19.1.0.1.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
    initrd /initrd-2.6.18-238.19.1.0.1.el5.img
title Oracle Linux Server (2.6.32-200.23.1.el5uek)
   root (hd0,0)
   kernel /vmlinuz-2.6.32-200.23.1.el5uek ro root=/dev/VolGroup00/LogVol00 rhgb quiet
   initrd /initrd-2.6.32-200.23.1.el5uek.img
Der Eintrag default=0 sorgt dafür, dass der erste Eintrag der Liste, in diesem Fall der Kernel 2.6.18-274.7.1.0.1.el5 automatisch gestartet wird. Kommentiert man die Zeile hiddenmenu aus, kann man auch beim Startvorgang auswählen, welcher Kernel verwendet werden soll.



Mit dem 2.6.18er Kernel und dem dafür vorhandenen devel-package lassen sich dann (nach Reboot) auch die VBox-Extensions wieder übersetzen.

--- UPDATE ---

Warum einfach, wenn es auch kompliziert geht ;-)
Es hätte auch gereicht, einfach das zum Kernel passende 'kernel-uek-devel...' Packet zu installieren. Danke an Lorenz Keller für den Hinweis.

Freitag, 4. November 2011

Servlet für Clustering erstellen

Nachdem der vorige Betrag gezeigt hat, wie der WebLogic Cluster aufgesetzt wird, soll jetzt ein einfaches Servlet erstellt werden, um das Clustering zu demonstrieren. Das Servlet wurde bewusst simpel gestaltet um es nachvollziehbar zu machen. Für dieses Beispiel habe ich den JDeveloper 11.1.2.0.0 benutzt.


Eine neue Anwendung wird erstellt via 'New Application...'.


Hier wird die 'Custom Application' ausgewählt.


Die Anwendung benötigt einen Namen ...


... ebenso wie das Projekt. Bei den Technologien ist 'JSP and Servlets' auszuwählen, 'Java' wird dann automatisch mit ausgewählt.


Defaults belassen und 'Finish'.


Auf dem neu erzeugten Projekt per Rechtsklick 'New...' auswählen.


Dann Auswahl von 'Web Tier' -> 'Servlets' -> 'HTTP Servlet' und OK.

Next
Next
Next

Hier können noch die Namen für das Servlet und das URL Pattern geändert werden, z.B. in 'simple' und '/cluster'


Das Servlet benötigt keine Parameter, beenden mit 'Finish'.


Als Ergebnis liefert der JDeveloper ein fertiges Servlet wie oben abgebildet.

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType(CONTENT_TYPE);
        PrintWriter out = response.getWriter();
        
        HttpSession sess = request.getSession();
        Integer cnt = (Integer)sess.getAttribute("cnt");
        if(cnt==null)
            cnt=0;
                
        out.println("<html>");
        out.println("<head><title>Servlet1</title></head>");
        out.println("<body>");
        out.println("<p>The servlet has received a GET. This is the reply.</p>");
        out.println( new Date() );
        out.println( "<p>Bisherige Aufrufe: " + cnt + "</p>"  );
        out.println("</body></html>");
        out.close();
        
        System.out.println( new Date()+ ": doGet - bisherige Aufrufe: " + cnt );
        
        sess.setAttribute("cnt", ++cnt);
    }

Der Quellcode wird nun wie oben geändert. Hierdurch wird ein Zähler hinzugefügt und dieser vor jedem Aufruf aus der HttpSession gelesen, erhöht und zum Schluss wieder in die HttpSession geschrieben.


Die Klasse Date muss noch importiert werden. Der JDeveloper bietet freundlicherweise an, das zu erledigen. Einfach den Cursor auf der Klasse positionieren und Alt-Enter drücken.


In der daraufhin auftauchenden Auswahl bitte Date (java.util) auswählen, damit die richtige Klasse importiert wird.

Über den Run-Button kann das Servlet im internen WebLogic Server getestet werden.


Das Ergebnis sollte dann wie oben abgebildet aussehen.

Damit ist das Servlet selbst soweit fertig, im nächsten Schritt wird der Ablauf im Cluster gezeigt.