Como forçar um dispositivo a ser montado como MMS (Mass Media Storage) em vez de MTP (Media Transfer Protocol)?

7

Eu uso vários Sony Walkmans para gravar uma infinidade de audionotes curtos em movimento (enquanto correndo, nadar, ou simplesmente caminhar ou pegar o ônibus).

Eu usei para montar cada dispositivo como um MMS (Mass Media Storage) para /media/$USER/WALKMAN/ sob o linux e para mover os audionotes (em /media/WALKMAN/Record/Voice ) para meu disco rígido através de um script, que prepara uma ordem especial para processamento renomeando as pastas que contêm os audionotes.

Desde a atualização para o novo kernel do linux há alguns meses, os walkmans são reconhecidos como dispositivos MTP (Media Transfer Protocol) em vez de MMS. Isso não apenas altera o ponto de montagem de /media/$USER/WALKMAN/ para algo como /run/user/1003/gvfs/mtp:host=%5Busb%3A002%2C007%5D/Storage Media , mas os scripts (nem shell) não podem acessar esse novo local: voltei a mover e renomear as pastas de audionotes "por mouse" desde então.

Mesmo usando interfaces MTP conhecidas (por exemplo, PyMTP em Python, mtpfs) está falhando, porque o dispositivo já estava montado em sua inserção. Muitos outros usuários se queixaram de MTP para o seu dispositivo Android. A mudança do MMS para o MTP é justificada em grande parte para dispositivos Android, já que eles estão compartilhando o acesso a seus arquivos com a máquina de montagem, não acho que seja justificável para dispositivos walkman. O protocolo MMS é mais simples e rápido neste caso (e foi o padrão até a última atualização do kernel).

Notas

  1. Se eu entendi a vantagem de montar o sistema de arquivos de dispositivos ativos, como telefones celulares como MTP, eu teria assumido que o modo MMS teria sido mantido para outros dispositivos (então presumo que perdi um ponto?).
  2. Conseguirei reprogramar meu script usando a biblioteca pymtp: estou perguntando aqui, caso haja uma solução mais simples. Eu gostaria que uma solução mais simples existisse não apenas por preguiça, mas porque encorajaria outros a programar e personalizar seu ambiente de trabalho?
  3. Recompilar o kernel pode gerar uma solução link , mas eu ficaria surpreso se for o mais simples possível.
  4. A configuração de uma regra UDEV (com scripts adequados) deve ter resolvido o problema de acordo com this e this postagens, mas parece que o dispositivo não está nem montado quando é reconhecido como um mtp (nem o gparted nem o gnome-disks mostram isso mesmo uma vez visível no gerenciador de arquivos) : (
  5. Achei que usbmount resolveria meu problema, mas, novamente, acho que o walkman não é detectado como uma chave USB, mas como um dispositivo MTP ....
  6. Meu problema NÃO é com a mudança no ponto de montagem: encontrei o novo ponto de montagem em /run/user/1003/gvfs/mtp:host=*/Storage\ Media/ . O problema é que um simples cp ou mv em um shell deste local para o meu disco rígido não funciona: Copiar (ou mover) a pasta ou arquivos individuais não é suportado:

    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. A saída do dmesg após inserir o dispositivo é:

    [  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. A saída de "montagem" não muda entre antes e depois de montar o dispositivo. É o seguinte:

    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)
    
por Jeremy 27.12.2014 / 16:09

2 respostas

2

Ainda não encontrei uma maneira de tornar as alterações permanentes, mas pelo menos há uma maneira de alterar manualmente os drivers de mudança :

Por exemplo, com meu walkman sony:

  • Conecte-o e descubra seu fornecedor e o ID do produto com 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
    ...
    

    - > então, neste caso: 054c 04be .

  • Mude para usb_storage com:

    # mtp_switch 054c 04be
    

Ele deve ser montado automaticamente (no ubuntu pelo menos)

mtp_switch script:

#!/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."
    
por 25.01.2015 / 18:50
0

Eu não estou familiarizado com o dispositivo, mas aqui estão algumas ideias:

Poderia o modo usb-handle lidar com o retorno do dispositivo para o modo de armazenamento em massa?

Existem vários sistemas de arquivos mtp. Talvez eles sejam mais compatíveis que o gvfs.

    
por 28.12.2014 / 14:39

Tags