Kiểm soát nguồn cung cấp USB (bật / tắt) với Linux


164

Có thể bật / tắt nguồn điện từ USB bằng tay với Linux không?

Có quạt làm mát USB bên ngoài này (loại bạn sử dụng để làm mát bản thân chứ không phải PC) và thật tuyệt khi có thể điều khiển nó từ thiết bị đầu cuối, vì tôi muốn đặt quạt ở một nơi xa.

Tôi cho rằng điều này cũng có thể hữu ích cho nhiều thứ khác nữa, bởi vì có rất nhiều đồ chơi USB ngoài kia. Có lẽ máy lọc không khí, v.v. (Tôi nghe nói chúng không thực sự hoạt động).


9
Hãy để tôi tóm tắt lại cho Linux> = 2.6,38: Hiện tại tệp power/level không được dùng nữa; sử dụng power/control thay thế . ( power/wakeuplà ok.) Hơn nữa, nó chỉ chấp nhận "tự động" và "bật", không "đình chỉ" nữa. "tự động" là đủ thông minh và nếu nguồn không tắt khi không hoạt động, đó là lỗi của thiết bị. Dù sao bạn không thể tắt nguồn bằng tay. Để biết thêm, hãy xem câu trả lời dưới đây của tlwhitec và tài liệu của kernel: kernel.org/doc/Documentation/usb/power-manepage.txt
teika kazura

Bản sao có thể có của stackoverflow.com/q/1163824/1967394
Floris

2
Tính năng này thực sự xứng đáng với GUI tốt
mikebabcock

Nó có yêu cầu phần cứng đặc biệt nào không? Nó không hoàn toàn rõ ràng từ câu trả lời,
Vojtěch Dohnal

Câu trả lời:


63

Ghi chú. Thông tin trong câu trả lời này có liên quan đến các hạt nhân cũ hơn (tối đa 2.6.32). Xem câu trả lời của tlwhitec để biết thông tin về các hạt nhân mới hơn.

# 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

(Bạn có thể cần thay đổi usb1 thành usb n )

Nguồn: Tài liệu / usb / power-manager.txt.gz


1
Whoa, cảm ơn vì điều đó. Tôi đã nghĩ rằng tôi phải trải qua libUSB bất kể điều gì. Bất kỳ ý tưởng làm thế nào để có được tên của các thiết bị đính kèm là tốt?
kamziro

Theo bài đăng này, nếu không có phần cứng đặc biệt thì không thể? blog.andrew.net.au/2009/01/17
NoBugs

7
Tôi nhận được quyền từ chối lỗi ngay cả khi tôi sử dụng sudo!
Wally

3
tương tự đối với tôi "quyền bị từ chối" ngay cả sau khi sử dụng sudo
Raulp

2
Quyền bị từ chối vì một lệnh ở dạng sudo foo > barđược phân tích cú pháp dưới dạng trực tiếp đầu ra bar, sau đó chạy foobằngsudo . Việc chuyển hướng không thành công vì nó xảy ra trước khi bạn có quyền truy cập root. Giải pháp là sử dụng sudo sh -c 'echo disabled > /sys/bus/usb/devices/usb1/power/wakeup', v.v.: lấy root, chạy địa ngục mới để thực hiện chuyển hướng, sau đó xuất một cái gì đó vào bộ mô tả tệp được chuyển hướng.
đào

60

Theo các tài liệu , có một số thay đổi đối với việc quản lý nguồn USB từ hạt nhân 2.6.32 , dường như giải quyết trong 2.6,38 . Bây giờ bạn sẽ cần đợi thiết bị ở chế độ chờ , được điều khiển bởi trình điều khiển thiết bị cụ thể. Người lái xe cần hỗ trợ nó, nếu không thiết bị sẽ không bao giờ đạt đến trạng thái này. Thật không may, bây giờ người dùng không có cơ hội để buộc điều này. Tuy nhiên, nếu bạn may mắn và thiết bị của bạn có thể không hoạt động, thì để tắt tính năng này, bạn cần phải:

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

hoặc, đối với hạt nhân khoảng 2.6,38 trở lên:

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

Điều này có nghĩa là, hãy tạm dừng tại thời điểm thiết bị không hoạt động.

Vì vậy, trừ khi quạt của bạn là thứ gì đó "thông minh" có thể được xem như một thiết bị và được điều khiển bởi người lái xe, bạn có thể sẽ không gặp nhiều may mắn trên các hạt nhân hiện tại.


Có vẻ như điều này sẽ khiến thiết bị USB liên tục bị tắt nguồn ... (?) Làm thế nào để nguồn điện trở lại với tôi, sau khi nó hoạt động? Mục tiêu của tôi là khởi động lại thiết bị một lần, không thay đổi vĩnh viễn cấu hình hệ thống treo.
matanster

4
Để tiếp tục thiết bị bị treo, bạn có thể vô hiệu hóa lại "autosuspend" với echo "on" > "/sys/bus/usb/devices/usbX/power/control", nhưng tôi nghĩ bạn cần hiểu mục đích ban đầu. Tính năng autosuspend ở đây chỉ đơn thuần là cho phép các thiết bị chạy không hoạt động ở trạng thái năng lượng thấp (nơi nó có thể bị tắt), chỉ được phục hồi sau khi cần, bởi máy chủ hoặc một số sự kiện bên ngoài. Điều đó xảy ra (hoặc nên xảy ra) tự động. Bản thân cổng thực sự không bao giờ thực sự tắt. Thực sự, hãy đọc các tài liệu ;)
tlwhitec

4
Tôi có thể xác nhận nó hoạt động với hạt nhân> 3.10. Chỉ cần chắc chắn rằng "id" thiết bị bạn đang sử dụng là chính xác: dmesg | grep "usb"và sử dụng số sau "usb", ví dụ: usb 2-4.4: SerialNumber: A0848020bạn sẽ sử dụng : /sys/bus/usb/devices/2-4.4/power/.... Ngoài ra, hãy chắc chắn rằng thiết bị không được sử dụng. Tôi đã tạo một tập lệnh để đơn giản hóa quá trình này
lepe

Có cách nào để lưu cấu hình này để mỗi lần cắm vào nó sẽ không thay đổi trở lại mặc định không? Tôi có một thiết bị cần đặt điều khiển nguồn thành "bật" để sạc.
quickblueblur

@quickblueblur nghe có vẻ như là một quy tắc udev đối với tôi.
tlwhitec

24

Tôi đã tìm thấy những giải pháp ít nhất hoạt động đối với chip trung tâm USB Terminus FE 1.1 được cấu hình đúng cách:

1. Để tắt nguồn trên tất cả các cổng USB của hub, bạn có thể hủy liên kết trung tâm khỏi kernel bằng cách sử dụng:

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

để bật lại nguồn - bạn có thể liên kết lại bằng cách sử dụng

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

2. Việc chuyển đổi năng lượng ở từng cổng riêng lẻ phức tạp hơn: Tôi có thể sử dụng hubpower để điều khiển từng cổng - nhưng nó đi kèm với một nhược điểm: trước tiên, việc ngắt kết nối với usbdevfs sẽ khiến tất cả các thiết bị USB không hoạt động trên hệ thống, ít nhất là trên Ubuntu :

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

Với tính ioctlnăng bị vô hiệu hóa này, tôi có thể tắt nguồn cổng riêng lẻ mà không cần tháo tất cả các thiết bị - nhưng nguồn bị tắt ngay lập tức (có thể do nhân nhìn thấy một thiết bị chưa được khởi tạo) khiến thiết bị USB chỉ thực hiện "khởi động lại lạnh", đó là điều tôi nói chung là muốn làm. Hubpower vá của tôi là ở đây


Các mục liên kết / hủy liên kết được xác nhận để hoạt động trên kernel linux 2.6.34, chipset ICH8 và Ubuntu 10.04.
user1357196

5
liên kết / hủy liên kết không tắt nguồn cổng USB bất kể chipset. Thiết bị vẫn có điện ...
themihai

1
chuột laser bị tắt, loại bàn phím không thể, modem dừng nhấp nháy - tất cả đều tốt trên nền tảng của tôi
eri

24

PowerTOP từ Intel cho phép bạn chuyển đổi các thiết bị như thiết bị ngoại vi usb trong thời gian thực. Chúng được gọi là "điều chỉnh".

sudo apt install powertop
sudo powertop
  • Tab trên để 'điều chỉnh'.
  • Cuộn xuống thiết bị của bạn.
  • Nhấn enter để chuyển chế độ tiết kiệm năng lượng ( Tốt / Xấu )

nhập mô tả hình ảnh ở đây

Lưu ý rằng Bad có nghĩa là thiết bị luôn bật. Toggling to Good sẽ tắt thiết bị sau thời gian lưu không hoạt động được cài đặt sẵn (mặc định là 2000ms).

Xem tài liệu PowerTOP để biết chi tiết về cách thực hiện các thay đổi này vĩnh viễn.
Nó tạo ra các kịch bản cấu hình cho bạn (khá nhiều như được mô tả bởi các áp phích khác về chủ đề này).

GHI CHÚ: Các tập lệnh này không ảnh hưởng đến nguồn pin USB (luôn bật).
Chúng chỉ gửi giao thức trình điều khiển để kích hoạt và hủy kích hoạt thiết bị.

Nếu bạn muốn kiểm soát nguồn pin, bạn có thể sử dụng bộ chia USB thông minh được hỗ trợ hoặc tốt hơn là vi điều khiển .


2
Tuyệt vời! : DI nghĩ rằng đây là cách thân thiện nhất để thực hiện (mặc dù ở mức độ thấp, nó thực hiện các thao tác tương tự như được nêu trong các câu trả lời khác.) Cảm ơn bạn và có thể câu trả lời của bạn đạt đến đỉnh;)
Matyas

1
Cảm ơn câu trả lời của bạn. Tôi phải bắt đầu đào ở đâu để thay đổi thời gian tiết kiệm không hoạt động được cài sẵn?
mikezter

Như đã đề cập bởi các áp phích trước, các tài liệu kernel có ở đây: kernel.org/doc/Documentation/usb/power-man
Quản lý.txt

10

Bạn có thể sử dụng công cụ uhubctl của tôi để kiểm soát nguồn USB trên mỗi cổng cho các hub USB tương thích.


công cụ tốt trên osx, nhưng không tìm thấy bất kỳ 'trung tâm thông minh được hỗ trợ' nào trên debian cho tôi.
jitter

1
Trên Linux, bạn cần chạy nó dưới quyền root (dưới sudo) hoặc để định cấu hình quyền của thiết bị udev. Cũng có thể máy chủ Linux của bạn không có các trung tâm tương thích được kết nối.
mvp

đó là một btw 'xương xanh' btw.
jitter

7

Tôi muốn làm điều này và với phần cứng USB của tôi, tôi không thể. Tôi đã viết một cách hacky làm thế nào để làm điều đó ở đây:

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

Nói một cách ngắn gọn: Tôi đã sử dụng rơle USB để mở / đóng V CC của một cáp USB khác ...


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

hoạt động cho Ubuntu


1
CÁC BẠN LÀ GIẢI PHÁP DUY NHẤT ĐƯỢC LÀM VIỆC TRÊN TRƯỜNG HỢP CỦA TÔI. Tôi đang sử dụng một acer làm cho máy tính xách tay Ubuntu 12.04LTS.
RicoRicochet

1
Không tắt nguồn thiết bị, chỉ xóa thiết bị khỏi danh sách thiết bị. Làm cách nào tôi có thể tắt nguồn cổng USB?
rustyx

1
Đây cũng là giải pháp duy nhất hiệu quả với tôi khi tắt nguồn máy tính bảng Wacom Intuos5 touch M mà không cần rút phích cắm (trên Fedora 28)
user1738984

2

Nguồn USB 5v luôn được bật (ngay cả khi máy tính đã tắt, trên một số máy tính và trên một số cổng.) Bạn có thể sẽ cần lập trình Arduino với một số loại công tắc và điều khiển nó thông qua thư viện Nối tiếp từ USB được cắm vào máy vi tính.

Nói cách khác, sự kết hợp của hướng dẫn chuyển đổi này và hướng dẫn này về giao tiếp thông qua Nối tiếp nối tiếp với Arduino được cắm qua USB.


2

Lý do tại sao mọi người gửi câu hỏi như thế này là do sự dreaded- thực sự " EVIL '- USB Auto-Tạm ngừng' tính năng ".

Tự động tạm dừng cấp nguồn cho thiết bị USB "nhàn rỗi" và trừ khi trình điều khiển của thiết bị hỗ trợ chính xác tính năng này, thiết bị có thể không thể hoạt động được. Vì vậy, việc bật / tắt cổng USB là một triệu chứng của sự cố chứ không phải vấn đề.

Tôi sẽ chỉ cho bạn cách GLOBALLY tắt tự động tạm dừng, phủ nhận nhu cầu bật và tắt các cổng USB theo cách thủ công:

Câu trả lời ngắn:

Bạn không cần phải chỉnh sửa " autosuspend_delay_ms " riêng lẻ: USB autosuspend có thể bị vô hiệu hóa trên toàn cầu và liên tục sử dụng các lệnh sau:

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

update-grub

systemctl reboot

Ảnh chụp màn hình Ubuntu 18.04 theo sau phần cuối của "Câu trả lời dài" minh họa kết quả của tôi đã đạt được.

Câu trả lời dài:

Đúng là Tài liệu hạt nhân quản lý nguồn USB cho biết autosuspend sẽ không được dùng nữa và ở vị trí " autosuspend_delay_ms " của nó được sử dụng để vô hiệu hóa autosuspend USB:

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

TUY NHIÊN thử nghiệm của tôi cho thấy rằng cài đặt usbcore.autosuspend=-1trong / etc / default / grub như bên dưới có thể được sử dụng làm chuyển đổi TOÀN CẦU cho chức năng tự động gửi USB - bạn KHÔNG cần phải chỉnh sửa các tệp " autosuspend_delay_ms " riêng lẻ .

Tài liệu tương tự được liên kết ở trên nêu giá trị "0" là ENABLED và giá trị âmDISABLED :

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.

Trong phần chụp màn hình Ubuntu 18.04 được chú thích bên dưới minh họa cách đạt được kết quả của tôi (và có thể tái tạo), vui lòng nhận xét mặc định là "0" ( được bật ) trong autosuspend_delay_ms .

Sau đó lưu ý rằng sau khi cài đặt CHỈusbcore.autosuspend=-1 trong Grub, các giá trị này sẽ âm ( bị tắt ) sau khi khởi động lại. Điều này sẽ giúp tôi tiết kiệm công việc chỉnh sửa các giá trị riêng lẻ và giờ đây kịch bản có thể vô hiệu hóa tính năng tự động lưu USB.

screengrab: autosuspend value Trước và sau khi chỉnh sửa toàn cầu

Hy vọng điều này làm cho việc vô hiệu hóa USB autosuspend dễ dàng hơn một chút và có nhiều tập lệnh hơn-


1

Tôi gặp sự cố khi kết nối điện thoại Android, tôi không thể sạc điện thoại vì bật nguồn và tắt ... PowerTop cho phép tôi tìm cài đặt này và rất hữu ích để khắc phục sự cố (giá trị tự động gây ra sự cố):

echo 'on' | sudo tee /sys/bus/usb/devices/1-1/power/control
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.