Компиляция модуля ядра для android

Есть у меня телефон LG GT540 Optimus. Телефон достаточно продвинутый. Не смотря на все свои недостатки (их не очень много, но они есть), он позволяет сделать очень многое и является отличным помощником за вполне умеренные деньги.

По работе мне часто приходится пользоваться VPN. Кроме прямого назначения, это еще и довольно безопасный способ бродить по интернету, пользуясь различными публичными точками доступа WiFi. Встроенный в Android 2.1 (это ОС на моем телефоне) VPN-клиент к сожалению поддерживает только PPTP и L2TP. Меня это не очень устраивает, т.к. на работе (да и для личных нужд) я в основном пользуюсь OpenVPN. И вот как-раз поддержки именно этой реализации VPN на телефоне нет. В принципе это легко устраняется путем установки соответствующего клиента из Google Play (он же Android Market). Но есть одно «но» — для того, чтобы воспользоваться этим клиентом, необходимо, чтобы в ядре ОС, установленной на телефоне, была поддержка туннельного устройства (tun). Это можно достичь путем загрузки соответствующего модуля (tun.ko). Проблема заключается в том, что в поставке телефонной ОС этого модуля нет. Его можно установить двумя путями: установить соответствующее приложение, которое автоматически установит и загрузит нужный модуль или самостоятельно скомпилировать и установить соответствующий модуль. Я пошел вторым путем, т.к. упомянутое приложение просто не нашло нужный модуль.

Что для этого потребуется:

  1. Сам телефон. На телефоне обязательно должен быть получены права root, т.к. установить скомпилированный модуль не удастся. Я воспользовался  z4root. Есть еще другие способы, но z4root позволяет получить временный root, что для меня является немаловажным достоинством.
  2. Исходный код ядра ОС, установленной на телефоне. Я взял его с официального сайта.
  3. Необходимый набор кросс-компиляторов для того, чтобы собрать нужный модуль. Я взял тот, который был в моем дистрибутиве Linux (я пользуюсь Ubuntu 10.10)
  4. Конфигурационный файл ядра, установленного на телефон. Его можно взять с самого телефона (этот файл находится здесь: /proc/config.gz) или же сгенерировать его самому воспользовавшись подсказкой в README, которая идет в составе исходного кода ядра. Я воспользовался первым вариантом. Нужный файл можно скопировать как с помощью adb так и с помощью ssh-сервера SSHDroid.

Сам процесс сборки выглядит примерно так:

  1. Конфигурируем главный make-файл таким образом, чтобы он нашел нужный компилятор. Это опция CONFIG_CROSSCOMPILE=»arm-linux-gnueabi-«.
  2. Устанавливаем опцию, которая добавит правильную версию в описание модуля(иначе он просто не загрузится). Это можно указать явно с помощью опции CONFIG_LOCAL_VERSION или автоматически, с помощью опции CONFIG_LOCALVERSION_AUTO=y. Я выбрал второй вариант.
  3. Добавляем нужную опцию в конфигурационный файл ядра, чтобы был собран нужный модуль. Это опция CONFIG_TUN=m (буква m указывает на то, чтобы нужный модуль был собран не в составе ядра, а в виде загружаемого модуля).
  4. Собственно собираем модуль: make modules
  5. Получившийся модуль содержится в директории $WORK_DIR/kernel/drivers/net/($WORK_DIR — это директория, куда вы распаковали исходный код ядра). Нужный модуль нужно проверить на соответствие ядру командой strings tun.ko. Если версия ядра совпадает с той, которая показывается с помощью uname -a на вашем телефоне, то все прошло хорошо.

Далее просто помещаем нужный модуль на телефон и загружаем его с помощью  команды insmod tun.ko. Далее настраиваем OpenVPN и пользуемся.

При написании этого руководства я пользовался опытом зарубежных коллег:

  1. http://stevechui.blogspot.com/
  2. http://sshrootat.blogspot.com/
  3. http://android-jotting.blogspot.com/

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.