Сборка недостающих модулей ядра для платформы 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