Нашел время, доработал это извращение. Наглядный пример зачем в современном мобильнике 4 ядра и 2GB RAM. Собственно, на скриншоте ajenti, который торчит из моего старого UMI X2 с разбитым экраном. Так как экран на ладан дышит, а новый экран стоит как новый аппарат, я взял другой телефон, а этот приспособил на чердаке на даче для раздачи интернета.
На борту стоковый android (ядро тоже родное) с root'ом, из которого вычищено все, что только можно, включая google play services. Из софта только smanager, который запускает при загрузке аппарата скрипт, который запускает debian в chroot'е и дергает chroot окружение каждый раз, когда меняется состояние мобильной сети.
В chroot'е живет OpenVPN, stunnel, squid, iptables со стопкой правил, ssh, ajenti и самописная прога, умеющая отдавать фотку по запросу, а так же куча скриптов всех цветов и расцветок. (Ходили слухи, что будет и на нашей улице DPI, решил превентивно разобраться с stunnel. На практике дает много оверхеда).
Так как интернет на даче через мобильную сеть, прямого IP нет, приходится держать OpenVPN до VPS'ки с включенной компрессией, чтобы можно было удаленно наблюдать за курочками^W^W^W администрировать дачную сетку.
Помимо OpenVPN стоит squid с прозрачным редиректом всего траффика через него и жирным кешем на быструю 32GB SD карточку.
Родной «tethering» не используется. Вместо этого скрипт запуска chroot окружения делает вот так:
echo 0 > /sys/class/android_usb/android0/enable
echo rndis,adb > /sys/class/android_usb/android0/functions
А уже debian'овский chroot получает IP штатными средствами. Воткнут телефон в OpenWRT роутер. Изначально, все было на нем, но связка OpenVPN+stunnel оказалась очень жручей до CPU и сжирала 600Mhz MIPS уже на 5-6 мегабитах, если не меньше. Здесь такого боттлнека нет. Да и сеть телефон держит ВНЕЗАПНО лучше 3g модема.
Изначально оверхед от OpenVPN по tcp был где-то 60%, после долгих мытарств, увеличения TCP окна и добавления в конфиг волшебных строк
tun-mtu 1500
mtu-disc yes
txqueuelen 15000
Все стало намного лучше, оверхед стал где-то 20-30%. Пинг без OpenVPN был 80-100ms, с OpenVPN - 150-200ms. TCP_NODELAY в разных местах stunnel уменьшает время пинга, но здорово увеличивает оверхед, потому не используется
Все расписывать будет очень долго, потому отмечу самые нетривиальные хаки:
1. При выключенном экране телефон находится в easrlysuspend (ЕМНИП) и никогда не будет включать вторичные ядра, даже если на 100% загрузить доступное ядро. Потому в настройках девелопмента надо выставить «не гасить экран при подключенном кабеле». Экран он гасить не будет, и в earlysuspend уходить не будет. Сам же экран я гашу в стремном keepalive скрипте, который по крону запускается каждую минуту:
#!/bin/bash
N=`route -n|grep tun0|wc -l`
if [ "$N" -eq "0" ]; then
route del 127.0.0.1
route add 127.0.0.1 dev lo
mkdir /dev/net
ln -sf /dev/tun /dev/net/tun
/etc/init.d/stunnel4 restart
/etc/init.d/openvpn restart
fi
echo 0 > /sys/devices/platform/leds-mt65xx/leds/lcd-backlight/brightness
2. Каждое изменение состояния сети android убивает все маршруты и заполняет таблицу заново, потому помимо крона этот же keepalive вызывается и smanager'ом
3. Напряжение батарейки, температуру батарейки и температуру SoC'а можно прочитать в /sys. Так как у меня медиатек - ajenti это не подхватывает, приходится читать ручками:
Температура батарейки: /sys/devices/platform/mt6320-battery/power_supply/battery/batt_temp
Напруга на батарейке: /sys/devices/platform/mt6320-battery/power_supply/battery/batt_vol
Напруга проводе воткнутом в телефон: /sys/devices/platform/mt6320-battery/power_supply/battery/ChargerVoltage
Ну и
/sys/devices/virtual/thermal/thermal_zone{0,1,2,3}/temp
Для чтения температуры самого SoC'а.
3. usb0 добавлен у меня в br-lan на роутере, вместе с остальнымим портами, для br-lan интерфейса является маршрутом по умолчанию. Хитровыдолбанную настройку DNS и маршрутизации расписывать не буду, лень.
4. На скорость крайне положительно влияет нижеследующее заклинание, немного меняющее настройки буферов для TCP и прочего:
echo "0" > /proc/sys/net/ipv4/tcp_timestamps
echo "1" > /proc/sys/net/ipv4/tcp_tw_reuse
echo "1" > /proc/sys/net/ipv4/tcp_sack
echo "1" > /proc/sys/net/ipv4/tcp_tw_recycle
echo "1" > /proc/sys/net/ipv4/tcp_window_scaling
echo "5" > /proc/sys/net/ipv4/tcp_keepalive_probes
echo "30" > /proc/sys/net/ipv4/tcp_keepalive_intvl
echo "30" > /proc/sys/net/ipv4/tcp_fin_timeout
echo "404480" > /proc/sys/net/core/wmem_max
echo "404480" > /proc/sys/net/core/rmem_max
echo "256960" > /proc/sys/net/core/rmem_default
echo "256960" > /proc/sys/net/core/wmem_default
echo "4096,16384,404480" > /proc/sys/net/ipv4/tcp_wmem
echo "4096,87380,404480" > /proc/sys/net/ipv4/tcp_rmem
5. OpenVPN не оживет по дефолту, так как /dev/net/tun в андроеде виден как /dev/tun. решается парой строчек:
mkdir /dev/net
ln -sf /dev/tun /dev/net/tun
Лучше запихнуть в keepalive - раз в сутки оно куда-то пропадало у меня.
Задавайте свои вопросы. Все вышеуказанное было настроено за один вечер под действием отборного кофеина, советы экспертов по тонкой настройке OpenVPN на 3g канале приветствуются. ;)
>>> Просмотр
(1920x1080,
136 Kb)