Câu trả lời:
Có ít nhất hai công việc Upstart ảnh hưởng đến trạng thái không dây mặc định:
/etc/init/rfkill-restore.conf
Khôi phục trạng thái khối mềm cho tất cả các bộ đàm về trạng thái tắt máy cuối cùng, như được ghi trong /var/lib/rfkill/saved-state
./etc/init/network-manager.conf
khởi động Trình quản lý mạng, từ đó khôi phục ý tưởng về trạng thái không dây từ đó /var/lib/NetworkManager/NetworkManager.state
.Nếu bạn nhìn vào hai cấu hình công việc đó, bạn sẽ thấy rằng chúng không có mối quan hệ tạm thời , có vẻ như là một lỗ hổng thiết kế đối với tôi. Tôi đoán điều kiện cuộc đua này hiếm khi là một vấn đề vì /etc/init/rfkill-restore.conf
đơn giản hơn nhiều và có ít điều kiện bắt đầu hơn.
Tất cả các giải pháp để thực thi mặc định tắt không dây mà tôi thấy đã thử sử dụng /etc/rc.local
, bao gồm giải pháp "hiện đại" mà @Lekensteyn và @ rubo77 đã đưa ra. Thật không may, giải pháp đó không hiệu quả với tôi trên một trong hai máy tính xách tay mà tôi đã thử. Đây không phải là đặc biệt ngạc nhiên vì /etc/rc.local
cũng có có mối quan hệ thời gian mà tôi có thể tìm đến một trong hai /etc/init/rfkill-restore.conf
và /etc/init/network-manager.conf
. Ném vào một giấc ngủ dài /etc/rc.local
trước khi phát hành rfkill block wifi
là một cách giải quyết xấu cho tình trạng lộn xộn của cuộc đua này, nhưng nó hoạt động nếu độ trễ đủ dài.
Một giải pháp tốt hơn sẽ là cho chúng tôi áp đặt các trạng thái mong muốn của mình vào /var/lib/rfkill/saved-state
và /var/lib/NetworkManager/NetworkManager.state
trước khi hai công việc Upstart đó thậm chí được phép chạy. Chúng ta có thể đạt được điều này bằng cách tạo ra công việc Upstart của riêng mình. Trong thực tế, chúng ta sẽ cần hai tệp cấu hình công việc để đạt được thời gian chúng ta cần.
Cấu hình công việc đầu tiên của chúng tôi thực hiện các sửa đổi tập tin thực tế mà chúng tôi cần. Nó sẽ chạy càng sớm càng tốt và sẽ chỉ chạy một lần. Tạo /etc/init/radio-silence.conf
với nội dung này:
# radio-silence - Ensure radio silence on startup
#
# Override default startup behaviour of radios to ensure they are all
# disabled until the user deliberately enables them. This job requires
# radio-silence-wait to delay start of any services that may depend on
# resources manipulated by this job.
description "Disable all radios by default"
start on local-filesystems
pre-start script
sed -i -re "s/^(.+[[:space:]]+)[01][[:space:]]*\$/\11/" /var/lib/rfkill/saved-state
sed -i -re "s/^(WirelessEnabled=).*\$/\1false/" /var/lib/NetworkManager/NetworkManager.state
end script
Vì tôi thích im lặng vô tuyến khi máy tính xách tay của tôi khởi động, tôi chặn tất cả các bộ đàm, không chỉ là không dây, mà bạn có thể sửa đổi cái đầu tiên sed
ở trên để hạn chế tác động của công việc này đối với bất kỳ thiết bị không dây nào bạn muốn chặn mềm.
Cấu hình công việc thứ hai của chúng tôi chịu trách nhiệm đảm bảo rằng cả hai rfkill-restore
và network-manager
công việc sẽ không bắt đầu trước khi radio-silence
hoàn thành sửa đổi tệp. Tạo /etc/init/radio-silence-wait.conf
như sau:
# radio-silence-wait - Helper task for radio-silence
#
# Delays the start of all jobs that may depend on resources manipulated
# by radio-silence job. Avoids the need to modify job configuration of
# those other jobs.
description "Assist radio-silence by delaying jobs it affects"
start on (starting rfkill-restore or starting network-manager)
stop on (started radio-silence or stopped radio-silence)
instance $JOB
normal exit 0 2
task
script
status radio-silence | grep -q "start/running" && exit 0
start radio-silence || true
sleep infinity
end script
Với giải pháp này, tôi không còn thấy các vấn đề về tình trạng chủng tộc, mặc dù tôi chưa đề cập đến cuộc đua lý thuyết giữa rfkill-restore
và network-manager
.
Để biết thêm chi tiết về cách các công việc này phối hợp với nhau để đạt được mục tiêu tạm thời của chúng tôi, hãy tham khảo câu hỏi và câu trả lời của tôi, "Làm thế nào để tôi tạo một công việc Upstart duy nhất được đảm bảo hoàn thành trước khi hai công việc khác bắt đầu?"
Giải pháp "Hiện đại" bằng Trình quản lý mạng: chỉ cần bỏ chọn tùy chọn Kích hoạt không dây tại ứng dụng Trình quản lý mạng (KDE: Quản lý mạng). Lệnh nmcli nm wifi off
tương đương. Tiếp tục đọc nếu bạn thỉnh thoảng bật Wi-Fi, nhưng muốn hoàn nguyên nó thành vô hiệu hóa khi khởi động lại.
Trạng thái không dây được ghi nhớ trong tệp /var/lib/NetworkManager/NetworkManager.state
. Để tắt Wi-Fi khi khởi động, đảm bảo rằng phím WirelessEnabled
vẫn ở false
. Bạn có thể làm điều đó bằng cách chỉnh sửa tập lệnh init của Trình quản lý mạng hoặc bằng cách sử dụng /etc/rc.local
mẹo bên dưới. Lệnh bạn cần là:
sed s/^WirelessEnabled=true/WirelessEnabled=false/ -i /var/lib/NetworkManager/NetworkManager.state
rfkill block wifi
Đặt cái này trước exit 0
(như được mô tả dưới đây). Các rfkill block wifi
lệnh vẫn còn cần thiết do một cuộc chạy đua với khởi động của Network Manager (NM). Khi NM đã bắt đầu, các thay đổi đối với tệp trạng thái không có hiệu lực.
(câu trả lời cũ liên quan đến chỉnh sửa tập tin /etc/rc.local
với giải thích về rfkill
lệnh)
Một chút hacky, nhưng nó nên hoạt động. Một thẻ không dây có thể được vô hiệu hóa bằng cách sử dụng rfkill
lệnh. Tất cả các thiết bị được sử dụng bởi rfkill có thể được hiển thị bằng cách sử dụng rfkill list
. Đầu ra mẫu:
0: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
Hard blocked
phụ thuộc vào cài đặt phần cứng, ví dụ: công tắc không dây trên máy tính xách tay. Soft blocked
có thể được điều khiển bởi HĐH (Ubuntu).
Làm thế nào nó hoạt động? Nó không có manpage, chạy rfkill
cung cấp một văn bản trợ giúp trong trường hợp này:
Usage: rfkill [options] command
Options:
--version show version (0.4)
Commands:
help
event
list [IDENTIFIER]
block IDENTIFIER
unblock IDENTIFIER
where IDENTIFIER is the index no. of an rfkill switch or one of:
<idx> all wifi wlan bluetooth uwb ultrawideband wimax wwan gps fm
Ah, bây giờ chúng ta có một nơi nào đó. Bạn cần chạy rfkill block wifi
bằng root để tắt thiết bị không dây. (wlan là bí danh của wifi, xem mã nguồn của rfkill ).
Bây giờ, nếu bạn muốn tắt các chức năng không dây khi khởi động, hãy thêm lệnh vào /etc/rc.local bằng cách chạy sudo nano /etc/rc.local
. Sử dụng các phím mũi tên / phím lên / xuống trang để điều hướng đến dòng trước exit 0
và thêm rfkill block wifi
, để tệp kết thúc như thế này:
# By default, this script does nothing
rfkill block wifi
exit 0
Khi hoàn tất, nhấn Ctrl+ X, sau đó nhấn Yđể lưu nó và nhấn Enterđể chấp nhận tên tệp.
Nếu bạn quyết định kích hoạt thiết bị sau, hãy chạy : sudo rfkill unblock wifi
. Đừng quên xóa dòng khỏi /etc/rc.local nếu bạn quyết định sử dụng thẻ không dây.
/etc/rc.local
khi tập lệnh được chạy với quyền root. Rất khó có thể bạn có thể vô hiệu hóa wifi mà không có quyền root. Nếu tôi thử rfkill block wifi
hoặc rfkill unblock wifi
, tôi nhận được "Không thể mở thiết bị điều khiển RFKILL: Quyền bị từ chối".
$ rfkill block wifi
khiến applet NetworkManager hiển thị "Không dây bị tắt" và $ iwconfig
hiển thị Tx-Power=off
. $ rfkill unblock wifi
hoàn tác hiệu ứng này
/etc/rc.local
. Sử dụng cái này thay thế:/bin/sleep 10 && rfkill block wifi
/var/lib/NetworkManager/NetworkManager.state
tệp vẫn tồn tại các cài đặt, WirelessEnabled=false
là một trong số đó. Tôi sẽ đăng trong câu hỏi của bạn ..
Cách dễ nhất để vô hiệu hóa thẻ không dây của bạn là nhấp chuột phải vào chỉ báo NetworkManager (biểu tượng nhỏ ở trên cùng bên phải trên bảng điều khiển) và bỏ chọn Enable Wireless
. Điều này làm giảm ( ifconfig wlan0 down
) giao diện và nó không thực hiện quét nữa.
tlp
, xin vui lòng đọc toàn bộ câu trả lời.Tất cả các câu trả lời cho câu hỏi này đã khá cũ và không hoạt động trên các bản phát hành Ubuntu mới hơn sử dụng systemd. Câu trả lời của froage làm việc cho tôi vào ngày 14.04 nhưng không hoạt động vào ngày 16.04.
Systemd sử dụng systemd-rfkill.service
để lưu trạng thái chuyển đổi rfkill trong khi tắt máy và khôi phục nó trên mỗi lần khởi động.
Bạn phải truyền tham số dòng lệnh kernel để khôi phục trạng thái chuyển đổi rfkill trên mỗi lần khởi động.
/etc/default/grub
với trình soạn thảo văn bản ưa thích của bạn.systemd.restore_state=1
làm tham số cho GRUB_CMDLINE_LINUX
. Dòng đó nên đọc GRUB_CMDLINE_LINUX="systemd.restore_state=1"
. Bạn có thể thêm nó vào GRUB_CMDLINE_LINUX_DEFAULT
là tốt. Một trong số họ làm việc. Xem câu hỏi này để biết thêm chi tiết.Điều này sẽ đảm bảo rằng trạng thái rfkill được khôi phục trên mỗi lần khởi động. Đảm bảo tắt bluetooth và wifi trước khi khởi động lại.
tlp
:tlp 0.8-1
có trong kho 16.04. Sau khi cập nhật để tlp 0.9-1
sử dụng linrunner ppa, TẤT CẢ các vấn đề đã được giải quyết.Câu trả lời gốc:
tlp
mặt nạ / vô hiệu hóa systemd-rfkill.service
để "tránh xung đột và đảm bảo vận hành đúng các tùy chọn chuyển đổi thiết bị vô tuyến của TLP" . ( Nguồn-1 , Nguồn-2 )
Điều này có nghĩa là việc truyền tham số kernel sẽ không hiệu quả với bạn.
Đây là một đoạn nhỏ (xung quanh dòng số 195) từ tệp cấu hình mặc định của tlp ( /etc/default/tlp
).
# Restore radio device state (Bluetooth, WiFi, WWAN) from previous shutdown
# on system startup: 0=disable, 1=enable.
# Hint: the parameters DEVICES_TO_DISABLE/ENABLE_ON_STARTUP/SHUTDOWN below
# are ignored when this is enabled!
RESTORE_DEVICE_STATE_ON_STARTUP=0
# Radio devices to disable on startup: bluetooth, wifi, wwan.
# Separate multiple devices with spaces.
#DEVICES_TO_DISABLE_ON_STARTUP="bluetooth wifi wwan"
# Radio devices to enable on startup: bluetooth, wifi, wwan.
# Separate multiple devices with spaces.
#DEVICES_TO_ENABLE_ON_STARTUP="wifi"
Như bạn có thể thấy tùy chọn RESTORE_DEVICE_STATE_ON_STARTUP
bị tắt theo mặc định. Nhưng cho phép tùy chọn đó không giúp được gì.
Ngay cả sau khi bạn bật tùy chọn RESTORE_DEVICE_STATE_ON_STARTUP
, tắt wifi và bluetooth (sử dụng rfkill block all
) và tiếp tục khởi động lại, bằng cách nào đó, WiFi vẫn được bật trên mỗi lần khởi động thứ 2 hoặc thứ 3. Không có gì đảm bảo rằng WiFi khởi động tiếp theo sẽ bị tắt. Đáng ngạc nhiên
tlp
quản lý để giữ bluetooth bị vô hiệu hóa trên mỗi khởi động.
Tương tự với tùy chọn thứ 2 trong đoạn trích, DEVICES_TO_DISABLE_ON_STARTUP
cũng bị tắt theo mặc định. Kích hoạt nó cũng không hoạt động. Network Manger
cho thấy WiFi bị vô hiệu hóa nhưng rfkill list
không hiển thị bất kỳ khối mềm nào trên WiFi.
Lưu ý: Tôi đã đọc các dòng
"Hint: the parameters DEVICES_TO_DISABLE/ENABLE_ON_STARTUP/SHUTDOWN below are ignored when this is enabled!"
.Tôi đã vô hiệu hóa
RESTORE_DEVICE_STATE_ON_STARTUP
trước khi cho phépDEVICES_TO_DISABLE_ON_STARTUP
để tránh xung đột.
tlp-rdw
không hoạt động như mong đợi.tlp
người dùng:tlp 0.9-1
sử dụng ppa linrunner.Câu trả lời gốc:
Kích hoạt DEVICES_TO_DISABLE_ON_STARTUP
và cài đặt nó để tắt Bluetooth và WiFi có thể phù hợp với bạn. ( Nó hoạt động cho người này )
Câu hỏi này ở đây trên Askubfox. Nó tương tự như một câu trả lời cũ hơn cho câu hỏi này. Nhưng xin lưu ý rằng tôi đã không thử bản thân mình. Nó có thể hoặc không thể làm việc.
Các nguồn khác: systemd-rfkill , tlp-configure
GRUB_CMDLINE_LINUX
và GRUB_CMDLINE_LINUX_DEFAULT
cộng với lệnh (không được đề cập) sudo update-grub
và tôi không thể làm cho nó hoạt động trong Pop_OS! 19.10 (dựa trên Ubuntu 19.10). Theo đó systemctl status systemd-rfkill
, dịch vụ này đã được chạy trên mọi khởi động và, vì giá trị mặc định là 1
, nên không cần nỗ lực này. Dựa trên thông tin tại man systemd-rfkill
, việc nhớ trạng thái radio "lúc khởi động sớm" sẽ là hành vi mặc định, điều này khiến tôi tin rằng thành phần này bị hỏng.
Bạn có thể thêm
ifconfig wlan0 down
đến /etc/rc.local
, nhưng trước tiên,
đảm bảo rằng, nếu bạn đang sử dụng NetworkManager (Tôi có phiên bản 0.8.4 ~ git.20110319t175609.d14809b-0ubuntu3), bạn hãy vào menu " Edit Connections " -> " không dây " tab, bấm vào kết nối, bấm vào nút " Chỉnh sửa " và đảm bảo rằng, trong tab " Không dây ", hộp kiểm " Kết nối tự động " KHÔNG được chọn.
rfkill
.