Mastodon

Shumaher’s_Blog@AlexZ.me

— yet another stupid personal weblog

Как монтировать сетевые диски Windows в Android

Зачем это нужно, спросят некоторые, ведь есть файловые менеджеры с поддержкой виндовых шар?
Отвечу — чтобы смотреть сериальчики по 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)

Собственно, результат всех трудов:

{filelink=3}


Или тоже самое в теме на 4PDA (необходима регистрация).
Тема посвящена приложению для монтирования шар, есть подробный мануал.

Архив для 2.13 перезалит, но модули не тестировались. Файлы на 4PDA могут быть устаревшие!

Но почему-то возникают проблемы с записью на шары через ES Проводник, через Root Explorer или терминал все нормально. Помогает mount -o remount. Вряд ли это проблемы модуля, т.к. тогда бы не работало во всех приложениях. Надо попробовать ещё раз пересобрать с другими опциями.

А на сегодня всё)


UPD 05.06.2012, 16:42:

Добавлены модули для 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)

{filelink=2}

Тот же архив на 4PDA.

VN:F [1.9.17_1161]
Rating: 0.0/5 (0 votes cast)

2 комментариев »

  1. Что касается музыки, для Android есть DAAP плеер. DAAP сервером можно использовать FireFly Media Server

    VA:F [1.9.17_1161]
    Rating: 0.0/5 (0 votes cast)
    Reply to this commentReply
  2. OCTAGRAM, это типа UPnP сервера/плеера? пробовал что-то подобное – музыку играет норм, а видео только mp4, да и то тормозит.
    в любом случае, держать лишний сервер, когда на винде всегда запущена самба, считаю излишним.
    не встречал плееров под андройд с поддержкой плейлистов m3u? вот это было бы реально полезно. а то даже Winamp не умеет

    VN:F [1.9.17_1161]
    Rating: 0.0/5 (0 votes cast)
    Reply to this commentReply
Оставьте свой комментарий




OpenID WordPress.com Yahoo

Это не спам.