Michal Čihař - Udev, hotplug a rychlost

Udev, hotplug a rychlost

Udev používám v podstatě od té doby co se objevil, protože to je jediná cesta jak pro několik usb-storage zařízení dostávat stále stejná jména zařízení. Když člověk používá několik takových věcí, tak opravdu nechce pokaždé přemýšlet, co že je tentokrát to sda.

Hotplug je zase nutný například pro práci s usb zařízeními (např. PTP foťáky), která nemají vlastní ovladač, pod uživatelem a ne jen pod rootem. Kromě podobných věcí, má na starosti také natahování modulů při připojení zařízení.

Tohle všechno funguje celkem bez problémů, ale je potřeba nějak zajistit počáteční inicializaci, to znamená provést tyto akce pro zařízení, které v systému byly před „zapnutím“ hotplugu (tj. zapsáním jména binárky obsluhující hotplug události do /proc/sys/kernel/hotplug). Na to se obvykle používá hromada shellovských skriptů, které jsou součástí hotplugu a vendor distribuce si je příslušně přiohne a případně přejmenuje na coldplug. Toto procházení veškerého hardware samozřejmě nějakou dobu trvá a to je to mnoha lidem na hotplugu vadí.

Všechno se dá samozřejmě urychlit :-). Stačí se podívat co ony skripty dělají a zajistíme, že ve většině případů pro PCI jenom natáhnou potřebné moduly, pro USB se obvykle ještě spouští nějaký skript zajišťující třeba přístupová práva.

Takže pro zbavení se dlouhého startu hotplugu při bootu stačí hned po připojení filesystému zapnout mechanizmus hotplug (např. echo /sbin/udevsend > /proc/sys/kernel/hotplug ) a pak natáhnout moduly pro PCI zařízení (včetně USB hubu). V okamžiku dokončení inicializace USB hubu se vyšlou hotplug eventy a ty již normálně zpacuje hotplug, takže není potřeba procházet USB zařízení. PCI také procházet nemusíme, potože to obvykle není věc, která by se často měnila a vytvořit seznam těch pár modulů co pro PCI zařízení potřebujeme je poměrně snadné.

Nyní již můžeme init skript hotplugu kompletně vyřadit nebo alespoň vypnout natahování pro PCI a USB. Vypnutí jednotlivých částí se v Debianu dělá zapsáním HOTPLUG_RC_substystém=no (např. HOTPLUG_RC_pci=no ) do /etc/default/hotplug .

Tak a tím jsme se zbavili hlavního problému hutplugu :-).