Зачем это нужно, спросят некоторые, ведь есть файловые менеджеры с поддержкой виндовых шар?
Отвечу — чтобы смотреть сериальчики по Wi-Fi без задержек и с быстрой перемоткой, и слушать музыку папками. Пользователи Linux знают, какая это удобная штука — монтирование всех ресурсов в локальную ФС. И естественно на Андройде тоже можно так сделать. Проблема только в том, что нужен модуль ядра cifs.ko для конкретной прошивки конкретного смартфона. И если его ещё никто не скомпилировал, придётся сделать это самому.
Процесс сборки модулей далее будет описан на примере моего не самого популярного смартфона HTC Wildfire S.
Девайс с прошивкой 2.13 имеет ядро 2.6.35.10-ga66971c (последняя часть номера версии тоже важна, далее станет ясно почему), и не так много свободной внутренней памяти как хотелось бы.
Данный способ не является догмой, и возможно существуют и более правильные и простые решения данного вопроса.
Всё, что написано далее, вы делаете на свой страх и риск!
Что понадобится
0) Телефон должен быть root'ован, хотя бы временно!
Способ для HTC. Точно работает для WFS, прежде чем делать на другой модели, читайте соответствующий топик.
Обязательно эмулятор терминала, рекомендую BTEP.
1) Исходники "ванильного" ядра с kernel.org, например 2.6.35.10
ИЛИ, что естественно более предпочтительно, исходники ядра именно вашей прошивки (если вы знаете, где их взять). Тут я пишу именно про официальное ядро.
2) Файл .config с конфигурацией сборки вашего ядра. Извлекается из смартфона, для HTC так:
zcat /proc/config.gz > /mnt/sdcard/.config |
3) Toolchain. Таким странным словом называется кросс-компилятор, которым и собирают всякие полезные штуки для процессоров ARM на обычных i386 компах с линуксом.
Есть сайт gnuarm.com, откуда можно скачать кучу архивов с исходниками и собрать всё самому по очереди, а также мне попалось несколько архивов с готовыми бинарниками. Загуглить не составляет труда.
Но оказывается (для Ubuntu 10.10 и выше) есть способ лучше — всего лишь
sudo apt-get build-dep linux && sudo apt-get install g++-4.5-arm-linux-gnueabi |
Сборка
1) Нужно определить несколько переменных для корректной работы toolchain'а:
export ARCH="arm" export CROSS_COMPILE="/usr/bin/arm-linux-gnueabi-" export EXTRAVERSION=".10-ga66971c" # vermagic ядра, у меня эта переменная не работала export CFLAGS="-march=armv6" # ВАЖНО: архитектура проца, подробнее ниже export CXXFLAGS="${CFLAGS}" |
Опция -march=armv6
указана для примера, выбирайте архитектуру своего процессора (узнать можно по cat /proc/cpuinfo), ещё есть опция -mtune=
для выбора модели процессора, что указывать для своего я не узнал, поэтому пропустил её.
Все варианты смотрите в arm-linux-gnueabi-gcc --target-help
2) Сейчас вы должны находиться в директории с уже распакованным ядром, и там же должен быть файл .config. Далее все пути будут относительные.
По команде
make menuconfig |
запустится конфигуратор сборки ядра. Найдите в меню File systems ---> Network File Systems
и Native language support
и кнопкой M установите следующие опции:
<M> CIFS support (advanced network filesystem, SMBFS successor) <M> NLS UTF-8 |
Под CIFS support
есть группа дополнительных опций, с которыми можно поэкспериментировать, я их включать не стал.
Выбор NLS UTF-8
добавляет модуль nls_utf8.ko, который необходим для корректного отображения имен файлов с кириллицей на Windows-серверах.
Выйдите кнопкой Esc и сохраните .config
Теперь измените в нём опцию CONFIG_DEBUG_INFO
на:
CONFIG_DEBUG_INFO=n |
что позволяет исключить отладочную информацию и очень сократить размер файла.
3) Собственно сборка модулей запускается так:
make EXTRAVERSION=.10-ga66971c modules |
Строка EXTRAVERSION=.10-ga66971c
очень важна, только так получается полное соответствие версии ядра и собираемого модуля.
Опция modprobe -f, которая позволяет это игнорировать и загрузить модуль принудительно, на андройде не работает.
Не забудьте исправить на свою! Тут указывается не только буквенно-цифровая часть в конце (что и называется vermagic), но и последнее число основного номера.
По идее это можно было бы указать через переменные (см. выше), но у меня заработало только так.
Иначе при загрузке модуля вы получите ошибку
insmod: can't insert 'cifs.ko': invalid module format |
Если всё собралось успешно, проверить версию можно так:
modinfo ./fs/cifs/cifs.ko modinfo ./fs/nls/nls_utf8.ko |
Хранение и загрузка модулей
Куда положить получившиеся модули тоже важно.
Если у вас есть постоянный root с записью в /system, то:
su mkdir -p /system/lib/modules/$(uname -r)/ cp *.ko /system/lib/modules/$(uname -r)/ chown root:root /system/lib/modules/$(uname -r)/*.ko chmod 644 /system/lib/modules/$(uname -r)/*.ko |
Если доступа на запись в /system нет, модули можно положить в /lib/modules/$(uname -r), но эта папка удалится после перезагрузки телефона!
Только если модули лежат в названных выше местах, работает команда modprobe!
Поэтому я предпочитаю хранить сами файлы *.ko на SD в /mnt/sdcard/cifs/modules/$(uname -r), а в /lib сделать симлинк.
Теперь можно попробовать загрузить модули (кстати, выгрузить получается только через modprobe):
insmod nls_utf8.ko insmod cifs.ko |
Если ошибок не было, и модуль cifs.ko загрузился (проверить можно командой lsmod), то переходите к чтению подраздела "Монтирование".
Но, скорее всего произойдет ошибка, и в выводе dmesg будет примерно следующее:
cifs: Unknown symbol slow_work_enqueue |
то необходимо собрать ещё и модуль slow-work.ko.
Сборка slow-work.ko
Как я понял, этот модуль необходим не на всех телефонах, поэтому сначала лучше попытаться без него.
Откройте файл fs/cifs/Makefile и добавьте следующее, не забыв оставить пустую строку в конце:
15 16 | obj-$(CONFIG_CIFS) += cifs.o ../../kernel/slow-work.o |
Можно пересобрать только сifs.ko
make clean make EXTRAVERSION=.10-ga66971c M=fs/cifs |
Но теперь должен появиться файл kernel/slow-work.ko, который надо грузить через insmod/modprobe ПЕРВЫМ, до cifs.ko.
Скопировав в телефон эти два модуля и попытавшись загрузить, я столкнулся ещё с одной ошибкой:
slow_work: Unknown symbol round_jiffies (err 0) |
Помогло закомментировать в файле kernel/slow-work.c строки содержащие Этого делать не нужно. Подробности смотрите ниже.round_jiffies
:
669 670 | /*mod_timer(&slow_work_cull_timer,
round_jiffies(jiffies + SLOW_WORK_CULL_TIMEOUT));*/ |
810 811 | /*mod_timer(&slow_work_oom_timer/
round_jiffies(jiffies + SLOW_WORK_OOM_TIMEOUT));*/ |
После этого все модули скомпилировались и загрузились в телефоне нормально.
Если у вас возникли другие ошибки, то попробуйте их загуглить.
Монтирование
Само монтирование происходит точно так же, как во всех линуксах, вопрос в том, куда монтировать:
можно в /mnt/cifs/share, но лишние директории после перезагрузки девайса могут тоже пропасть (не пробовал), поэтому я монтирую прямо на SD-карту, что, кстати, ещё и облегчает открытие шар файловыми менеджерами.
Монтирование/размонтирование:
mount -t cifs -o rw,iocharset=utf8,username=USER,password=PASS,file_mode=0777,dir_mode=0777 //192.168.1.1/share /mnt/sdcard/cifs/share umount /mnt/sdcard/cifs/share # только по точке монтирования, по имени ресурса не работает |
Естественно существуют и более графические способы, без консоли. Но об этом, а так же о том, как немого упростить процедуру загрузки .ko — в следующий раз.
Модули для HTC Wildfire S (прошивка 2.13)
Собственно, результат всех трудов:
Или тоже самое в теме на 4PDA (необходима регистрация).
Тема посвящена приложению для монтирования шар, есть подробный мануал.
Архив для 2.13 перезалит, но модули не тестировались. Файлы на 4PDA могут быть устаревшие!
Но почему-то возникают проблемы с записью на шары через ES Проводник, через Root Explorer или терминал все нормально. Помогает mount -o remount. Вряд ли это проблемы модуля, т.к. тогда бы не работало во всех приложениях. Надо попробовать ещё раз пересобрать с другими опциями.
А на сегодня всё)
Добавлены модули для Wildfire S 2.26 (ядро 2.6.35.10-g696f19b), спооб сборки изменён. Предыдущий архив также обновлён.
Теперь используется ядро с HTCDev, и опции CIFS:
<M> CIFS support (advanced network filesystem, SMBFS successor) [ ] CIFS statistics [*] Support legacy servers which use weaker LANMAN security [*] CIFS extended attributes [*] CIFS POSIX Extensions [ ] Enable additional CIFS debugging routines [*] CIFS Experimental Features (EXPERIMENTAL) |
Вместо комментирования кода теперь из файла kernel/timer.c в kernel/slow-work.c скопированы функции round_jiffies_common
и round_jiffies
.
Добавлять нужно ДО функции slow_work_cull_thread
, т.е. в строку 663:
663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 | static unsigned long round_jiffies_common(unsigned long j, int cpu, bool force_up) { int rem; unsigned long original = j; j += cpu * 3; rem = j % HZ; if (rem < HZ/4 && !force_up) j = j - rem; else j = j - rem + HZ; j -= cpu * 3; if (j <= jiffies) return original; return j; } unsigned long round_jiffies(unsigned long j) { return round_jiffies_common(j, raw_smp_processor_id(), false); } |
За этот способ спасибо USer13 и его посту.
Иногда возникающие глюки с записью в шары, описанные выше, теперь устранены.
Модули для HTC Wildfire S (прошивка 2.26)
Тот же архив на 4PDA.
Что касается музыки, для Android есть DAAP плеер. DAAP сервером можно использовать FireFly Media Server
OCTAGRAM, это типа UPnP сервера/плеера? пробовал что-то подобное – музыку играет норм, а видео только mp4, да и то тормозит.
в любом случае, держать лишний сервер, когда на винде всегда запущена самба, считаю излишним.
не встречал плееров под андройд с поддержкой плейлистов m3u? вот это было бы реально полезно. а то даже Winamp не умеет