Portál AbcLinuxu, 2. května 2025 05:50
Na začátku historie rfkill stojí hardware - uživatelé toužili po jednodušším způsobu zapínání vysílaček ve svých noteboocích a laptopech, než jsou zmatené a nepohodlé programy. Chtěli pěkné, velké tlačítko, které by zareagovalo pěkným, uklidňujícím cvaknutím(*). A naši milí výrobci jim ho dodali, v podobě jednoduchého a spolehlivého mechanického přepínače který odpojil anténu od zdroje signálu. Uživatelé ovšem velice rychle zjistili, že čip vysílající na plné kule do nějakého vybíjecího odporu nemá zrovna kladný vliv na spotřebu, potažmo životnost baterek. Pročež se zrodila generace bastardních tlačítek, které navenek vypadaly uspokojivě mechanicky, jak to mají luseři rádi, ale pod kapotou řídily uspokojivě nemechanický software. Software místo ošklivého uřezávání signálu hezky uspal dané zařízení. Přibývající nálož ikonkových klikátek zapříčinila postupný přesun softwarového ovládání z vlastního firmware zpátky do userspace. V poslední iteraci mi na stole přistál notes od Dellu, který už nejenom nemá pseudomechanický vypínač, ale dokonce dokonce ani přiblblou klávesovou zkratku hlídanou BIOSem a ovládá se kompletně softwarově. Kruh se uzavřel.
Linuxový ovladač celé té šaškárny se jmenuje rfkill. Ovladače vysílacího hardware mohou mít (a často mají) vlastní háčky, rfkill by měl do chaosu vnést jednotné API společné pro různé druhy vysílačů a dostupné z userspace. Podporovaný hardware může být celkem cokoliv, co jde „vypnout“ - wifi, bluetooth, wimax, ale třeba i gps. Aplikace v userspace mohou zjišťovat stav nebo vypínat zařízení pomocí jednoduchého API přes znakové zařízení /dev/rfkill
. Pro každé zařízení existují dvě úrovně vypnutí - „hard“ je neovlivnitelný, mechanický stav zařízení, čili pouze pro čtení. „soft“ je softwarový vypínač, který ale naopak nemusí být čitelný. Konkrétní provedení záleží na ovladači a hardwaru - třeba na mém erárním Latitude E5500 jsou všechny „hard“ vypínače leda na ozdobu.
V první řadě je potřeba zpřístupnit /dev/rfkill
, ve výchozím stavu je totiž root:root 660
, což pohodlí ovládání z userspace poněkud omezuje. Zprasit to chmodem odněkud z initskriptu se mi příčí, ovšem na drbání s consolekitem nervy nemám (po nahlédnutí do toho, o čem freedesktop.org tvrdí, že je to dokumentace). Pročež jsem kompromisně oprášil trosky znalostí udev a zplodil následující pravidlo:
KERNEL=="rfkill", GROUP="plugdev"
Pokud udevu nehovíte a vaše distro to (zatím) neřeší, vložte tento řádek tam, kam vaše distro cpe udev pravidla - nejspíš nějak takhle:
echo 'KERNEL=="rfkill", GROUP="plugdev"' >> /etc/udev/rules.d/80-rfkill.rules
plugdev
jsou v gentoo uživatelé kteří mohou připojovat zařízení - flashky, foťáky etc. čili víceméně totéž, co by měl povolit consolekit. Chcete-li změnit práva, místo GROUP použijte MODE. Nebo obojí, oddělené čárkou.
Další co bude potřeba je program rfkill. Detaily instalace ponechávám na svědomí distribuce. Použití je následující:
rfkill listvypíše existující vypínače a jejich stav.
0: phy0: Wireless LAN Soft blocked: yes Hard blocked: yes 1: dell-wifi: Wireless LAN Soft blocked: yes Hard blocked: yes 2: dell-bluetooth: Bluetooth Soft blocked: no Hard blocked: yesJak vidno, mám vypnutou wifi a zapnutý bluetooth. Pro pomalu chápající, logika je obrácená - yes znamená zapnuté blokování čili vypnuté zařízení. Na mě nekoukejte, já to nevymyslel. Vypnutý hard vypínač je nevhodně zvolený default - můj hardware žádný nemá, čili to nic neovliňuje. Zařízení se vypíná a zapíná pomocí parametru block nebo unblock:
rfkill block bluetooth rfkill unblock 2Argumentem je jak vidno číslo zařízení ze seznamu výše, nebo jedno ze symbolických jmen
all
, wifi
, bluetooth
, uwb
, wimax
, wwan
a gps
. Popisek z výpisu - v mém případě dell-bluetooth - nejde použít.
A nakonec něco pro šťastné majitele opravdových poctivých cvakajících vypínačů:
rfkill eventzobrazuje události vypnutí a zapnutí podobně jako
xev
(hard i soft stavy). Napsat si démona, který po přepnutí vypínače shodí rozhraní nebo naopak nakopne wicd či bluez přenechám za úkol šťastlivcům, kteří nebyli o poctivé cvakající vypínače ošizeni.
No a protože příkazová řádka dnes není v módě, chce to nějaké klikátko. Samozřejmě by se dalo blbnout s karambou, komanderem a podobnými vyfikundacemi, resp. jejich ne-kde obdobami, já jsem ale shodou okolností narazil na geniálně jednoduché řešení - plasmid „on-off přepínač“. Stačí zadat shellové příkazy pro vypnutí a zapnutí a je to.
(druhá poznámka na okraj - plasma se mi taky začíná líbit).
Třeba k tomu, abych se zbavil ošklivých modrých světýlek. Na mém železe wifi i bluetooth čipy nahodí BIOS a vypnout to rfkillem je jednodušší než zapnout a vypnout služby (které to shodí pomocí ovladačů BT a wifi). Předpokládám ale, že sťastní majitelé hardwarových tlačítek (nebo pseudohardwarových klávesových kombinací) najdou zajímavější využití.
(*) Zde cituji klasika, ale bohužel už si přesně nevzpomínám kterého. Nejspíš nějakého A. C. Clarka
Tiskni
Sdílej:
iwconfig eth1 txpower off
. Nějakým spektrometrem jsem to smz neměřil, ale od sítě se to odpojí.
Dělá snad rfkill něco dalšího? Možná iwconfig nedokáže vypnout bluetooth. To nevím. Nejsem vlastníkem BT.
ath5k phy0: failed to wakeup the MAC Chip ath5k phy0: can't reset hardware (-5)Wifi sice vypnu, ale už nezapnu. Po příkazu
rfkill unblock wifise modrá ledka rozsvítí, ale nevytvoří se wlan0, jedině až po restartu. Takže pokud chci zapnout wifi musím restartovat.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.