[Howto] Buildumgebung - Kernelmodule für QNAP bauen

  • [NAS Typ:] NAS TS mit Marvell CPU
    [Firmware:] allgemein
    [Getestet:] ja - TS-419P / FW 3.3.4
    [Sonstige Modifikationen:] keine


    Ab und an benötigt man Treiber (Kernelmodule) die in der aktuellen Firmware von QNAP nicht enthalten sind.


    Diese Anleitung beschreibt einen Weg zum Bauen der fehlenden Module. Konkret für mein TS-419P die Module „usbserial.ko“ und „ftdi-sio.ko“.
    Sie kann aber für alle QNAP NAS mit Marvell CPU mit kleinen Anpassungen angewandt werden.
    Nach dem Download aller notwendigen Tools und Files kann man seine Module innerhalb einer Stunde erstellen.


    Ein paar Dinge sind für „Linuxeinsteiger“ (u.a. für mich ;) ) etwas ausführlicher erklärt.



    1. Entwicklerumgebung


    Ich nutze den VMWARE-Player unter Window und die Buildumgebung "freetz-linux" aus dem "ip-phone-forum"(von "Silent-Tears"abgesegnet :thumb: ).


    VMWARE-Player:
    http://downloads.vmware.com/de…wnloads/vmware_player/3_0
    Beitrag im "ip-phone-forum":
    http://www.ip-phone-forum.de/s…php?p=1400234&postcount=1
    Download "freetz-linux":
    http://sourceforge.net/project…ux-1.1.1.tar.bz2/download
    oder hier:
    http://freetz.falkenhain.info/freetz-linux-1.1.1.tar.bz2


    Nach der Installation der VM (Buildumgebung) diese starten und sich mit User : freetz und passwd: freetz anmelden.
    mit "ifconfig" die akt. IP-Adresse der VM ermitteln.
    Ab hier wird besser über "PUTTY" mit der VM weitergearbeitet. da funzt wenigstens paste & copy! Die VM nun nur im Hintergrund weiter laufen lassen.


    Wer die noch notwendigen Downloads gleich in der VM machen möchte und hinter einem Proxy hängt:
    export http_proxy=http://192.168.1.111:3128 (natürlich mit eurer ProxyIP + Port)


    2. Tools


    Die wichtigsten Hinweise dazu kamen von „TERZ“ -> Toolchain , CodeSourcery, Crosskompilieren :thumb:
    Weitere Hinweise und Infos fand ich in diversen Foren.


    Toolchain (deutsch: Werkzeugkette) ist ein Gesamtbegriff für die Programmierwerkzeuge.
    Benötigt wird immer eine Toolchain, passend für das jeweilige QNAP Nas!


    Welche Toolchain die Entwickler von QNAP nutzen – das sagen sie uns hier:

    Zitat


    here from my 209 with 3.0 beta
    [~] # cat /proc/version
    Linux version 2.6.12.6-arm1 (root@NasARM4) (gcc version 3.4.4 (release) (CodeSourcery ARM 2005q3-2)) #4 Wed Jan 21 04:34:22 CST 2009


    Eine Toolchain von CodeSourcery !! ;)


    Übersicht Toolchain CodeSourcery (arm-none-linux-gnueabi)


    codesourcery 2005q1 toolchain (gcc 3.4.3) bundles glibc 2.3.4, auch zum bauen von optware/cs05q1armel
    http://www.codesourcery.com/sgpp/lite/arm/portal/release286 oder direkt:

    Code
    wget http://www.codesourcery.com/public/gnu_toolchain/arm-none-linux-gnueabi/gnu-csl-arm-2005Q1B-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2


    codesourcery 2005q3 toolchain (gcc 3.4.4) bundles glibc 2.3.6, auch zum bauen von optware/cs05q3armel
    ( 'ARM GNU/Linux' und 'IA32 GNU/Linux' auswählen)
    http://www.codesourcery.com/gn…ins/arm/releases/2005q3-2 oder direkt:

    Code
    wget http://www.codesourcery.com/public/gnu_toolchain/arm-none-linux-gnueabi/arm-2005q3-2-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2


    codesourcery 2007q3 toolchain (gcc 4.2.1) bundles glibc 2.5
    http://www.codesourcery.com/sgpp/lite/arm/portal/release313 oder direkt:

    Code
    wget http://www.codesourcery.com/public/gnu_toolchain/arm-none-linux-gnueabi/arm-2007q3-51-arm-none-linux-gnueabi.bin


    codesourcery 2008q1 toolchain (gcc 4.2.3) bundles glibc 2.5, auch zum bauen von optware/cs08q1armel
    http://www.codesourcery.com/sgpp/lite/arm/portal/release324

    Code
    wget http://www.codesourcery.com/public/gnu_toolchain/arm-none-linux-gnueabi/arm-2008q1-126-arm-none-linux-gnueabi.bin


    NICHT eine Version mit neuere gcc/libc zum Erstellen nutzen, als die in der orginalen Firmware von deinem NAS vorhandene !!


    Mit den folgende Befehle auf Console von deinem QNAP-NAS (Putty) kannst du die Versionen von Linux, "gcc" und "libc" ermitteln:
    cat /proc/version
    strings /lib/libc* | grep GCC | uniq
    strings /lib/libc.so.6 |grep 'GNU C'



    Beispiel: TS-419 FW3.3.4

    Code
    # cat /proc/versionLinux version 2.6.33.2 (root@BuildEnv-00) (gcc version 4.2.1) #1 Sat Oct 16 06:44:11 CST 2010


    auch möglich:

    Code
    # strings /lib/libc* | grep GCC | uniqGCC: (GNU) 4.2.1


    Code
    [~] # strings /lib/libc.so.6 |grep 'GNU C'GNU C Library stable release version 2.5, by Roland McGrath et al.Compiled by GNU CC version 4.2.1.


    4.2.1 und 2.5 =>> Toolchain: codesourcery 2007q3 in der Buildumgebung installieren.
    Linuxversion: 2.6.33.2


    (wichtig!) Eine Installationsanleitung für die Toolchain (getting-started.pdf) findet ihr hier:
    http://www.codesourcery.com/sg…c1162/getting-started.pdf
    neu:
    http://www.codesourcery.com/sg…c7606/getting-started.pdf


    Installation am Beispiel: - (Nicht für Toolchain als *.tar-File!!! -> siehe o.g. Anleitung)

    Code
    /bin/sh ./arm-2007q3-51-arm-none-linux-gnueabi.bin -i console


    Eine kleine Änderung bei der Anleitung kann notwendig sein! (prüfen!)

    Code
    export PATH=$HOME/CodeSourcery/Sourcery_G++/bin:$PATH


    Ändern nach:

    Code
    export PATH=$HOME/CodeSourcery/Sourcery_G++_Lite/bin:$PATH


    Um PATH dauerhaft zu speichern (z.B. nach Neustart der VM):

    Code
    echo 'export PATH=$HOME/CodeSourcery/Sourcery_G++_Lite/bin:$PATH' >> $HOME/.bashrc


    Ob es funzt, das kann man mal nach Neustart überprüfen mit
    "echo $PATH" und “bzwarm-none-linux-gnueabi-g++ -v”


    3. Linuxsource + QNAP GPL Source


    Vorhande Linuxversion auf dem NAS (Beispiel) :

    Code
    # cat /proc/versionLinux version 2.6.33.2 (root@BuildEnv-00) (gcc version 4.2.1) #1 Sat Oct 16 06:44:11 CST 2010


    - download von „kernel.org“ -> Archiv „linux-2.6.33.2.tar.bz2“

    Code
    wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.33.2.tar.bz2


    und auf der Buildumgebung in ein Arbeitsverzeichnis entpackt.

    Code
    tar xjfv linux-2.6.33.2.tar.bz2


    Den z.Z aktuellsten QNAP GPL Source findet man hier:
    http://resources.qnap.com/Stor…P_GPL_3.3_20100629.tar.gz
    oder
    http://files.qnap.com/download…P_GPL_3.3_20100629.tar.gz


    Im Moment braucht man daraus nur das Verzeichniss „kernel_cfg“. In diesem Verzeichniss findet man für den jeweiligen NAS Type und Linuxversion den dazu gehörenden Konfigfile. Dieser File „linux-*.cfg“ wird in das Linuxsource-Verzeichnis der Buildumgebung (hier im Beispiel nach linux-2.6.33.2) kopiert und umbenannt in „ .config “ ! Da es für das TS-419P keinen CFG-File für die Linuxversion 2.6.33.2 gibt einfach den File der aktuellsten, vorhandene Linuxversion benutzen. (z.Z. linux-2.6.30.6-arm.cfg)


    Für die QNAP Nas mit Marvell CPU sind die KonfigFiles unten im Beitrag als Anhang !



    4. Module bauen


    - ein "cd" zum neuen SourceVerzeichnis (linux-2.6.33.2)


    Für QNAP NAS mit Marvell CPU:


    Code
    make ARCH=arm menuconfig


    - „System Type“ auswählen
    - unter „ARM system type“ sollte Marvell Kirkwood (für TS-x10 / TS-x19) stehen!
    (Ts-x09 -> Marvell Orion - aber für die gibt es keine neuere Firmware)
    - unter „Marvell '...' Implementations” dein QNAP Nas auswählen
    - unter „Device Drivers -> USB support ->USB Serial Converter support" die notwendigen Treiber (z.B. FTDI / Pl2303) als Module auswählen -> (M)
    - Konfiguration abspeichern (verlassen)


    Code
    make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- 
    make ARCH=arm modules_install INSTALL_MOD_PATH=$HOME


    Eure neu erstellten Module / Treiber findet ihr nun unterhalb von $HOME/lib !!


    Wenn alles fehlerfrei war, dann die Module von der Buildumgebung zum QNAP – NAS kopieren und mit „insmod“ einbinden.
    ----------------------------


    Da dies hier von einem „Laien“ geschrieben wurde sind Kommentare, Hinweise, Ergänzungen oder andere Formulierungen ausdrücklich erwünscht!!


    vg kasimodo

  • Für eine QNAP TS-239P (Atom) mit 3.3.3er Firmware:


    - Download Ubuntu 7.10 VMware Image (Server, nicht Desktop)
    - Cross-Compile Toolchain nicht notwendig
    - Update /etc/apt/sources.list (von archive. nach old-releases., da nicht mehr offiziell verfügbar)
    - Download von packages für Kernel compile.. (z.B. make, libncurses-dev etc.)
    - Download GPL-TS sources inkl. kernel config (s.o.)
    - Auspacken in z.B. /usr/src/linux-2.6.33.2 (und .config reinkopieren)
    - Modul in .config aktivieren
    - make modules
    - danach auch z.B. make M=drivers/usb/serial möglich zum direkten compile (geht schneller)
    - fertiges Modul (modulname.ko) auf QNAP schieben und laden

  • Hi maxdbox,


    Danke für die Infos! :thumb:


    Hast du dafür auch einen Link? :?:

    Zitat

    - Download Ubuntu 7.10 VMware Image (Server, nicht Desktop)


    Tante Google hat da viele Links - welchen kannst du empfehlen?


    vg kasimodo

  • Hi,


    das Crosscompilen fällt eh weg wenn man etwas für die Atoms kompilieren möchte. Wichtig ist nur, dass man die Architektur hat, die das System fährt. (QNAP nutzt noch i386 anstatt x86_64 oder auch AMD64)


    Ihr könnt es für die Intels genau so machen wie kasimodo es im HowTo beschreibt. Von einer Ubuntu 7.10 würde ich abraten, da diese mit einen alten Kompiler kommt. Alternativ einfach für die Intels Ubuntu (Desktop oder Server) herunterladen / Desktop hat halt 'ne GUI - Server kommt ohne und mit einen auf Server optimierten kernel. Ich würde die Desktop vorziehen. (USB Stick, booten - vom normalen PC oder NAS aus / was halt "mehr dampf hat" / also CPU leistung.


    Aktuell ist GCC 4.4 vorhanden (was reicht) man könnte auch den GCC 4.5 via ppa updaten.
    Anstatt die Pakete einzeln zu ziehen reicht es wenn man darauf die pakete "build-essential" und "kernel-package" installiert (Iss zum kompilieren). QNAP nutzt glaube eh noch nicht die ATOM Flags die es in GCC 4.5 gibt.


    Cross-Compilen muss man nur dann, wenn beispielsweise von x86 auf ARM möchte. Wenn man ein ARM CPU emulieren würde (in QEMU z.B.) und darin ein lauffähiges Linux hätte, so könnte man auch für ARM ohne Crosscompilen kompilieren.


    Also einfach so machen wie oben im HowTo beschrieben und den Crosscompiler wegdenken. ;)


    Grüsse, David

  • Hi,


    you don't need to Crosscompile on i386 architectures.
    Take an ISO from a i386 Linux Distribution and compile it ;)


    Grüsse, David

  • Hi,
    Thanks for quick answer.
    can you be more specific, do I need to follow those steps (install freetz ...).
    What I want to do, is compile some USB webcam drivers for my nas.



    Thanks

  • Webcam Driver aren't easy, because first you must search for a compatible driver 4 linux.
    If you have luck there are available as kernel modules. If not you must search for an alternative driver which works.


    Which Webcam do you have / and which driver you need for it?

  • Hi,
    I've already found some linux drivers here:
    http://ovcam.org/ov511/download.html#2.xx
    For old creative cam - Model no CT6840
    Extern verlinktes Bild entfernt! Der Grund!


    Which version of ubuntu should I get:
    http://mirror.lihnidos.org/ubuntu/ubuntu-releases//

    Code
    cat /proc/version 
    Linux version 2.6.33.2 (root@NasX86-3) (gcc version 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)) #1 SMP Wed Nov 10 03:55:22 CST 2010


    Thanks! :!:

    Einmal editiert, zuletzt von christian () aus folgendem Grund: Extern verlinktes Bild entfernt, siehe Forenregeln!

  • HI,


    the driver is tooo old for it. I think's it does not running on a 2.6 Kernel. The last Version is the Kernel 2.4.
    The easyest way is to test your cam with an real distri like Ubuntu. If it works on a current *nix System the chances are good.... But i don't think so.

  • Ok so I'll just try to install Ubuntu Desktop Edition 10.10 (lattest version) and try to setup cam there.


    EDIT:
    btw, if I search QNAP GPL source, there are some drivers for ov511:


    Could I use those ?

  • Hier aktueller QNAP GPL Source ab FW 3.3.x

    Code
    wget ftp://gpl:download@ftp.qnap.com/gpl/QNAP_GPL_3.3.x_20101126.tar.gz


    Hier aktueller QNAP GPL Source ab FW 3.4.x

    Code
    wget ftp://gpl:download@ftp.qnap.com/gpl/QNAP_GPL_3.4.x_20110218.tar.gz


    FTP Download - QNAP GPL Source
    ftp://gpl:download@ftp.qnap.com/gpl/



    vg kasimodo

  • Hi!


    I am using the current QNAP GPL Source for FW 3.4.x + the included config file for my TS-410P (what oes the P mean?)
    I now get following error message:



    Can someone help me on that?
    Thank's!

  • Hi,


    you are trying to compile the kernel / modules directly on the NAS?
    It's better to use an toolchain like the #1 Post in this Thread.


    Greets, David

  • moin!


    würde mir gern ne buildumgebung für mein ts-219 p II ( hab fw 3.7.3 installiert ) bauen, aber:
    ich schnall nicht, welche toolchain ich dafür brauche! :oops:

    Code
    [~] # strings /lib/libc.so.6 |grep 'GNU C'GNU C Library stable release version 2.5, by Roland McGrath et al.Compiled by GNU CC version 4.2.1.[~] # strings /lib/libc* | grep GCC | uniqGCC: (GNU) 4.2.1[~] # cat /proc/versionLinux version 2.6.33.2 (root@NasX86-10) (gcc version 4.2.1) #1 Wed Aug 1 01:36:0                                                2 CST 2012


    das ist doch ne arm-cpu, oder?!?

    Code
    cat /proc/cpuinfoProcessor       : Feroceon 88F6282 rev 1 (v5l)BogoMIPS        : 1985.74Features        : swp half thumb fastmult edspCPU implementer : 0x56CPU architecture: 5TECPU variant     : 0x2CPU part        : 0x131CPU revision    : 1Hardware        : Feroceon-KW ARMRevision        : 0000Serial          : 0000000000000000


    warum gibt mir uname -a aber nen

    Code
    (root@NasX86-10)


    zurück?
    ist das nu arm oder x86??? :roll:
    kann mir einer weiterhelfen?

  • Zitat von "heini66"

    warum gibt mir uname -a aber nen

    Code
    (root@NasX86-10)


    zurück?

    Dieser Wert gibt dir nur den Benutzer@Rechnername zurück und sagt aus, mit welchem Benutzer der Kernel auf welcher Maschine kompiliert wurde.

  • Hallo
    Habe versucht nach der Anleitung ein Modul cdc-acm.ko zu erstellen.
    Mein NAS TS119 hat folgende Daten:

    Code
    Linux version 2.6.33.2 (root@VMBuildEnv001-450G) (gcc version 4.2.1) #1 Wed Nov  14 18:55:58 CST 2012


    Aber das erstellte Modul antwortet auf insmod:

    Code
    /opt/lib # insmod ./cdc-acm.ko
    insmod: cannot insert `./cdc-acm.ko': Invalid module format (-1): Exec format error


    Ich habe Linux-2.6.33.2 source gezogen dann noch die Toolchain arm-2007q3-51-arm-none-linux-gnueabi.bin installiert.
    Das ganze dann nach Anleitung compiliert...


    Wobei ich sagen muß das ich allerhand Optionen (SCSI u.s.w.) in der config ausknippsen mußte, damit es überhapt compiliert wurde...


    Und nun weiß ich nicht woran ich drehen muß das es funktioniert.
    Weiß es jemand?