我用各种索尼随身听随时随地录制大量简短的音频笔记(跑步、游泳、或者只是走路或乘坐公共汽车时)。
我曾经将每个设备作为海量媒体存储 (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 协议更简单、更快(并且在上次内核升级之前一直是默认协议)。
笔记
- 如果我理解将手机等活动设备的文件系统挂载为 MTP 的优点,我会假设 MMS 模式将为其他设备保留(所以我假设我错过了一点?)。
- 我将设法使用 pymtp 库重新编程我的脚本:我在这里询问是否有更简单的解决方案。我希望存在一个更简单的解决方案,不仅是出于懒惰,而且是因为它会鼓励其他人对他们的工作环境进行编程和个性化?
- 重新编译内核可能会产生解决方案关联,但如果它是最简单的,我会感到惊讶。
- 设置 UDEV 规则(使用足够的脚本)应该可以根据以下内容解决问题这和这帖子,但似乎该设备在被识别为 mtp 设备时甚至没有安装(gparted 和 gnome-disks 都没有显示它,甚至在文件管理器中可见一次):(
- 我以为USB挂载可以解决我的问题,但我再次认为随身听没有被检测为 USB 密钥,而是被检测为 MTP 设备......
我的问题不在于安装点的更改:我确实在
/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
`
插入设备后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
“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 更兼容。