217 votes

Comment réinitialiser un périphérique USB à partir de la ligne de commande ?

Est-il possible de réinitialiser la connexion d'un périphérique USB, sans le déconnecter/le connecter physiquement au PC ?

Plus précisément, mon appareil est un appareil photo numérique. J'utilise gphoto2 mais dernièrement, je reçois des "erreurs de lecture du périphérique", alors j'aimerais essayer de réinitialiser la connexion par logiciel.

D'après ce que je peux dire, aucun module du noyau n'est chargé pour la caméra. Le seul qui semble lié est usbhid .

1voto

Trake Vital Points 143

C'est une façon très élégante et pourtant laide de le faire. J'ai lancé une ligne Shell dans cpp qui utilise Python pour réinitialiser l'usb.

  1. installer la bibliothèque Python usb : sudo pip3 install pyusb

  2. obtenir l'ID du vendeur et du produit pour pouvoir l'utiliser dans le code : lsusb -v

  3. copier-coller le code suivant mais n'oubliez pas de remplacer <vendor_id> y <product_id> avec l'ID du fournisseur et l'ID du produit que vous avez trouvés à l'étape précédente :

    include <iostream>

    int main() { int res = system("echo \"from usb.core import find as finddev; dev=finddev(idVendor=<vendor_id>,idProduct=<product_id>); dev.reset()\" | python3");

    return res;

    }

0voto

Clay Points 101

Si vous connaissez le nom de votre appareil, ce script Python fonctionnera :

#!/usr/bin/python
"""
USB Reset

Call as "usbreset.py <device_file_path>"

With device_file_path like "/dev/bus/usb/bus_number/device_number"
"""
import fcntl, sys, os

USBDEVFS_RESET = ord('U') << (4*2) | 20

def main():
    fd = os.open(sys.argv[1], os.O_WRONLY)
    if fd < 0: sys.exit(1)
    fcntl.ioctl(fd, USBDEVFS_RESET, 0)
    os.close(fd)
    sys.exit(0)
# end main

if __name__ == '__main__':
    main()

-1voto

dudewat Points 990

Peut-être que cela fonctionne aussi pour un appareil photo :

Après avoir fait revivre une personne affamée USB 3.0 HDD sur un 3.4.42 (kernel.org) Linux de mon côté. dmesg J'ai appris que les commandes étaient interrompues au bout de 360 secondes (désolé, je ne peux pas copier le syslog ici, je ne suis pas connecté au réseau) et que le disque se bloquait complètement. Les processus accédant au périphérique étaient bloqués dans le noyau, impossible à tuer. NFS suspendu, ZFS suspendu, dd suspendu.

Après avoir fait cela, tout a fonctionné à nouveau. dmesg n'a dit qu'une seule ligne sur le USB appareil trouvé.

Je n'ai vraiment aucune idée de ce que fait ce qui suit en détail. Mais ça a marché.

L'exemple de sortie suivant provient de Debian Squeeze avec 2.6.32-5-686 donc je pense que cela fonctionne pour les versions 2.6 et supérieures :

$ ls -al /dev/sdb
brw-rw---T 1 root floppy 8, 16 Jun  3 20:24 /dev/sdb

$ ls -al /sys/dev/block/8:16/device/rescan
--w------- 1 root root 4096 Jun  6 01:46 /sys/dev/block/8:16/device/rescan

$ echo 1 > /sys/dev/block/8:16/device/rescan

Si cela ne fonctionne pas, quelqu'un d'autre pourra peut-être trouver comment envoyer une véritable réinitialisation à un appareil.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X