Como eu conecto um drive USB?

2

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
    
por Yeti 08.02.2018 / 19:23

1 resposta

1

Se o dispositivo não for uma unidade de CDROM, eject retornará a um comando genérico SCSI "START STOP", com a opção "ejetar" definida.

É possível enviar o reverso, "START STOP" com a opção "start", usando sg_start -s . O sg_start está disponível como parte do pacote sg3_utils na maioria das distribuições.

Aparentemente, sg_start -s foi suficiente para reiniciar a unidade nesse caso. sg_start --load não foi necessário. (Isso faz sentido para mim, porque não vejo isso como uma ejeção ocorrida).

Outros usuários afirmaram que isso não funciona. Controladores de drive USB particularmente para pequenos flash drives podem ser um pouco estranhos, então eu não ficaria surpreso se algumas unidades recusarem este comando.

link

The USB controller in a flash ROM stick usually reacts by powering down the device and preventing any further interaction. That means it disappears completely from the USB subsystem, and must be re-enumerated to be able to accessed again.

The same command when send e.g. to a CD/DVD drive will eject the disk, and the also existing "load" option of the "START STOP" command will load it again. But this interpretation only applies to devices with removable media.

    
por 08.02.2018 / 23:52