如何强制将设备安装为大容量媒体存储 (MMS) 而不是媒体传输协议 (MTP)?

如何强制将设备安装为大容量媒体存储 (MMS) 而不是媒体传输协议 (MTP)?

我用各种索尼随身听随时随地录制大量简短的音频笔记(跑步、游泳、或者只是走路或乘坐公共汽车时)。

我曾经将每个设备作为海量媒体存储 (MMS) 安装到/media/$USER/WALKMAN/Linux 下,并通过脚本将音频笔记(在 中/media/WALKMAN/Record/Voice)移动到我的硬盘驱动器,该脚本通过重命名包含音频笔记的文件夹来准备特殊的处理顺序。

自从几个月前升级到新的 Linux 内核以来,随身听被识别为媒体传输协议 (MTP) 设备,而不是 MMS。这不仅会将安装点从 更改/media/$USER/WALKMAN/为类似 的位置/run/user/1003/gvfs/mtp:host=%5Busb%3A002%2C007%5D/Storage Media,而且脚本(也不是 shell)无法访问这个新位置:从那时起,我又重新开始“通过鼠标”移动和重命名音频笔记文件夹。

即使使用已知的 MTP 接口(例如 Python 中的 PyMTP、mtpfs)也会失败,因为设备已在插入时安装。许多其他用户抱怨其 Android 设备的 MTP。对于 Android 设备来说,从 MMS 迁移到 MTP 基本上是合理的,因为这些设备分享使用安装机访问他们的文件,我认为它不适用于随身听设备。在这种情况下,MMS 协议更简单、更快(并且在上次内核升级之前一直是默认协议)。


笔记

  1. 如果我理解将手机等活动设备的文件系统挂载为 MTP 的优点,我会假设 MMS 模式将为其他设备保留(所以我假设我错过了一点?)。
  2. 我将设法使用 pymtp 库重新编程我的脚本:我在这里询问是否有更简单的解决方案。我希望存在一个更简单的解决方案,不仅是出于懒惰,而且是因为它会鼓励其他人对他们的工作环境进行编程和个性化?
  3. 重新编译内核可能会产生解决方案关联,但如果它是最简单的,我会感到惊讶。
  4. 设置 UDEV 规则(使用足够的脚本)应该可以根据以下内容解决问题帖子,但似乎该设备在被识别为 mtp 设备时甚至没有安装(gparted 和 gnome-disks 都没有显示它,甚至在文件管理器中可见一次):(
  5. 我以为USB挂载可以解决我的问题,但我再次认为随身听没有被检测为 USB 密钥,而是被检测为 MTP 设备......
  6. 我的问题不在于安装点的更改:我确实在/run/user/1003/gvfs/mtp:host=*/Storage\ Media/.问题是,从该位置到我的硬盘驱动器的 shell 中的简单 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)
    

答案1

尚未找到使更改永久生效的方法,但至少有一种方法可以手动更换司机:

以我的索尼随身听为例:

  • 将其插入并通过以下命令查找其供应商和产品 ID 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."

答案2

我不熟悉该设备,但这里有一些想法:

USB-modeswitch 能否将设备转回大容量存储模式?

有多种 mtp fusion 文件系统。也许它们会比 gvfs 更兼容。

相关内容