Problema
Depois de usar o seguinte comando no meu drive USB (/ dev / sdd):
# physically plugging usb-drive in at /dev/sdd
> umount /dev/sdd1
> eject /dev/sdd
Não consigo desfazer esta última ação. Como faço para montar a unidade novamente, programaticamente?
O acesso físico ao dispositivo não é uma opção e nem o reinício.
O que você tentou?
Como você verá, as coisas normais não funcionam.
> mount /dev/sdd1
mount: /dev/sdd1: can't find in /etc/fstab.
Podemos ver que /dev/sdd1
não existe mais:
> ls /dev/sdd*
/dev/sdd
Então, vamos tentar desfazer a ejeção usando o mesmo utilitário novamente:
> eject --trayclose /dev/sdd
> ls /dev/sdd*
/dev/sdd
Isso não parece fazer nada, então vamos ligar o drive USB ao driver.
> 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
Ok, então o unbind e o bind funcionaram. Este não é o problema nem a solução. Além disso, o dispositivo ainda parece estar ligado. Vamos tentar acionar algo.
> udevadm trigger --name-match=/dev/sdd
Isso não parece resolver o problema também. Agora vamos tentar ler a tabela de partições novamente, porque /dev/sdd
existe, mas /dev/sdd1
não. Eu encontrei três métodos diferentes para alcançar isso:
> 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
Ainda não há /dev/sdd1
. Talvez tente alguma nova verificação:
> echo 1 > /sys/block/sdd/device/rescan
> ls /dev/sdd*
/dev/sdd
Ainda nada, vamos verificar o que o fdisk
diz sobre isso:
> fdisk -l | grep sdd
Ok, nada. Vamos tentar redefinir o drive USB então.
> 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
Isso piorou, tentativa e erro falharam. Desisto. O que estou perdendo aqui?
* facepalm * por que eject
de todo?!
Bem, eu preciso dessa solução para outro problema, no qual o Linux não quer mais montar a unidade usb após a ocorrência de erros de E / S. Desde fisicamente conectando o drive USB novamente em obras para esse problema, eu preciso saber como fazer isso de forma programática. E mesmo que isso não resolva meu problema original, quero saber como desfazer eject
.
EDIT: Mais detalhes
Aqui está uma fonte adicional de kernel.org no usb hotplugging , dizendo o que deveria estar acontecendo:
- Find a driver that can handle the device. That may involve loading a kernel module; newer drivers can use module-init-tools to publish their device (and class) support to user utilities.
- Bind a driver to that device. Bus frameworks do that using a device driver’s probe() routine.
- Tell other subsystems to configure the new device. Print queues may need to be enabled, networks brought up, disk partitions mounted, and so on. In some cases these will be driver-specific actions.
Parece que o último passo ainda precisa ser feito. Apoiado por mais informações sobre o estado do drive usb depois que ele é "ejetado", mostrando que o drive usb está ligado e o Linux pode se comunicar com ele:
> 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