首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何插入usb驱动器?

如何插入usb驱动器?
EN

Unix & Linux用户
提问于 2018-02-08 18:23:00
回答 1查看 332关注 0票数 2

问题

在我的usb驱动器(/dev/sdd)上使用以下命令之后:

代码语言:javascript
运行
复制
# physically plugging usb-drive in at /dev/sdd
> umount /dev/sdd1
> eject /dev/sdd

我无法撤销这最后的行动。如何以编程方式重新安装驱动器?

对设备的物理访问不是一个选项,也不是重新启动。

你试了什么?

正如你所看到的,常规的东西是行不通的。

代码语言:javascript
运行
复制
> mount /dev/sdd1
mount: /dev/sdd1: can't find in /etc/fstab.

我们可以看到,/dev/sdd1不再存在了:

代码语言:javascript
运行
复制
> ls /dev/sdd*
/dev/sdd

因此,让我们再次使用相同的实用程序来撤销弹出:

代码语言:javascript
运行
复制
> eject --trayclose /dev/sdd
> ls /dev/sdd*
/dev/sdd

这似乎没有什么作用,所以让我们将usb驱动器绑定到驱动程序。

代码语言:javascript
运行
复制
> udevadm info /dev/sdd | grep DEVPATH
E: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/host6/target6:0:0/6:0:0:0/block/sdd
> echo -n "1-1:1.0" > /sys/bus/usb/drivers/usb-storage/unbind
> ls -d /sys/bus/usb/drivers/usb-storage/1-1\:1.0
ls: cannot access '/sys/bus/usb/drivers/usb-storage/1-1:1.0': No such file or directory
> echo -n "1-1:1.0" > /sys/bus/usb/drivers/usb-storage/bind
> ls -d /sys/bus/usb/drivers/usb-storage/1-1\:1.0
1-1:1.0

好的,那么解除绑定和绑定是有效的。这不是问题,也不是解决办法。而且,这个装置似乎仍然有动力。我们试着触发点什么吧。

代码语言:javascript
运行
复制
> udevadm trigger --name-match=/dev/sdd

这似乎也解决不了问题。现在,让我们再次尝试读取分区表,因为/dev/sdd存在,但/dev/sdd1不存在。我找到了实现这一目标的三种不同方法:

代码语言:javascript
运行
复制
> partprobe /dev/sdd
Error: Error opening /dev/sdd: No medium found
> hdparm -z /dev/sdd

/dev/sdd:
 re-reading partition table
> partx -u /dev/sdd
partx: cannot open /dev/sdd: No medium found
> ls /dev/sdd*
/dev/sdd

还是没有/dev/sdd1。也许可以尝试一些重新扫描:

代码语言:javascript
运行
复制
> echo 1 > /sys/block/sdd/device/rescan
> ls /dev/sdd*
/dev/sdd

仍然没有,让我们验证一下fdisk是怎么说的:

代码语言:javascript
运行
复制
> fdisk -l | grep sdd

好吧没什么。让我们试着重新设置usb驱动器。

代码语言:javascript
运行
复制
> echo 0 > /sys/bus/usb/devices/1-1\:1.0/authorized
> echo 1 > /sys/bus/usb/devices/1-1\:1.0/authorized
> ls /dev/sdd*
ls: cannot access '/dev/sdd*': No such file or directory

这使情况更糟,试错失败了。投降了。我在这里错过了什么?

*facepalm*为什么是eject?!

实际上,我需要这个解决方案来解决另一个问题,在这个问题中,Linux不希望在i/o错误发生后再挂载usb驱动器。由于物理上插入usb驱动器可以解决这个问题,所以我需要知道如何通过编程来完成这个任务。即使这不能解决我最初的问题,我也想知道如何撤消eject

编辑:更详细信息

下面是来自基于kernel.org的热插拔的另一个消息来源,它告诉我们应该发生什么:

  • 找到一个能处理设备的驱动程序。这可能涉及加载内核模块;较新的驱动程序可以使用模块-init-工具将其设备(和类)支持发布到用户实用程序。
  • 把驱动程序绑定到那个设备上。总线框架使用设备驱动程序的探测()例程来实现这一点。
  • 告诉其他子系统配置新设备。可能需要启用打印队列、打开网络、安装磁盘分区等等。在某些情况下,这将是驱动程序的具体操作。

看来最后一步可能还需要做。在进一步的信息支持下,在usb驱动器被“弹出”后,显示usb驱动器是有电源的,Linux可以与它进行通信:

代码语言:javascript
运行
复制
> cat /sys/block/sdd/device/state
running
> cat /sys/block/sdd/device/power/runtime_status
active
> cat /sys/block/sdd/device/power/runtime_suspended_time
0
> cat /sys/block/sdd/device/power/control
on
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2018-02-08 22:52:18

如果设备不是CDROM驱动器,则eject返回到一般的SCSI "START“命令,并设置"eject”选项。

可以使用sg_start -s使用"start“选项发送反向"START”。在大多数发行版中,sg_start都可以作为sg3_utils包的一部分。

显然,在这种情况下,sg_start -s足以重新启动驱动器。不需要sg_start --load。(这对我来说是有道理的,因为我不认为这是一件已经发生的事情)。

其他用户声称这是行不通的。USB驱动器控制器,特别是小型闪存驱动器,可能有点奇怪,因此,如果一些驱动器拒绝此命令,我将不会感到惊讶。

https://unix.stackexchange.com/a/394961/29483

闪存ROM棒中的USB控制器通常通过关闭设备和防止任何进一步的交互来响应。这意味着它从USB子系统中完全消失,必须重新枚举才能再次访问。当发送到CD/DVD驱动器时,相同的命令将弹出磁盘,"START STOP“命令的" load”选项也将再次加载它。但这种解释只适用于具有可移动媒体的设备。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/422880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档