Иногда бывают ситуации, когда нужно отключить USB флешку, сделать настройку какой-то программы и потом опять подключить для нормальной работы. Но что делать если эти действия нужно сделать на удаленном сервере, к которому у нас нет физического доступа. Можно обратиться в службу поддержки, но можно и сделать все своими силами «не отходя от кассы». Расскажу как это делается.
Допустим, наша флешка уже втыкнута в USB-порт. Первым делом нужно проверить так ли это.
sasha@sasha-desktop# lsusb Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 002 Device 002: ID 09da:000a A4 Tech Co., Ltd Port Mouse Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 001 Device 004: ID 090c:1000 Feiya Technology Corp. Flash Drive Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Как видим, USB-флешка находиться на шине Bus 001. Следовательно нам нужно найти в /sys/bus/usb/devices/ соответствующее USB устройство и выключить питание.
sasha@sasha-desktop:~# cd /sys/bus/usb/devices/ sasha@sasha-desktop:/sys/bus/usb/devices# ls 1-0:1.0 1-6 1-6:1.0 2-0:1.0 2-2 2-2:1.0 3-0:1.0 4-0:1.0 5-0:1.0 usb1 usb2 usb3 usb4 usb5
Чтобы копаться в системных устройствах нужны права суперпользователя.
root@sasha-desktop:/sys/bus/usb/devices# cat 1-6/busnum 1 root@sasha-desktop:/sys/bus/usb/devices# cat 2-2/busnum 2
По скольку мы знаем, что наша USB флешка на физической шине с номером 1. Следовательно, нужно отключить питание устройства 1-6, так как именно оно отвечает за первую шину.
root@sasha-desktop:/sys/bus/usb/devices# echo suspend > 1-6/power/level
Приведенная выше команда, отключит питание устройства на лету. Проверим теперь, так ли это.
root@sasha-desktop:/sys/bus/usb/devices# lsusb Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 002 Device 002: ID 09da:000a A4 Tech Co., Ltd Port Mouse Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Как видим — устройство отключено.
После внесения нужных изменений, подключаем питание USB устройства.
root@sasha-desktop:/sys/bus/usb/devices# echo on > 1-6/power/level root@sasha-desktop:/sys/bus/usb/devices# lsusb Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 002 Device 002: ID 09da:000a A4 Tech Co., Ltd Port Mouse Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 001 Device 004: ID 090c:1000 Feiya Technology Corp. Flash Drive Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Как видим, все работает.
Литература:
http://www.mjmwired.net/kernel/Documentation/usb/power-management.txt
Здравствуйте. Попробовал — не получилось. При вводе команды(echo suspend > 1-3/power/level) от суперпользователя «su», выдает «bash: echo: ошибка записи: Недопустимый аргумент» 🙁
Здравствуйте. В данном случаи Вам нужно посмотреть включен ли параметр ядра CONFIG_USB_SUSPEND. Если Вы используете Ubuntu:
root@ACCKEY:/boot# cat /boot/config-3.2.0-29-generic-pae | grep CONFIG_SUSPEND
CONFIG_SUSPEND=y
CONFIG_SUSPEND_FREEZER=y
При этом из-под рута не дает изменить файл /power/level
Потому что эти два параметра не имеют никакого отношения к USB. Можете посмотреть их предназначение по ссылкам:
CONFIG_SUSPEND
CONFIG_SUSPEND_FREEZER
Нам же нужен параметрCONFIG_USB_SUSPEND
не работает
root@Zond:/sys/bus/usb/devices# echo suspend > 2-1/power/level bash: echo: ошибка записи: Недопустимый аргумент
root@Zond:/sys/bus/usb/devices# grep CONFIG_USB_SUSPEND /boot/config-3.8.0-23-generic
CONFIG_USB_SUSPEND=y
root@Zond:/sys/bus/usb/devices#
Из документации:
«In kernels up to 2.6.32, you could also specify «suspend», meaning that the device should remain suspended and autoresume was not allowed. This setting is no longer supported.»
Так как у Вас ядро 3.8 такой способ не прокатит. Вместо этого нужно сделать так:
А если и такой способ не катит? Кроме того, в этих файлах эти значения по умолчанию. Ядро 3.12.
«Starting with the 3.10 kernel release, dynamic PM support for USB is
present whenever the kernel was built with CONFIG_PM_RUNTIME enabled.
The CONFIG_USB_SUSPEND option has been eliminated.»
В этом случаи вы вообще можете освободить(удалить) USB-устройство и потом снова включить.
Так то оно так, устроство удаляется. Вот только питание с VBUS не снимается. В результате хардварный резет устройства не происходит.
Для ядра 3.8 приведены команды включения/отключения или обе эти команды для отключения питания?
Обе для выключения. Т.е. мы ставим автоматическое отключения питания (auto in ../power/level) если устройство нигде не используется (т.е. устройство в idle состоянии). Чтобы вручную задать состояние idle, нужно впихнуть «0» в ../power/autosuspend
«When the counter is > 0 then the interface is deemed to be busy, and the kernel will not
autosuspend the interface’s device. When the usage counter is = 0 then the interface is
considered to be idle, and the kernel may autosuspend the device.»
Интересно, а как тогда корректно включить питание в этом случае?
вместо 0 вписать 5, к примеру.
USB-модем хорошо передёргивает в 4.9
echo ‘1-4’ > /sys/bus/usb/drivers/usb/unbind && echo ‘1-4’ > /sys/bus/usb/drivers/usb/bind