Anleitung Kernelmodul erstellen - für acer ICONIA TAB A210

E

enero99

Neues Mitglied
0
Hallo und guten Tag,
ich habe ein (gerootetes) acer ICONIA TAB A210:
Modellnummer A210, Android-Version 4.1.1, Kernel-Version 3.1.10+, Image Version Acer_AV051_A210_RV03RC02_EMEA_DE, Build-Nummer Acer_AV051_A210_1.020.00_EMEA_DE, Abbild-P/N FM.S1NA0.02L
Ich habe mir folgende Tools installiert:
Sourcery Tools Support Portal, Sourcery CodeBench Lite 2012.09-64 for ARM
Ich möchte ein cifs.ko Kernelmodul erstellen um Verzeichnisse (von meiner NAS) direkt in den Verzeichnisbaum zu mounten.

Soviel ich es bis jetzt verstanden habe benötige ich noch die Headerdateien, die bei der Erstellung des Kernel verwendet wurden. Und die Quelldateien für das Kernelmodul cifs.ko. Und noch ein wenig Wissen wie daraus ein funktionierendes Kernelmodul zu erstellen ist.


  1. Wo kann ich die passenden Headerdateien finden?
  2. Wo kann ich die Queldateien für das cifs.ko Kernelmodul finden?
  3. Wie wird ein Kernelmodul für Android erstellt?

Im Voraus besten Dank für jede Hilfe.
enero99
 
Hallo,

die Headerdateien bringen dir nicht viel, da du zuerst den Kernel deines Tablets auf deinem PC neu erstellen musst, um dann das cifs Modul erstellen zu können. Du brauchst also den Quellcode deines Kernels. Die Quelldateien für das cifs Modul sind da mit dabei.
Den Quellcode für deinen Kernel findest du auf der HP deines Herstellers, falls er es schon veröffentlicht hat. Schau dich da einfach mal um Support Bereich um. Manche Hersteller haben auch eine eigene Seite für ihre Open Source Dateien. Muss du dich halt mal umschauen.

Wenn du das hast, kannst du ans Kompilieren gehen.
Ich erkläre das mal für Ubuntu mit dem gcc Toolchain. Code Sourcery nutze ich nicht, wenn du unbedingt das nutzen willst, schau einfach mal dort nach, wo es dir empfohlen wurde. Da steht cher mehr dazu.

gcc Toolchain installierst du mit:
Code:
sudo apt-get install build-essential libncurses5-dev make gcc-arm-linux-gnueabi


Den Kernel Quellcode entpackst du und wechselst mir dem Dateimanager mal in das Verzeichnis des Kernels, in dem alle Unterordner und Dateien wie README und Makefile liegen. Öffne auch mal die Makefile mit dem Texteditor und überprüfe, ob die Versionsangaben darin mit der Version deiner Kernels übereinstimmt. Falls nicht hast du den falschen Quellcode und solltest nochmal auf der Herstellerseite nachschauen.
Zusätzlich navigierst du auch im Terminal in das Verzeichnis.
Im Terminal gibst du erst mal
Code:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- clean
ein, das bereinigt Überreste von alten Builds, manchmal lassen die Hersteller sie drin.

Im Dateimanager aktivierst du unter Ansicht "Verborgene Dateien anzeigen", nun schau mal ob im Verzeichnis eine .config Datei liegt. Falls das nicht der Fall ist muss du den internen Namen deines Tablets kennen, im Verzeichnis "arch/arm/configs" kannst du dann schauen, ob eine defconfig für dein Tablet vorhanden ist. Die gibt es immer, die passende zu finden ist aber nicht immer einfach. Wenn du die defconfig für dein Tablet gefunden hast, gibst du im Terminal:
Code:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- xxx_defconfig
ein, xxx musst du mit dem namen deiner defconfig ersetzen.

Du kannst auch alternativ auf deinem Tablet ins Verzeichnis /proc schauen, dort findest du eine config.gz Datei. Sie kopierst du auf deinen PC, entpackst sie und legst sie ins Hauptverzeichnis deiner Quellcodes. Dort muss du sie dann in .config umbenennen. Die Vorgehensweise empfehle ich dir, da du damit die exakte config deines aktuellen Kernels nutzen würdest.

Nachdem du die passende .config hast, musst du ins Konfigurationsmenü, um das cifs Modul zu aktivieren. Dazu musst
Code:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
im Terminal eingeben. Nun erscheint im Terminal dieses Menü:
kernel_menu.png
Du musst nun mit den Pfeiltasten nach unten navigieren, bist zum Menüpunkt "File System", dann auf Enter drücken, im Untermenü, wieder ziemlich weit unten auf "Network File Systems" und Leertaste, falls kein [*] vorne vorhanden ist, Enter um in Untermenu zu gelangen. Im nächsten Menü dann auf "CIFS Support", dort drückst du so oft die Leertaste bis vorne ein <M> erscheint. Bei "CIFS statistics", "CIFS extended attributes" und "CIFS POSIX Extensions" sollte ein Stern vorne vorhanden sein, falls nicht mach sie rein, also hin navigieren, mit Leertaste markieren. So muss es dann ausschauen:
kernel_cifs.png
Wenn du das hast kannst du mit der rechten Pfeiltaste auf "exit" navigieren und mit ENTER Taste das Menü verlassen, das machst du so oft bis die Frage kommt, ob du speichern möchtest. Speichern und raus.
Achte darauf im Menü nichts anderes zu verändern.

Nun kannst du deinen Kernel mit
Code:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j5
kompilieren, das -j5 ist damit der Build schneller geht, in der Regel nimmt man da Kernezahl + 1. Wenn dein PC Prozessor z.B. 2 Kerne hat, nimmst du -j3.
Das dauert dann ein Weilchen, sofern es nicht mit Fehlern abbricht.
Wenn der Build erfolgreich war, findest du das cifs.ko Modul im "fs/cifs" Ordner. Falls dein Build ohne Fehler durchgelaufen ist, das Modul jedoch nicht vorhanden, dann kannst du mit
Code:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules -j5
nur die Module erstellen lassen.

Falls dein Build nicht durchläuft und du Errormeldungen bekommst, dann melde dich noch einmal.
 
Zuletzt bearbeitet von einem Moderator:
  • Danke
Reaktionen: ui_3k1
perpe schrieb:
Code:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-  -j5
kompilieren, das -j5 ist damit der Build schneller geht, in der Regel nimmt man da Kernelzahl + 1. Wenn dein PC Prozessor z.B. 2 Kernel hat, nimmst du -j3.


Ich denke du meinst Kerne und nicht Kernel oder?
 
jupp...korrigiert :)
 
  • Danke
Reaktionen: finnq
Hallo,
erstmal vielen Dank für die gute und ausführliche Hilfe!
Habe ein wenig gebraucht um es zu realisieren; konnte aber dann auch problemlos das Modul cifs.ko erstellen.

Leider bekomme ich jetzt aber immer ein Fehler wenn ich das Modul verwenden will.

Hier erstmal das Modul laden; scheint auch zu funktionieren.
Code:
...
root@android:/ #
root@android:/ # cd /system/lib/modules
root@android:/system/lib/modules # [B]ls[/B]                                                                                                                
bcmdhd.ko    cfg80211.ko  [B]cifs.ko[/B]      lib80211.ko  mac80211.ko  mpu3050.ko   timerirq.ko  ufsd.ko
root@android:/system/lib/modules # [B]insmod cifs.ko[/B]
root@android:/system/lib/modules # [B]lsmod[/B]
[B]cifs 229935 0 - Live 0x00000000[/B]
bcmdhd 347806 0 - Live 0x00000000
cfg80211 150751 1 bcmdhd, Live 0x00000000
timerirq 3421 1 - Live 0x00000000
mpu3050 46139 3 - Live 0x00000000
ufsd 373931 0 - Live 0x00000000 (P)
...

So wie es verstehe müsste ich doch das Modul fehlerfrei geladen haben?!?

Ich habe jetzt versucht einfach mit dem mount Befehl ein Verzeichnis meiner NAS zu mounten.

Code:
...
root@android:/system/lib/modules # cd /
root@android:/ #
root@android:/ # [B]mount -t cifs -o user=admin,password=geheim //192.168.178.20/Multimedia /sdcard/cifs/Multimedia
mount: mounting //192.168.178.20/Multimedia on /sdcard/cifs/Multimedia failed: No such file or directory
255[/B]
root@android:/ #
root@android:/ # [B]ls -l /sdcard/cifs
total 9
drwxrwxr-x    2 root     sdcard_r      4096 Dec 27 21:33 Multimedia[/B]
root@android:/ # 
root@android:/ # 
...

Leider bekomme ich die Fehlermeldung "No such file or directory"! Aber das Verzeichnis existiert!

Ich habe den mount Befehl auch auf meinem PC ausprobiert und dort funktioniert er (Verzeichnis habe ich angepasst).

Code:
...
enero99@pc02 ~ $ [B]sudo mount -t cifs -o user=admin,password=geheim //192.168.178.20/Multimedia /mnt/NAS01/Multimedia
[sudo] password for enero99: [/B]
enero99@pc02 ~ $ 
...

Wie erwartet ohne Probleme das Verzeichnis "Multimedia" eingebunden.

Was kann ich machen?
Wer hat einen Tipp?

apropos
Ich bekomme auch die selbe Fehlermeldung, wenn ich auf dem Tablet die App CifsManager verwende.

Gruß und Dank für jede Rückmeldung.
enero99
 
Hi

darf dein Tablet auch auf dein NAS zugreifen?? Nicht das du dort eine Firewall laufen hast die das Tablet aussperrt.

MfG
 
Das-Ich schrieb:
Hi

darf dein Tablet auch auf dein NAS zugreifen?? Nicht das du dort eine Firewall laufen hast die das Tablet aussperrt.

MfG

Das Tablet und die NAS befinden sich im selben lokalen Netz. Eine Firewall ist nirgends installiert.

Gruß und Dank für den Tipp.
enero99
 
Hi

hast du die Möglichkeit Logs auszuwerten auf deinem NAS, wer wann zum Beispiel Zugriff hatte. Geht erstmal nur darum ob eine Verbindung überhaupt zustande kommt.

Was du auch noch versuchen kannst, mal unter media auf deinem Tablet zu mounten, vielleicht lässt fat32 einfach kein mounten in ein Verzeichniss zu.

MfG
 
Der Fehler könnte auch daran liegen, das md4 nicht mit in dein Kernel kompiliert ist. Schau in deinem Quellcode Verzeichnis in den Ordner Crypto, ob er dir die md4.ko erstellt hat, wenn ja mal aufs Gerät kopieren und vor dem cifs.ko laden.
Wenn das Modul nicht vorhanden ist, muss du es erstellen, müsste im Kernel Menü unter Cryptographic API sein (wenn ein * dran ist, dann ist es direkt ins Kernel kompiliert und der Fehler liegt nicht daran). dann wie oben im letzten Teil beschrieben mit dem letzten Befehl nur die Module kompilieren. du kannst auch alternativ
Code:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- CONFIG_CRYPTO_MD4=m
ausführen, dann brauchst du zuvor auch nicht nochmal ins Menü.
Die beiden Befehle funktionieren jedoch nur dann, wenn du zwischen zeitlich dein Build Verzeichnis nicht bereinigt hast (clean), sollte das der Fall sein muss du den Kernel auch noch mal neu erstellen.

Ansonsten direkt nach den insmod Befehlen mal dmesg im Terminal aufrufen, in der Ausgabe dann mal suchen ob was mit <3> am Anfang steht, das sind Error Meldungen des Kernel.
 
Das-Ich schrieb:
Hi

hast du die Möglichkeit Logs auszuwerten auf deinem NAS, wer wann zum Beispiel Zugriff hatte. Geht erstmal nur darum ob eine Verbindung überhaupt zustande kommt.

Was du auch noch versuchen kannst, mal unter media auf deinem Tablet zu mounten, vielleicht lässt fat32 einfach kein mounten in ein Verzeichniss zu.

MfG

Hallo,
anbei die Logs der NAS.
Mein Tablet hat die 192.168.178.23 die ...31 ist meine PC.

Code:
Typ	 Datum	 Uhrzeit	 Benutzer	 Quellen-IP	 Computername	 Verbindungstyp	Genutzte Ressourcen	 Aktion
	2013-01-06	21:12:26	admin	192.168.178.31	---	HTTP	Administration	Login OK
	2013-01-06	21:12:15	admin	192.168.178.31	---	HTTP	Administration	Login OK
	2013-01-06	21:11:39	admin	192.168.178.31	---	HTTP	Administration	Login OK
	2013-01-06	19:34:25	admin	192.168.178.31	192.168.178.31	SAMBA	---	Login OK
	2013-01-06	18:29:03	admin	192.168.178.31	192.168.178.31	SAMBA	---	Login OK
	2013-01-06	18:27:30	admin	192.168.178.31	192.168.178.31	SAMBA	---	Login OK

Auch einmal ein anderes Verzeichnis gewählt.
Code:
~ # 
~ # mount -t cifs -o user=admin,password=geheim //192.168.178.20/Multimedia /mnt/external_sd/Media/Multimedia
mount: mounting //192.168.178.20/Multimedia on /mnt/external_sd/Media/Multimedia failed: No such file or directory
~ # 
~ #

Gruß und Dank für die Tipps
enero99
 
Hi

ich meine ein Verzeichniss unterhalb von /media oder /mnt, auf jedenfall keines das auf der einer SD-Karte liegt. Habs noch nicht versucht, aber es kann sein das vfat kein einbinden/mounten eines anderen Dateisystems zulässt.

MfG
 
perpe schrieb:
Der Fehler könnte auch daran liegen, das md4 nicht mit in dein Kernel kompiliert ist. Schau in deinem Quellcode Verzeichnis in den Ordner Crypto, ob er dir die md4.ko erstellt hat, wenn ja mal aufs Gerät kopieren und vor dem cifs.ko laden.
...

Hallo perpe,
vielen Dank für die Hilfe. Fehler ist jetzt behoben. Es fehlte die md4.ko. Jetzt kann ohne Probleme Verzeichnisse eingebunden werden.

Gruß und Dank im Voraus
enero99
 
Darf ich mal noch kurz eine Frage zum CIFS modul stellen?

Ich habe in meinem Kernel auch das CIFS modul mit reinkompiliert.

Habe dabei aber das Problem, dass ich den NAS-Server per IP-Addresse angeben muss, mit Name funktioniert es leider nicht.

Ist das normal? Oder könnte es sein, dass ich noch einweiteres Modul mit einbinden muss, um eine Namensauflösung aus dem CIFS Modul zu ermöglichen.

Ich arbeite auch mit einem Acer A210 (bzw habe ich die A211 Sourcen Kernel 3.1.10+ für JB genommen).

Grüsse Uwe
 
Für die Namensauflösung ist das Cifs Modul nicht zuständig. Wenn du per Name auf deinen Server zugreifen willst, musst du in der hosts Datei anpassen und dort deinen Server Namen und IP eingeben -> hosts ist zwar für Linux, müsste unter Android jedoch identisch sein.
 
Zuletzt bearbeitet von einem Moderator:
Ich habe aber in meinem Heimnetz einen Name-Server drin (dnsmasq auf DD-WRT). Ein FTP-Client, der Browser (Zugriff auf die Admin-Weboberfläche des NAS) und auch ein Ping von der Kommando-Zeile finden den NAS auch per Name.

Der Hintergrund der Frage ist der, dass ich eigentlich einen DHCP-Server am laufen habe, und daher der NAS eine dynamische IP Addresse zugewiesen bekommen 'könnte' (auch wenn ich zur Zeit so konfiguriert habe, dass er vom DHCP immer die gleiche Addresse bekommt).

Genaugenommen geht es um die Frage, ob das CIFS Modul von mir 'schräg in den Kernel eingebaut' wurde. Wenn es eigentlich in der Lage sien sollte, Namen aufzulösen, muss ich mich noch mal tiefer damit beschäftigen...

Danke Uwe
 
Die Namensauflösung wird normalerweise in die lmhosts Datei eingetragen, hat mit dem Modul selbst nicht viel zu tun. Du kannst im Grunde nur schauen, ob die App, die du nutzt es unterstützt. Alternativ gibt es eben auch den Weg über die hosts Datei.
Ist natürlich nichts für dynamische IPs. Da kannst du es mal über die resolv.conf versuchen. Sie müsste unter /system/etc liegen, wenn nicht vorhanden, anlegen. Dort kannst du dann mehrer nameserver angeben und mit "search" festlegen nach welchen Domainnamen er suchen soll. z.B. so:
Code:
search deineNAS
nameserver x.x.x.x
Bei nameserver gibst du die IP deines Nameserver an, deineNAS mit dem Namen deiner NAS ersetzen, logisch ;)

Obs unter Android fubnktioniert, kann ich dir jedoch nicht mit Sicherheit sagen.


Edit: sehe gerade, ich hatte oben ein wichtiges "nicht" vergessen, das Modul selbst ist nicht für die Namensauflösung zuständig. Nur um noch mal klar zustellen.

Edit 2: Wenn du die resolv.conf neu erstellen muss, dann muss du die Rechte noch richtig setzen entweder mit "chmod 4755 /system/etc/resolv.conf" oder per mit einem Dateimanager auf rw-r–r–
 
Zuletzt bearbeitet von einem Moderator:
Die hier erwähnten Komponenten laufen alle auf dem Tablet:

Ein FTP-Client, der Browser (Zugriff auf die Admin-Weboberfläche des NAS) und auch ein Ping von der Kommando-Zeile finden den NAS auch per Name.

Also das Tablet erkennt schon meinen Nameserver!

Wenn das CIFS-Modul den Namen nicht auflösen kann, dann glaube ich daher nicht, dass das an der Netwerk-Konfiguration des Tablets liegt.

Ich rufe das CIFS-Modul i.a. aus dem Terminal-Emulator mit
Code:
busybox mount -t cifs //xxxx.yyy.zzz.xyz/public /mnt/cifs/public -o username=user,password=xyz
auf, und das Terminal kann den NAS mit
Code:
ping <mynas>.<mydomain>
finden.
Daher denke ich, ich muss mich nochmal genau damit beschäftigen, was ich dabei wohl verbastelt habe.

Mein Frage bezog sich darauf, dass ich mir halt nicht sicher war, ob im CIFS eine Aufruf der Namensauflösung mit drin ist, oder ob das stumpf auf den IP-Addresse geht.

Und das, denke ich, habe ich von Dir so verstanden, dass das CIFS eigentlich die Namen auflösen können müsste.

Danke für Deine Antworten!

Grüsse Uwe
 
Sorry, war mein Fehler. Habe es oben nochmal korrigiert. Meines Wissens, löst das cifs Modul selber den Namen nicht auf. Ich kann mich natürlich auch irren. Unter Linux funktioniert es mit nmbd, es liest die lmhosts Datei ein und löst dann die IP richtig auf, damit dann der Sambazugriff über den Namen funktioniert.
 
Danke für Deine Mühe...

Grüsse Uwe
 

Ähnliche Themen

DerOhneNick
Antworten
3
Aufrufe
1.096
DerOhneNick
DerOhneNick
J
Antworten
1
Aufrufe
1.129
mblaster4711
mblaster4711
F
  • firedaxhill
Antworten
3
Aufrufe
1.559
firedaxhill
F
Zurück
Oben Unten