Хард ресет USB в Ubuntu 10.04
У меня есть устройство USB (модем), который действительно привередливый. Иногда это работает нормально, но иногда он отказывается подключиться. Единственное решение, которое я нашел, чтобы исправить это, как только оно перейдет в плохое состояние, - это физически отключить устройство и снова подключить его. Однако у меня не всегда есть физический доступ к машине, к которой он подключен, поэтому я ' Я ищу способ сделать это через командную строку.
Этот пост предлагает запустить:
$ sudo modprobe -w -r usb_storage; sudo modprobe usb_storage
Однако я получаю вывод "неизвестная опция -w". Это слегка измененная команда:
$ sudo modprobe -r usb_storage
Сбой с сообщением FATAL: модуль usb_storage используется. Если я попытаюсь убить -9, процессы, помеченные [usb-storage] перед запуском, откажутся умереть (я думаю, потому что они тесно связаны с ядром).
Кто-нибудь знает способ сделать это?
ПРИМЕЧАНИЕ: я сделал кросс-пост на serverfault, так как не знал, что было более подходящим. Я буду удалять и / или ссылаться на тот, кто ответит первым.
7 ответов
У меня Ubuntu 14.04.4. Я понятия не имею, работает ли это в 10.04. Я проверил его на Cyborg Rumble Pad (и обычном USB-накопителе).
Сразу после подключения устройства:
dmesg | grep usb | tail -n 20
Я получаю (может быть среди прочего):
[ 2875.790610] usb 2-1.2: new full-speed USB device number 7 using ehci-pci
[ 2875.887485] usb 2-1.2: New USB device found, idVendor=0738, idProduct=cb02
[ 2875.887489] usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 2875.887490] usb 2-1.2: Product: Cyborg Rumble Pad - PC/Xbox 360
[ 2875.887492] usb 2-1.2: Manufacturer: Saitek
[ 2875.887493] usb 2-1.2: SerialNumber: 0CFE6B97
Важнейшая часть 2-1.2
строка. Он идентифицирует порт USB. Хорошей новостью является то, что это не должно измениться, если я не подключу устройство к другому порту, поэтому мне нужно получить строку только один раз.
Далее я иду в нужное место:
cd /sys/bus/usb/drivers/usb
и вызвать как root (например, sudo bash
первый):
echo 2-1.2 > unbind ; sleep 3 ; echo 2-1.2 > bind
В результате мой Rumble Pad повторно инициализирует себя, как будто он был отключен и снова подключен. Я также проверил свою флешку. Он (его светодиод) ведет себя так, как будто ничего не произошло, но мой KDE реагирует и спрашивает, хочу ли я монтировать.
Все время устройство включено. Этот метод не будет работать, если ваш модем перезагружается из-за отсутствия питания.
Вы можете попробовать сбросить USB-устройство с помощью usbreset
, Вот ссылка на источник - http://marc.info/?l=linux-usb&m=121459435621262&w=2
Вы просто ищете устройство, которое хотите сбросить (lsusb
):
# lsusb
Bus 005 Device 004: ID 0951:1642 Kingston Technology DT101 G2
а потом:
# usbreset /dev/bus/usb/005/004
Самый простой способ отключить произвольные USB-устройства из командной строки (то есть с реальным циклом включения USB):
- купите 4-портовый USB-концентратор DELOCK 87445 (Google для
) - это оборудование совместимо с hub-ctrl.c (Google для
). Таким образом, произвольные порты могут быть включены / выключены. Для получения дополнительной информации см. Также: http://code.google.com/p/wl500g/source/browse/branches/rt-n/utils/hub-ctrl.c?r=2235
Почему вы пытаетесь разгрузить usb_storage
модуль, когда ваше устройство USB модем?
бежать sudo lshw
и найдите запись для вашего USB-модема. Там должно быть configuration:
такая строка (ваш драйвер будет другим, очевидно):
configuration: ... driver=iwlagn ...
убедитесь, что модуль загружен (подставив правильное имя драйвера):
lsmod | grep iwlagn
тогда просто сделайте:
sudo modprobe -r iwlagn && sleep 2 && sudo modprobe iwlagn
Мне нравится ставить sleep
на всякий случай, если устройству требуется некоторое время для выключения.
Я использую Fedora, у меня сработала отвязка и привязка USB-контроллеров. Обратите внимание, что идентификатор контроллера отличается от производителя к производителю, поэтому сначала вам нужно найти идентификатор контроллера в каталоге ниже:
/sys/bus/pci/drivers/ehci_hcd
Идентификатор производителя имеет вид0000:00:xx.y
.
Отвязка:
cd /sys/bus/pci/drivers/xhci_hcd
echo -n "0000:00:xx.y" > unbind
Обвязка:
echo -n "0000:00:xx.y" > bind
есть утилита uhubctl , которая делает это возможным. (даже с Raspberry Pi)
вот пример использования:
sudo uhubctl -p 2 -a cycle
Это решение "выхода из положения", но оно может сработать.
- Получите второй, старый, не очень мощный ПК. Установите Debian на него. устанавливать
usbip
в теме. - Затем установите
usbip
на вашем сервере. - Подключите модем ко второму ПК. конфигурировать
usbip
на обеих машинах, чтобы модем, подключенный ко второму ПК, был доступен через VHCI с сервера. - конфигурировать
ssh
на втором компьютере или другом означает, что вы можете подключиться к нему и выдавать команды. - Когда устройство выходит из строя, войдите в систему и перезагрузите второй компьютер через
reboot
команда, а затем, как только он возвращается, снова подключиться с использованием любых средствusbip
обеспечивает (я никогда не использовалusbip
). Это должно перезагрузить устройство. Вы, вероятно, могли бы написать это.