Linux ile bir USB güç kaynağını kontrol etme (açık / kapalı)


164

Linux ile USB'den güç kaynaklarını manuel olarak açmak / kapatmak mümkün müdür?

Bu harici USB soğutma fanı var (PC'yi değil, kendinizi soğutmak için kullandığınız tür) ve terminalden kontrol edebilmek güzel olurdu, çünkü fanı uzak bir yere yerleştirmek istiyorum.

Bunun çeşitli başka şeyler için de yararlı olabileceğini düşünüyorum, çünkü orada bir sürü USB oyuncak var. Belki hava temizleyicileri vb. (Gerçekten işe yaramadıklarını duydum).


9
Linux için özetleyeyim> = 2.6.38: Dosya power/level şimdi kullanımdan kaldırıldı; kullanmak power/control yerine . ( power/wakeupTamam.) Ayrıca, artık "askıya almayı" değil, sadece "otomatik" ve "açık" kabul eder. "auto" yeterince akıllıdır ve boşta iken güç kapatılmazsa, cihazın hatasıdır. Her neyse, gücü manuel olarak kapatamazsınız. Daha fazla bilgi için, tlwhitec ve çekirdeğin dokümanı tarafından aşağıdaki cevaba bakınız : kernel.org/doc/Documentation/usb/power-management.txt
teika kazura


2
Bu özellik gerçekten iyi bir GUI hak ediyor
mikebabcock

Herhangi bir özel donanım gerektiriyor mu? Cevaplardan pek açık değil
Vojtěch Dohnal

Yanıtlar:


63

Not. Bu yanıttaki bilgiler daha eski çekirdekler için geçerlidir (2.6.32'ye kadar). Daha yeni çekirdekler hakkında bilgi için tlwhitec'in cevabına bakınız .

# 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'i usb n'ye değiştirmeniz gerekebilir )

Kaynak: Dokümantasyon / usb / power-management.txt.gz


1
Vay, bunun için teşekkürler. Ne olursa olsun libUSB'den geçmek zorunda olduğumu düşünüyordum. Ekli cihazların adlarını nasıl alacağınız hakkında bir fikriniz var mı?
21'de kamziro

Bu mesaja göre, özel donanım olmadan mümkün değil mi? blog.andrew.net.au/2009/01/17
NoBugs

7
Sudo kullansam bile izin verilmedi hatası alıyorum!
Wally

3
sudo kullandıktan sonra bile benim için aynı "izin reddedildi"
Raulp

2
Şeklinde bir komut çünkü izni engellendi sudo foo > barolarak ayrıştırılır çıktı yönlendirmek bar, daha sonra çalıştırın fookullanaraksudo . Yeniden yönlendirme başarısız olur çünkü kök erişimi almadan önce gerçekleşir. Çözüm kullanmaktır sudo sh -c 'echo disabled > /sys/bus/usb/devices/usb1/power/wakeup've böylece: root kazanın, yönlendirme yapmak için yeni bir cehennem çalıştırın, sonra yeniden yönlendirilen dosya tanımlayıcısına bir şeyler verin.
kazmak

61

Dokümanlara göre , USB güç yönetiminde 2.6.38'e yerleşmiş gibi görünen 2.6.32 çekirdeklerinden birkaç değişiklik yapıldı . Şimdi, cihazın belirli bir aygıt sürücüsü tarafından yönetilen boşta kalmasını beklemeniz gerekir . Sürücünün desteklemesi gerekiyor, aksi takdirde cihaz bu duruma asla ulaşamaz. Ne yazık ki, şimdi kullanıcının bunu zorlama şansı yok. Ancak, şanslıysanız ve cihazınız boşta kalabilirse, bunu kapatmak için yapmanız gerekenler:

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

veya 2.6.38 ve üstü çekirdekler için:

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

Bu kelimenin tam anlamıyla , cihaz boşta kaldığı anda askıya alın anlamına gelir.

Dolayısıyla, fanınız bir cihaz olarak görülebilen ve bir sürücü tarafından kontrol edilebilen "akıllı" bir şey değilse, muhtemelen mevcut çekirdeklerde çok fazla şansınız olmayacaktır.


Bu, USB cihazının sürekli olarak kapanmasına neden olacak gibi görünüyor ... (?) Bu çalıştıktan sonra güç benim tarafımdan nasıl devam ettirilmelidir? Amacım askıya alma yapılandırmasını kalıcı olarak değiştirmek değil, cihazı bir kez yeniden başlatmak.
matanster

4
To devam asılı bir cihaz, tekrar ile "otomatik askıya almayı" devre dışı bırakabilir echo "on" > "/sys/bus/usb/devices/usbX/power/control", ama orijinal amacını anlamak gerek. Otomatik askıya alma özelliği, yalnızca rölanti cihazlarının düşük güç durumuna (kapalı görünebileceği yerlerde) girmesini sağlamak için, yalnızca daha sonra gerek ana bilgisayar gerekse harici bir olay tarafından devam ettirilmek üzere. Bu otomatik olarak gerçekleşir (veya olması gerekir). Limanın kendisi aslında hiçbir zaman gerçekten kapanmaz. Gerçekten, belgeleri okuyun ;)
tlwhitec

4
> 3.10 çekirdekleri ile çalıştığını onaylayabilirim. : Sadece kullandığınız cihazı "id" doğru olduğundan emin olmak zorunda dmesg | grep "usb"ve örneğin, "usb" sonra numarayı kullanın: usb 2-4.4: SerialNumber: A0848020Eğer kullanacağız: /sys/bus/usb/devices/2-4.4/power/.... Ayrıca, cihazın kullanımda olmadığından emin olun. Bu işlemi basitleştirmek için
lepe

Bu yapılandırmayı her takıldığında yeniden varsayılanlara dönmeyecek şekilde kaydetmenin bir yolu var mı? Şarj olması için güç kontrolünü "açık" olarak ayarlamam gereken bir cihazım var.
quickblueblur

@quickblueblur bana bir udev kuralı gibi geliyor .
tlwhitec

24

En azından doğru yapılandırılmış Terminus FE 1.1 USB hub çipi için çalışan bu çözümleri buldum:

Bir hub'ın tüm USB bağlantı noktalarındaki gücü kapatmak için, hub'ı kullanarak çekirdeğin bağlantısını kesebilirsiniz:

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

gücü tekrar açmak için - düğmesini kullanarak geri bağlayabilirsiniz.

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

2. her bağlantı noktasında ayrı ayrı güç değiştirmek daha zor: Her bağlantı noktasını kontrol etmek için hubpower kullanabildim - ama bir dezavantajı var: hubpower ilk önce tüm USB cihazlarının sistemden ayrılmasına neden olan usbdevfs bağlantısını keser, en azından ubuntu'da :

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

Bu ioctldevre dışı bırakıldığında, tüm aygıtları ayırmadan ayrı bağlantı noktası gücünü kapatabiliyordum - ancak güç hemen geri dönüyor (muhtemelen başlatılmamış bir aygıtı görmesi nedeniyle çekirdek), USB aygıtının sadece "soğuk yeniden başlatma" yapmasına neden oluyor. genellikle yapmak istedim. Yamalı hub gücüm burada


Bağlama / açma girişlerinin linux çekirdek 2.6.34, ICH8 yonga seti ve Ubuntu 10.04 üzerinde çalıştığı onaylanmıştır.
user1357196

5
bind / unbind, chipsetten bağımsız olarak USB bağlantı noktasını kapatmaz. Cihaz hala güç alıyor ...
themihai

2
fare lazer kapalı, klavye cant tipi, modem yanıp sönmeyi kesiyor - hepsi benim platformumda iyi
eri

24

Intel'den PowerTOP , usb çevre birimleri gibi cihazları gerçek zamanlı olarak değiştirmenizi sağlar. Bunlara 'ayarlanabilirler' denir.

sudo apt install powertop
sudo powertop
  • Sekme tuşlarını 'ayarlanabilirler'e yönlendirin.
  • Cihazınıza ilerleyin.
  • Güç tasarrufu modunu değiştirmek için enter tuşuna basın ( İyi / Kötü )

resim açıklamasını buraya girin

Kötü seçeneğinin , cihazın her zaman açık olduğu anlamına geldiğini unutmayın . Ye geçmek İyi (varsayılan 2000 ms olan) önceden ayarlanmış inaktif tasarrufu süre sonra cihazı kapanacaktır.

Bu değişikliklerin nasıl kalıcı hale getirileceğiyle ilgili ayrıntılar için PowerTOP belgelerine bakın .
Sizin için yapılandırma komut dosyalarını oluşturur (bu konudaki diğer posterler tarafından açıklandığı gibi).

NOT: Bu komut dosyaları USB pin gücünü etkilemez (bu her zaman açıktır).
Bunlar, yalnızca bir aygıtı etkinleştirmek ve devre dışı bırakmak için sürücü protokolünü gönderir.

Pin gücünü kontrol etmek istiyorsanız, desteklenen bir akıllı USB hub veya daha iyisi bir mikro denetleyici kullanabilirsiniz .


2
Müthiş! : DI bu teşekkürler ve cevap top ulaşabilir (. Alçak seviyede, diğer yanıtlar belirtildiği gibi aynı işlemleri yapar rağmen) bunu yapmak için userfriendliest yolu olduğunu düşünüyorum;)
Matyas

1
Cevabınız için teşekkürler. Önceden ayarlanmış etkin olmayan tasarruf süresini değiştirmek için nerede kazmaya başlamam gerekir?
mikezter

Önceki posterlerde belirtildiği gibi, çekirdek dokümanlar burada: kernel.org/doc/Documentation/usb/power-management.txt
Dominic Cerisano

10

Uyumlu USB hub'ları için port başına USB gücünü kontrol etmek için uhubctl aracımı kullanabilirsiniz .


osx üzerinde iyi bir araç, ama debian benim için herhangi bir 'desteklenen akıllı hub' bulamıyor.
jitter

1
Linux'ta, kök (sudo altında) olarak çalıştırmanız veya udev aygıt izinlerini yapılandırmanız gerekir. Linux ana makinenizde uyumlu hub'lar bulunmaması da mümkündür.
mvp

Bu bir 'beagle kemik yeşili' btw.
jitter


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

Ubuntu için çalışıyor


1
SİZİN DURUMDA ÇALIŞAN TEK ÇÖZÜM. Bir dizüstü bilgisayar yapmak 12.04LTS Ubuntu acer kullanıyorum.
RicoRicochet

1
Aygıtı kapatmaz, yalnızca aygıt listesinden kaldırır. USB bağlantı noktasına nasıl güç verebilirim?
rustyx

1
Bu aynı zamanda bir Wacom Intuos5 touch M tableti çıkarmadan (Fedora 28'de) kapatmak için benim için çalışan tek çözümdür
user1738984

2

USB 5v gücü her zaman açıktır (bilgisayar kapalıyken, bazı bilgisayarlarda ve bazı bağlantı noktalarında bile.) Muhtemelen bir çeşit anahtarla bir Arduino programlamanız ve USB'ye takılı USB'den Seri kitaplık aracılığıyla kontrol etmeniz gerekecektir. bilgisayar.

Başka bir deyişle, bu anahtar öğreticisinin ve Seri libary yoluyla USB üzerinden takılı Arduino'ya iletişim kurma üzerine bu öğreticinin bir kombinasyonu .


2

İnsanların böyle sorular göndermesinin nedeni, korkunç - gerçekten de " EVIL " - USB Auto-Suspend " özelliğinden " kaynaklanmaktadır.

Otomatik askıya alma, gücü "boşta" bir USB aygıtına indirir ve aygıtın sürücüsü bu özelliği doğru bir şekilde desteklemediği sürece aygıtla bağlantı kurulamaz. Bu nedenle, bir USB bağlantı noktasını açmak / kapatmak, sorunun kendisinin değil, sorunun bir belirtisidir.

KÜRESEL OLARAK nasıl olduğunu göstereceğimOtomatik olarak askıya almayı devre dışı bırakacağınızı , USB bağlantı noktalarını manuel olarak açıp kapama ihtiyacını ortadan kaldıracağım:

Kısa cevap:

" Autosuspend_delay_ms " öğesini tek tek düzenlemeniz GEREKMEZ : USB otomatik askıya alma aşağıdaki komutları kullanarak global olarak ve KİŞİSEL OLARAK devre dışı bırakılabilir :

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

update-grub

systemctl reboot

Bir Ubuntu 18.04 ekran kapmak benim sonuçlar elde nasıl gösteren "Uzun Yanıt" sonunda izler.

Uzun cevap:

Bu doğrudur USB Güç Yönetimi Çekirdek Belgeleri durumları otomatik askıya almayı kaldırılacaktır için ve onun yer 'in autosuspend_delay_ms sakatlar USB otomatik askıya almayı kullanılan':

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

ANCAK benim test bu ayarı ortaya koymaktadır usbcore.autosuspend=-1içinde / etc / default / grub bir olarak kullanılabilir aşağıda GLOBAL sen do işlevsellik-USB otomatik askıya almayı için geçiş DEĞİL "düzenlemek bireye ihtiyaç autosuspend_delay_ms " dosyaları.

Yukarıda bağlantılı olan aynı belge "0" değerinin ETKİN olduğunu ve negatif değerin DEVRE DIŞI olduğunu belirtir :

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.

Açıklamalı olarak Ubuntu 18.04 benim sonuçların elde (ve tekrarlanabilir) nasıl gösteren aşağıdaki ekran kepçeyle, varsayılan açıklama lütfen "0" ( etkin olarak) autosuspend_delay_ms .

Sonra SADECEusbcore.autosuspend=-1 Grub içinde ayarlandıktan sonra , bu değerlerin yeniden başlatıldıktan sonra artık negatif ( devre dışı ) olduğunu unutmayın . Bu beni bireysel değerleri düzenleme zahmetinden kurtaracak ve şimdi USB otomatik askıya alma devre dışı bırakma komut dosyası olabilir.

screengrab: otomatik askıya alma değerleri Global düzenlemeden önce ve sonra

Umarım bu USB otomatik askıya alınmayı biraz daha kolay ve daha yazılabilir hale getirir


1

Android telefonumu bağlarken bir sorun yaşadım, telefonumu şarj edemedim çünkü güç açıp kapatıyor ... PowerTop bu ayarı bulmama izin verdi ve sorunu düzeltmek için yararlı oldu (otomatik değer soruna neden oluyordu):

echo 'on' | sudo tee /sys/bus/usb/devices/1-1/power/control
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.