Добавляем поддержку монтирования Windows шар в Android
Купил недавно себе планшет Samsung Galaxy Tab Pro 10.1 LTE SM-T525 и захотелось дома смотреть на нём фильмы и другие файлы с моего сетевого диска, расшаренного через samba. Для этого в ядре должна быть поддержка CIFS и не только… в андроиде начиная с версии 4.2 это оказалось нетривиальной задачей.
1. Суть проблемы с пользовательскими монтированиями
Дело в том, что с версии 4.2 в Adnroid ввели многопользовательский режим и вместе с ним все файловые системы теперь монтируются как Slave, это приводит к тому, что файловая система смонтированная одним пользователем, не видна другим пользователям.
В виртуальной машине Dalvik андроида с версии 4.2 в файле vm/Init.cpp есть такой код:
Этот код монтирует рутовую файловую систему с флагами MS_SLAVE и MS_REC, это означает что файловые системы, смонтированные внутри / будут также монтироваться по умолчанию с флагом MS_SLAVE и доступны только пользователям их смонтировавшим и их дочерним процессам. Для решения этой проблемы, пользователем mkasick с xda-developers был предложен следующий патч для ядра в функции do_mount:
Суть патча в том, что мы перехватываем вызов do_mount для / с флагами MS_SVALE и MS_REC и не даём их установить. Но для работы андроида эти флаги необходимы для пользовательских файловых систем в /storage, иначе система у меня просто не грузится. Поэтому мы вызываем do_mount(NULL, (char *)storage, NULL, (MS_SLAVE | MS_REC), NULL)) == 0). Чтобы последний вызов работал, /storage должна быть точкой монтирования, а не просто директорией, поэтому в файле init.rc в рамдиске, где происходит создание директории /storage необходимо туда смонтировать tmpfs
После этих манипуляций, точки монтирования за пределами /storage будут видны всем пользователям.
Для начала необходимо добавить поддержку CIFS в Linux ядро. Это можно сделать двумя способами: скомпилировать модуль для ядра cifs, либо добавить поддержку cifs в само ядро. Первый способ лучше, т.к. не надо будет прошивать новое ядро и терять гарантию на некоторых аппаратах.
Ядро моего планшета оказалось собрано без поддержки модулей, так что мне пришлось пересобирать и прошивать новое ядро:
Для сборки ядра необходимо:
а) Машина на Linux
б) Исходники ядра для вашего девайса, для Самсунга берём здесь opensource.samsung.com
в) Toolchain для сборки, берём тут developer.android.com/tools/sdk/ndk/index.html
Для сборки ядра создаём директорию
/android, и распаковываем внутри неё исходники ядра в директорию kernel, android-ndk в android-ndk-r9
Теперь применяем патч для исправления проблемы с пустыми точками монтирования
Далее необходимо прописать переменные окружения и подготовить конфигурационный файл ядра, для моего самсунга это делается так:
Данная команда создаст файл .config, далее необходимо выполнить команду make menuconfig и перейти в раздел File Systems -> Network File Systems и отметить пункт CIFS support (в случае сборки модуля, необходимо отметить буквой M) и отмечаем RESTRICT_ROOTFS_SLAVE в разделе File Systems
Далее выходим клавишей Esc и сохраняем конфигурацию. Теперь собираем ядро командой make -j3 (вместо цифры 3 указываем количество ядер процессора+1)
На этом сборка ядра окончена.
3. Сборка boot.img для прошивки
Теперь необходимо прошить новое ядро в планшет. Для этого необходимо собрать образ boot.img в который входит ядро, ramdisk и device tree для чипов Qualcomm.
Для начала нам надо получить родной ramdisk, для этого распаковываем оригинальную прошивку (это обычный tar) и достаём оттуда файл boot.img
Для распаковки boot.img понадобится пакет bootimg_tools
Скачиваем его в
/android, и распаковываем командой split_boot файл boot.img
и получаем распакованный ramdisk в директории boot/ramdisk
Теперь необходимо поправить пару файлов в рамдиске для перевода Selinux в permissive mode и для монтирования /storage как tmpfs
В файле init.rc ищем строчку setsebool debugfs 1 и заменяем её на
Далее ищем строку setprop selinux.reload_policy 1 и меняем её на setprop selinux.reload_policy 0
Для монтирования /storage как tmpfs ищем строчку mkdir /storage 0751 root sdcard_r и после неё добавляем
Также в файле defaul.prop меняем ro.secure=1 на ro.secure=0 и ro.adb.secure=1 на ro.adb.secure=0
Теперь собираем ramdisk назад
Далее для сборки нам ещё необходим файл dt.img, он генерируется утилитой dtbTool которая идёт в комплекте с ядром
Теперь, когда есть всё необходимое для сборки boot.img, начинаем саму сборку при помощи утилиты mkbootimg (поставляется так же с ядром)
Всё, файл boot.img готов. Для прошивки его через Odin, делаем из него boot.tar.md5
Теперь прошиваем его через Odin
На Samsung есть проблема, что с катомным ядром перестаёт работать wifi, лечится это правкой файла build.prop на рабочей системе. Необходимо заменить строчку ro.securestorage.support=true на ro.securestorage.support=false
4. Настройка ПО для монтирования
Для монтирования шар будем использовать программу CifsManager
Тут есть несколько нюансов в настройке:
а) В cifs на ядре 3.4 что-то поломали, и теперь он не обрабатывает параметр device команды mount, т.е. конструкция вида
mount -t cifs //pc/share /mnt больше не работает, монтируемую шару необходимо указывать в параметре unc, т.е. предыдущая команда будет выглядеть так:
б) Теперь про точку монтирования. Как писалось выше, если мы будем монтировать внутри /storage, то такая шара будет пустая для других приложений, если же монтировать куда-то вне /storage, то большинство приложений её не смогут открыть, т.к. позволяют открывать файлы только внутри карты памяти. Выход есть. Внутренняя память /storage/emulated/0 на самом деле лежит в /data/media/0, а /storage/emulated/0 — это эмуляция fat32 для этой директории. Так что мы смело можем можем монтировать например в /data/media/0/cifs и увидим нашу шару в фйловом менеджере в internal storage.
в) Есть ещё нигде не описанный нюанс, команда mount -t cifs почему то игнорирует параметры, идущие после password, например в команде
параметр sec=ntlmssp не будет обработан. Поэтому, если для подключения к шаре необходим пароль, то в CifsManager поле Password оставляем пустым, а пароль пишем в поле Options в самый конец, как на скриншоте выше.
г) Для корректной работы с русскими буквами в именах файлов, необходимо добавить опцию iocharset=utf8
Теперь монтируем шару в CifsManager и наслаждаемся!
Источник
Android монтирование сетевого диска
Подробнее про сетевую папку, пожалуйста. К примеру, какой протокол должен быть задействован (SMB/CIFS, WebDAV, SFTP и т.д.), т.е. что за устройство предоставляет Вам доступ к этой сетевой папке. Судя по вашему сообщению ниже, у меня есть некоторые сомнения, что Вам необходим именно sshfs.
В CM13 безусловно есть FUSE и проверить Вы это можете, запустив эмулятор терминала (встроенный в CM ‘Settings>Developer options>Local terminal’ или к примеру, Terminal Emulator for Android) и дав команду: cat /proc/filesystems
А вот SSHFS, это приблизительно то, что описал выше посетитель kaztost, или потрудитесь ознакомиться с текстом хотя бы вот здесь SSHFS — Википедия. Написано «сухо», но доступно.
И да, «вроде андройд это линукс» — это всё-таки так далеко от реальности, но очень оптимистично. 😉
Сообщение отредактировал rlsd — 02.12.16, 10:44
BiBoy, скорей всего у вас обычная сетевая шара SMB/CIFS. Ее тоже можно монтировать, но нужен cifs в ядре или в отдельном модуле cifs.ko. Ну и обоина под это есть. А если хотите, чтобы именно по sshfs, выясните, есть ли на вашем NAS-е ssh-сервер, как туда заходить, и работает ли там sftp.
Сообщение отредактировал kaztost — 02.12.16, 11:03
BiBoy, без рута никак. smb при правильной настройке работает быстрее, чем sshfs. Инструкции — надо минимально освоить линуксовый терминал. Например, здесь. Ну и начать лучше с обычного линукс на ПК или виртуальной машине, в андроиде есть некоторые отличия, там же можете освоить работу с sshfs. Без знания терминала вы будете ограничены функционалом этих обоин, SSHFSAndroid или EasySSHFS. Внутри этих обоин в /data/data лежат бинарники которые можно запускать вручную в терминале с нужными опциями.
Сообщение отредактировал kaztost — 02.12.16, 15:35
Источник
Android монтирование сетевого диска
Для функционирования программы необходимы права root пользователя.
Краткое описание:
Монтирование и использование сетевых ресурсов локально.
Описание:
Программа написана для монтирования и использования сетевых ресурсов на девайсе(локально) (к примеру: просмотр видео без ошибки «не поддерживается потоковая передача»)
необходимо : root
ядро с поддержкой CIFS (cifs.ko)
Android >= 1.6
нашёл программку на просторах ресурса XDA,
уже доступна в маркете.
для поддержки кириллицы в опциях надо ввести iocharset=utf8 но работает это тлько с ядрами с поддержкой utf8
у Wildmonk’s есть ядра с поддержкой UTF8 (кириллицы) (если не ошибся — только для Nexus one)
В версии 1.5 есть возможность загрузки нескольких модулей (указывать через двоеточие), пример:
/system/lib/modules/nls_utf8.ko:/system/lib/modules/cifs.ko
То есть возможно загружать сначала русские буквы, а потом сеть.
Перед тем как задавать вопрос — поищите по теме свой девайс!
ming39
Что-бы получить права полные, с удалением файлов, в свойствах через запятую пишем file_mode=0777
Кто с другими девайсами знаете где нарыть ядра с поддержкой UTF8 — пишите. прикреплю 😉
Пишите в ветке мануалы и давайте ссылки на сырцы. будет время — добавлю в шапку. (если сдублируете сообщение в личку — супер,быстрее перекину в шапку
При добавлении шары в cifsmanager вводим путь к шаре, точку монтирования (лучше в /sdcard/cifs/), в поле options пишем «iocharset=utf8» без кавычек. Если шара доступна в сети (с других машин) без ввода логина/пароля — имя пользователя guest, пароль пустой. Иначе нужно ввести данные учетной записи для этой шары.
Если не получается получить доступ к шаре на win-системе (при монтировании возникает ошибка mount permission denied) — копать в сторону включения учетной записи гостя, для висты и 7ки в центре управления сетями и общим доступом отключить общий доступ с парольной защитой.
Есть у меня на ZTE Blade от Билайна (E400) уже имелась папка /system/lib/modules/, но, как оказалось, в ней нужно создать папку 2.6.32.9-perf
затем, я сее для удобства создал файлик для автоматического запуска некоторых команд для подготовки файлов:
Затем, делаем скрипт исполняемым и запускаем:
Если Всё в порядке, то сначала просто выведется несколько пустых строчек, а затем ещё несколько непустых, в которых, если модули в порядке, будет:
Скачать файлы модулей: ZTE_Blade__ZTE_V9__kernel_2.6.32.9_perf___cifs__slow_work__tun__nls_utf8_.ko_mod
ules.rar
Ах, да, чуть не забыл.
В CIFSManager выставляем в опциях все галки, а в пункте Path to cifs.ko[:modpath]*
пишем:
Создаём шару и в опциях пишем (пример для виндовых шар):
И ещё совет. Кто пользует XP и какого-то безпарольного пользователя, имеющего доступ к расшаренному ресурсу, чтобы шара открывалась без пароля, только с именем пользователя, лезем в Пуск/Настройки/Панель управления/Администрирование/Локальные политики безопасности. Или Пуск/Выполнить и пишем: secpol.msc
Там ищем Параметры безопасности/Локальные политики/Параметры безопасности и в списке справа почти в конце пункт «Учетные записи: ограничить использование пустых паролей только для консольного входа», дважды щелкаем мышкой и выбираем Отключить и затем жмём «Ок».
У меня Galaxy S (rooted)
2.1 ECLAIR.XWJM7
Kernel 2.6.29 [email protected] #2
Cifsmanager всегда пишет «no such device». Перепробовал все версии cifs.ko, какие только есть.
Сегодня смог подключить сетевую шару с помощью adb.
cifs.ko у меня находится на sdcard в /sdcard/cifs/cifs.ko.
Cifs.ko пришлось загрузить через adb:
После этого Cifsmanager без вопросов примонтировал шару.
[quote name=»Святитель Киприц» date=»18.09.2010, 10:09″ post=5222961]Плохой новостью стало, что те файлы, которые имеют в названии кирилицу, мало того, что вопросительными знаками отображаются, так они еще и не открываются программами.
Решилось: закинул nls_utf8.ko в ту же папку, где у меня валяется cifs.ko и прописал в опциях как сказано здесь:
Всё заработало, русские буквы видны и все запускается!
Its works!
Прикрепил файлы, которые я использовал, может кому пригодятся: cifs.ko и nls_utf8.ko.
Cifs.zip
сначала обязательно нужно загрузить slow-work.ko, только потом сifs.ko
например
insmod slow-work.ko
insmod cifs.ko
поддержка utf8 уже есть в ядре, так что с опцией iocharset=utf8 русские имена папок и файлов показываются нормальноFroyo.zip
проверил на прошивке JPO — работает на ура.
HTC Wildfire S версия ядра 2.6.35.10-ga66971c
(zombierzn)Cifs.ko для Wildfire с версией ядра 2.6.29-6fb59e13 (WildPuzzleROM v7.1).
В архиве 2 файла (cifs.ko и nls_utf8.ko). Второй нужен для того чтоб русские файлы нормально отображались. Файлы надо положить в /system/lib/modules/.
Так и не понял как сделать в программе чтоб инициализировался не только cifs.ko но и nls_utf8.ko, поэтому делал в GScript.
Для монтирования:
,iocharset=utf8 -t cifs
— пароль, удаленная шара (напр. \\192.168.1.2\share), — папка на коммуникаторе (напр. \sdcard\share).
где — смонтированная папка на коммуникаторе.
При создании скриптов в GScript надо поставить галку «Needs SU?».
В GScript можно вынести ярлыки скриптов на рабочий стол и получится едва ли не удобнее чем в программе этой.
Надеюсь кому нибудь пригодится:)
buzz_2.6.29_6fb59e13.zip
Добавлю: Вполне вероятно что прога не умеет правильно находить куда впихнуть модуль или не корректно обращяется к busybox и команде insmod. поэтому можно пользоваться выше описанным способом,либо 1 раз через ADB или тот-же Gscript\ASE выполнить «insmod».
по поводу
Я новичок в андроиде. Сделал так. Зашел на форум xda и ввел поиском cifs desire. Там была тема http://forum.xda-developers.com/showthread.php?p=7713599 сравнил номер ядра, мой! Скопировать в system/lib/modules не получилось какая-то засада как с подменой hosts, даже с рутом не дает это сделать. Ну фиг с ним. Создал на карте папку /sdcard/cifs/ и кинул туда cifs.ko, дальше просто, в настройках программы выбираем load via insmod и указываем путь к cifs.ko.
— там в архиве был еще какой-то nls с utf-8, что такое не понял, думаю для поддержки кириллицы в путях, но как использовать не понятно.
— тут на форуме еще была ссылка на cifs моего ядра от официальной 2.2 я его не тестил, поскольку все и так работает.
Немного добавлю.
собрано для ядра 2.6.32.15 и немного не догнал что за значения arm-eabi-4.4.0 — может это на Десайре что обозначает?
как использовать:
качаем cifs_bravo_stockfroyo.zip ( 108.82 КБ )
далее входим в Рекавери(?) (Десайра не имею — не могу нормально обьяснить что это значит)
далее в программе при настройке шары,в последнем пунктике вводим iocharset=utf8
в принципе должно работать. кто с Десайром попробуйте и отпишитесь.
1) Во первых надо найти модули cifs.ko, nls_utf8.ko для версии ядра вашего девайса.
Ищем по шапке темы, на xda-developers.com. Если непонятно для какой версии найденные модули, ищем внутри них строчку «vermagic=». Если полное соответствие — ура, если совпадает только числовая часть (например у вас 2.6.32.15-xxxxxxxx, а найдена 2.6.32.15-yyyyyyyy) — hex-редактором правим в каждом ko файле yyyyyyyy на xxxxxxxx. Если нет и таких, можно попробовать поискать для других устройств с тем же типом процессора.
2) копируем модули на флешку в /sdcard/cifs
3) через терминал (я использовал встроенный в SUFBS) задаем правильные права файлам
su
chmod 644 /sdcard/cifs/*.ko
Подготовка закончена.
Через терминал и su загружаем модули:
insmod /sdcard/cifs/cifs.ko
insmod /sdcard/cifs/nls_utf8.ko
Эти команды надо будет делать после каждой перезагрузки устройства. Чтобы не писать их терминале каждый раз, поставил GScript Lite и оформил в виде скрипта. Как вариант, можно грузить их автоматически через modprobe.
Теперь можно запускать cifsmanager и настраивать шары.
При добавлении шары в cifsmanager вводим путь к шаре, точку монтирования (лучше в /sdcard/cifs/), в поле options пишем «iocharset=utf8» без кавычек. Если шара доступна в сети (с других машин) без ввода логина/пароля — имя пользователя guest, пароль пустой. Иначе нужно ввести данные учетной записи для этой шары.
Если не получается получить доступ к шаре на win-системе (при монтировании возникает ошибка mount permission denied) — копать в сторону включения учетной записи гостя, для висты и 7ки в центре управления сетями и общим доступом отключить общий доступ с парольной защитой.
Источник