Новости из Блогов Сборка недостающих модулей ядра для платформы Android

Discussion in 'Мировые новости. Обсуждения.' started by Suicide, 27 Aug 2012.

  1. Suicide

    Suicide Super Moderator
    Staff Member

    Joined:
    24 Apr 2009
    Messages:
    2,373
    Likes Received:
    6,619
    Reputations:
    693
    Сборка недостающих модулей ядра для платформы Android


    Давненько мне хотелось попробовать себя в сборке модулей ядра для моего телефона на базе Android. Вчера мне потребовался OpenVPN, но для его работы нужен модуль tun/tap, который отсутствует в моей прошивке. Поискав по маркету я нашел приложение TUN.ko Installer, которое позволяет установить модуль нужной вам версии, если такой есть в репозитории проекта. Но поскольку спать еще не хотелось, и простых решения я не искал, то было решено собрать модуль самостоятельно.

    Для начала я посмотрел версию ядра, которая используется в моем телефоне.
    Code:
    $ adb shell uname -r
    2.6.32.9-perf
    Затем скачал из телефона конфигурацию текущего ядра.
    Code:
    $ adb pull /proc/config.gz u8500-config.gz
     157 KB/s (12577 bytes in 0.078s)
    Дольше всего пришлось искать исходники нужного мне ядра. Если кому-то нужна ссылка на архив с исходниками, то вот она.
    Code:
    $ wget -q https://github.com/SaNek011/kernel_huawei_u8500/tarball/master -O SaNek011-kernel_huawei_u8500-0117a91.tar.gz
    Теперь нужно установить toolchain для компиляции под кросскомпиляции под платформу ARM. Такой нашелся на одном из сайтов проекта Linaro. Скачиваем нужный toolchain
    Code:
    $ wget -q http://snapshots.linaro.org/android/~linaro-android/toolchain-4.7-2012.05/1/android-toolchain-eabi-linaro-4.7-2012.05-1-2012-05-18_15-49-28-linux-x86.tar.bz2
    И устанавливаем его
    Code:
    $ tar xf android-toolchain-eabi-linaro-4.7-2012.05-1-2012-05-18_15-49-28-linux-x86.tar.bz2
    $ export PATH=$PATH:/home/andrey/android-toolchain-eabi/bin
    Для работы menuconfig я установил пакет libncurses5-dev.
    Code:
    $ sudo aptitude install -y libncurses5-dev
    Далее готовим ядро к компиляции
    Code:
    $ tar xf SaNek011-kernel_huawei_u8500-0117a91.tar.gz
    $ cd SaNek011-kernel_huawei_u8500-0117a91/
    $ mkdir build
    $ gzip -dc ~/u8500-config.gz > build/.config
    $ make silentoldconfig prepare headers_install scripts ARCH=arm CROSS_COMPILE=arm-eabi- O=build KERNELRELEASE=2.6.32.9-perf
    На этом этапе важно правильно указать значение переменной KERNELRELEASE, иначе модуль не загрузится. После окончания подготовки я включил в menuconfig нужный мне модуль ("Device Drivers" / "Network device support" / <m> "Universal TUN/TAP device driver support")
    Code:
    $ make menuconfig ARCH=arm CROSS_COMPILE=arm-eabi- O=build KERNELRELEASE=2.6.32.9-perf
    И собрал нужный мне модуль
    Code:
    $ make modules ARCH=arm CROSS_COMPILE=arm-eabi- O=build KERNELRELEASE=2.6.32.9-perf
    Собранный модуль находится в /home/andrey/SaNek011-kernel_huawei_u8500-0117a91/build/drivers/net/tun.ko. Загрузим его в телефон
    Code:
    $ adb push /home/andrey/SaNek011-kernel_huawei_u8500-0117a91/build/drivers/net/tun.ko /sdcard/
    Затем, получив права root, установим модуль в /system/lib/modules
    Code:
    $ adb shell
    adb$ su
    adb# mount -o remount,rw -t yaffs2 /dev/block/mtdblock4 /system
    adb# mkdir /system/lib/modules
    adb# mv /sdcard/tun.ko /system/lib/modules
    adb# chown 0 /system/lib/modules/tun.ko
    adb# chgrp 0 /system/lib/modules/tun.ko
    adb# chmod 644 /system/lib/modules/tun.ko
    adb# mount -o remount,ro -t yaffs2 /dev/mtdblock4 /system
    
    Теперь пробуем загрузить модуль
    Code:
    adb# insmod /system/lib/modules/tun.ko
    adb$ lsmod | grep tun
    tun 11051 0 - Live 0xbf000000
    adb$ ls -l /dev/tun
    crw-r----- vpn      vpn       10, 200 2012-08-24 11:16 tun
    Теперь порядок - можно ставить OpenVPN.

    Автор: Andrey Tataranovich
    24 августа 2012 г.
    http://blog.tataranovich.com/2012/08/android.html