특정 USB 플래시 장치를 재설정하는 방법은 무엇입니까?

특정 USB 플래시 장치를 재설정하는 방법은 무엇입니까?

때로는 문제를 해결하기 위해 USB 플래시 드라이브를 분리했다가 연결해야 할 때도 있습니다.

소프트웨어에서 이를 수행할 수 있는 방법이 있습니까?

답변1

다음을 다음과 같이 저장합니다 usbreset.c.

/* 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;
}

터미널에서 다음 명령을 실행합니다.

컴파일러:

$ cc usbreset.c -o usbreset

재설정할 USB 장치의 버스 및 장치 ID를 가져옵니다.

$ lsusb  
Bus 002 Device 003: ID 0fe9:9010 DVICO 

컴파일된 프로그램을 실행 가능하게 만듭니다.

$ chmod +x usbreset

sudo 권한으로 프로그램을 실행하고 다음 명령을 실행하여 찾은 항목과 ID를 <Bus>필요한 대로 대체합니다 .<Device>lsusb

$ sudo ./usbreset /dev/bus/usb/002/003  

원천:https://askubuntu.com/questions/645/how-do-you-reset-a-usb-device-from-the-command-line

답변2

나는 이것을 위해 스크립트를 작성했습니다. /dev/에 있는 장치 노드의 이름을 지정하기만 하면 원하는 대로 작동합니다. 다음 코드를 스크립트에 저장하고 이렇게 사용합니다 sudo ./reset-drive.sh sdb.오직USB 대용량 저장 장치에서 작동하므로 다른 장치(하드 드라이브, USB 마우스, 키보드)에 영향을 주지 않으므로 더 안전합니다. 하드 드라이브를 재설정하도록 요청할 수 있지만 작동하지 않습니다.

#!/bin/bash
drive="$1" # expects input like "sda" "sdc" etc.

cd /sys/bus/usb/drivers/usb-storage

for i in *; do
  if [[ $(udevadm info -q path -n "/dev/$drive" | grep -c "$i") == "1" ]]; then
    echo $i > unbind
    echo $i > bind
  fi
done

어떻게 작동하나요?

USB 대용량 저장소 클래스의 장치에 대한 포트 정보가 포함된 디렉터리로 변경합니다.

cd /sys/bus/usb/drivers/usb-storage

이제 거기에 나열된 모든 장치를 평가하여 지정된 장치 노드와 일치하는 장치를 찾으십시오.

for i in *; do
  if [[ $(udevadm info -q path -n "/dev/$drive" | grep -c "$i") == "1" ]]; 
then

unbind찾은 후에는 포트 명령을 실행하는 데 사용되는 파일 에 해당 USB 포트 경로 이름을 제공합니다 .bind

echo $i > unbind
echo $i > bind

추신: 이 솔루션은 다음 문서를 기반으로 합니다. http://billauer.co.il/blog/2013/02/usb-reset-ehci-uhci-linux/

관련 정보