Как заставить устройство монтироваться как хранилище для массовых коммуникаций (MMS), а не протокол передачи мультимедиа (MTP)?

Я использую различные Sony Walkmans для записи множества коротких аудиодиотов на ходу (во время бега, плавания или просто пешком или сесть на автобус).

Я использовал для монтирования каждого устройства в качестве хранилища для мультимедиа (MMS) в /media/$USER/WALKMAN/ под Linux и для перемещения аудиодиотов (в /media/WALKMAN/Record/Voice ) на мой жесткий диск с помощью скрипта , который подготавливает специальный заказ для обработки, переименовывая папки, содержащие аудиодиоты.

Начиная с обновления до нового ядра linux несколько месяцев назад, walkmans распознаются как устройства протокола передачи данных (MTP), а не MMS. Это не только изменяет точку монтирования с /media/$USER/WALKMAN/ на что-то вроде /run/user/1003/gvfs/mtp:host=%5Busb%3A002%2C007%5D/Storage Media , но скрипты (или shell ) не может получить доступ к этому новому местоположению: с тех пор я вернулся к переходу и переименованию папок аудиодиотов «с помощью мыши».

Даже с использованием известных интерфейсов MTP (например, PyMTP в Python, mtpfs) происходит сбой, поскольку устройство уже было установлено при его вставке. Многие другие пользователи жаловались на MTP для своего устройства Android. Переход от MMS к MTP в значительной степени оправдан для устройств Android, поскольку они предоставляют доступ к своим файлам с помощью монтажной машины, я не считаю это оправданным для устройств Walkman. В этом случае протокол MMS проще и быстрее (и был установлен по умолчанию до последнего обновления ядра).


Заметки

  1. Если я понимаю преимущество установки файловой системы активных устройств, таких как сотовые телефоны в качестве MTP, я бы предположил, что режим MMS будет сохранен для других устройств (поэтому я предполагаю, что я пропустил точку?).
  2. Мне удастся перепрограммировать мой скрипт с помощью библиотеки pymtp: я спрашиваю здесь, если есть более простое решение. Я хотел бы, чтобы более простое решение существовало не только из лености, но и потому, что оно побуждало бы других программировать и персонализировать свою рабочую среду?
  3. Перекомпиляция ядра может дать ссылку на решение, но я был бы удивлен, если бы это было проще всего.
  4. Настройка правила UDEV (с соответствующими сценариями) должна была решить проблему в соответствии с этим и этими сообщениями, но кажется, что устройство даже не установлено, когда оно распознается как mtp (ни gparted, ни gnome-диски не показывают его даже один раз видимый в файловом менеджере) 🙁
  5. Я думал, что usbmount решит мою проблему, но опять же я думаю, что walkman не обнаружен как USB-ключ, а как устройство MTP.
  6. Моя проблема НЕ с изменением точки монтирования: я нашел новую точку монтирования в /run/user/1003/gvfs/mtp:host=*/Storage\ Media/ . Проблема в том, что простой cp или mv в оболочке из этого места на мой жесткий диск не работает: копирование (или перемещение) папки или отдельных файлов не поддерживается:

     cp -r /run/user/1003/gvfs/mtp:host=*/Storage\ Media/Record/Voice ~/Unison/Boxes/MyBoxes/AudioNotesToProcess/2014-12-28-09-17 cp: cannot open '/run/user/1003/gvfs/mtp:host=%5Busb%3A002%2C016%5D/Storage Media/Record/Voice/VR0001.WAV' for reading: Operation not supported cp: cannot open '/run/user/1003/gvfs/mtp:host=%5Busb%3A002%2C016%5D/Storage Media/Record/Voice/VR0002.WAV' for reading: Operation not supported 

    `

  7. Выход dmesg после вставки устройства:

     [ 217.097691] usb 2-1: new high-speed USB device number 6 using xhci_hcd [ 217.114176] usb 2-1: New USB device found, idVendor=054c, idProduct=059a [ 217.114186] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=8 [ 217.114192] usb 2-1: Product: WALKMAN [ 217.114197] usb 2-1: Manufacturer: SONY [ 217.114201] usb 2-1: SerialNumber: 0E4A0C57283357 [ 217.134426] usb-storage 2-1:1.0: USB Mass Storage device detected [ 217.134471] scsi4 : usb-storage 2-1:1.0 [ 217.134551] usbcore: registered new interface driver usb-storage 
  8. Выход «mount» не изменяется между до и после установки устройства. Это выглядит так:

     mount /dev/sda7 on / type ext4 (rw,errors=remount-ro) proc on /proc type proc (rw,noexec,nosuid,nodev) sysfs on /sys type sysfs (rw,noexec,nosuid,nodev) none on /sys/fs/cgroup type tmpfs (rw) none on /sys/fs/fuse/connections type fusectl (rw) none on /sys/kernel/debug type debugfs (rw) none on /sys/kernel/security type securityfs (rw) udev on /dev type devtmpfs (rw,mode=0755) devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620) tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755) none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880) none on /run/shm type tmpfs (rw,nosuid,nodev) none on /run/user type tmpfs (rw,noexec,nosuid,nodev,size=104857600,mode=0755) none on /sys/fs/pstore type pstore (rw) binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,noexec,nosuid,nodev) systemd on /sys/fs/cgroup/systemd type cgroup (rw,noexec,nosuid,nodev,none,name=systemd) gvfsd-fuse on /run/user/1003/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,user=jbarbay) 

Не нашли способ сделать изменения постоянными, но, по крайней мере, есть способ вручную изменить драйверы :

Например, с моим соным плеером:

  • Подключите его и узнайте его идентификатор поставщика и продукта с помощью lsusb :

     # lsusb Bus 001 Device 003: ID 0402:7675 ALi Corp. Bus 001 Device 025: ID 054c:04be Sony Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub ... 

    -> так в этом случае: 054c 04be .

  • Переключите его в usb_storage с помощью:

     # mtp_switch 054c 04be 

Он должен быть установлен автоматически (по крайней мере, по ubuntu)


Сценарий mtp_switch :

 #!/bin/bash usage() { echo "Usage: mtp_switch vendor_id product_id" echo " switch usb device driver from mtp to usb storage." exit 1 } [ $# = "2" ] || usage vendor="$1" product="$2" die() { echo "$@" exit 1 } find_bus_id() { cd /sys/bus/usb/devices/ for f in *:* ; do if grep -qi "^usb:v${vendor}p${product}" "$f/modalias" 2>/dev/null; then echo $f return fi done } driver() { readlink "/sys/bus/usb/devices/$bus_id/driver" } bus_id=`find_bus_id` [ -n "$bus_id" ] || die "couldn't find device" driver | grep -q 'usbfs' || die "device's driver is not mtp" cd "/sys/bus/usb/drivers" echo -n "Unbinding mtp driver ..." while driver | grep -q usbfs; do echo -n "$bus_id" > usbfs/unbind sleep 0.5 done echo "" echo -n "$bus_id" > usb-storage/bind echo "Done." 

Я не знаком с устройством, но вот несколько идей:

Может ли usb-modeswitch обрабатывать устройство обратно в режим массового хранения?

Существует несколько файловых систем плавких предохранителей mtp. Возможно, они будут более совместимы, чем gvfs.