LINUX.ORG.RU
ФорумMobile

Монтировать папку как USB?

 , ,


0

1

Приветствую. В твбоксе Ugoos на Android 9 есть встроенный NFS-клиент который монтирует шару как новое USB устройство. Отследил что он монтирует в mnt/media_rw/Share, mnt/media_rw/runtime/default/Share, mnt/media_rw/runtime/read/Share, mnt/media_rw/runtime/write/Share, а так же в storage/Share. В dev/block/vold добавляется disk:nfs И в итоге это новое USB устройство видно во всех плеерах. Но проблема в том, что он монтирует только одну шару, а в сети их четыре. Как можно это повторить скриптом init.d вписав туда опции монтирования для всех шар?



Последнее исправление: fishb0nd (всего исправлений: 1)

встроенный NFS-клиент который монтирует шару

как «шару» // неожиданно, да? )

Почему ты решил, что это «новое USB устройство» мне непонятно. Впрочем, это не суть.

Скорее всего «официально» точка монтирования storage/Share. Все остальные «точки» отражают «внутренности» устройства ФС «тамошнего» Android-а. Читать из них, вероятно, вполне безопасно. А вот на счёт записи… могут быть «варианты».

Как можно это повторить скриптом init.d вписав туда опции монтирования для всех шар?

Повторить, я думаю не проблема. Правда, если TV-бокс сам игнорирует все шары, кроме одной…могут быть "варианты".

в итоге это новое USB устройство видно во всех плеерах

Другие плееры не имеют встроенных NFS-клиентов? Ты бы «раскрыл» свои возможности на этом TV-боксе. Я вот не понимаю, что там позволено пользователю. К примеру:

  • переименовать storage/Share в storage/Share_1;
  • подключить новую шару;
  • ?профит…

Извини, я не силён в андроидах (

master_0K
()
Ответ на: комментарий от master_0K

Почему ты решил, что это «новое USB устройство» мне непонятно

Опишу более развернуто: В настройках NFS клиента всего три пункта для заполнения:

  1. IP адрес NFS сервера (в моем случае 192.168.1.4)
  2. Общая папка на сервере (в моем случае /NAS)
  3. Локальное название, тут произвольно (в моем случае Share)

После заполнения нажимаю запуск и в системе появляется новое виртуальное USB устройство с примонтированной nfs-шарой с именем Share которое видят все приложения.

Другие плееры не имеют встроенных NFS-клиентов

нет, но это и не важно.

ок, смотрю в терминале лог монтирования:

cat /proc/mounts | grep /storage/Share

получаю ответ:

/mnt/media_rw/Share /storage/Share sdcardfs rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=1015,mask=6 0 0

ок, тогда:

cat /proc/mounts | grep /mnt/media_rw/Share

в ответ:

192.168.1.4:/NAS /mnt/media_rw/Share nfs rw,relatime,vers=3,rsize=32768,wsize=32768,namlen=255,hard,nolock,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.1.4,mountvers=3,mountproto=tcp,local_lock=all,addr=192.168.1.4 0 0 /mnt/media_rw/Share /mnt/runtime/default/Share sdcardfs rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=1015,mask=6 0 0 /mnt/media_rw/Share /mnt/runtime/read/Share sdcardfs rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=9997,mask=23 0 0 /mnt/media_rw/Share /mnt/runtime/write/Share sdcardfs rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=9997,mask=7 0 0 /mnt/media_rw/Share /storage/Share sdcardfs rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=1015,mask=6 0 0

Ну тут все ясно, по этим логам я составил свой скрипт монтирования, все монтируется, но! /storage/Share видна только под root, а в общем пространстве ее не видно. И вот теперь мне нужен недостающий кусок кода чтобы /storage/Share монтировалась как новое виртуальное устройство (не важно как USB или SD или Disk) в общем пространстве имен.

Ты бы «раскрыл» свои возможности на этом TV-боксе. Я вот не понимаю, что там позволено пользователю.

Позволено все, полный root

fishb0nd
() автор топика
Ответ на: комментарий от fishb0nd

Начну с замечаний. «Крупные» вставки делаются так:

  • в начале строки ставишь подряд три символа `
  • с новой строки вставляешь свою «копипасту»
  • переходишь на новую строку и ставишь снова подряд три символа `
  • и на всякий «контрольный случай» жмешь кнопку «Предпросмотр» – вдруг что-то пошло не так ;

Будет что-то вроде:

92.168.1.4:/NAS /mnt/media_rw/Share nfs rw,relatime,vers=3,rsize=32768,wsize=32768,namlen=255,hard,nolock,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.1.4,mountvers=3,mountproto=tcp,local_lock=all,addr=192.168.1.4 0 0 
/mnt/media_rw/Share /mnt/runtime/default/Share sdcardfs rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=1015,mask=6 0 0
/mnt/media_rw/Share /mnt/runtime/read/Share sdcardfs rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=9997,mask=23 0 0
/mnt/media_rw/Share /mnt/runtime/write/Share sdcardfs rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=9997,mask=7 0 0
/mnt/media_rw/Share /storage/Share sdcardfs rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=1015,mask=6 0 0

по этим логам я составил свой скрипт монтирования, все монтируется

Надо было скрипт показать.

/storage/Share видна только под root, а в общем пространстве ее не видно. И вот теперь мне нужен недостающий кусок кода чтобы /storage/Share монтировалась как новое виртуальное устройство (не важно как USB или SD или Disk) в общем пространстве имен.

Эту самую /storage/Share создаёшь ты/твой скрипт или андроид? Там возможно только права/владельца надо поправить. Но лучше скрипт показывай.

master_0K
()
Ответ на: комментарий от master_0K

Начну с замечаний. «Крупные» вставки делаются так

Спасибо, принято

Эту самую /storage/Share создаёшь ты/твой скрипт или андроид?

Это создает Android при монтирование своим встроенным NFS-клиентом, что видно из логов выше, но у меня не получается это повторить своим скриптом монтирования в /storage/Share, но другим скриптом я монтирую шару в /sdcard/Share которая появляется во внутреннем общем накопители /storage/emulated/0/Share и видна всем программам

#!/system/bin/sh
su
busybox mkdir -p /mnt/media_rw/Share /sdcard/Share
busybox mount -o nolock,rw,soft,vers=3,context=u:object_r:sdcardfs:s0 -t nfs 192.168.1.4:/NAS /mnt/media_rw/Share
busybox mount -t sdcardfs -o nosuid,nodev,noexec,noatime,mask=6,gid=1015 /mnt/media_rw/Share /mnt/runtime/default/emulated/0/Share
busybox mount -t sdcardfs -o nosuid,nodev,noexec,noatime,mask=23,gid=9997 /mnt/media_rw/Share /mnt/runtime/read/emulated/0/Share
busybox mount -t sdcardfs -o nosuid,nodev,noexec,noatime,mask=7,gid=9997 /mnt/media_rw/Share /mnt/runtime/write/Share

Но хотелось бы повторить ручное монтирование шары как новое устройство (по аналогии с встроенным NFS-клиентом). Может есть способ как подробно отследить что происходит в системе во время отработки встроенного NFS-клиента, какие папки создаются, с какими разрешениями, куда, что и как монтируется, с какими правами/ключами итд? Так то проще будет составить свой скрипт.

fishb0nd
() автор топика
Ответ на: комментарий от fishb0nd

не получается это повторить своим скриптом монтирования в /storage/Share

Поправь меня, если я понял неверно:

  • твой скрипт пытается монтировать следующий хост в ту же точку монтирования, с которой «только что» работал штатный NFS-клиент
  • при выполнении того* скрипта никаких явных сообщений об ошибках нет

Может есть способ как подробно отследить что происходит в системе во время отработки встроенного NFS-клиента, какие папки создаются, с какими разрешениями, куда, что и как монтируется, с какими правами/ключами

звучит как новое задание для режима отладки через ADB (но я могу и ошибаться)

От себя могу предложить следующее:

  • не пользоваться штатным NFS-клиентом
  • создать своим скриптом каталог /storage/Share
  • создать в нём подкаталоги host_0, host_1, … host_100500
  • монтировать шары в точках монтирования /storage/Share/host_0, /storage/Share/host_1, … /storage/Share/host_100500 самописным скриптом. Тут возможны варианты: соль в том, что каждая шара монтируется в свою точку монтирования.
  • профит?

Почти, наверняка, можно извернуться и подключить все шары в одну точку монтирования (я так пониманию «план такой» был?), но вот побочных эффектов я ожидаю прямо-таки лавину. Опять же: такое я не практикую.

master_0K
()
Ответ на: комментарий от master_0K

Поправь меня, если я понял неверно:
твой скрипт пытается монтировать следующий хост в ту же точку монтирования, с которой «только что» работал штатный NFS-клиент

Я штатный клиент не запускаю, работаю только со своим скриптом

создать своим скриптом каталог /storage/Share
создать в нём подкаталоги host_0, host_1, … host_100500
монтировать шары в точках монтирования /storage/Share/host_0, /storage/Share/host_1, … /storage/Share/host_100500 самописным скриптом

Да это все понятно, я практически так и делаю, вопрос в другом, как создать новый диск и примонтировать туда шару, как это делает штатный клиент?

звучит как новое задание для режима отладки через ADB

Так и есть, вот что показывает adb logcat при включении и отключении штатного клиента


3208  3268 V vold    : /vendor/xbin/busybox
3554  3554 V SettingsProvider: Notifying for 0: content://settings/system/nfs_enable
3697  3697 D StorageNotification: Notifying about public volume: VolumeInfo{public:NFSCLIENT}:
3697  3697 D StorageNotification:     type=PUBLIC diskId=disk:nfs partGuid= mountFlags=0 mountUserId=0
3697  3697 D StorageNotification:     state=UNMOUNTED
3697  3697 D StorageNotification:     fsType=null fsUuid=null fsLabel=null
3697  3697 D StorageNotification:     path=null internalPath=null
3208  3268 V vold    :     mount
3208  3268 V vold    :     -o
3208  3268 V vold    :     nolock,rw,hard,intr,vers=3
3208  3268 V vold    :     -t
03208  3268 V vold    :     nfs
3208  3268 V vold    :     192.168.1.4:/NAS
3208  3268 V vold    :     /mnt/media_rw/Share
3697  3697 D StorageNotification: Notifying about public volume: VolumeInfo{public:NFSCLIENT}:
3697  3697 D StorageNotification:     type=PUBLIC diskId=disk:nfs partGuid= mountFlags=0 mountUserId=0
3697  3697 D StorageNotification:     state=CHECKING
3697  3697 D StorageNotification:     fsType=null fsUuid=null fsLabel=null
3697  3697 D StorageNotification:     path=null internalPath=null
12848 12848 I busybox : type=1400 audit(0.0:10643): avc: denied { create } for scontext=u:r:vold:s0 tcontext=u:r:vold:s0 tclass=tcp_socket permissive=1
3208  3268 V vold    : Waiting for FUSE to spin up...
12850 12850 W sdcard  : Device explicitly enabled sdcardfs
3554  3568 W android.os.Debug: failed to get memory consumption info: -1
12131 12131 D ExternalStorage: After updating volumes, found 4 active roots
3697  3697 D StorageNotification: Notifying about public volume: VolumeInfo{public:NFSCLIENT}:
3697  3697 D StorageNotification:     type=PUBLIC diskId=disk:nfs partGuid= mountFlags=0 mountUserId=0
3697  3697 D StorageNotification:     state=CHECKING
3697  3697 D StorageNotification:     fsType=null fsUuid=null fsLabel=null
3697  3697 D StorageNotification:     path=null internalPath=null
13026 13026 I busybox : type=1400 audit(0.0:10942): avc: denied { getattr } for path="/vendor/xbin/busybox" dev="mmcblk0p16" ino=733 scontext=u:r:vold:s0 tcontext=u:object_r:vendor_file:s0 tclass=file permissive=1
672   672 I RenderThread: type=1400 audit(0.0:10943): avc: denied { ioctl } for path="/dev/mali0" dev="tmpfs" ino=5240 ioctlcmd=0x800f scontext=u:r:zygote:s0 tcontext=u:object_r:gpu_device:s0 tclass=chr_file permissive=1
3208  3268 V vold    : Waiting for FUSE to spin up...
13033 13033 W sdcard  : Device explicitly enabled sdcardfs
3554  3568 W android.os.Debug: failed to get memory consumption info: -1
3697  3697 D StorageNotification: Notifying about public volume: VolumeInfo{public:NFSCLIENT}:
3697  3697 D StorageNotification:     type=PUBLIC diskId=disk:nfs partGuid= mountFlags=0 mountUserId=0
3697  3697 D StorageNotification:     state=MOUNTED
3697  3697 D StorageNotification:     fsType=nfs fsUuid=nfs fsLabel=Share
3697  3697 D StorageNotification:     path=/storage/Share internalPath=/mnt/media_rw/Share
12131 12131 D ExternalStorage: After updating volumes, found 4 active roots
3554  3569 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.DROPBOX_ENTRY_ADDED flg=0x10 (has extras) } to com.google.android.gms/.stats.service.DropBoxEntryAddedReceiver
3554  3569 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.DROPBOX_ENTRY_ADDED flg=0x10 (has extras) } to com.google.android.gms/.chimera.GmsIntentOperationService$PersistentTrustedReceiver
12131 12131 D ExternalStorage: After updating volumes, found 4 active roots
3756  3756 D BoundBrokerSvc: onBind: Intent { act=com.google.android.gms.udc.service.START cmp=com.google.android.gms/.chimera.PersistentApiService }
3756  3756 D BoundBrokerSvc: Loading bound service for intent: Intent { act=com.google.android.gms.udc.service.START cmp=com.google.android.gms/.chimera.PersistentApiService }
3756  4748 W afai    : Empty content. Thus might mean that the settings are not synced down.
3756  6256 W afai    : Empty content. Thus might mean that the settings are not synced down.
3697  3697 D StorageNotification: Notifying about public volume: VolumeInfo{public:NFSCLIENT}:
3697  3697 D StorageNotification:     type=PUBLIC diskId=disk:nfs partGuid= mountFlags=0 mountUserId=0
3697  3697 D StorageNotification:     state=EJECTING
3697  3697 D StorageNotification:     fsType=nfs fsUuid=nfs fsLabel=Share
3697  3697 D StorageNotification:     path=/storage/Share internalPath=/mnt/media_rw/Share
12131 12131 D ExternalStorage: After updating volumes, found 3 active roots
3737  3737 I UEventObserver: type=1400 audit(0.0:10975): avc: denied { read } for scontext=u:r:zygote:s0 tcontext=u:r:zygote:s0 tclass=netlink_kobject_uevent_socket permissive=1
3697  3697 D StorageNotification: Notifying about public volume: VolumeInfo{public:NFSCLIENT}:
3697  3697 D StorageNotification:     type=PUBLIC diskId=disk:nfs partGuid= mountFlags=0 mountUserId=0
3697  3697 D StorageNotification:     state=UNMOUNTED
3697  3697 D StorageNotification:     fsType=nfs fsUuid=nfs fsLabel=Share
3697  3697 D StorageNotification:     path=/storage/Share internalPath=/mnt/media_rw/Share
3554  3554 V SettingsProvider: Notifying for 0: content://settings/system/nfs_enable
3697  3697 D StorageNotification: Notifying about public volume: VolumeInfo{public:NFSCLIENT}:
3697  3697 D StorageNotification:     type=PUBLIC diskId=disk:nfs partGuid= mountFlags=0 mountUserId=0
3697  3697 D StorageNotification:     state=REMOVED
3697  3697 D StorageNotification:     fsType=nfs fsUuid=nfs fsLabel=Share
3697  3697 D StorageNotification:     path=/storage/Share internalPath=/mnt/media_rw/Share

как создается diskId=disk:nfs вот в чем вся загвоздка. Мне главное понять как своим скриптом создать такой диск, а как туда уже что то примонтировать я разберусь :)

fishb0nd
() автор топика
Ответ на: комментарий от fishb0nd

На мой взгляд, создается diskId=disk:nfs в /vendor/xbin/busybox по команде mount -o nolock,rw,hard,intr,vers=3 -t nfs 192.168.1.4:/NAS /mnt/media_rw/Share

3208  3268 V vold    : /vendor/xbin/busybox
...
3208  3268 V vold    :     mount
3208  3268 V vold    :     -o
3208  3268 V vold    :     nolock,rw,hard,intr,vers=3
3208  3268 V vold    :     -t
03208  3268 V vold    :     nfs
3208  3268 V vold    :     192.168.1.4:/NAS
3208  3268 V vold    :     /mnt/media_rw/Share
...

Вот это: криво вставилось или что-то другое?

3208  3268 V vold    :     -t
03208  3268 V vold    :     nfs
master_0K
()
Последнее исправление: master_0K (всего исправлений: 1)
Ответ на: комментарий от master_0K

На мой взгляд, создается diskId=disk:nfs в …

Ну в ручном монтировании это получается как папка, видимая с содержанием шар под root, ну ни как как диск.
При монтировании встроенным клиентом в /dev/block/vold появляется disk:nfs с шарой, как disk:179,128 внутренняя память и disk:179,129 sd карта

Вот это: криво вставилось или что-то другое?

Похоже что то при копировании лишнее залетело

fishb0nd
() автор топика
Ответ на: комментарий от fishb0nd

Значит встроенный клиент не просто «морда». Надо либо его раскладывать на «атомы», либо искать ему аналог без ограничений. Логи при «ручном» монтировании выглядят также?

master_0K
()
Ответ на: комментарий от master_0K

Значит встроенный клиент не просто «морда»

Да это мне и самому понятно :)

Надо либо его раскладывать на «атомы»

Ну для этого у меня познаний маловато :(

Логи при «ручном» монтировании выглядят также?

Нет конечно, мой скрипт только монтирует шары в папку, а внутренний клиент еще создает виртуальную USB и туда уже монтирует шары. Апеллируя к vold и fstab, чего и я хочу добиться но не знаю как.

fishb0nd
() автор топика
Ответ на: комментарий от fishb0nd

Поспешил я. Команда монтирования делает только, то что и должна. Устройство USB, видимо, посредством vold создается позже (в логе ещё FUSE упоминается). Не уверен, что в андроид через интерфейс командной строки возможно это провернуть (я в устройстве андроида не разбираюсь).

master_0K
()