我找遍了所有地方,还是没能找到原因。我有一台较旧的 Olympus 相机(2001 年左右)。当我插入 USB 连接时,我得到了以下日志输出:
$ dmesg | grep sd
[20047.625076] sd 21:0:0:0: Attached scsi generic sg7 type 0
[20047.627922] sd 21:0:0:0: [sdg] Attached SCSI removable disk
其次,驱动器未安装在 FS 中,但是当我运行 gphoto2 时出现以下错误:
$ gphoto2 --list-config
*** Error ***
An error occurred in the io-library ('Could not lock the device'): Camera is already in use.
*** Error (-60: 'Could not lock the device') ***
什么命令可以卸载驱动器。例如,在 Nautilus 中,我可以右键单击并选择“安全删除设备”。执行此操作后,/dev/sg7 和 /dev/sdg 设备将被删除。
gphoto2 的输出为:
# gphoto2 --list-config
/Camera Configuration/Picture Settings/resolution
/Camera Configuration/Picture Settings/shutter
/Camera Configuration/Picture Settings/aperture
/Camera Configuration/Picture Settings/color
/Camera Configuration/Picture Settings/flash
/Camera Configuration/Picture Settings/whitebalance
/Camera Configuration/Picture Settings/focus-mode
/Camera Configuration/Picture Settings/focus-pos
/Camera Configuration/Picture Settings/exp
/Camera Configuration/Picture Settings/exp-meter
/Camera Configuration/Picture Settings/zoom
/Camera Configuration/Picture Settings/dzoom
/Camera Configuration/Picture Settings/iso
/Camera Configuration/Camera Settings/date-time
/Camera Configuration/Camera Settings/lcd-mode
/Camera Configuration/Camera Settings/lcd-brightness
/Camera Configuration/Camera Settings/lcd-auto-shutoff
/Camera Configuration/Camera Settings/camera-power-save
/Camera Configuration/Camera Settings/host-power-save
/Camera Configuration/Camera Settings/timefmt
我已经尝试过的一些东西是sdparm
和sg3_utils
,但我不熟悉它们,所以可能我只是没有找到正确的命令。
更新 1:
# mount | grep sdg
# mount | grep sg7
# umount /dev/sg7
umount: /dev/sg7: not mounted
# umount /dev/sdg
umount: /dev/sdg: not mounted
# gphoto2 --list-config
*** Error ***
An error occurred in the io-library ('Could not lock the device'): Camera is already in use.
*** Error (-60: 'Could not lock the device') ***
答案1
快速而粗略的方法
要强制禁用所有活动大容量存储设备:
rmmod usb_storage
防止任何设备加载 usb_storage 模块
我找到了以下链接,基本上是问同样的疑问. 如果你想阻止内核自动挂载,使用usb_storage
:
echo "blacklist usb_storage" | sudo tee /etc/modprobe.d/blacklist-usb-storage.conf
防止单个设备加载 usb_storage 模块
您可以使用 udev 规则来忽略特定设备,而不是禁用所有设备。这里有一个具体的例子这里。
我花了很多时间尝试让它在 Ubuntu 10.04 中运行,但它看起来这个功能在较新版本的 udev 中已被禁用。
“安全移除磁盘”解除绑定/取消声明源代码
这此主题的最后一篇帖子非常有效。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/ioctl.h>
#include <linux/usbdevice_fs.h>
int main(int argc, char**argv)
{
struct usbdevfs_ioctl command;
int ret;
int fd;
int i;
if (argc>1) {
fd = open(argv[1],O_RDWR);
if (fd<1){
perror("unable to open file");
return 1;
}
for (i=0;i<255;i++){ // hack: should fetch how many interface there is.
command.ifno = i;
command.ioctl_code = USBDEVFS_DISCONNECT;
command.data = NULL;
ret = ioctl(fd, USBDEVFS_IOCTL, &command);
if(ret!=-1)
printf("un claimed interface %d %d\n",i,ret);
}
}else {
printf ("usage: %s /dev/bus/usb/BUS/DEVICE\n",argv[0]);
printf("Release all interfaces of this usb device for usage in virtualisation\n");
}
}
绑定/解绑设备的简单脚本
前面的例子很有趣,但我还发现了一种更简化的方法。您可以使用用于绑定和解除绑定设备的 usb-storage 驱动程序接口。
以下命令有效,就像上面的源代码一样:
echo -n "1-2.4:1.0" | sudo tee unbind
答案2
首先,mount
以 root 身份运行。这应该会列出所有已安装的文件系统。如果/dev/sdg
和/dev/sg7
不在列表中,则表示相机已不再安装。
如果相机仍处于安装状态,您可以使用命令将其卸载umount
(请注意缺少“n”)。例如umount /dev/sg7
或umount /dev/sdg
。
如果相机已安装文件系统,那么您可能只需在 Nautilus 中浏览照片即可。 的输出mount
将告诉您设备在文件系统中的安装位置 - 只需浏览文件夹并开始查找照片即可。
答案3
答案4
我在脚本中这样做:
# If camera is mounted we need to unmount it
export CAMERA_MOUNT_POINTS=`gvfs-mount -l | grep gphoto2 | sed 's/.*\(gphoto2.*\)$/\1/' | uniq 2> $LOG_FILE`
for CAMERA_MOUNT_POINT in $CAMERA_MOUNT_POINTS
do
echo Unmounting mounted camera from $CAMERA_MOUNT_POINT.
gvfs-mount -u $CAMERA_MOUNT_POINT &> $LOG_FILE
done
我不确定这是你需要的,但可能是,因为我遇到过类似的问题。
编辑:稍微解释一下:
gvfs-mount -l
列出已安装的内容该行的其余部分清理输出以仅生成已安装摄像机的列表(并将错误传送到日志文件)。然后循环卸载所有摄像机。