Mini-Howto: Fritz Card PCI mit Asterisk in DomU (XEN) unter Fedora 8 (Quick+Dirty)

hahni

Neuer User
Mitglied seit
26 Mai 2007
Beiträge
52
Punkte für Reaktionen
0
Punkte
0
Hallo liebe Forengemeinde!

Ich habe mittlerweile einige Tage damit rumgebracht, eine FritzCard PCI in einer DomU unter XEN ins Rennen zu schicken. Für alle, die nicht wissen, wo sie anfangen sollen, oder ob fcpci mit CAPI in einer DomU tatsächlich funktioniert, hier ein kleines HowTo:

1) Worum geht's?
Die AVM FritzCards sind für ihre eigenartige Treiberunterstützung unter Linux bekannt (es existiert nur ein, nicht mehr gepflegter, Binary-Treiber für SUSE-Linux 9.3). Ich versuche hier zu beschreiben, wie ich es geschafft habe, eine Fritz-Card unter Fedora 8 innerhalb einer paravirtualisierten Maschine unter XEN ins Rennen zu schicken.

2) Ausgangspunkt
Ich habe folgende Hardware und Software genutzt:

Hardware (hatte auf der Arbeit gerade nichts anderes da):
- AMD Sempron 2600
- 1GB RAM
- Asus-Board (Typ ist mir gerade entfallen)
- 40GB-Platte
- Fedora 8 in der Dom0, alle Updates eingespielt und SELinux deaktiviert (dies ist nur ein Quick+Dirty-Howto, erst die Funktion, um die Sicherheit kümmere ich mich später)
- Fedora 8 in der DomU, bislang ohne Updates, nur der Kernel.

3) Vorgehensweise
Man setzte eine Fedora 8-Dom0 mittels Installer (grafisch oder Text ist egal) auf. Ich habe mir angewöhnt, grundsätzlich KEINE Dienste in der Dom0 laufen zu lassen, also muss der Asterisk nebst allen Treibern in der DomU laufen. Die FritzCard muss also vom Host in das Gastsystem durchgereicht werden. Für die Installation wählte ich keine großen Pakete/Paketgruppen aus. Defacto eigentlich nur "Base". Nach erfolgter Installation tat ich folgendes:

yum -y update kernel-xen

danach

yum -y groupinstall "Virtualization"

und für ein paar nützliche Tools:

yum -y install mc iptraf nmap tcpdump


Soviel erstmal zur Dom0.
----


Installation der DomU, um die ISDN-Karte durchzureichen. Früher habe ich meine virtuellen Maschinen immer mit virt-install aufgesetzt. Dabei kommt ein Image-File und eine schlecht dokumentierte .sxp-Config-Datei heraus, die mir persönlich NICHT weitergeholfen hat. Also fange ich vom Anfang an.

1) Erstellen einer Image-Datei für die Asterisk-DomU (2GB reichten bei mir):

dd if=/dev/zero of=/var/xenimages/asterisk bs=1M count=2048

2) Config-File für die Installation der DomU erstellen (ich gehe davon aus, dass das Netzwerk innerhalb der XEN-Umgebung bereits eingerichtet ist und die Installations-RPMS auf einem lokalen FTP-Server vorliegen. Ich habe dazu einfach die F8-DVD in ein Verzeichnis auf unserem internen FTP kopiert und anonymous Zugriff auf das Verzeichnis aktiviert, bei mir heißt es fc8i386).

Ich lege die Datei /etc/xen/asterisk an, die ich mit diesem Inhalt füttere:

Code:
kernel = "/boot/vmlinuz-xen-install"
ramdisk = "/boot/initrd-xen-install"
extra = "text ks=ftp://ip.zum.ftp.server/fc8i386/minimal-ks.cfg"
name = "asterisk"
memory = "256"
disk = [ 'file:/var/xenimages/asterisk,xvda,w', ]
vif = [ 'bridge=virbr0', ]
vcpus=1

Danach kopiere ich von der Fedora8-DVD die Dateien "/images/xen/vmlinuz" und "/images/xen/initrd" in das /boot-Verzeichnis der Dom0 und nenne sie in "vmlinux-xen-install" und "initrd-xen-install" um, ansonsten wird die DomU nicht installieren wollen. Auf dem FTP erstelle ich im Verzeichnis "fc8i386" die Datei "minimal-ks.cfg". Hier schreibe ich folgendes rein:

Code:
install
url --url ftp://ip.zum.ftp.server/fc8i386

Danach werfe ich die Installation an:

xm create -c asterisk

Das ganze schaut dann aus, wie eine ganz normale Fedora-Installation, ich habe wieder nur einige Pakete aus "Base" und den YUM installiert. Mehr benötige ich für die weiteren Schritte nicht.

Nachdem die Installation fertig ist fahre ich die DomU mit "halt" herunter und tue ich folgendes:
- Ich ändere als erstes die /etc/xen/asterisk in der Dom0 ab, damit nicht bei jedem Anwerfen der DomU der Installer lädt. Ich habe aus der o.g. Config einfach die "extra"-Zeile gelöscht.

Danach tue ich in der Dom0 folgendes:

lspci eingeben um herauszufinden, welche PCI-ID meine ISDN-Karte hat. Bei mir steht dann:

Code:
02:0e.0 Network controller: AVM Audiovisuelles MKTG & Computer System GmbH Fritz!PCI v2.0 ISDN (rev 01)

in /etc/rc.d/rc.local füge ich ein:

modprobe pciback;
echo -n 0000:02:0e.0 > /sys/bus/pci/drivers/pciback/new_slot;
echo -n 0000:02:0e.0 > /sys/bus/pci/drivers/pciback/bind;

damit wird die FCPCI an das PCIBACK-Modul von Xen gebunden, um sie später in der DomU nutzen zu können. Die Dom0 starte ich danach neu.

Nun geht's ans Eingemachte. Ich nehme erneut die /etc/xen/asterisk und füge an:

pci = ['02:0e.0']

Anschließend wird die DomU angeworfen:

xm create -c asterisk

Ich logge mich auf der DomU ein, deaktiviere SELinux und update als erstes den Kernel und installiere den Compiler.

yum -y update kernel-xen
yum -y install mc iptraf tcpdump nmap isdn4k-utils kernel-xen-devel
yum -y groupinstall "Development Tools"
yum -y groupinstall "Development Libraries"

und werfe dann einen Blick in lspci. Bei mir steht hier nun:

Code:
00:00.0 Network controller: AVM Audiovisuelles MKTG & Computer System GmbH Fritz!PCI v2.0 ISDN (rev 01)

Damit ist die Karte schonmal in der DomU. Noch kurz die DomU rebooten, um den aktuellen Kernel am Start zu haben.

Nun compiliere ich das FCPCI-Modul:

cd /usr/src
wget ftp://ftp.avm.de/cardware/fritzcrd.pci/linux/suse.93/fcpci-suse93-3.11-07.tar.gz
tar -xf fcpci-suse93-3.11.07.tar.gz

ich lade mir folgenden Patch herunter:

wget http://mephistopheles.homelinux.org//fcpci/fcpci-suse93-3.11-07-twelter-v2.patch

Danach wird der Patch eingespielt.

patch -p0 < fcpci-suse93-3.11-07-twelter-v2.patch

nun wechsle ich ins Verzeichnis "fritz" und mache ein normales "make". Das Compilieren sollte glatt durchlaufen, ein paar Warnungen hin oder her. Zum Schluss bricht das ganze ab, irgendeine gnu.irgendwas könne nicht geschrieben werden. Macht nix, das benötigte fcpci.ko-Modul finden wir in /usr/src/fritz/src/fcpci.ko. Mehr brauchen wir gar nicht.

Danach tue ich dieses:
modprobe capi
MAKEDEV /dev/capi
insmod /usr/src/fritz/src/fcpci.ko
capiinit

capiinfo zeigt dann auch ganz brav alle B-Kanäle und alles was man für einen erfolgreichen Betrieb der CAPI unter einer DomU braucht. Nun können wir Asterisk und chan_capi (habe Ver. 1.1.1 genommen) installieren.

That's it. Ein Test-Telefonat mit meiner Freundin über 3 Stunden (ja, es ging unter anderem auch um ihr Gewicht und um Schuhe) verlief einwandfrei.



Was noch zu tun ist:
- SELinux hinfriemeln
- Stabilitätstest
- Prioritätsgewichtung gegenüber anderen VMs, damit keine Timing-Probleme entstehen.

Ich hoffe aber, es hat ein wenig geholfen!

Grüße,

Euer Hahni
 
Zuletzt bearbeitet:
Super Anleitung!
mit dem FC-Treiber hatte ich mich vor einiger Zeit schon mal länger rum geärgert, der entscheidende Hinweis war der Patch - seit dem klappt endlich alles.

Danke!
 
Hallo!

Danke erstmal für über 1300 Klicks bisher ;)

Das beschriebene Howto funktioniert übrigens problemlos auch auf CentOS 5.2. Der beschriebene Fehler mit der gnu.irgendwas-Datei tritt dort nicht auf.

Hier kann man nach dem "make" einfach ausführen:

make install
depmod -ae

Die FritzCard wird nach einem Reboot automatisch erkannt. Man braucht außer dem capiinit keine weiteren Einträge in der /etc/rc.d/local anlegen.

Edit: Nach der CentOS-Installation können auch per yum update alle Updates (Stand: heute) eingespielt werden, ohne, dass das der fcpci-Treiber danach nicht mehr mag (Unter F8 hat's nicht funktioniert, obwohl die Kernel-Version gleich geblieben ist. Auch recompilieren des Treibermoduls nach dem Update brachte keine Abhilfe).
 
Zuletzt bearbeitet:
Hallo, ich bin bei der Suche über den Tread gestolpert.

Aktuell versuche ich den AVM FritzUSB 2.0 Treiber unter CentOS5 64 Bit zum laufen zu bekommen.
Dazu habe ich mir den fcusb2-suse10.0-64bit-3.11-07 von avm geholt und wollte den fcpci-suse93-3.11-07-twelter-v2.patch testen bzw anpassen. Leider sind die Links alle tot. Hat eventuell jemand diesen Patch oder einen aktuelleren ?
Oder vielleicht auch einen Tip wie der Treiber unter 64bit zum laufen zu bekommen ist ?

Code:
[root@pbx src]# cd /usr/src/fritz/src/
[root@pbx src]# make
make -C /lib/modules/2.6.18-194.32.1.el5/build SUBDIRS=/usr/src/fritz/src modules
make[1]: Entering directory `/usr/src/kernels/2.6.18-194.32.1.el5-x86_64'
  CC [M]  /usr/src/fritz/src/main.o
In file included from /usr/src/fritz/src/driver.h:26,
                 from /usr/src/fritz/src/main.c:35:
include/linux/config.h:6:2: warning: #warning Including config.h is deprecated.
/usr/src/fritz/src/main.c:85: error: unknown field âownerâ specified in initializer
/usr/src/fritz/src/main.c:85: warning: initialization from incompatible pointer type
make[2]: *** [/usr/src/fritz/src/main.o] Error 1
make[1]: *** [_module_/usr/src/fritz/src] Error 2
make[1]: Leaving directory `/usr/src/kernels/2.6.18-194.32.1.el5-x86_64'
make: *** [fcusb2.o] Error 2
[root@pbx src]#

EDIT: Es läuft nun durch die folgenden Änderungen auf CentOS 5.2 Kernel 2.6.18-SMP:

- in /usr/src/fritz/src/main.c Zeile 85 auskommentieren -> make laufen lassen
- in /usr/src/fritz/install folgende Zeilen auskomentieren

Code:
#if test "$I_ARCH-$I_SMP" = "x86_64-SMP"; then
#       ALERT "This driver is for x86_64 single processor machines only!\n"
#       exit 3
#fi

dann install aufrufen
Code:
Welcome to the FRITZ!Card USB v2.x driver installation!

Generating FRITZ!Card USB v2.x driver for kernel 2.6.18-194.32.1.el5...
Copying FRITZ!Card USB v2.x driver...
  fcusb2.ko to /lib/modules/2.6.18-194.32.1.el5/extra/fcusb2.ko

The driver files have been copied.

Ready
-------------
folgendes muss noch manuell gemacht werden: 

modprobe fcusb2, 
mkdir -p /usr/share/isdn
cp /usr/src/fritz/*.frm /usr/share/isdn/
/etc/init.d/capi start

/etc/init.d/capi start und es hat funktioniert

capiinfo zeigt nun schön das device
 
Zuletzt bearbeitet:
Ich habe die Patch-Datei leider gerade nicht zur Hand, ich gucke aber morgen mal, ob ich sie noch auf meinem Arbeitsrechner habe. Schau sonst mal bei ATrpms, die haben entsprechend vorcompilierte Module und evtl. auch das SRPM mit integriertem Patch :)
 
Anbei der gesuchte Patch von Timo Welter. Habe ihn noch auf Platte gehabt.

Code:
#Patch was written by Timo Welter ([email protected])
#v2
#fixed Problem with Kernel-Namespace in Kernelversions after 9/2007 
#(SA_IRQ_THINGS)
#
#v1
#replaced old Kernel-Functions with new ... etc.
#
#If you get some error or warning messages at compile time
#please report me for debuging!
#
Only in fritz_patched: fcpci.ko
Only in fritz_patched: install.log
Only in fritz_patched/src: .tmp_versions
Only in fritz_patched/src: Module.symvers
diff -U 3 -H -d -r -- fritz/src/driver.c fritz_patched/src/driver.c
--- fritz/src/driver.c	2005-07-07 00:00:00.000000000 +0200
+++ fritz_patched/src/driver.c	2007-08-18 18:16:22.000000000 +0200
@@ -374,9 +374,9 @@
 			card->irq, 
 			&irq_handler, 
 #if defined (__fcpci__) || defined (__fcpcmcia__)
-			SA_INTERRUPT | SA_SHIRQ, 
+			IRQF_DISABLED | IRQF_SHARED, 
 #else
-			SA_INTERRUPT, 
+			IRQF_DISABLED, 
 #endif
 			TARGET, 
 			card
@@ -901,10 +901,10 @@
 
 /*---------------------------------------------------------------------------*\
 \*---------------------------------------------------------------------------*/
-int driver_init (void) {
+int driver_initnew (void) {
 
 	return (NULL != (capi_lib = link_library (NULL)));
-} /* driver_init */
+} /* driver_initnew */
 
 /*---------------------------------------------------------------------------*\
 \*---------------------------------------------------------------------------*/
Only in fritz_patched/src: driver.c.orig
diff -U 3 -H -d -r -- fritz/src/driver.h fritz_patched/src/driver.h
--- fritz/src/driver.h	2005-07-07 00:00:00.000000000 +0200
+++ fritz_patched/src/driver.h	2007-08-18 18:00:43.000000000 +0200
@@ -23,7 +23,7 @@
 #ifndef __have_driver_h__
 #define __have_driver_h__
 
-#include <linux/config.h>
+//#include <linux/autoconf.h>
 #include <linux/skbuff.h>
 #include <linux/capi.h>
 #include <linux/list.h>
@@ -98,7 +98,7 @@
 
 /*---------------------------------------------------------------------------*\
 \*---------------------------------------------------------------------------*/
-extern int driver_init (void);
+extern int driver_initnew (void);
 extern void driver_exit (void);
 
 /*---------------------------------------------------------------------------*\
Only in fritz_patched/src: driver.h.orig
diff -U 3 -H -d -r -- fritz/src/main.c fritz_patched/src/main.c
--- fritz/src/main.c	2005-07-07 00:00:00.000000000 +0200
+++ fritz_patched/src/main.c	2007-08-18 18:00:43.000000000 +0200
@@ -22,7 +22,7 @@
 
 #include <stdarg.h>
 #include <asm/uaccess.h>
-#include <linux/config.h>
+//#include <linux/autoconf.h>
 #include <linux/version.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
@@ -205,7 +205,7 @@
 	NOTE(PRODUCT_LOGO " found: port 0x%04x, irq %u\n", pars.port, pars.irq);
 
 	NOTE("Loading...\n");
-	if (!driver_init ()) {
+	if (!driver_initnew ()) {
 		ERROR("Error: Driver library not available.\n");
 		ERROR("Not loaded.\n");
 		return res;
@@ -270,7 +270,7 @@
 	NOTE (PRODUCT_LOGO " found: port 0x%04x, irq %u\n", pars.port, pars.irq);
 
 	NOTE("Loading...\n");
-	if (!driver_init ()) {
+	if (!driver_initnew ()) {
 		ERROR("Error: Driver library not available.\n");
 		ERROR("Not loaded.\n");
 		return -EBUSY;
@@ -364,7 +364,8 @@
 #endif
 
 #if defined (__fcpci__)	
-	if (0 == (err = pci_module_init (&fcpci_driver))) {
+//	if (0 == (err = pci_module_init (&fcpci_driver))) {
+        if (0 == (err = pci_register_driver (&fcpci_driver))) {
 		LOG("PCI driver registered.\n");
 		register_capi_driver (&fritz_capi_driver);
 		LOG("CAPI driver registered.\n");
@@ -378,7 +379,7 @@
 	}
 	return err;
 #elif defined (__fcpcmcia__) || defined (__fcclassic__)
-	if (!driver_init ()) {
+	if (!driver_initnew ()) {
 		ERROR("Error: Driver library not available.\n");
 		ERROR("Not loaded.\n");
 		return -EBUSY;
Only in fritz_patched/src: main.c.orig
diff -U 3 -H -d -r -- fritz/src/tools.h fritz_patched/src/tools.h
--- fritz/src/tools.h	2005-07-07 00:00:00.000000000 +0200
+++ fritz_patched/src/tools.h	2007-08-18 18:00:43.000000000 +0200
@@ -71,15 +71,6 @@
 
 /*---------------------------------------------------------------------------*\
 \*---------------------------------------------------------------------------*/
-static inline unsigned long atomic_xchg (
-	volatile atomic_t *	v, 
-	unsigned		value
-) {
-	return __xchg (value, &v->counter, sizeof (unsigned));
-} /* atomic_xchg */
-
-/*---------------------------------------------------------------------------*\
-\*---------------------------------------------------------------------------*/
 #ifndef NDEBUG
 extern unsigned hallocated (void);
 extern int hvalid (void *);
Only in fritz_patched/src: tools.h.orig
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.