在我的usb驱动器(/dev/sdd)上使用以下命令之后:
# physically plugging usb-drive in at /dev/sdd
> umount /dev/sdd1
> eject /dev/sdd我无法撤销这最后的行动。如何以编程方式重新安装驱动器?
对设备的物理访问不是一个选项,也不是重新启动。
正如你所看到的,常规的东西是行不通的。
> mount /dev/sdd1
mount: /dev/sdd1: can't find in /etc/fstab.我们可以看到,/dev/sdd1不再存在了:
> ls /dev/sdd*
/dev/sdd因此,让我们再次使用相同的实用程序来撤销弹出:
> eject --trayclose /dev/sdd
> ls /dev/sdd*
/dev/sdd这似乎没有什么作用,所以让我们将usb驱动器绑定到驱动程序。
> 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好的,那么解除绑定和绑定是有效的。这不是问题,也不是解决办法。而且,这个装置似乎仍然有动力。我们试着触发点什么吧。
> udevadm trigger --name-match=/dev/sdd这似乎也解决不了问题。现在,让我们再次尝试读取分区表,因为/dev/sdd存在,但/dev/sdd1不存在。我找到了实现这一目标的三种不同方法:
> 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。也许可以尝试一些重新扫描:
> echo 1 > /sys/block/sdd/device/rescan
> ls /dev/sdd*
/dev/sdd仍然没有,让我们验证一下fdisk是怎么说的:
> fdisk -l | grep sdd好吧没什么。让我们试着重新设置usb驱动器。
> 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这使情况更糟,试错失败了。投降了。我在这里错过了什么?
eject?!实际上,我需要这个解决方案来解决另一个问题,在这个问题中,Linux不希望在i/o错误发生后再挂载usb驱动器。由于物理上插入usb驱动器可以解决这个问题,所以我需要知道如何通过编程来完成这个任务。即使这不能解决我最初的问题,我也想知道如何撤消eject。
下面是来自基于kernel.org的热插拔的另一个消息来源,它告诉我们应该发生什么:
看来最后一步可能还需要做。在进一步的信息支持下,在usb驱动器被“弹出”后,显示usb驱动器是有电源的,Linux可以与它进行通信:
> 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发布于 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”选项也将再次加载它。但这种解释只适用于具有可移动媒体的设备。
https://unix.stackexchange.com/questions/422880
复制相似问题