Restartovani pripojeneho USB zarizeni v Linuxu

Casto se mi stava, ze softwarove odpojim USB flash a hned po odpojeni si vzpomenu, ze chci jeste nejaky soubor nakopirovat. Nejjednodussi reseni je vytahnou a znovu zastrcit flashku do USB portu. Jenze co delat, kdyz flashka je pripojena do vzdaleneho pocitace?

Nemusi jit hned o flashku, muze jit treba o nereagujici usb modem, nebo jine libovolne zarizeni.

Resenim je poslat USB zarizeni USBDEVFS_RESET. Staci si napsat jednoduchy program, jehoz zdrojak je na stackoverflow:

/* usbreset -- send a USB port reset to a USB device */

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>

#include <linux/usbdevice_fs.h>


int main(int argc, char **argv)
{
    const char *filename;
    int fd;
    int rc;

    if (argc != 2) {
        fprintf(stderr, "Usage: usbreset device-filename\n");
        return 1;
    }
    filename = argv[1];

    fd = open(filename, O_WRONLY);
    if (fd < 0) {
        perror("Error opening output file");
        return 1;
    }

    printf("Resetting USB device %s\n", filename);
    rc = ioctl(fd, USBDEVFS_RESET, 0);
    if (rc < 0) {
        perror("Error in ioctl");
        return 1;
    }
    printf("Reset successful\n");

    close(fd);
    return 0;
}

 

Po kompilaci pomoci sudo gcc usbreset.c -o /usr/local/bin/usbreset

muzeme nastroj otestovat.
Pripojime flashku do USB. Mela by se  sama pripojit:

martin@martin:/tmp$ mount | grep sdd
/dev/sdd1 on /media/martin/VANCL type vfat (rw,nosuid,nodev,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec,flush,uhelper=udisks2)
martin@martin:/tmp$ lsusb | grep "Flash Drive"
Bus 002 Device 013: ID 1307:0165 Transcend Information, Inc. 2GB/4GB Flash Drive

martin@martin~$ ls /dev/ | grep sdd
sdd
sdd1

Nyni GUI klikatkem (Nautilus) odpojime/odebereme flash disk:
V Nautilu zarizeni uplne zmizi a ve vypisu mountu uz take neni. Jinak je i dal pripojene:
martin@martin:/tmp$ mount | grep sdd
martin@martin:/tmp$ lsusb | grep "Flash Drive"

Bus 002 Device 013: ID 1307:0165 Transcend Information, Inc. 2GB/4GB Flash Drive

martin@martin:~$ ls /dev/ | grep sdd
sdd
Ted nastal cas na nastroj usbreset, je potreba ho spustit pod rootem:
# usbreset /dev/bus/usb/002/013
Resetting USB device /dev/bus/usb/002/013
Reset successful
Jedinym parametrem je cesta k USB zarizeni. Dulezite jsou posledni 2 ciselne hodnoty oddelene lomitkem. Ty vezmeme z vyse uvedenho vystupu lsusb. Po spusteni prikazu se flash disk opet pripoji a v Nautilu se zobrazi jako pripojeny.
Nefunguje to ovsem vzdy, pokud odebereme flashku pomoci udisks –detach, je nutne ji znovu vytahnout a zastric zpet do USB (alespon jsem na jiny zpusob neprisel):
martin@martin:/tmp$ lsusb | grep "Flash Drive"
Bus 002 Device 013: ID 1307:0165 Transcend Information, Inc. 2GB/4GB Flash Drive
martin@martin:/tmp$ udisks --detach /dev/sdd
martin@martin:/tmp$ lsusb | grep "Flash Drive"
martin@martin:~$ ls /dev/ | grep sdd
martin@martin:~$ 
Takze az se priste odpojite flashku u stovky kilometru vzdaleneho serveru, nemusite nikam jezdit. Prikladem muze byt v posledni dobe oblibeny Raspberry Pi hosting, kde jde dat disk pouze do SD a USB.
Vyuziti by mohlo byt i na ruzne 3G modemy a TV karty, pokud se z nejakeho duvodu zblazni a prestanou reagovat.

Pouzite zdroje:

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *