Archiv der Kategorie: Linux

Es ist OpenSource, es ist anpassbar, es ist zerstörbar und das Beste daran, du darfst es alles machen ;)

Smart Cards durch die in Java eingebaute Java Smartcard I/O javax.smartcardio.* ansprechen

Zuerst mache ich eine kleine Einführung in das Thema Java und Smartcads und beschreibe danach wichtige Punkte für Linux und Windows.

Java hat seit Version 1.5 (5.0) eine Unterstützung für Smartcards bereits eingebaut. Es nutzt dafür die eigene Provider Technik und greift über PC/SC auf die Smartcard zu. Das bedeutet es sind keine weiteren Module für Java notwendig (früher JPCSC für Linux) und die Nutzung erfolgt unabhängig vom Betriebssystem. Zumindest kann ich das für Windows XP/Vista und Linux bestätigen. FreeBSD und Sun Solaris sollten genau so gut funktionieren. Weitere Informationen zu Betriebssystemen in den nächsten Absätzen.

Unter Windows ist die Verwendung denkbar einfach. Für die Nutzung ist ein installierter Treiber für das Lesegerät (Terminal) und natürlich Java notwendig. Windows bringt eine eigene PC/SC Implementierung mit, die Java über den eingebauten Provider nutzt. Dadurch ist die Installation und Einrichtung sehr einfach.

Für Linux ist die Installation fast genau so einfach. Durch die verschiedenen pcsclite-Versionen (PC/SC Implementierung unter Linux) sind aber die Header-Datei (.h) für die Bibliothek notwendig, damit Java die PC/SC Bibliothek richtig ansprechen kann. Dafür reicht meistens die Installation der folgenden Pakete:

  • libpcsclite1
  • pcscd
  • libccid
  • libpcsclite-dev  (WICHTIG: Hier sind die notwendigen Header-Dateien)

Fehlt das Paket libpcsclite-dev bzw. die Header Dateien, so kann Java die PC/SC Bibliothek nicht nutzen und findet deswegen kein Lesegerät (Terminal).

Für Debian/Ubuntu und weitere Debian-Derivate ist die Installation denkbar einfach:

[code]
sudo aptitude install libpcsclite1 pcscd libccid libpcsclite-dev
[/code]

Die Nutzung der JPCSC Middleware, welcher veraltet ist, habe ich bereits früher hier beschreiben.

Um die Verwendung der Java Smartcard I/O zu testen, habe ich ein paar kleine Testprogramme geschrieben, die ich hier veröffentliche. Sie sind auf Englisch kommentiert, so dass keine weitere Erklärungen erfolgen. Ich denke die paar Worte Englisch wird wohl jeder verstehen können. Sie sind extra kurz und einfach gehalten.

[code]
import java.util.List;
import javax.smartcardio.*;

/*
* Look in rt.jar for „javax.smartcardio“ to get further information
* Defined in: JSR 268
*/
public class ListSmartcardReaders {

public static int listCounted() {

/* we use the default TerminalFactory */
TerminalFactory factory = TerminalFactory.getDefault();

try {
/* We can have multiple terminals on one System, so we get a list */
List terminals = factory.terminals().list();

for (CardTerminal terminal : terminals) {
System.out.println(„Card_Terminal_Name: „+ terminal.getName());
System.out.println(„Card_in_Terminal_present: „+terminal.isCardPresent());
System.out.println(„——————————————–„);
}
return terminals.size();

} catch (CardException e) {
e.printStackTrace();
}
return 0;
}

public static void main(String[] args) {
listCounted();
}
}
[/code]

[code]
import java.util.List;
import javax.smartcardio.*;

/*
* Look in rt.jar for „javax.smartcardio“ to get further information
* Defined in: JSR 268
*/
public class ConnectReader {

/**
*
* @param index is the array index of the terminal list (0..x)
* @throws CardException if there are problems accessing the smartcard
*/
public static void connectCard(int index) throws CardException {

/* Is a Reader connected we can access? */
if (TerminalFactory.getDefault().terminals().list().size() == 0) {
System.err.println(„No reader present“);
return;
}

/* Terminal we are working on */
CardTerminal terminal = TerminalFactory.getDefault().terminals().list().get(index);

/* Is a card present? */
if (!terminal.isCardPresent()) {
System.err.println(„No Card present!“);
return;
}

/* Here you have to choose „T=0″,“T=1“, „T=2“, check documentation of your smart card */
//Mostly it’s „T=1“, for older cards its „T=0“
Card card = terminal.connect(„T=1“);

System.out.println(„Card_Info: „+card.toString());
System.out.println(„Card Protocol: „+ card.getProtocol());

//Reset the card for use
ATR atr = card.getATR();

System.out.println(„ATR: “ + atr.getBytes());
System.out.println(„ATR historical bytes: „+ atr.getHistoricalBytes());

/* Get the basic channel. This one can’t be closed */
CardChannel channel = card.getBasicChannel();

/* Try to send a command. This one won’t work! */
byte[] command = { 0, 0, 0, 0};

CommandAPDU someApdu = new CommandAPDU(command);

ResponseAPDU r = channel.transmit(someApdu);
/* Response encoded in bytes */
byte[] response = r.getBytes();

System.out.println(„response: „+ response);

card.disconnect(false);
}

public static void main(String[] args) {
try {
//First Terminal = 0
connectCard(0);
} catch (Exception e) {
e.printStackTrace();
}
}
}
[/code]

Für weitere Information über APDUs und die Nutzung der Smartcards empfehle ich das Lesen des Buches Handbuch der Chipkarten oder direkt die dazugehörigen ISO-Normen ISO-7816 und im Speziellen die ISO-Normen ISO7816-4, ISO7816-8 und ISO7816-9.

Auf die Frage „Kommt man ohne das Buch bzw. die Normen aus?“, muss ich leider mit „definitiv nein!“ beantworten, da die Informationen sehr komplex sind und schwer zu verstehen. Im Internet ist bis Heute fast gar nichts vorhanden.
Ich rate aber nach Diplom-, Master- und Bachelorarbeiten zu dem Thema zu suchen. Da gibt es bestimmt Auszüge aus den Normen, um wenigstens die Zusammehänge und die Anfänge zu verstehen.

Mit Java über JPCSC auf den Smartcardreader und die Smartcard unter Linux zugreifen

Nach etwas Arbeit habe ich den JPCSC Wrapper in der Version 0.8.0 für PCSC unter Ubuntu Jaunty 9.04 zum laufen gebracht. Dafür waren diverse Änderungen am Quellcode von JPCSC notwendig, die ich zuerst beschreibe.

Die folgenden Pakete müssen zuerst auf dem System installiert werden:
[code]
sudo aptitude install sun-java6-jdk libpcsclite-dev libpcsclite1
[/code]

Danach muss JPCSC von der Linuxnet.com Seite runtergeladen und entpackt werden. Das Erstellen mit dem Befehl „make“ wird nicht funktionieren, weil diverse Header-Dateien von PCSC nicht in dem Standard-Pfad /usr/include/ liegen, sondern in dem Pfad /usr/include/PCSC/.

Die folgenden Header-Dateien sind davon betroffen:
[code]
ifdhandler.h
pcsclite.h
reader.h
winscard.h
wintypes.h
[/code]

Um dieses Problem zu lösen, ist es am Einfachsten die Bibliotheken in dem Pfad /usr/include zu verlinken. Dazu sollten die folgenden Befehle reichen:

[code]
cd /usr/include
sudo ln -s PCSC/ifdhandler.h ifdhandler.h
sudo ln -s PCSC/pcsclite.h pcsclite.h
sudo ln -s PCSC/reader.h reader.h
sudo ln -s PCSC/winscard.h winscard.h
sudo ln -s PCSC/wintypes.h wintypes.h
[/code]

Zusätzlich muss die Zeile 769 in der Datei jpcsc/src/jpcsc/jpcsc.c angepasst werden, weil sie nicht mehr dem Aufruf aus der pcsc-Bibliothek passt:

[code]
<      rv =  SCardControl(card, cin + joff, jlen, cout, &clen); --- >     rv =  SCardControl(card, SCARD_CTL_CODE(jcc), cin + joff, jlen, cout, clen, &clen);
[/code]

Also „SCardControl(card, cin + joff, jlen, cout, &clen);“ ersetzen durch „SCardControl(card, SCARD_CTL_CODE(jcc), cin + joff, jlen, cout, clen, &clen);“.

Danach sollte es möglich sein den Code zu erstellen.

Um über den Wrapper auf die Bibliothek zuzugreifen, muss die Bibliothek jpcsc.so und jpcsc.jar über den folgenden Parameter verlinkt werden. Der folgenden Parameter muss dem Aufruf vor der Ausführung als Parameter direkt übergeben werden:

[code]
java -Djava.library.path=lib/ Test
[/code]

In dem von mir gezeigten Beispiel müssen die beiden Dateien „jpcsc.so“ und „jpcsc.jar“ in den Ordner „lib/“ gelegt werden, damit sie angesteuert werden.

Unter Eclipse muss unter „Run as “ unter Configurations nur der Parameter bei VM-Arguments eingetragen werden:

[code]
-Djava.library.path=lib/
[/code]

Beispielcode:

[code]
import com.linuxnet.jpcsc.*;

public class JPCSCUsecase {

public JPCSCUsecase() {
try {
Context context = new Context();
context.EstablishContext(PCSC.SCOPE_GLOBAL, null, null);

String[] readers = context.ListReaders();
if (readers.length <= 0) { System.err.println("No readers found..."); return; } //Talk to the first reader = 0 String reader = readers[0]; System.out.println("Using reader " + reader); Card card = context.Connect(reader); card.BeginTransaction(); //Do something with APDUS System.out.println("APDU: "+ readApduInfo(card)); card.EndTransaction(PCSC.RESET_CARD); card.Disconnect(); context.ReleaseContext(); } catch (Exception e) { e.printStackTrace(); } } private String readApduInfo(Card card) { Apdu apdu = new Apdu((byte) 0x20, (byte) 0x13, (byte) 0x00, (byte) 0x81, 0, null, 0, 5); byte[] data = card.Transmit(apdu); return bytesToString(data); } private String bytesToString(byte[] bytes) { String output = ""; for (int i = 0; i < bytes.length; i++) { output += "0x"+bytes[i]+ " "; } return output; } public static void main(String[] arg) { new JPCSCUsecase(); } } [/code] Eigentlich ist es besser und vor allem einfacher über die Implementierung von javax.smartcardio.* zuzugreifen. Weitere Informationen folgen noch.

Aktualisierung des Intel Graphikkartentreibers unter Ubuntu 9.04 Jaunty löst viele Probleme

Heute habe ich mich nach längeren Problemen mit dem Intel Graphikkarten Treiber dazu entschieden diesen zu aktualisieren. Die Ubuntu 9.04 (Jaunty) Version kam zu einem denkbar schlechten Zeitpunkt aus Sicht des Kernels und der Intel Treiber raus. Intel hat kurz vorher begonnen die Treiber komplett auf die neue Kernel Architektur umzubauen.

Mit dem Kernel 2.6.28 und den in Jaunty enthaltenen Treibern enstand eine schlecht funktionierende Version.

Seit wenigen Minuten habe ich jetzt eine Lösung für das Problem und ja meine riesigen VertexArrays funktionieren wieder.

Die Lösung war relativ einfach. Ich habe zuerst von http://kernel.ubuntu.com/~kernel-ppa/mainline/ den neuesten Kernel (derzeit 2.6.30) installiert, damit der Treiber die UXA Graphikbeschleunigung Architektur nutzen kann.

Im nächsten Schritt habe ich die Quellen von X-Updates in die sources.list von apt aufgenommen und die Treiber aktualisiert. Siehe alle Informationen hier: https://launchpad.net/~ubuntu-x-swat/+archive/x-updates.

Zusätzlich müssen noch die neuesten X.org Pakete mit den folgenden Befehlen aktualisiert werden:

[code]
sudo aptitude update
sudo aptitude upgrade
[/code]

Im letzten Schritt musste ich die xorg.conf anpassen, damit UXA genutzt wird. Dafür muss  unter AccelMethod UXA aktiviert werden Der Abschnitt sieht so aus:

[code]
Section „Device“
Identifier „Configured Video Device“
Driver „intel“
# this one is important
Option „AccelMethod“ „UXA“
EndSection
[/code]

In vielen Anleitungen fehlen die Anführungszeichen um „AccelMethod“ was zu einer Fehlermeldung bei mir führt. Generell müssen Optionnen und die Optionen in Anführungszeichen gesetzt werden.

Quellen und weitere Hinweise:

http://www.ubuntugeek.com/new-intel-graphics-drivers-for-ubuntu-9-04-jaunty.html

ext3 Performanzverbesserungen und CFQ Linux Scheduler Internals auf lwn.net

Heute bin ich zufälligerweise über den Artikel Solving the ext3 latency problem gestolpert. In diesem ist beschrieben wie Latency Probleme im ext3 Dateisystem untersucht, aufgedeckt und behoben wurden. Vor allem interessant finde ich die Beschreibung der internen Abläufe im Kernel und besonders im CFQ Scheduler. Dieser stellt in heutigen Betriebssystemen den modernsten Scheduler dar.

Besonders die Probleme mit fsync() Aufrufen sind mir sehr gut bekannt. Allerdings habe ich sie ohne weitere Untersuchungen auf die Festplatte geschoben, weil ich bei Windows XP deutlich schlimmere Verzögerungen miterleben muss. Ich freue mich schon auf den 2.6.30er Linux Kernel und den deutlichen Performanzzuwachs.

Vor allem lobe ich die ausführliche und aufschlussreiche Berichtserstattung des Problems. Dadurch wurde den Lesern gleichzeitig notwendiges Hintergrundwissen für die Optimierung des Dateisystems mitgeteilt. Auch wurde damit gezeigt, dass an Linux mehrere Personen arbeiten und allen sehr viel an der Qualität des Linux Kernels liegt.

CUPS-PDF unter Ubuntu 8.10 Interpid nutzen

Installiert man das Paket durch z.B. aptitude:

[code]

aptitude install cups-pdf

[/code]

So wird zwar ein Drucker (PDF) angelegt und es wird auch gedruckt, aber das Ergebnis kommt nirgends raus.

Wenn man jetzt in die Date /var/log/cups/cups-pdf_log schaut, dann sieht man das Problem. Unter dem jeweiligen Benutzernamen in den Home-Folder muss ein Ordner mit dem Namen PDF existieren. Mit dem folgenden Befehl ist das Thema erledigt und der PDF-Drucker funktioniert:

[code]

mkdir ~/PDF

[/code]

Automatisches Einbinden der Windows Laufwerke über DBUS unter Debian/Ubuntu/andere verhindern

Nach der Installation aktueller Linux Distributionen werden Windows Laufwerke direkt in Linux zum einbinden angezeigt. Will man die Laufwerke in Linux nicht anzeigen, so sollte man eine XML-Datei anlegen und dbus neustarten.
Diese Datei kann z.B. so heißen und hier liegen:
[code]
/usr/share/hal/fdi/preprobe/95userpolicy/10ignore-disks.fdi
[/code]
Hier ist der Beispielinhalt der Datei:
[code]
< ?xml version="1.0" encoding="UTF-8"?>



true



true



[/code]
Auf diese Art und weise können beliebig viele Laufwerke ausgeschlossen werden.

Getestet mit:
– Ubuntu 8.10

SSHFS unter Linux und Windows direkt nutzen

Dateisysteme unter Linux mit SSH über das Netzwerk einbinden ist eine mehr als praktische Sache. Dazu findet die Übertragung gesichert statt, was bei NFS und Samba nicht der Fall ist.

Die ganze Geschichte funktioniert unter Debian und Ubuntu wie folgt:

[code]
# Paket installieren:
aptitude install sshfs

# Seinen Benutzer in die Gruppe fuse aufnehmen:
useradd fuse

# Sich neu am System anmelden, damit die Rechte übernommen werden

# Ein beliebigies Dateisystem einbinden:
sshfs user@remoterechner:remotepfad/ lokalerPfad/
[/code]

Für wackelige und schlechte Verbindungen hilft der folgende eintrag in der ~/.ssh/config:

[code]
ServerAliveInterval 15
[/code]

Das hält die SSH-Verbindung länger am leben, wenn auch gerade keine Verbindung da ist.
Quelle: http://fuse.sourceforge.net/wiki/index.php/SshfsFaq#TOC

SSHFS unter Linux und Windows direkt nutzen weiterlesen

15 Jahre Debian! Ich gratuliere ebenfalls diesem erfolgreichen Projekt

Am 18.08.2008 ist das Debian Projekt 15 Jahre alt geworden. Ich gratuliere dem Debian Projekt zu diesem Jubiläum. Für mich stellt Debian Linux noch immer die beste freie Linux Distribution dar. Qualitativ ist Debian kaum zu schlagen. Die Wahl von Debian Linux unter anderem für große Stadtprojekte wie München spricht für die Qualität von Debian. Auch braucht sich Debian nicht hinter kommerziellen Anbietern wie Red Hat, Suse und anderen zu verstecken.

Mein Weg von/zu Debian Linux:

Debian Linux war meine erste Linux Distribution. Damals war die Linux Installation etwas holprig und es gab nicht wenig Probleme mit Hardware und Treibern. Mein erster Linux Router verrichtete seine Arbeit als Router und FTP-Server an einer DSL Leitung. Graphische Oberflächen ware weniger interessant. KDE war damals zwar schon weit fortgeschritten, aber es war für meine Gefühle zu träge, überfrachtet und zu langsam – so wie es meiner Meinung nach Heute noch immer ist!

Zwischenzeitlich habe ich auch andere Distributionen ausprobiert. Slackware Linux hatte für eine nicht kurze Zeit Debian ersetzt. Soweit ich mich erinnern kann, war die Entscheidung für Slackware nicht groß zu begründen. Ich wollte neuere Paketeversionen und die erste Linux Distribution überhaupt mal ausprobieren. Mit Slackware verweilte ich eins bis zwei Jahre.

Suse und Red Hat haben mich nie groß begeistert. Suse Linux bereitete mir nur Ärger und spätestens YAST mit seiner „Configs-Überschreiben“-Funtkion und nicht alle möglichen einstellbaren Konfigurationen, führten zur Abwendung von Suse.

Red Hat lief zwar mindestens ein halbes Jahr auf einem meiner Systeme, hat mich aber nie begeistert, da es nicht frei war und für mich keine entscheidenden Vorteile besaß. Eine Grafische Installation wie sie Suse und Red Hat früh eigenführt hatten, waren für mich nie ein großes Kriterium. Support war auch nicht notwendig. Mittlerweile bestehen mit Open-Suse und Fedora freie Varianten der Linux Distributionen und sind nicht wenig beliebt.

Gentoo war nach Debian die von mir am längsten eingesetzte Linux Distribution. Die sehr aktuellen Softwarestände und die hohe Performance durch die Optimierung auf die CPU mit dem sehr guten System „emerge“ haben mich überzeugt. Allerdings habe ich mich wegen der langen Zeit für das Erstellen von Paketen und das ständige Compilieren (pro Woche ca. 18 Stunden) gegen Gentoo Linux entschieden. Firefox Aktualisierungen von ca. fünf bis sieben Stunden waren sehr lästig und der Lüfter war der selben Meinung, als er ununterbrochen unter Vollast lief.
Trotzdem bin ich noch immer der Meinung, dass Gentoo Linux die beste Wahl für unter Last laufende und sehr anspruchsvolle Systeme für Hohe Laste, die beste Wahl ist.

Trotz der vielen Ausflüge zu anderen Distributionen ist und bleibt Debian Linux für mich die Distribution der ersten Wahl. Nicht wenige andere Linux Projekte haben ihre Popularität und Erfolg nur durch die Debian Basis erreichen können. Ubuntu Linux ist dabei der bekannteste und der erfolgreichste Vertreter.

Weitere Informationen und interessante Berichte:

HOWTO: Hauppauge HVR 900 DVB-T Tuner und verwandte Modelle unter Linux nutzen

Das ist die dritte Fassung der Anleitung.

Nutzer bis einschließlich Kernel 2.6.23.X richten sich bitte an der folgenden Anleitung:
http://konstantin.filtschew.de/blog/2006/11/30/…/

Nutzer ab Kernel 2.6.24.X benutzen bitte diese Anleitung.
Die laufende Kernel Version kann unter Linux mit dem Befehl „uname -r“ eingesehen werden.

Hintergrundwissen:
Die Treiberstruktur hat sich mit dem Wechsel auf Kernel 2.6.24 komplett geändert. Das aktuelle Modul basiert auf dem Userspace Modul System und erleichtert die Portierung von einer Kernel Version zur nächsten erheblich. Zusätzlich wird das extra runterladen und auswählen der Firmware erspart.

Erklärung zu dem Befehl „sudo“:
Sudo erlaubt es als normaler Benutzer Befehle mit root-Rechten (Administrator Rechten) auszuführen. Alle Zeilen, die mit „sudo“ beginnen, können auch unter „root“ ohne Sudo ausgeführt werden. Der Befehl „whoami“ hilft sich zu identifizieren. Wenn man als normaler Benutzer „whoami“ ausführt, so erhält man seinen aktuell angemeldeten Benutzernamen zurück. Führt man den Befehl so aus „sudo whoami“, so erscheint dort der Benutzername root. Ich werde dieses durchgehend in dieser Anleitung nutzen.

Folgende Pakete (unter Debian) werden für die Erstellung der Module benötigt:

  • make
  • build-essential # (Wird für Debian gebraucht)
  • libncurses5-dev
  • kernel-package #(Wird für Debian gebraucht)
  • gcc #(muss mit der Version übereinstimmen, mit der der Kernel erstellt wurde)
  • linux-source-2.6 #(die zum laufenden Kernel passende Quellen)
  • linux-headers-2.6 #(müssen ebenfalls zur Kernel Version passen)
  • mercurial #(dieses Paket wird benötigt, um die Quellen aus dem Repository zu holen)

Mit dem folgenden Befehl werden die benötigten Pakete auf einem Debian oder Ubuntu Linux System installiert:
[code]
user@debian:~$ sudo aptitude install make gcc linux-source-2.6 linux-header-2.6 mercurial libncurses5-dev kernel-package build-essential
[/code]
Linux löst die nötigen Abhängigkeiten selber auf und installiert die zusätzlich benötigen Pakete.

Um die laufende Kernel Version zu bestimmen, reicht der Befehl „uname -a“. Meine Ausgabe an einem Debian Lenny (testing) System:
[code]
user@debian:~$ uname -r
2.6.25-2-686
[/code]

Ubuntu Nutzer bekommen ab jetzt die erste Schwierigkeit, die sie bewältigen müssen. Der vorinstallierte Kernel in der aktuellen Ubuntut Hardy (Version 8.04) ist zum Vanilla Kernel (Kernel von www.kernel.org) verändert und bereitet Probleme. Die Ubuntu Entwickler haben haben in den Kernel die Alsa Verison 0.16 integriert, obwohl im Vanilla Kernel 0.15 verwendet wird. Damit entstehen Schwierigkeiten, wenn eigene Module erstellt werden müssen.
Der folgende Eintrag beschreibt das Problem genauer (auf Englisch):
https://bugs.launchpad.net/ubuntu/+bug/204578

Ich werde für Ubuntu Nutzer eine extra Anleitung verfassen, da es doch sehr viele treffen wird. Bitte richtet euch bis dahin an diesem sehr radikalen Skript. Bitte nicht einfach ausführen, da es zu großen Problemen führen kann!
http://mcentral.de/wiki/index.php5/Installation_Guide

Im nächsten Schritt muss untersucht werden, ob die Kernel Quellen installiert und richtig verlinkt sind. Dafür geht man in den Ordner „/usr/src“ und für dort „ls -l“ aus. Die Ausgabe müsste so ungefähr aussehen:
[code]
debian:/usr/src# ls -l
total 47412
lrwxrwxrwx 1 root src 19 2008-07-13 18:53 linux -> linux-source-2.6.25
drwxr-xr-x 4 root root 4096 2008-07-13 18:34 linux-headers-2.6.25-2-686
drwxr-xr-x 18 root root 4096 2008-07-13 18:34 linux-headers-2.6.25-2-common
drwxr-xr-x 3 root root 4096 2008-07-13 18:34 linux-kbuild-2.6.25
drwxr-xr-x 21 root root 4096 2008-06-27 01:49 linux-source-2.6.25
-rw-r–r– 1 root root 48478530 2008-06-27 03:27 linux-source-2.6.25.tar.bz2
[/code]
Die zweite Zeile der Ausgabe „linux -> linux-source-2.6.25“ zeigt, dass die von mir gewählten Quellen richtig verlinkt sind.
Fehlt die Zeile, so muss man sie mit dem folgenden Befehl verlinken (-s steht für symbolisch – so wie ein Alias):
[code]
user@debian:~$ sudo ln -s /usr/src/linux-source-2.6.25 /usr/src/linux
[/code]

Damit das build-Skript funktioniert, muss zusätzlich in dem Pfad /lib/modules/ die Quellen verlinkt werden

[code]
user@debian:~$ cd /lib/modules/2.6.25-2-686
user@debian:/lib/modules/2.6.25-2-686# ls -l
total 1760
lrwxrwxrwx 1 root root 35 2008-07-13 18:34 build -> /usr/src/linux-headers-2.6.25-2-686
drwxr-xr-x 2 root root 4096 2008-07-13 18:55 empia
drwxr-xr-x 9 root root 4096 2008-07-13 18:05 kernel
-rw-r–r– 1 root root 385573 2008-07-13 18:55 modules.alias
-rw-r–r– 1 root root 69 2008-07-13 18:55 modules.ccwmap
-rw-r–r– 1 root root 385485 2008-07-13 18:55 modules.dep
-rw-r–r– 1 root root 147 2008-07-13 18:55 modules.ieee1394map
-rw-r–r– 1 root root 451 2008-07-13 18:55 modules.inputmap
-rw-r–r– 1 root root 22301 2008-07-13 18:55 modules.isapnpmap
-rw-r–r– 1 root root 74 2008-07-13 18:55 modules.ofmap
-rw-r–r– 1 root root 291390 2008-07-13 18:55 modules.pcimap
-rw-r–r– 1 root root 1387 2008-07-13 18:55 modules.seriomap
-rw-r–r– 1 root root 172847 2008-07-13 18:55 modules.symbols
-rw-r–r– 1 root root 476400 2008-07-13 18:55 modules.usbmap
lrwxrwxrwx 1 root root 28 2008-07-13 18:54 source -> /usr/src/linux-source-2.6.25
[/code]
Die letzte Zeile „source -> /usr/src/linux-source-2.6.25“ sagt aus, dass die Quellen für diesen Kernel unter „/usr/src/linux-source-2.6.25“ liegen. Fehlt so ein Eintrag, so holt man dies mit dem folgenden Befehl nach:
[code]
user@debian:~$ sudo ln -s /usr/src/linux-source-2.6.25 /lib/modules/2.6.25-2-686/source
[/code]

Damit sollte jetzt alle für das Erstellen der Module vorhanden sein.

Im nächsten Schritt müssen die Quellen runtergeladen werden. Mercurial legt schon einen passenden Ordner an. Bitte den folgenden Befehl ausführen und schauen, ob alles funktioniert hat:
[code]
user@debian:~$ hg clone http://mcentral.de/hg/~mrec/em28xx-new
[/code]
Die Ausgabe des „hg clone ..“ Befehls wird etwas länger sein und deswegen habe ich sie aus der Beschreibung raus gelassen.

Im nächsten Schritt müssen die Module erstellt werden. Das geschieht momentan (das Skript ändert sich immer wieder) so:
[code]
user@debian:~$ sudo ./build.sh build
rm -rf Module.symvers;
make -C /lib/modules/`if [ -d /lib/modules/2.6.21.4-eeepc ]; then echo 2.6.21.4-
eeepc; else uname -r; fi`/build SUBDIRS=/root/temp/em28xx-new modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.25-2-686′
CC [M] /home/user/em28xx-new/em2880-dvb.o
CC [M] /home/user/em28xx-new/em28xx-video.o
CC [M] /home/user/em28xx-new/em28xx-i2c.o
….
LD [M] /root/temp/em28xx-new/xc5000/xc5000-tuner.ko
CC /root/temp/em28xx-new/zl10353/zl10353.mod.o
LD [M] /root/temp/em28xx-new/zl10353/zl10353.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.25-2-686′
[/code]
Ich habe die Ausgabe gekürzt, weil es dort nichts interessantes gibt. Warnungen können hier ruhig ignoriert werden. Treten Fehler auf, dann sollte man genauer nach der Meldung schauen. Meistens fehlt irgendwas und das steht in der Meldung meistens genau drin.

Ist das Erstellen der Module erfolgreich gewesen, so müssen im nächsten Schritt die Module installiert werden. Das Erfolgt mit dem Befehl:
[code]
user@debian:~$ sudo ./build.sh install
[/code]
Das dauert ein Moment und normalerweise erfolgt keine Ausgabe. Nur im Fehlerfall könnte hier noch was kommen. Meistens wird „sudo“ vergessen und das Skript hat keine Schreibrechte auf Systemordner.

Damit wäre die Installation hoffentlich vollendet und man !!!sollte!!! an dieser Stelle das System neustarten. Wenn irgendwelche DVB-Module schon geladen waren, so werden sie spätestens jetzt unter Umständen Ärger machen.

Nach dem Neustart sollten sie die Module mit den folgenden Befehlen fehlerfrei laden lassen:

[code]
user@debian:~$ sudo modprobe em28xx
user@debian:~$ sudo modprobe em28xx-dvb
user@debian:~$ sudo modprobe em28xx-audio
[/code]

Das „build.sh“ Skript bietet ebenfalls die Möglichkeit alle Module zu laden. Dies geschieht mit dem folgenden Befehl:
[code]
user@debian:~$ sudo ./build.sh load
[/code]
Damit kann der Neustart vermieden werden. Wer allerdings beim Laden der Module Probleme bekommt, sollte vorsorglich einen Neustart durchführen, um nicht unnötig Fehler zu produzieren, die durch bereits geladene Module entstehen können!

Wenn ich jetzt meinen Receiver einstecke, so sieht die Ausgabe wie folgt aus:
[code]
[ 1950.302760] usb 1-1: new high speed USB device using ehci_hcd and address 2
[ 1950.454688] usb 1-1: configuration #1 chosen from 1 choice
[ 1950.456720] em28xx new video device (2040:6500): interface 0, class 255
[ 1950.456783] em28xx: device is attached to a USB 2.0 bus
[ 1950.456834] em28xx #0: Alternate settings: 8
[ 1950.456881] em28xx #0: Alternate setting 0, max size= 0
[ 1950.456889] em28xx #0: Alternate setting 1, max size= 0
[ 1950.456892] em28xx #0: Alternate setting 2, max size= 1448
[ 1950.456894] em28xx #0: Alternate setting 3, max size= 2048
[ 1950.456896] em28xx #0: Alternate setting 4, max size= 2304
[ 1950.456898] em28xx #0: Alternate setting 5, max size= 2580
[ 1950.456900] em28xx #0: Alternate setting 6, max size= 2892
[ 1950.456902] em28xx #0: Alternate setting 7, max size= 3072
[ 1950.814288] trying to set disabled gpio? (00)
[ 1950.926465] attach_inform: tvp5150 detected.
[ 1950.931991] cx25843.c: starting probe for adapter em28xx #0 (0x1001f)
[ 1950.965050] tuner‘ 0-0061: chip found @ 0xc2 (em28xx #0)
[ 1950.965050] attach inform (default): detected I2C address c2
[ 1951.024446] attach_inform: eeprom detected.
[ 1951.121182] em28xx #0: i2c eeprom 00: 1a eb 67 95 40 20 00 65 50 12 5c 03 82 1e 6a 18
[ 1951.121182] em28xx #0: i2c eeprom 10: 00 00 24 57 66 07 00 00 60 00 00 00 02 00 00 00
[ 1951.121182] em28xx #0: i2c eeprom 20: 46 00 01 00 f0 10 02 00 b8 00 00 00 5b 00 00 00
[ 1951.121182] em28xx #0: i2c eeprom 30: 00 00 20 40 20 6e 02 20 10 01 01 01 00 00 00 00
[ 1951.121182] em28xx #0: i2c eeprom 40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 1951.121182] em28xx #0: i2c eeprom 50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 1951.121182] em28xx #0: i2c eeprom 60: 00 00 00 00 00 00 00 00 00 00 18 03 34 00 30 00
[ 1951.121182] em28xx #0: i2c eeprom 70: 32 00 36 00 38 00 39 00 38 00 38 00 37 00 38 00
[ 1951.121182] em28xx #0: i2c eeprom 80: 00 00 1e 03 57 00 69 00 6e 00 54 00 56 00 20 00
[ 1951.121182] em28xx #0: i2c eeprom 90: 48 00 56 00 52 00 2d 00 39 00 30 00 30 00 00 00
[ 1951.121182] em28xx #0: i2c eeprom a0: 84 12 00 00 05 50 1a 7f d4 78 23 f0 fd d0 18 85
[ 1951.121182] em28xx #0: i2c eeprom b0: ff 00 00 00 04 84 0a 00 01 01 20 77 00 40 be 99
[ 1951.121183] em28xx #0: i2c eeprom c0: 05 f0 74 02 01 00 01 79 0c 00 00 00 00 00 00 00
[ 1951.121183] em28xx #0: i2c eeprom d0: 84 12 00 00 05 50 1a 7f d4 78 23 f0 fd d0 18 85
[ 1951.121183] em28xx #0: i2c eeprom e0: ff 00 00 00 04 84 0a 00 01 01 20 77 00 40 be 99
[ 1951.121183] em28xx #0: i2c eeprom f0: 05 f0 74 02 01 00 01 79 0c 00 00 00 00 00 00 00
[ 1951.121183] EEPROM ID= 0x9567eb1a
[ 1951.121183] Vendor/Product ID= 2040:6500
[ 1951.121183] AC97 audio (5 sample rates)
[ 1951.121183] 500mA max power
[ 1951.121183] Table at 0x24, strings=0x1e82, 0x186a, 0x0000
[ 1951.215248] tvp5150 0-005c: tvp5150am1 detected.
[ 1956.755148] successfully attached tuner
[ 1956.815279] em28xx #0: V4L2 VBI device registered as /dev/vbi0
[ 1956.858622] em28xx #0: V4L2 device registered as /dev/video0
[ 1956.858788] em2880-dvb.c: DVB Init
[ 1976.984939] analog tv open()
[ 1976.985010] modelock active!
[ 1976.992903] vbi open()
[ 1976.992935] modelock active!
[ 1957.188645] DVB: registering new adapter (em2880 DVB-T)
[ 1957.188645] DVB: registering frontend 0 (Zarlink ZL10353 DVB-T)…
[ 1957.190935] em28xx #0: Found Hauppauge WinTV HVR 900
[ 1957.192191] em28xx audio device (2040:6500): interface 1, class 1
[ 1957.192771] em28xx audio device (2040:6500): interface 2, class 1
[ 1957.193563] usb 1-1: New USB device found, idVendor=2040, idProduct=6500
[ 1957.193601] usb 1-1: New USB device strings: Mfr=0, Product=1, SerialNumber=2
[ 1957.193604] usb 1-1: Product: WinTV HVR-900
[ 1957.193667] usb 1-1: SerialNumber: 4026898878
[ 1958.013115] usbcore: registered new interface driver snd-usb-audio
[/code]

Nach dem einstecken müssen die folgenden Devices in /dev vorhanden sein:

[code]
/dev/vbi0
/dev/video0
/dev/dvb/adpater0/demux0
/dev/dvb/adpater0/dvr0
/dev/dvb/adapter0/frontend0
[/code]

Weitere Hinweise:
Unter Umständen wird es nötig sein den Nutzer zu der Gruppe Video hinzuzufügen, weil er sonst keine Zugriffsrechte auf das Video Device bekommt. Dafür muss der folgende Befehl ausgeführt werden. (Die Variable $USER wird vom System gesetzt und ist der aktuell angemeldete Benutzer):
[code]
user@debian:~$ sudo adduser $USER video
[/code]

Wenn Schwierigkeiten nach der erfolgreichen Installation entstehen, dann bitte das System ohne eingesteckten Receiver hoch fahren, dann die Module per Hand laden (unter dmesg die Meldungen beachten) und erst dann den Receiver einstecken. Dadurch sind die Fehler besser sichtbar, weil sie nicht durcheinander in dmesg beim Booten eingestreut werden.

Falls jemand Trotzdem Schwierigkeiten hat, der kann mir Gerne ein Kommentar hinterlassen. Damit es für mich einfacher wird euch zu helfen, bitte ich euch die folgenden Informationen mir zu geben:
– Linux Version (z.B. Ubuntu Hardy 8.04, Debian Linux 4.0 (Etch))
– Kernel Version 2.6.25-2 (Der Befehl: „uname -r“ verrät es. Auch bitte angeben, ob es ein selbst erstellter Kernel ist oder vom Distributor)
– Sind die Linux Quellen Installiert? (Folgende Befehle helfen weiter „sudo ls -l /usr/src“ und „sudo ls -l /lib/modules/$(uname -r)/source“
– Ist was beim Erstellen scheif gegangen, so bitte ich um die komplette Ausgabe, falls ihr den Fehler nicht selber seht.
– Hat das Installieren der Module funktioniert, aber danach geht irgendwas schief, so bitte ich euch das System ohne Receiver zu starten, dann die Module zu laden und erst dann den Receiver einzustecken. Danach mir bitte die dmesg-Ausgabe ab der Stelle in der die Module geladen wurden geben.
– Bitte alle längeren Ausgaben wie von dmesg oder vom Erstellen des Treibers auf der Seite http://www.pastebin.com oder auf http://ubuntuusers.de/paste/ posten und hier nur den Link rein stellen, da es sonst zu unübersichtlich wird.

Ich hoffe damit möglichst vielen Nutzern zu helfen. Wer mir danke möchte, der möge es mit einem Kommentar tun. Spenden nehme ich gerne als Geschenke von meiner Amazon Wunschliste an.

Software RAID 0/1/5 unter dem Debian Installer erstellen

Die Grundidee hinter dem Software Raid von Linux besteht darin, Partitionen zu erstellen und diese zu einem Raid zu verbinden. Mit diesem Grundgedanken wird es auch einfach das Raid einzurichten, weil nur dadurch klar wird, dass man auf jeder der Raid Festplatten die Partitionen x-fach anlegen muss.

Performance von Software Raid:
Man sollte nicht zu viel von Software Raid erwarten, da alle Informationen auf der CPU berechnet werden und das System damit nicht wenig Last erzeugt. Mein Testsystem ist ein betagter 800er Sempron mit 512 MB RAM mit Software Raid-1 Verbund. Er schafft mit FTP schreibend gerade mal 5-6 MB/s, da die CPU vollständig ausgelastet ist.

Erklärung zu Software Raid im Vergleich zu Hardware Raid:
Wer Hardware Raid Systeme konfiguriert hat und mit Software Raids nicht zu tun hatte, muss zuerst etwas umdenken. Im Hardware Raid existieren Devices in Form von Festplatten. Bei Software Raid sind diese Devices Partitionen, die als „Physical volume for RAID“ markiert werden. Diese Partitionen die als virtuelle physikalische Geräte markiert sind, werden dann zu Software RAID Arrays zusammen geschlossen.
Diese ergebenen wiederrum Partitionen und nicht virtuelle Laufwerke, die nicht mehr partitioniert werden können. Diese virtuellen Laufwerke werden mit dem jeweilig gewünschten Dateisystem formatiert und ergeben damit die benutzbaren Partitionen.

!!! Wer sich die vorhergehende Erklärung von mir, nicht durchgelesen hat, den bitte ich das noch zu tun, bevor er weiter macht und Verständnisschwierigkeiten bekommt!!!

Da die Erklärung eine Menge Verwirrung spart, schreibe ich jetzt hier die Schritte für die Durchführung der Raid Konfiguration für Raid 1 auf. Raid 5 und Raid 0 gehen analog. Auch setze ich vorraus, dass man sich wenigstens bei Wikipedia zu den einzelnen Raid-Arten schlau gemacht hat.

Diese Anleitung gilt für den Debian Installer in dem „Expert Mode“. Wie es unter generell jedem Linux geht, werde ich demnächst auch noch erläutern (die liebe Zeit fehlt mir).

Die Erklärung beginnt ab dem Punkt Partitionierung des Debian Installers:

  1. Für Raid muss unter „Partition method“ „Manuel“ gewählt werden.
  2. Hier erstellt man seine Wunschpartitionen und wählt danach in „Partition settings“ im Menüpunkt „Use as“ „physical volume RAID“ für die Partition aus. Diese Partition dient jetzt als eine Device für das spätere Raid.
  3. Jetzt wiederholt man den zweiten Schritt für jede Partition nochmal und vergisst nicht eine Swap Partition zu erstellen, weil es nicht viel Sinn macht, sie zum Raid hinzuzufügen. Wer es dennoch wünscht, kann es gerne tun.
  4. Den zweiten Schritt muss man am besten identisch zu der ersten Festplatte ausführen, so dass später die Auswahl einfacher wird.
  5. Jetzt sollten mindestens 2 Festplatten mit dem gleichen Partitionsschema vorhanden sein und oben im Menü unter der Festplattenübersicht ist ein neuer Menüpunkt „Configure software RAID“ erschienen.
  6. In dem „Configure software RAID“ Menüpunkt können nun die „physical volume RAID“ zu RAID Partitionen durch die Auswahl „Create MD device“ verbunden werden. Das muss für jede Partition wiederholt werden.
  7. Wenn man jetzt auf „Finish“ drückt und  in die Partitionsübersicht zurück kehrt, so sind ganz unten die neuen Partitionen des Software RAIDs aufgelistet. Diesen Partitionen muss jetzt das Dateisystem und der „Mount point“ hinzugefügt werden.
  8. Wenn dazwischen nicht schief gegangen ist, dann kann mit der weiteren Installation des Systems forgesetzt werden.

Hinweis:

  • Ist das Software Raid schon mal erstellt worden, so sollte man zuerst die „MD Devices“ löschen, bevor man irgend etwas an den Partitionen der wirklichen Festplatten ändert.
  • Grub und Lilo können nur von Raid 1 und nicht Raid 5 Devices booten. Aus diesem Grund sollte die Root-Partition als Raid 1 konfiguriert werden.
  • Sollte die Installation des Bootloaders einmal nicht funktionieren, so sollte man versuchen den Befehl auf einer der anderen Consolen auszuführen indem man vorher mit „chroot /target“ sich in die installierte Umgebung einklinkt und dann den Schritt der Installation durchführt.

Das wars erstmal von meiner Seite – Kritik und Verbesserungsvorschläge nehme ich gerne an.

Ich hoffe damit jemanden geholfen zu haben – mir dient es als eine gute Notiz. Ein Danke-Kommentar erfreut jeden Author! 😉