LinuxでのUSB電源の制御(オン/オフ)


164

Linuxで手動でUSBから電源をオン/オフにすることは可能ですか?

この外部USB冷却ファン(PCではなく、自分を冷やすために使用するもの)があり、ファンを遠くのどこかに配置したいので、ターミナルから制御できると便利です。

USBのおもちゃがたくさんあるので、これは他のさまざまなことにも役立つと思います。空気清浄機などかもしれません(実際には機能しないそうです)。


9
Linuxの要約> = 2.6.38:ファイル power/level は現在非推奨です。 power/control 代わりに使用してください。(power/wakeup大丈夫です。)さらに、「auto」と「on」だけを受け入れ、もはや「suspend」は受け入れません。「自動」は十分にスマートであり、アイドル中に電源がオフにされない場合、それはデバイスの故障です。とにかく手動で電源を切ることはできません。詳しくは、以下のtlwhitecによる回答とカーネルのドキュメントをご覧ください:kernel.org/doc/Documentation/usb/power-management.txt
teika kazura 2013


2
この機能は本当に良いGUIに値します
mikebabcock

特別なハードウェアは必要ですか?それは、答えは全く明らかではない
VojtěchDohnal

回答:


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 2011年

この投稿によると、特別なハードウェアなしではそれは不可能ですか? blog.andrew.net.au/2009/01/17
NoBugs

7
sudoを使用しても権限拒否エラーが発生します!
ウォーリー2014

3
sudoを使用した後でも「許可は拒否されました」と同じ
Raulp

2
の形式のコマンドは、出力をにsudo foo > bar送信するように解析され、次にを使用して実行されるため、権限が拒否されました。ルートアクセスを取得する前にリダイレクトが発生するため、リダイレクトは失敗します。解決策は、を使用することです。ルートを取得し、新しい地獄を実行してリダイレクトを実行し、リダイレクトされたファイル記述子に何かを出力します。barfoosudosudo 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デバイスの電源が継続的にオフになるようです...(?)これが機能した後、私はどのようにして電源を再開する必要がありますか?私の目標は、一時停止構成を永続的に変更するのではなく、デバイスを1回再起動することです。
matanster 2013

4
一時停止したデバイスを再開するには、で「自動一時停止」を再び無効にできますがecho "on" > "/sys/bus/usb/devices/usbX/power/control"、元の目的を理解する必要があると思います。自動サスペンド機能は、アイドリングデバイスが低電力状態(電源がオフになっているように見える場合がある)に入ることができるようにするためだけのものであり、ホストまたは何らかの外部イベントのいずれかによって、後で必要になったときにのみ再開されます。それは自動的に起こります(または起こるはずです)。ポート自体が実際にオフにされることはありません。本当に、ドキュメントを読んでください;)
tlwhitec 2013

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.各ポートで個別に電源を切り替えるのは難しいです:私はハブパワーを使用して各ポートを制御できましたが、欠点があります:ハブパワーが最初にusbdevfsを切断すると、少なくともubuntuではすべてのUSBデバイスがシステムから切断されます:

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

これをioctl無効にすると、すべてのデバイスを切り離すことなく個々のポートの電源をオフにすることができましたが、電源がすぐにオンになり(おそらくカーネルが初期化されていないデバイスを参照しているため)、USBデバイスに「コールドリスタート」を実行させるだけです。一般的にやりたかった。私のパッチを当てたハブパワーはこちら


bind / unbindエントリは、Linuxカーネル2.6.34、ICH8チップセット、Ubuntu 10.04で動作することが確認されています。
user1357196 2013

5
bind / unbindは、チップセットに関係なくUSBポートの電源を切りません。デバイスはまだ電力を供給しています...
themihai 2014年

1
マウスレーザーがオフ、キーボードがタイプできず、モデムが点滅しなくなった-私のプラットフォームではすべて
正常

24

IntelのPowerTOPを使用すると、USB周辺機器などのデバイスをリアルタイムで切り替えることができます。これらは「チューナブル」と呼ばれます。

sudo apt install powertop
sudo powertop
  • 「調整可能パラメータ」にタブで移動します。
  • デバイスまでスクロールします。
  • Enterキーを押して省電力モードを切り替えます(良い / 悪い

ここに画像の説明を入力してください

Badはデバイスが常にオンであることを意味することに注意してください。トグル良いです(デフォルトは2000ミリ秒です)プリセット非アクティブ節電時間後にデバイスをオフにします。

これらの変更を永続的にする方法の詳細については、PowerTOPのドキュメントを参照してください。
それはあなたのために設定スクリプトを生成します(このスレッドの他のポスターで説明されているものとかなり同じです)。

注:これらのスクリプトはUSBピンの電源には影響しません(常にオンです)。
これらは、デバイスをアクティブ化および非アクティブ化するためのドライバープロトコルのみを送信します。

ピンの電力を制御する場合は、サポートされているスマートUSBハブを使用するか、マイクロコントローラーを使用します


2
驚くばかり!:DIは、これがユーザーフレンドリな方法だと思います(低レベルでは、他の回答で概説されているのと同じ操作を行います)。ありがとうございます。回答がトップに到達するかもしれません;)
Matyas

1
ご回答有難うございます。事前に設定された非アクティブな節約時間を変更するには、どこから掘り始める必要がありますか?
mikezter 2016

以前のポスターで述べたように、カーネルのドキュメントはここにあります: kernel.org/doc/Documentation/usb/power-management.txt
Dominic Cerisano

10

私のツールuhubctlを使用して、互換性のあるUSBハブのポートごとのUSB電力を制御できます。


osxの細かいツールですが、debianで「サポートされているスマートハブ」が見つかりません。
ジッタ

1
Linuxでは、(sudoの下で)rootとして実行するか、udevデバイスの権限を設定する必要があります。Linuxホストに互換性のあるハブが接続されていない可能性もあります。
mvp 2018年

それは「ビーグルボーングリーン」です。
ジッタ


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

Ubuntuのために働く


1
あなたが私のケースで機能した唯一のソリューションです。私はacer makeラップトップ12.04LTS Ubuntuを使用しています。
RicoRicochet 14

1
デバイスの電源をオフにせず、デバイスリストから削除するだけです。USBポートの電源をオフにするにはどうすればよいですか?
rustyx 2014

1
これは、Wacom Intuos5タッチMタブレットのプラグを抜かずに電源をオフにするために私に役立つ唯一のソリューションでもあります(Fedora 28)
user1738984

2

USB 5v電源は常にオンになっています(コンピューターの電源がオフの場合でも、一部のコンピューターおよび一部のポートで)。おそらく、ある種のスイッチでArduinoをプログラムし、USBに接続されたシリアルライブラリを介して制御する必要があります。コンピューター。

つまり、このスイッチのチュートリアルとシリアルライブラリを介してUSB経由で接続されたArduinoに通信するためのチュートリアルの組み合わせです。


2

このような質問を投稿する理由は、恐ろしい「EVIL」-USB Auto-Suspend 機能によるものです。」によるものです。

自動サスペンドは、「アイドル」のUSBデバイスへの電力を下げ、デバイスのドライバーがこの機能を正しくサポートしない限り、デバイスは接続できなくなる可能性があります。したがって、USBポートの電源のオン/オフは、問題自体の問題ではなく、問題の症状です。

グローバルな方法をお見せします自動サスペンド無効にし、USBポートのオンとオフを手動で切り替える必要ます。

短い答え:

あなたが編集「する必要はありませんautosuspend_delay_msのUSB自動サスペンドはグローバルに無効にすることができます。個別に」持続的に以下のコマンドを使用して:

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

update-grub

systemctl reboot

Ubuntuの18.04スクリーングラブは自分の結果が達成されたかを示す「ロング回答」の最後に、次の。

長い答え:

それは事実だUSB電源管理カーネルドキュメントの状態の自動サスペンドは廃止されるべきであり、その場所『の中autosuspend_delay_ms無効のUSB自動サスペンドに使用します』:

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

もつとも、私のテストでは、その設定が明らかusbcore.autosuspend=-1ある/ etc / default / grubのをとして使用することができ、以下のようGLOBALあなたはfunctionality-のUSB自動サスペンドのためにトグルしないで、「編集個々に必要autosuspend_delay_ms」ファイルを。

同じ文書上記にリンクされているは、値「0」が有効負の値が無効であると記載されています。

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」(有効)になっています。ます。

次に、Grubでのみ設定usbcore.autosuspend=-1した後、再起動後にこれらの値が負(disable)になることに注意してください。これにより、個々の値を編集する手間が省け、USB自動サスペンドを無効にするスクリプトを作成できます。

screengrab:グローバル編集前後の値の自動一時停止

これにより、USBの自動サスペンドを無効にすることが少し簡単になり、スクリプトが作成しやすくなります。


1

Androidスマートフォンを接続するときに問題が発生しました。電源スイッチをオンにしてからオフにしたため、スマートフォンを充電できませんでした。PowerTopでこの設定を見つけることができ、問題を修正するのに役立ちました(自動値が原因で問題が発生していました):

echo 'on' | sudo tee /sys/bus/usb/devices/1-1/power/control
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.