때로는 문제를 해결하기 위해 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/