Linuxで手動でUSBから電源をオン/オフにすることは可能ですか?
この外部USB冷却ファン(PCではなく、自分を冷やすために使用するもの)があり、ファンを遠くのどこかに配置したいので、ターミナルから制御できると便利です。
USBのおもちゃがたくさんあるので、これは他のさまざまなことにも役立つと思います。空気清浄機などかもしれません(実際には機能しないそうです)。
Linuxで手動でUSBから電源をオン/オフにすることは可能ですか?
この外部USB冷却ファン(PCではなく、自分を冷やすために使用するもの)があり、ファンを遠くのどこかに配置したいので、ターミナルから制御できると便利です。
USBのおもちゃがたくさんあるので、これは他のさまざまなことにも役立つと思います。空気清浄機などかもしれません(実際には機能しないそうです)。
回答:
注意。この回答の情報は、古いカーネル(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
sudo foo > bar
送信するように解析され、次にを使用して実行されるため、権限が拒否されました。ルートアクセスを取得する前にリダイレクトが発生するため、リダイレクトは失敗します。解決策は、を使用することです。ルートを取得し、新しい地獄を実行してリダイレクトを実行し、リダイレクトされたファイル記述子に何かを出力します。bar
foo
sudo
sudo sh -c 'echo disabled > /sys/bus/usb/devices/usb1/power/wakeup'
ドキュメントによると、カーネル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"
これは文字通り、一時停止します、デバイスがアイドル状態になった瞬間ます。
したがって、ファンがデバイスとして認識され、ドライバによって制御される「インテリジェント」なファンでない限り、現在のカーネルではあまり運が悪いでしょう。
echo "on" > "/sys/bus/usb/devices/usbX/power/control"
、元の目的を理解する必要があると思います。自動サスペンド機能は、アイドリングデバイスが低電力状態(電源がオフになっているように見える場合がある)に入ることができるようにするためだけのものであり、ホストまたは何らかの外部イベントのいずれかによって、後で必要になったときにのみ再開されます。それは自動的に起こります(または起こるはずです)。ポート自体が実際にオフにされることはありません。本当に、ドキュメントを読んでください;)
dmesg | grep "usb"
たとえば、「usb」の後にある番号usb 2-4.4: SerialNumber: A0848020
を使用します/sys/bus/usb/devices/2-4.4/power/...
。たとえば、次のように使用します。また、デバイスが使用中でないことを確認してください。このプロセスを簡略化
私は、適切に構成された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デバイスに「コールドリスタート」を実行させるだけです。一般的にやりたかった。私のパッチを当てたハブパワーはこちら
IntelのPowerTOPを使用すると、USB周辺機器などのデバイスをリアルタイムで切り替えることができます。これらは「チューナブル」と呼ばれます。
sudo apt install powertop
sudo powertop
Badはデバイスが常にオンであることを意味することに注意してください。トグル良いです(デフォルトは2000ミリ秒です)プリセット非アクティブ節電時間後にデバイスをオフにします。
これらの変更を永続的にする方法の詳細については、PowerTOPのドキュメントを参照してください。
それはあなたのために設定スクリプトを生成します(このスレッドの他のポスターで説明されているものとかなり同じです)。
注:これらのスクリプトはUSBピンの電源には影響しません(常にオンです)。
これらは、デバイスをアクティブ化および非アクティブ化するためのドライバープロトコルのみを送信します。
ピンの電力を制御する場合は、サポートされているスマートUSBハブを使用するか、マイクロコントローラーを使用します。
私はこれをやりたかったのですが、私のUSBハードウェアではできませんでした。ここでそれを行う方法をハックな方法で書いた:
http://pintant.cat/2012/05/12/power-off-usb-device/。
簡単に言うと、USBリレーを使用して別のUSBケーブルのV CCを開閉しました...
echo '2-1' |sudo tee /sys/bus/usb/drivers/usb/unbind
Ubuntuのために働く
このような質問を投稿する理由は、恐ろしい「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自動サスペンドを無効にするスクリプトを作成できます。
これにより、USBの自動サスペンドを無効にすることが少し簡単になり、スクリプトが作成しやすくなります。
power/level
は現在非推奨です。power/control
代わりに使用してください。(power/wakeup
大丈夫です。)さらに、「auto」と「on」だけを受け入れ、もはや「suspend」は受け入れません。「自動」は十分にスマートであり、アイドル中に電源がオフにされない場合、それはデバイスの故障です。とにかく手動で電源を切ることはできません。詳しくは、以下のtlwhitecによる回答とカーネルのドキュメントをご覧ください:kernel.org/doc/Documentation/usb/power-management.txt