Udev je linuxový subsystém, který dodává vašemu počítači události zařízení. V jednoduché angličtině to znamená, že je to kód, který detekuje, když máte věci připojené k počítači, jako je síťová karta, externí pevné disky (včetně flash disků USB), myši, klávesnice, joysticky a gamepady, jednotky DVD-ROM atd. na. To z něj dělá potenciálně užitečný nástroj a je dostatečně dobře odhalený na to, aby jej standardní uživatel mohl ručně naskriptovat, aby dělal věci, jako je provádění určitých úkolů, když je připojen určitý pevný disk.
Tento článek vás naučí, jak vytvořit skript udev spouštěný nějakou událostí udev, jako je připojení konkrétního flash disku. Jakmile pochopíte proces práce s udev, můžete jej používat k nejrůznějším věcem, jako je načítání konkrétního ovladače, když je připojen gamepad, nebo provádění automatické zálohy, když připojíte záložní disk.
Základní skript
Nejlepší způsob, jak pracovat s udev, je po malých kouscích. Nepište celý skript předem, ale začněte něčím, co jednoduše potvrdí, že udev spouští nějakou vlastní událost.
V závislosti na vašem cíli pro váš skript nemůžete zaručit, že někdy uvidíte výsledky skriptu na vlastní oči, takže se ujistěte, že váš skript zaznamenává, že byl úspěšně spuštěn. Obvyklé místo pro soubory protokolu je /var adresář, ale to je většinou doména uživatele root. Pro testování použijte /tmp , který je přístupný běžným uživatelům a obvykle se vyčistí restartem.
Otevřete svůj oblíbený textový editor a zadejte tento jednoduchý skript:
#!/usr/bin/bash
/usr/bin/date>> /tmp/udev.log
Umístěte to do /usr/local/bin nebo nějaké takové místo ve výchozí cestě ke spustitelnému souboru. Nazvěte to trigger.sh a samozřejmě, aby byl spustitelný pomocí chmod +x .
$ sudo mv trigger.sh /usr/local/bin
$ sudo chmod +x /usr/local/bin/trigger.sh
Tento skript nemá nic společného s udev. Když se skript spustí, umístí časové razítko do souboru /tmp/udev.log . Otestujte skript sami:
$ /usr/local/bin/trigger.sh
$ cat /tmp/udev.log
Út 31. října 01:05:28 NZDT 2035
Dalším krokem je, aby udev spustil skript.
Unikátní identifikace zařízení
Aby byl váš skript spuštěn událostí zařízení, musí udev vědět, za jakých podmínek má skript volat. V reálném životě poznáte flash disk podle barvy, výrobce a skutečnosti, že jste jej právě zapojili do počítače. Váš počítač však potřebuje jinou sadu kritérií.
Udev identifikuje zařízení podle sériových čísel, výrobců a dokonce ID prodejců a ID produktů. Vzhledem k tomu, že se jedná o ranou fázi životnosti vašeho skriptu udev, buďte co nejširší, nekonkrétní a všezahrnující. Jinými slovy, chcete nejprve zachytit téměř každou platnou událost udev, která spustí váš skript.
S udevadm monitorem můžete v reálném čase napojit na udev a zjistit, co vidí, když připojíte různá zařízení. Staňte se rootem a vyzkoušejte to.
$ su
# udevadm monitor
Funkce monitoru vytiskne přijaté události pro:
- UDEV:událost, kterou udev odešle po zpracování pravidla
- KERNEL:událost jádra
S udevadm monitorem běží, zapojte flash disk a sledujte, jak se na vaši obrazovku chrlí nejrůznější informace. Všimněte si, že typ události je PŘIDAT událost. To je dobrý způsob, jak zjistit, jaký typ události chcete.
Udevadm monitor příkaz poskytuje spoustu dobrých informací, ale můžete je zobrazit s hezčím formátováním pomocí příkazu udevadm info , za předpokladu, že víte, kde se váš flash disk aktuálně nachází ve vašem /dev strom. Pokud ne, odpojte a znovu zapojte svůj flash disk a poté okamžitě zadejte tento příkaz:
$ su -c 'dmesg | tail | fgrep -i sd*'
Pokud tento příkaz vrátil sdb:sdb1 , například víte, že jádro přiřadilo vašemu palcovému disku sdb štítek.
Alternativně můžete použít lsblk zobrazíte všechny disky připojené k vašemu systému, včetně jejich velikostí a oddílů.
Nyní, když jste zjistili, kde se váš disk ve vašem souborovém systému nachází, můžete zobrazit informace udev o tomto zařízení pomocí tohoto příkazu:
# udevadm info -a -n /dev/sdb | less
Tím se vrátí mnoho informací. Zaměřte se zatím na první blok informací.
Vaším úkolem je vybrat části zprávy udev o zařízení, které jsou pro toto zařízení nejvíce jedinečné, a poté říct udev, aby spustil váš skript, když jsou tyto jedinečné atributy detekovány.
informace o udevadm zpracovat zprávy na zařízení (určeném cestou zařízení), poté „projde“ po řetězci nadřazených zařízení. Pro každé nalezené zařízení vytiskne všechny možné atributy pomocí formátu klíč–hodnota. Můžete sestavit pravidlo, které se bude shodovat podle atributů zařízení plus atributů z jednoho nadřazeného zařízení.
při pohledu na zařízení '/devices/000:000/blah/blah//block/sdb':
KERNEL=="sdb"
SUBSYSTEM=="blok"
OVLADAČ==""
ATTR{ro}=="0"
ATTR{size}=="125722368"
ATTR{stat}==" 2765 1537 5393"
ATTR{ range}=="16"
ATTR{discard\_alignment}=="0"
ATTR{removable}=="1"
ATTR{blah}=="bla"Pravidlo udev musí obsahovat jeden atribut z jednoho nadřazeného zařízení.
Nadřazené atributy jsou věci, které popisují zařízení od nejzákladnější úrovně, například je to něco, co bylo zapojeno do fyzického portu nebo je to něco s velikostí nebo toto je vyměnitelné zařízení .
Od označení KERNEL sdb se může změnit v závislosti na tom, kolik dalších disků bylo připojeno předtím, než jste připojili tento flash disk, to není optimální nadřazený atribut pro pravidlo udev. Funguje však jako důkaz konceptu, takže jej můžete použít. Ještě lepším kandidátem je atribut SUBSYSTEM, který identifikuje, že se jedná o „blokové“ systémové zařízení (proto lsblk příkaz zobrazí seznam zařízení).
Otevřete soubor s názvem 80-local.rules v /etc/udev/rules.d a zadejte tento kód:
SUBSYSTEM=="block", ACTION=="add", RUN+="/usr/local/bin/trigger.sh"
Uložte soubor, odpojte testovací flash disk a restartujte.
Počkejte, restartujte na počítači se systémem Linux?
Teoreticky stačí zadat udevadm control --reload , která by měla načíst všechna pravidla, ale v této fázi hry je nejlepší eliminovat všechny proměnné. Udev je dostatečně složitý a nechcete celou noc ležet v posteli a přemýšlet, jestli toto pravidlo nefungovalo kvůli syntaktické chybě, nebo jestli jste prostě neměli restartovat. Restartujte tedy bez ohledu na to, co vám říká vaše hrdost na POSIX.
Když je váš systém opět online, přepněte na textovou konzoli (pomocí Ctl+Alt+F3 nebo podobně) a připojte svůj flash disk. Pokud používáte nejnovější jádro, pravděpodobně uvidíte v konzoli spoustu výstupů, když připojíte jednotku. Pokud se zobrazí chybová zpráva, například Nelze spustit / usr /local/bin/trigger.sh , pravděpodobně jste zapomněli vytvořit spustitelný skript. Jinak doufejme, že vidíte jen to, že zařízení bylo připojeno, dostalo nějaké přiřazení zařízení jádra a tak dále.
Nyní okamžik pravdy:
$ cat /tmp/udev.log
Út 31. října 01:35:28 NZDT 2035Pokud vidíte velmi nedávné datum a čas vrácené z /tmp/udev.log , udev úspěšně spustil váš skript.
Upřesnění pravidla v něco užitečného
Problém s tímto pravidlem je, že je velmi obecné. Připojení myši, flash disku nebo flash disku někoho jiného spustí váš skript bez rozdílu. Nyní je čas začít se soustředit na přesnou jednotku palce, kterou chcete spustit skript.
Jedním ze způsobů, jak toho dosáhnout, je pomocí ID dodavatele a ID produktu. K získání těchto čísel můžete použít lsusb příkaz.
$ lsusb
Bus 001 Device 002:ID 8087:0024 Slacker Corp. Hub
Bus 002 Device 002:ID 8087:0024 Slacker Corp. Hub
Bus 003 Device 005:ID 03f0 :3307 TyCoon Corp.
Bus 003 Device 001:ID 1d6b:0002 Linux Foundation 2.0 hub
Bus 001 Device 003:ID 13d3:5165 SBo NetworksV tomto příkladu 03f0:3307 před TyCoon Corp. označuje atributy idVendor a idProduct. Tato čísla můžete také vidět ve výstupu udevadm info -a -n /dev/sdb | grep prodejce , ale najdu výstup lsusb trochu jednodušší pro oči.
Nyní můžete tyto atributy zahrnout do pravidla.
SUBSYSTEM=="block", ATTRS{idVendor}=="03f0", ACTION=="add", RUN+="/usr/local/bin/thumb.sh"
Otestujte to (ano, stále byste měli restartovat, jen abyste se ujistili, že dostáváte nové reakce od udev) a mělo by to fungovat stejně jako předtím, pouze pokud připojíte, řekněme, flash disk vyrobený jinou společností (proto s jiným idVendorem) nebo myší nebo tiskárnou, skript se nespustí.
Pokračujte v přidávání nových atributů, abyste se na ten jeden více zaměřili jedinečná jednotka palce, kterou chcete spustit skript. Pomocí udevadm info -a -n /dev/sdb , můžete zjistit věci jako jméno dodavatele, někdy sériové číslo nebo název produktu a tak dále.
Pro svůj zdravý rozum přidávejte vždy pouze jeden nový atribut. Většina chyb, kterých jsem se dopustil (a viděl jsem je dělat i jiné lidi online), je vhodit do jejich pravidla udev spoustu atributů a divit se, proč ta věc už nefunguje. Testování atributů jeden po druhém je nejbezpečnějším způsobem, jak zajistit, že udev dokáže vaše zařízení úspěšně identifikovat.
Zabezpečení
To přináší bezpečnostní problémy při psaní pravidel udev, aby se automaticky provedlo něco, když je disk připojen. Na mých počítačích nemám ani zapnuté automatické připojení, a přesto tento článek navrhuje skripty a pravidla, která spouštějí příkazy jen mít něco zapojeno.
Zde je třeba mít na paměti dvě věci.
- Zaměřte se na svá pravidla udev, jakmile je zprovozníte, aby spouštěla pouze skripty když to opravdu chcete. Spouštění skriptu, který slepě kopíruje data do nebo z vašeho počítače, je špatný nápad pro případ, že by jej do vaší krabice zasunul někdo, kdo náhodou nosí flash disk stejné značky.
- Nepište své pravidlo a skripty udev a zapomeňte na ně. Vím, na kterých počítačích jsou moje pravidla udev, a ty krabice jsou nejčastěji moje osobní počítače, ne ty, které si beru na konference nebo které mám v práci v kanceláři. Čím více je počítač „sociální“, tím je méně pravděpodobné, že na něj bude mít pravidlo udev, které by potenciálně mohlo vést k tomu, že moje data skončí v zařízení někoho jiného nebo data někoho jiného nebo malware na mém zařízení.
Jinými slovy, stejně jako u tolika výkonu poskytovaného systémem GNU je vaším úkolem dbát na to, jak tuto sílu využíváte. Pokud to zneužijete nebo se k němu nebudete chovat s respektem, může se to velmi pokazit.
Udev ve skutečném světě
Nyní, když můžete potvrdit, že váš skript spouští udev, můžete obrátit svou pozornost na funkci skriptu. Právě teď je to k ničemu, nedělá nic víc, než zaznamenává skutečnost, že to bylo provedeno.
Používám udev ke spuštění automatického zálohování mých flash disků. Myšlenka je taková, že hlavní kopie mých aktivních dokumentů jsou na mém flash disku (protože to jde všude, kam jdu a dalo by se na nich kdykoli pracovat), a tyto hlavní dokumenty se zálohují do mého počítače pokaždé, když zapojím disk do ten stroj. Jinými slovy, můj počítač je záložní disk a moje produkční data jsou mobilní. Zdrojový kód je k dispozici, takže se neváhejte podívat na kód přílohy, kde najdete další příklady omezení vašich testů udev.
Protože to je to, na co používám udev nejvíce, je to příklad, který zde použiji, ale udev dokáže zachytit spoustu dalších věcí, jako jsou gamepady (toto je užitečné na systémech, které nejsou nastaveny tak, aby načítaly modul xboxdrv, když je gamepad připojené) a kamery a mikrofony (užitečné k nastavení vstupů, když je připojen konkrétní mikrofon), takže si uvědomte, že je to dobré pro mnohem víc než tento jeden příklad.
Jednoduchá verze mého zálohovacího systému je dvoupříkazový proces:
SUBSYSTEM=="blok", ATTRS{idVendor}=="03f0", ACTION=="přidat", SYMLINK+="bezpečnost%n"
SUBSYSTEM=="blok", ATTRS{idVendor}=="03f0", ACTION=="add", RUN+="/usr/local/bin/trigger.sh"První řádek detekuje můj flash disk s atributy, které již byly probrány, a poté přiřadí flash disku symbolický odkaz ve stromu zařízení. Symbolický odkaz, který přiřadí, je bezpečnost%n . %n je makro udev, které řeší jakékoli číslo, které jádro přidělí zařízení , například sdb1, sdb2, sdb3 a tak dále. Takže %n bude 1 nebo 2 nebo 3.
To vytvoří symbolický odkaz ve stromu vývojářů, takže nenaruší normální proces připojení zařízení. To znamená, že pokud používáte desktopové prostředí, které rádo automaticky připojuje zařízení, nebudete mu způsobovat problémy.
Druhý řádek spustí skript.
Můj zálohovací skript vypadá takto:
#!/usr/bin/bash
mount /dev/safety1 /mnt/hd
spánek 2
rsync -az /mnt/hd/ /home/seth /backups/ &&umount /dev/safety1Skript používá symbolický odkaz, který zabraňuje možnosti, aby udev pojmenoval jednotku něčím neočekávaným (například pokud mám do počítače již zapojenou jednotku flash s názvem DISK a připojím svůj druhý flash disk, také nazývaný DISK, druhý bude označeno DISK_, což by znemožnilo můj skript). Upevňuje safety1 (první oddíl disku) v mém preferovaném bodu připojení /mnt/hd .
Jakmile je bezpečně připojen, používá rsync k zálohování disku do mé záložní složky (můj skutečný skript používá rdiff-backup a váš může používat jakékoli automatické řešení zálohování, které preferujete).
Udev je váš vývojář
Udev je velmi flexibilní systém a umožňuje vám definovat pravidla a funkce způsobem, který si jen málokterý jiný systém dovolí uživatelům poskytnout. Naučte se ji a používejte ji a užívejte si sílu POSIX.
Tento článek staví na obsahu příručky Slackermedia Handbook, která je licencována pod GNU Free Documentation License 1.3.
Linux