Linux를 사용하여 USB 전원 공급 장치 제어 (켜기 / 끄기)


164

Linux를 사용하여 USB에서 수동으로 전원 공급 장치를 켜거나 끌 수 있습니까?

이 외부 USB 냉각 팬 (PC가 아닌 몸을 식히는 데 사용하는 종류)이 있으며 팬을 멀리 떨어진 곳에 놓고 싶기 때문에 터미널에서 제어 할 수있는 것이 좋습니다.

USB 장난감이 많기 때문에 다양한 다른 것들에도 유용 할 수 있다고 생각합니다. 공기 청정기 등이있을 수 있습니다 (실제로는 효과가 없다고 들었습니다).


9
Linux> = 2.6.38에 대해 다시 살펴 보겠습니다 . 파일 power/level 이 더 이상 사용되지 않습니다. 사용하는 power/control 대신 . ( power/wakeupOK입니다.) 또한, 그것은 단지 "자동차"와, 더 이상 아닙니다 "중단"을 "ON"으로 받아들입니다. "자동"은 충분히 똑똑하며 유휴 상태에서 전원이 꺼지지 않으면 장치의 결함입니다. 어쨌든 수동으로 전원을 끌 수 없습니다. 자세한 내용은 참조 아래의 대답 에 의한 tlwhitec : 커널의 문서 kernel.org/doc/Documentation/usb/power-management.txt
테이 카 kazura


2
이 기능은 정말 좋은 GUI를받을 자격
mikebabcock

특별한 하드웨어가 필요합니까? 대답에서 명확하지 않다
Vojtěch Dohnal

답변:


63

노트. 이 답변의 정보는 이전 커널 (최대 2.6.32)과 관련이 있습니다. 최신 커널에 대한 정보는 tlwhitec의 답변 을 참조하십시오 .

# disable external wake-up; do this only once
echo disabled > /sys/bus/usb/devices/usb1/power/wakeup 

echo on > /sys/bus/usb/devices/usb1/power/level       # turn on
echo suspend > /sys/bus/usb/devices/usb1/power/level  # turn off

(usb1을 usb n 으로 변경해야 할 수도 있습니다 )

출처 : Documentation / usb / power-management.txt.gz


1
우와, 고마워 나는 무엇이든 상관없이 libUSB를 거쳐야한다고 생각했습니다. 연결된 장치의 이름을 얻는 방법에 대한 아이디어가 있습니까?
kamziro

이 게시물에 따르면 특수 하드웨어가 없으면 불가능합니까? blog.andrew.net.au/2009/01/17
NoBugs

7
sudo를 사용하더라도 권한 거부 오류가 발생합니다!
Wally

3
sudo를 사용한 후에도 "권한이 거부되었습니다"
Raulp

2
형식의 명령 이 출력을sudo foo > bar 으로 직접 보낸 다음barfoosudo 구문을 사용하여 실행 되므로 권한이 거부 됩니다 . 리디렉션은 루트 액세스 권한을 얻기 전에 발생하므로 실패합니다. 해결책은을 사용하는 sudo sh -c 'echo disabled > /sys/bus/usb/devices/usb1/power/wakeup'것입니다. 루트를 얻고 새로운 지옥을 실행하여 리디렉션을 수행 한 다음 리디렉션 된 파일 설명자에 무언가를 출력하십시오.
발굴

60

문서 에 따르면 커널 2.6.32 에서 USB 전원 관리에 몇 가지 변경 사항이 있었으며 2.6.38 에서 해결 된 것으로 보입니다 . 이제 특정 장치 드라이버에 의해 제어되는 장치가 유휴 상태 가 될 때까지 기다려야합니다 . 드라이버가 지원해야합니다. 그렇지 않으면 장치가이 상태에 도달하지 않습니다. 불행하게도, 이제 사용자는 이것을 강제 할 기회가 없습니다. 그러나 운이 좋으면 기기가 유휴 상태가 될 수 있으면이 기능을 끄려면

echo "0" > "/sys/bus/usb/devices/usbX/power/autosuspend"
echo "auto" > "/sys/bus/usb/devices/usbX/power/level"

또는 2.6.38 이상의 커널의 경우 :

echo "0" > "/sys/bus/usb/devices/usbX/power/autosuspend_delay_ms"
echo "auto" > "/sys/bus/usb/devices/usbX/power/control"

이것은 말 그대로 장치가 유휴 상태가 된 순간에 일시 중단됨을 의미 합니다.

따라서 팬이 장치로 볼 수 있고 드라이버가 제어 할 수있는 "지능형"장치가 아닌 경우 현재 커널에서 많은 운이 없을 것입니다.


USB 장치의 전원이 계속 꺼질 것 같습니다 ... (?)이 작업을 수행 한 후에 어떻게 전원을 다시 시작해야합니까? 내 목표는 장치를 한 번 다시 시작하여 서스펜션 구성을 영구적으로 변경하지 않는 것입니다.
matanster

4
일시 중지 된 기기 를 재개 하려면을 사용하여 "autosuspend"를 다시 비활성화 할 수 echo "on" > "/sys/bus/usb/devices/usbX/power/control"있지만 원래 목적을 이해해야한다고 생각합니다. 자동 일시 중지 기능은 유휴 장치가 저전력 상태 (꺼져있는 것처럼 보일 수 있음)로 들어갈 수 있도록하기위한 것입니다. 호스트 나 외부 이벤트에 의해 필요할 때 나중에 다시 시작할 수 있습니다. 자동으로 발생합니다. 포트 자체는 실제로 절대로 꺼지지 않습니다. 실제로, 문서를 읽으십시오 ;)
tlwhitec

4
커널> 3.10에서 작동하는지 확인할 수 있습니다. 사용중인 장치 "id"가 올바른지 확인 dmesg | grep "usb"하고 "usb"뒤에 숫자 usb 2-4.4: SerialNumber: A0848020를 사용하십시오 /sys/bus/usb/devices/2-4.4/power/.... 예를 들면 다음과 같습니다 .. 또한 장치를 사용하고 있지 않은지 확인하십시오. 이 프로세스를 단순화
lepe

연결될 때마다 기본값으로 다시 변경되지 않도록이 구성을 저장하는 방법이 있습니까? 충전하기 위해 전원 제어를 "켜기"로 설정해야하는 장치가 있습니다.
quickblueblur

@quickblueblur는 udev 규칙 처럼 들립니다 .
tlwhitec

24

적어도 올바르게 구성된 Terminus FE 1.1 USB 허브 칩에서 작동하는 이러한 솔루션을 발견했습니다.

1. 허브의 모든 USB 포트에서 전원을 끄려면 다음을 사용하여 허브에서 커널을 바인딩 해제 할 수 있습니다.

echo "1-4.4.4" > /sys/bus/usb/drivers/usb/unbind

전원을 다시 켜려면-

echo "1-4.4.4" > /sys/bus/usb/drivers/usb/bind

내가 사용 할 수 있었다 : 개별적으로 각 포트에서 전원을 2.Switching하는 것은 까다 롭습니다 hubpower을 각 포트를 제어하는 -하지만 단점과 함께 제공 : hubpower 첫 번째 연결이 끊어 적어도 우분투 시스템에서 disconect에 USB 장치의 모든 원인 느릅 나무 usbdevfs :

usb_ioctl.ioctl_code = USBDEVFS_DISCONNECT;
rc = ioctl(fd, USBDEVFS_IOCTL, &usb_ioctl);

이 기능을 ioctl비활성화 하면 모든 장치를 분리하지 않고 개별 포트 전원을 끌 수 있었지만 전원이 즉시 다시 켜집니다 (아마 커널이 초기화되지 않은 장치를보고 있기 때문에) 일반적으로하고 싶었다. 패치 된 허브 파워가 여기 있습니다


바인드 / 바인드 해제 항목은 Linux 커널 2.6.34, ICH8 칩셋 및 Ubuntu 10.04에서 작동하는 것으로 확인되었습니다.
user1357196

5
바인드 / 바인드 해제는 칩셋에 관계없이 USB 포트의 전원을 끄지 않습니다. 이 장치는 여전히 ... 힘을 얻는다
themihai

1
마우스 레이저가 꺼져 있고, 키보드를 사용할 수없고, 모뎀이 깜박임을 멈 춥니 다. – 모든 플랫폼에서
정상

24

Intel의 PowerTOP 을 사용하면 USB 주변 장치와 같은 장치를 실시간으로 전환 할 수 있습니다. 이것을 '튜너 블'이라고합니다.

sudo apt install powertop
sudo powertop
  • '튜너 블'로 탭합니다.
  • 기기로 스크롤합니다.
  • 절전 모드를 전환하려면 Enter 키를 누르십시오 ( 양호 / 나쁨 )

여기에 이미지 설명을 입력하십시오

참고 것을 나쁜는 장치가 항상 의미합니다. 에 토글 좋은 것은 (기본값은 2000ms입니다) 사전 설정 비활성 절약 시간 후 장치를 끌 것입니다.

이러한 변경 사항을 영구적으로 유지하는 방법에 대한 자세한 내용은 PowerTOP 문서를 참조하십시오 .
이 스레드의 다른 포스터에서 설명한 것처럼 구성 스크립트를 생성합니다.

참고 :이 스크립트는 항상 켜져있는 USB 핀 전원에 영향을 미치지 않습니다.
장치를 활성화 및 비활성화하기 위해 드라이버 프로토콜 만 보냅니다.

핀 전원을 제어하려면 지원되는 스마트 USB 허브 또는 더 나은 마이크로 컨트롤러를 사용할 수 있습니다.


2
대박! : DI는 이것이 사용자에게 가장 친근한 방법이라고 생각합니다 (낮은 수준에서는 다른 답변에 설명 된 것과 동일한 작업을 수행하지만). 감사합니다. 귀하의 답변이 최상위에 도달 할 수도 있습니다.)
Matyas

1
답변 주셔서 감사합니다. 사전 설정된 비활성 저장 시간을 변경하기 위해 파기를 시작해야하는 곳은 어디입니까?
mikezter

이전 포스터에서 언급했듯이 커널 문서는 다음과 같습니다. kernel.org/doc/Documentation/usb/power-management.txt
Dominic Cerisano

10

내 도구 uhubctl 을 사용 하여 호환되는 USB 허브의 포트 당 USB 전원을 제어 할 수 있습니다 .


osx에서 훌륭한 도구이지만 데비안에서 '지원되는 스마트 허브'를 찾지 못했습니다.
지터

1
Linux에서는 루트로 실행하거나 (sudo에서) udev 장치 권한을 구성해야합니다. Linux 호스트에 호환 가능한 허브가 연결되어 있지 않을 수도 있습니다.
mvp

그것은 '비글 본 그린'btw입니다.
지터

7

나는 이것을하고 싶었고 USB 하드웨어로는 할 수 없었습니다. 나는 그것을하는 방법을 해킹 한 방법으로 썼다 :

http://pintant.cat/2012/05/12/power-off-usb-device/ .

짧은 방법으로 : 나는 USB 릴레이를 사용하여 다른 USB 케이블 의 V CC 를 열고 닫았습니다 ...


5
echo '2-1' |sudo tee /sys/bus/usb/drivers/usb/unbind

우분투에서 작동


1
귀하는 본인의 사례에서 효과가있는 유일한 솔루션입니다. Acer make laptop 12.04LTS Ubuntu를 사용하고 있습니다.
RicoRicochet

1
장치의 전원을 끄지 않고 장치 목록에서만 장치를 제거합니다. USB 포트의 전원을 끄려면 어떻게해야합니까?
rustyx

1
이 솔루션은 또한 Wacom Intuos5 touch M 태블릿의 전원을 끄지 않고 전원을 끄는 데 도움이되는 유일한 솔루션입니다 (Fedora 28에서)
user1738984

2

USB 5v 전원은 항상 켜져 있습니다 (컴퓨터가 꺼져 있거나 일부 컴퓨터 및 일부 포트에서는). 스위치를 사용하여 Arduino를 프로그래밍하고 USB에 연결된 직렬 라이브러리를 통해 Arduino를 제어해야 할 수도 있습니다. 컴퓨터.

다시 말해, 스위치 튜토리얼 과이 튜토리얼을 시리얼 라이브러리를 통해 USB를 통해 연결된 Arduino와 통신 하는 방법에 대한 조합입니다 .


2

사람들이 이와 같은 질문을 게시하는 이유는 " EVIL "-USB 자동 일시 중단 " 기능 " 이 끔찍하기 때문 입니다.

자동 일시 중단은 "유휴"USB 장치에 전원을 공급하고 장치 드라이버가이 기능을 올바르게 지원하지 않으면 장치에 접촉 할 수 없게됩니다. 따라서 USB 포트를 켜고 끄는 것은 문제 자체가 아니라 문제의 증상입니다.

GLOBALLY가 자동 일시 중단을 비활성화 하는 방법을 보여 드리 므로 USB 포트를 수동으로 켜고 끌 필요가 없습니다.

짧은 답변:

당신은 편집 "할 필요가 없습니다 autosuspend_delay_ms USB의 autosuspend 세계적 및 해제 할 수 있습니다 : 개별적으로" 지속적으로 다음 명령을 사용하여 :

sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="/&usbcore.autosuspend=-1 /' /etc/default/grub

update-grub

systemctl reboot

우분투 18.04 화면 잡아 내 결과를 달성 한 방법을 보여주는 "긴 대답"의 끝에 다음과 같습니다.

긴 답변 :

그것은 사실이다 USB 전원 관리 커널 문서 상태의 autosuspend은 더 이상 사용되지되어야하며, 그 '장소'에서의 autosuspend_delay_ms 해제 USB의 autosuspend에 사용 "

"In 2.6.38 the "autosuspend" file will be deprecated
and replaced by the "autosuspend_delay_ms" file."

그러나 내 테스트에 따르면 아래의 / etc / default / grub 설정 usbcore.autosuspend=-1은 USB 자동 일시 중단 기능을위한 글로벌 토글 로 사용될 수 있습니다 . 개별 " autosuspend_delay_ms "파일 을 편집 할 필요 는 없습니다 .

위에 링크 된 동일한 문서 는 "0"의 값이 ENABLED 이고 음의 값이 DISABLED 임을 나타냅니다 .

power/autosuspend_delay_ms

    <snip> 0 means to autosuspend
    as soon as the device becomes idle, and negative
    values mean never to autosuspend.  You can write a
    number to the file to change the autosuspend
    idle-delay time.

아래의 주석이 달린 Ubuntu 18.04 화면 캡처에서 내 결과가 어떻게 달성되고 재현 가능한지 설명 하는 autosuspend_delay_ms 의 기본값은 "0"( 활성화 )입니다 .

그런 후 있습니다 설정 usbcore.autosuspend=-1브에서,이 값은 현재 마이너스 (있는 장애인 재부팅 후). 이렇게하면 개별 값을 편집하지 않아도되며 이제 USB 자동 일시 중지 기능을 비활성화 할 수 있습니다.

screengrab : 전역 편집 전과 후에 자동 일시 중단 값

이것이 USB 자동 일시 중지 기능을 좀 더 쉽고 스크립트 가능하게 만듭니다.


1

내 안드로이드 폰을 연결할 때 문제가 발생했습니다. 전원 스위치를 껐다가 켜서 휴대폰을 충전 할 수 없었습니다.

echo 'on' | sudo tee /sys/bus/usb/devices/1-1/power/control
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.