Portál AbcLinuxu, 20. říjen 2017 22:08

Píšeme pravidla pro udev

26. 9. 2012 | Luboš Doležel
Články - Píšeme pravidla pro udev  

Udev před přibližně šesti lety definitivně nahradil starého, jaderného správce adresáře /dev zvaného devfs. K této změně došlo v Linuxu 2.6.18. My se podíváme na schopnosti udevu, ale také na částečný návrat devfs zpět do našich jader.

Obsah

Jak udev funguje

link

Udev funguje tak, že naslouchá na události od jádra (uevents), které jej informují o nově připojených nebo odpojených zařízeních (z hlediska operačního systému). Udev v systému běží jako obyčejný démon. Jeho konfigurace se nachází v /etc/udev a její obsah je používán při provádění „reakcí“ na události od jádra. Samotný udev se skládá ze tří součástí: udevd (to je ten démon, který čte události od jádra), libudev (knihovna pro přístup k informacím) a udevadm (nástroj pro správu).

Detailní informace o zařízeních udev získává z /sys (sysfs). Zde jsou údaje snadno přístupné i zvědavému užvateli. Technicky probíhá komunikace s jádrem přes soket typu netlink. Netlink je jinak typicky používán pro konfiguraci síťových rozhraní, routovacích tabulek a tak dále. Právě pomocí netlinku provádí například program ip veškeré operace, které mu zadáte.

S udevem se historicky pojí také démon HAL, který se v některých linuxových distribucích nacházel snad ještě i loni, jeho poslední verze však vyšla v roce 2009. HAL se staral o předávání událostí z udevu dalším aplikacím, typicky desktopovým, a to přes D-Bus. Byl pro právě HAL, který stál za (ne)funkčností reakcí desktopových prostředí kupříkladu na nově připojený flash disk. Část funkčnosti HALu se dostala do udevu samotného, zbytek je nyní obstaráván projekty UPower a udisks.

Kdy si s udevem hrát nemusíte

link

Většina uživatelů může využívat výhod udevu, aniž by se kdy dotkli konfigurace v /etc/udev. Jde zejména o poskytování trvalých jmen pro disková zařízení a síťová rozhraní. U disků tak můžete odkazovat na konkrétní disk nebo dískový oddíl pomocí symbolických odkazů uvnitř /dev/disk, a to buď pomocí jedinečných identifikátorů UUID (/dev/disk/by-uuid a /dev/disk/by-partuuid), popisků (/dev/disk/by-label), hardwarových identifikátorů (/dev/disk/by-id) nebo cest v sysfs (/dev/disk/by-path). Přehled si snadno zobrazíme příkazem blkid:

/dev/loop0: PTTYPE="mac" 
/dev/sdb1: UUID="3d392d5f-6df3-8b65-73d1-58fc63c6b3dd" TYPE="linux_raid_member" 
/dev/sdd1: UUID="521ba861-b372-ef29-d6b0-e9e1319efc69" TYPE="linux_raid_member" 
/dev/sdd2: UUID="1343acef-e2c1-a15e-71c4-c341527e1256" TYPE="linux_raid_member" 
/dev/sdd3: UUID="f2f831fd-f2a3-3b22-656a-3dd964024052" TYPE="linux_raid_member" 
/dev/sda1: UUID="3d392d5f-6df3-8b65-73d1-58fc63c6b3dd" TYPE="linux_raid_member" 
/dev/md2: TYPE="swap" 
/dev/md127: UUID="fb69d690-2737-433b-9162-3e9d0b86b43b" TYPE="ext4" 
/dev/md126: UUID="4d4cb6f8-cb49-4ecc-9fba-118bac46eac3" TYPE="ext2" 
/dev/md3: UUID="b8782ee0-92d1-4d27-872c-61a5aac34f52" TYPE="ext4" 
/dev/sdg1: UUID="521ba861-b372-ef29-d6b0-e9e1319efc69" TYPE="linux_raid_member" 
/dev/sdg2: UUID="1343acef-e2c1-a15e-71c4-c341527e1256" TYPE="linux_raid_member" 
/dev/sdg3: UUID="f2f831fd-f2a3-3b22-656a-3dd964024052" TYPE="linux_raid_member" 
/dev/sdh1: UUID="58cf7046-70b8-48f0-9da9-0dfb25463628" TYPE="ext4" PARTUUID="39c92e8a-3cee-4c7c-b391-ab88274a1ae9" 

Podobné chování je u názvů síťových rozhraní. Že má v těchto názvech prsty udev se člověk bohužel často dozví, až když hledá důvod, proč je jeho síťová karta při startu přejmenována např. z eth0 na eth3 :-) Udev totiž pro každé síťové rozhraní, co je kdy připojeno do systému, trvale vyhradí název. Tyto názvy jsou pak zapisovány do /etc/udev/rules.d/70-persistent-net.rules. Tento soubor můžete dle své vůle upravovat, nebo smazat.

# PCI device 0x8086:/sys/devices/pci0000:00/0000:00:1c.5/0000:04:00.0/0000:05:01.0 (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0e:0c:b8:f2:60", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x168c:/sys/devices/pci0000:00/0000:00:1c.5/0000:04:00.0/0000:05:00.0 (ath9k)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="d8:5d:4c:a3:97:2d", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="wlan*", NAME="wlan0"

# PCI device 0x10ec:/sys/devices/pci0000:00/0000:00:1c.4/0000:03:00.0 (r8169)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="10:bf:48:83:64:ce", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

Právě zde se můžeme s podobou pravidel pro udev poprvé setkat.

Píšeme pravidla

link

Pravidla umisťujeme do adresáře /etc/udev/rules.d, název souboru je na nás, přičemž číslo na začátku názvu usnadňuje orientaci v pořadí aplikace pravidel. Ve výše uvedené ukázce můžeme vidět, že dochází k určitému porovnávání (operátor ==) a přiřazování (=). Dalším důležitým operátorem je pak přidání (+=), jehož použití si ukážeme zanedlouho. Pokud jsou splněna všechna pravidla stanovená pomocí porovnání, provedou se dále určené operace.

Při porovnání používáme tato klíčová slova:

KERNEL
Jak (by) zařízení pojmenovalo jádro.
SUBSYSTEM
Subsystém zařízení.
DRIVER
Název použitého ovladače.
ATTR
Slouží pro přístup k dalším atributům (např. sériovému číslu), které ovladač zpřístupnil přes sysfs.
ACTION
Akce, ke které právě dochází. Při přidávání nese hodnotu „add“, při odebírání zase „remove“. Hodí se při spouštění aplikace po události.

S těmito klíčovými slovy se kromě ACTION můžeme setkat i v „množné“ variantě, tedy např. ATTRS. V této podobě se porovnání provádí nejen s vlastností daného zařízení, ale i s vlastnostimi nadřazeného zařízení.

Nejčastěji vám asi nepůjde o přejmenování zařízení pomocí NAME (jako se to děje výše u síťových karet), spíše budete chtít aby bylo zařízení kromě původního jména dostupné i pod nějakým očekávatelným symbolickým odkazem. V této situaci místo nastavování názvu (NAME="název") použijeme přidání dalšího symbolického odkazu pomocí operátoru +=. Tento operátor se postará o to, aby si pravidla vzájemně nepřepisovala symbolické odkazy, ale spíše se tyto odkazy nashromáždily.

Pro zařízení /dev/ttyS0 si tedy můžeme nechat udevem vytvářet symbolický odkaz takto:

KERNEL=="ttyS0", SYMLINK+="hlavni-seriak"

Při porovnávání řetězců si můžeme pomáhat pomocí těchto speciálních znaků:

*
Libovolné znaky nebo nic (tedy výskyt něčeho nula či vícekrát).
?
Libovolný znak právě jednou.
[ ]
Jeden znak ze znaků v závorkách právě jednou, je možné použít i rozsah jako [0-9].

Bez zvláštní námahy můžeme v NAME a SYMLINK pracovat i s názvem zařízení od jádra (KERNEL). %k je v NAME a SYMLINK nahrazováno původním názvem zařízení, zatímco %n je nahrazováno číslem na konci tohoto názvu. Původní ukázku si tedy rozšíříme:

KERNEL=="ttyS*", SYMLINK+="seriak-cislo-%n-puvodne-%k"

Atributy

link

Od předchozích ujetých pravidel se přesuneme k něčemu, co asi budete dělat častěji. Tedy identifikaci zařízení podle atributů. Začnu hned ukázkou toho, co se dá s udevem vyřešit za problém:

SUBSYSTEM=="tty", ATTRS{serial}=="A101645B", SYMLINK+="arduino0"
SUBSYSTEM=="tty", ATTRS{serial}=="A800dRam", SYMLINK+="usbrelay0"

Zde mám dvě zařízení na USB, přes které je zpřístupňována tradiční sériová linka (běžný konvertor od FTDI). Tato zařízení se v systému objevují jako /dev/ttyUSB0 a /dev/ttyUSB1. Jedno z nich je Arduino, druhé z nich je zase USB relé. Zdánlivě je problém je odlišit, jak ale vidíme, podle sériových čísel to je možné. A jak také vidíte, k jednotlivým atributům se přistupuje pomocí ATTRS{název_atributu}.

Jak si snadno zobrazit atributy zařízení? Dříve k tomu sloužil nástroj udevinfo, v aktuální distribucích ale používejte udevadm info.

$ # udevadm info -q all -n /dev/ttyUSB0
P: /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.7/2-1.7:1.0/ttyUSB0/tty/ttyUSB0
N: ttyUSB0
S: serial/by-id/usb-FTDI_FT232R_USB_UART_A800dRam-if00-port0
S: serial/by-path/pci-0000:00:1d.0-usb-0:1.7:1.0-port0
S: usbrelay0
E: DEVLINKS=/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A800dRam-if00-port0 /dev/serial/by-path/pci-0000:00:1d.0-usb-0:1.7:1.0-port0 /dev/usbrelay0
E: DEVNAME=/dev/ttyUSB0
E: DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.7/2-1.7:1.0/ttyUSB0/tty/ttyUSB0
E: ID_BUS=usb
E: ID_MODEL=FT232R_USB_UART
E: ID_MODEL_ENC=FT232R\x20USB\x20UART
E: ID_MODEL_FROM_DATABASE=FT232 USB-Serial (UART) IC
E: ID_MODEL_ID=6001
E: ID_PATH=pci-0000:00:1d.0-usb-0:1.7:1.0
E: ID_PATH_TAG=pci-0000_00_1d_0-usb-0_1_7_1_0
E: ID_REVISION=0600
E: ID_SERIAL=FTDI_FT232R_USB_UART_A800dRam
E: ID_SERIAL_SHORT=A800dRam
E: ID_TYPE=generic
E: ID_USB_DRIVER=ftdi_sio
E: ID_USB_INTERFACES=:ffffff:
E: ID_USB_INTERFACE_NUM=00
E: ID_VENDOR=FTDI
E: ID_VENDOR_ENC=FTDI
E: ID_VENDOR_FROM_DATABASE=Future Technology Devices International, Ltd
E: ID_VENDOR_ID=0403
E: MAJOR=188
E: MINOR=0
E: SUBSYSTEM=tty
E: UPOWER_PRODUCT=Watts Up? Pro
E: UPOWER_VENDOR=Watts Up, Inc.
E: UP_MONITOR_TYPE=wup
E: USEC_INITIALIZED=95065708556

Zde sice sériové číslo vidíme (E: ID_SERIAL_SHORT=A800dRam), není to ale přímo ve formě, ve které můžeme text rovnou okopírovat do pravidel. Takovou podobu získáme tímto příkazem:

$ udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.7/2-1.7:1.0/ttyUSB0/tty/ttyUSB0':
    KERNEL=="ttyUSB0"
    SUBSYSTEM=="tty"
    DRIVER==""

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.7/2-1.7:1.0/ttyUSB0':
    KERNELS=="ttyUSB0"
    SUBSYSTEMS=="usb-serial"
    DRIVERS=="ftdi_sio"
    ATTRS{port_number}=="0"
    ATTRS{latency_timer}=="1"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.7/2-1.7:1.0':
    KERNELS=="2-1.7:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="ftdi_sio"
    ATTRS{bInterfaceClass}=="ff"
    ATTRS{bInterfaceSubClass}=="ff"
    ATTRS{bInterfaceProtocol}=="ff"
    ATTRS{bNumEndpoints}=="02"
    ATTRS{supports_autosuspend}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{interface}=="FT232R USB UART"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.7':
    KERNELS=="2-1.7"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{devpath}=="1.7"
    ATTRS{idVendor}=="0403"
    ATTRS{speed}=="12"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPacketSize0}=="8"
    ATTRS{busnum}=="2"
    ATTRS{devnum}=="39"
    ATTRS{configuration}==""
    ATTRS{bMaxPower}==" 90mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="a0"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{maxchild}=="0"
    ATTRS{bcdDevice}=="0600"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{serial}=="A800dRam"
    ATTRS{version}==" 2.00"
    ATTRS{urbnum}=="296377"
    ATTRS{manufacturer}=="FTDI"
    ATTRS{removable}=="unknown"
    ATTRS{idProduct}=="6001"
    ATTRS{bDeviceClass}=="00"
    ATTRS{product}=="FT232R USB UART"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1':
    KERNELS=="2-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{devpath}=="1"
    ATTRS{idVendor}=="8087"
    ATTRS{speed}=="480"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{busnum}=="2"
    ATTRS{devnum}=="2"
    ATTRS{configuration}==""
    ATTRS{bMaxPower}=="  0mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{maxchild}=="8"
    ATTRS{bcdDevice}=="0000"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{version}==" 2.00"
    ATTRS{urbnum}=="650"
    ATTRS{removable}=="unknown"
    ATTRS{idProduct}=="0024"
    ATTRS{bDeviceClass}=="09"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2':
    KERNELS=="usb2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{devpath}=="0"
    ATTRS{idVendor}=="1d6b"
    ATTRS{speed}=="480"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{authorized_default}=="1"
    ATTRS{busnum}=="2"
    ATTRS{devnum}=="1"
    ATTRS{configuration}==""
    ATTRS{bMaxPower}=="  0mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{maxchild}=="2"
    ATTRS{bcdDevice}=="0304"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{serial}=="0000:00:1d.0"
    ATTRS{version}==" 2.00"
    ATTRS{urbnum}=="31"
    ATTRS{manufacturer}=="Linux 3.4.4-gentoo ehci_hcd"
    ATTRS{removable}=="unknown"
    ATTRS{idProduct}=="0002"
    ATTRS{bDeviceClass}=="09"
    ATTRS{product}=="EHCI Host Controller"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0':
    KERNELS=="0000:00:1d.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="ehci_hcd"
    ATTRS{irq}=="23"
    ATTRS{subsystem_vendor}=="0x1043"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x0c0320"
    ATTRS{companion}==""
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{local_cpus}=="0f"
    ATTRS{device}=="0x1e26"
    ATTRS{uframe_periodic_max}=="100"
    ATTRS{enable}=="1"
    ATTRS{msi_bus}==""
    ATTRS{local_cpulist}=="0-3"
    ATTRS{vendor}=="0x8086"
    ATTRS{subsystem_device}=="0x84ca"
    ATTRS{numa_node}=="-1"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""

Tento výpis je podstatně delší a můžeme vidět, že se tu postupně prochází struktura zařízení. Zde si můžeme vybrat atributy (z jednoho uvedeného zařízení), které podle nás dostatečně jedinečně identifikují daný kus hardwaru,a ty použít.

Nastavování práv

link

Pomocí udevu můžeme měnit vlastníka (OWNER), skupinu (GROUP) a práva (MODE) daného device node. Použití je jednoduché. Předchozí příklad si rozšíříme:

SUBSYSTEM=="tty", ATTRS{serial}=="A101645B", SYMLINK+="arduino0", OWNER="lubos", GROUP="users", MODE="0660"

Sluší se poznamenat, že práva 0660 jsou výchozí, a tak by v této ukázce nemusela být nastavována.

Spouštění programů

link

Externí programy můžeme spouštět pomocí klíčových slov PROGRAM a RUN. Výstup PROGRAMu poslouží při nastavování názvu, ale třeba i práv. Výstup programu RUN není dále používán, program je pouze spuštěn; RUN je tedy vhodný pro automatizacké zareagování na nějakou událost.

SUBSYSTEM=="tty", PROGRAM="/usr/bin/pojmenuj %k", SYMLINK+="%c"

%c je nahrazeno výstupem programu. Možnosti jsou ještě širší (používání části výstupu), jejich prozkoumání už ponechám na případných zájemcích. Použití RUN je podobné, zde už ale nepracujeme s výstupem programu; spíše nám poslouží výše uvedená volba ACTION určující, zda je zařízení přidáváno (add), nebo odebíráno (remove). Ještě se nám může hodit nastavování hodnot prostředí. Ukázka:

SUBSYSTEMS=="usb", KERNEL=="sd*", ACTION="add", RUN="/usr/local/bin/varovani_pripojeni", ENV{nazev}="hodnota"

Devtmpfs: návrat devfs?

link

Odchod devfs byl do značné míry revolučním krokem. Není divu, že jeho částečný návrat nebyl všemi zrovna oslavován. Devtmpfs, odpůrci často označovaný jako devfs 2.0, vrací jádru zpět schopnost samostatně spravovat obsah adresáře /dev bez pomoci démona v uživatelském prostoru.

Devtmpfs je konkrétně souborový systém postavený nad tmpfs. Jeho fungování je prosté: při připojení zařízení jádro automaticky vytvoří příslušný device node a po odpojení jej hnedle odstraní. Pro spoustu použití je tato funkčnost naprosto postačující – například na embedded systémech – a zvyšuje tak rychlost startu, protože žádný démon nemusí dodatečně zpracovávat události od jádra a nic tedy ani nemusí na tohoto démona čekat.

Přestože si tento článek možná nečtete z embedded zařízení, ale svého linuxového desktopu, i tak je velmi pravděpodobné, že devtmpfs používáte. Důvodem je to, že současné verze udevu (od verze 176) devtmpfs dokonce vyžadují – aby nebyla funkčnost duplikována, tak zůstává vytváření device nodes nyní plně na jádře a udev se už stará jen o dodatečné úpravy.

Na závěr zmiňme to, že díky devtmpfs můžeme snadno nabootovat do systému bez přítomnosti sady základních device nodes v /dev na disku. To je praktické například při snahách o obnovu systému.

Odkazy a zdroje

Writing udev rules

Další články z této rubriky

Syncthing
Twibright Registrator: Instalace, odinstalace, test, základní použití
Twibright Registrator: fotografie v šeru bez stativu 2
Twibright Registrator: fotografie v šeru bez stativu 1
Filtrujeme čtivé texty z Projektu Gutenberg 9

Diskuse k tomuto článku

26.9.2012 08:08 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
Odpovědět | Sbalit | Link | Blokovat | Admin
Udev před přibližně šesti lety definitivně nahradil starého, jaderného správce adresáře /dev zvaného devfs.

Tahle věta je IMHO trochu zavádějící, protože vzbuzuje představu, že se devfs opravdu používal. Ve skutečnosti ho ale z běžných distribucí používal pouze Mandrake, takže to byla spíš taková slepá ulička.

Luboš Doležel (Doli) avatar 27.9.2012 01:10 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
Aha, právě Mandrake jsem v té době používal. Co se používalo jinde?
27.9.2012 08:46 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
Totéž co od počátku unixových systémů: /dev jako normální součást filesystému a v něm statické soubory vytvářené skriptem při instalaci. Když bylo potřeba něco upravit (což bylo jen velmi zřídka), provádělo se to přímo příkazem mknod - buď to udělal přímo správce systému nebo post-instalační skript balíčku. Takové řešení mělo samozřejmě spoustu nedostatků, takže se hledaly způsoby, jak spravovat obsah /dev dynamicky, aby opravdu odpovídal tomu, co v počítači je, a umožňoval mít jména zařízení persistentní. Virtuální filesystém devfs byl (v Linuxu) první takový pokus, ale měl řadu chyb, proto se nikdy moc neprosadil a nakonec vznikl udev založený na úplně jiné koncepci.
28.9.2012 00:17 Sten
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
IIRC se devfs používal i v Gentoo a v Debianu se snad objevoval v initrd (ale už ne dále)
28.9.2012 04:43 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
O tom, jestli je Gentoo běžnou distribucí dnes, by se dalo dlouze diskutovat. Ale za dob jádra 2.4 jí nebylo zcela určitě.
26.9.2012 08:45 ondro
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
Odpovědět | Sbalit | Link | Blokovat | Admin
Podobné chování je u názvů síťových rozhraní. Že má v těchto názvech prsty udev se člověk bohužel často dozví, až když hledá důvod, proč je jeho síťová karta při startu přejmenována např. z eth0 na eth3 :-) Udev totiž pro každé síťové rozhraní, co je kdy připojeno do systému, trvale vyhradí název.
To ma nemilo prekvalipo v Debiane, kde som za nic na svete nevedel prist preco pri vymene sietovky mi ta nie a nie fungovat, ked pri starsej distribucii Debianu to fungovalo.

Po hodinach patrania som na to prisiel, ze to sposobil udev a jeho pravidlo. Osobne si myslym, ze to mohli lepsie postavit aby sa chovanie udev podobalo tomu, co bolo pred tym. Ak mam jednu sietovku, tak preco po jej vymene to nemoze byt stale eth0. Tak mam za bezpecene, ze siet mi bude fungovat stale(samozrejme ak mam ovladac). Teraz to tak nieje a ludom, ktory sa s tym stretnu prvy raz to zbytocne komplikuje zivot. To nehovorim o BFU, ktory to nema sancu zvladnut. Neviem ako su na tom ine distribucie.
26.9.2012 10:08 Honza Jaroš | skóre: 6 | blog: moje_strana_plotu | Bohnice
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
Pokud se nepletu, jde tady v první řadě o to, aby u strojů s více síťovými kartami nemohlo dojít k prohození jejich názvů. To, že se po výměně síťovky pro ni vytvoří úplně nový název (neboť se změní MAC adresa) je jen vedlejší efekt.
26.9.2012 10:12 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
On je to vlastně nutný důsledek, protože zařízení mohou být dynamická (např. USB to ethernet adaptér), takže systém nemůže vědět, jestli se to, které "zmizelo", časem zase neobjeví. Proto nemůže (automaticky) znovu použít opuštěné jméno a musí novému zařízení přidělit nové.
27.9.2012 14:45 ondro
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
Nemusi pridelit nove. To je len pohlad z urciteho uhlu na vec. Objavi sa to povodne zariadenie a pri deli sa mu najblizsie volne. Otazka znie aky vplyv to bude mat na nastavenie a chod systemu.

Neriesi to uz mno spominay problem, ze po vymene sietovky mi ta fungovat nebude lebo nebude nastavena. Sadne k tomu BFU a je nahrany. Nejako sa mu ju podari nakonfigurovat ako eth1 ale ak tu sietovku vymeni 5x(trochu prehanam), tak aj napriek tomu, ze ma v systeme stale len jednu sietovku, tak sa bude volat eth4. To nepovazujem za najstastnejsie riesenie.

Sposobuje to aj problem pri klonovani systemu. V novom PC bude mat sietovka inu MAC adresu a uz to zase nebude eth0 ale eth1 a zase je ju potrebne nastavovat alebo upravit udev pravidlo aby to bola eth0.

27.9.2012 15:12 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
Objavi sa to povodne zariadenie a pri deli sa mu najblizsie volne.

Jenže ta persistentní jména mají zajistit právě to, aby se tohle nestalo.

27.9.2012 23:20 Ondrej 'SanTiago' Zajicek
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
Persistentni jmena mohou byt, ale je otazka, co je ten spravny klic, podle ktereho by se ta persistence mela udrzovat. Osobne myslim, ze absolutni pozice po sbernicich (tedy vicemene cesta v /sys/devices) je pro persistenci daleko vhodnejsi klic nez MAC adresa.

Takove reseni ma podstatne vyhody stejne jako persistence na MAC (nezavislost jmena na poradi objeveni ci vubec existenci ostatnich zarizeni) bez nevyhod (nutnost softwarove rekonfigurace pri vymene porouchane karty ci pri naklonovani).
27.9.2012 23:28 Honza Jaroš | skóre: 6 | blog: moje_strana_plotu | Bohnice
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
No pokud uvažujeme například výše zmiňovaný USB to ethernet adaptér, opět by to byla slepá ulička. Bojím se, že se nikdy nezavděčíte všem. :-)

Ale já ten problém stejně nechápu. BFU-like distribuce používají NetworkManager, který by měl být schopen si ty karty nastavit sám. A u pokročilejšího uživatele bych čekal, že si to bude schopen upravit...
27.9.2012 15:13 David Jaša | skóre: 44 | blog: Dejvův blog
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
Sposobuje to aj problem pri klonovani systemu.
Tak klonování systémů je obecně problém kvůli chybějícímu všeobjímajícímu seal/sysprep postupu. Když je potřeba dělat často nové systému, je podle mě lepší zkousnout kulku a nasadit něco, co je naprovižnuje od nuly.
27.9.2012 18:06 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
Nemusi pridelit nove. To je len pohlad z urciteho uhlu na vec. Objavi sa to povodne zariadenie a pri deli sa mu najblizsie volne. Otazka znie aky vplyv to bude mat na nastavenie a chod systemu.

Vliv to může mít značný, protože pro původní síťovku jste měl třeba nějak nastavenou síť, a to nastavení s novým jménem nebude fungovat.

V každém případě pokud chcete, aby se systém choval tak, jak popisuje, není nic jednoduššího, než persistentní jména prostě nepoužívat ;-) Persistentní jména totiž slouží právě k tomu, aby se tak nechoval.
27.9.2012 18:08 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
Sposobuje to aj problem pri klonovani systemu. V novom PC bude mat sietovka inu MAC adresu...

Zkušený administrátor systém naklonuje bez toho persistentního souboru ;-) Problem solved.
26.9.2012 22:52 Gilhad | skóre: 20 | blog: gilhadoviny
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
Tohle jsem celkem jednoduse "vyresil" tim, ze ve skriptu, co se spousti pri vypinani stroje ten soubor /etc/udev/rules.d/70-persistent-net.rules proste smazu. Pak prvni nalezena sitovka (cti jedina) dostane prvni volne jmeno (cti eth0) a veci funguji spravne. Ostatne stejne jsem to udelal i s CD mechanikama
blami avatar 26.9.2012 23:57 blami | skóre: 29 | Praha
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
To je nadherne hnusny hack!
27.9.2012 00:35 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
Nebylo by jednodušší prostě vyhodit ten generátor?
Marián Kyral avatar 27.9.2012 06:58 Marián Kyral | skóre: 29 | blog: Sem_Tam | Frýdek-Místek
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
A při další aktualizaci udev se mu tam ten generátor zase vrátí. To není moc velká výhra :-D
27.9.2012 08:47 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
Když tam nechám prázdný soubor, tak by mi ho přepsat neměl, je-li ten balíček udělaný rozumně.
Marián Kyral avatar 27.9.2012 19:13 Marián Kyral | skóre: 29 | blog: Sem_Tam | Frýdek-Místek
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
Tak to jo. To by šlo.
26.9.2012 09:09 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
Odpovědět | Sbalit | Link | Blokovat | Admin
Podobné chování je u názvů síťových rozhraní. Že má v těchto názvech prsty udev se člověk bohužel často dozví, až když hledá důvod, proč je jeho síťová karta při startu přejmenována např. z eth0 na eth3 :-) Udev totiž pro každé síťové rozhraní, co je kdy připojeno do systému, trvale vyhradí název. Tyto názvy jsou pak zapisovány do /etc/udev/rules.d/70-persistent-net.rules. Tento soubor můžete dle své vůle upravovat, nebo smazat.

Tady by bylo vhodné upřesnit, že to udev nedělá sám od sebe, ale opět na základě nějakého jiného souboru s pravidly (a za pomoci helperů). Např. v OpenSuSE 12.2 je to /lib/udev/rules.d/75-persistent-net-generator.rules

26.9.2012 10:10 ludvik
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
Jenže leckdy tam ten generator není ... např. Archlinux ho už nemá. A tam jsem narazil také na to, že nelze jen tak přejmenovávat jak se mi zlíbí. Např. nadefinovat si to jako eth0-ethX je cesta do pekel. Občas se to přejmenování totiž neprovede, zjevně neumí vyřešit konflikt. Takže musím používat jiné názvy, např net0. Je tam jádro 3.4.9. A vím, že dříve to šlo bezpečně, mám to tak na více kusech serverů, s různými jádry.
26.9.2012 10:16 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev

Pokud tam ten generátor není, tak tam není ani ten soubor s pravidly, o kterém píše autor.

Přejmenovávání na jména, která by mohla kolidovat s těmi automaticky generovanými, se obecně moc nedoporučuje (ať už u blokových/znakových zařízení nebo u síťových rozhraní). On i ten generátor je trochu komplikovanější a snaží se potenciální kolize řešit, ale stejně je to náchylné na race conditions. Některé zdroje jdou dokonce tak daleko, že doporučují NAME="..." nepoužívat vůbec, nechat všemu původní jména a jen přidávat symbolické linky. Ale to zrovna u síťových rozhraní nejde.

Limoto avatar 28.9.2012 21:22 Limoto | skóre: 32 | blog: Limotův blog | Prostějov
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev

 

Jenže leckdy tam ten generator není ... např. Archlinux ho už nemá.

A ani nikdy neměl

 

D.A.Tiger avatar 26.9.2012 09:21 D.A.Tiger | skóre: 8 | Brno
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
Odpovědět | Sbalit | Link | Blokovat | Admin
Pěkné, dík :)
Radost z toho, že někdo objeví něco nového, je omyl starý 6000 let... (Jean Paul) | anthill inside
the.max avatar 26.9.2012 11:17 the.max | skóre: 46 | blog: Davidovo smetiště | Bílina
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
Odpovědět | Sbalit | Link | Blokovat | Admin
Parada, uz dlouho chci prejmenovat usb-serial prevodniky tak, aby se mi ruzne po restartu neprehazovali, ale protoze jsem nikde nenasel zadnej ucelenej 'navod' v cestine, ale jen v anglictine, odkladal jsem to (jiz druhy rok) na dlouhe zimni vecery
KERNEL ULTRAS Fan Team || Sabaton - nejlepší učitel dějepisu || Gentoo - dokud nás systemd nerozdělí.
26.9.2012 14:42 loki
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
Odpovědět | Sbalit | Link | Blokovat | Admin
Super clanek, diky za nej.
Cohen avatar 27.9.2012 11:47 Cohen | skóre: 21 | blog: Drobnosti | Brno
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev

Tak. Být tu Flattr tlačítko, tak už tam má hlas. ;-)

OpenPGP key fingerprint: 489C 5EC8 0FD6 2BE8 9E59 B4F7 19C1 3E8C E0F5 DB61 (https://www.fi.muni.cz/~xruzick7/pgp-klic/)
26.9.2012 19:11 edison
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
Odpovědět | Sbalit | Link | Blokovat | Admin
ten prikaz "CMD=" se mi nejak nezda. Nemelo by tam byt nahodou "RUN+=" ?
Luboš Doležel (Doli) avatar 27.9.2012 00:50 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
Mělo, nevím, jak jsem přišel na CMD.
27.9.2012 23:25 Ondrej 'SanTiago' Zajicek
Rozbalit Rozbalit vše Re: Píšeme pravidla pro udev
Odpovědět | Sbalit | Link | Blokovat | Admin
Novy devtmpfs je moc pekna vec, nicmene jednu vec jsem nepochopil. Kdyz uz leta mame v /sys textovy soubor s major a minor cislem zarizeni (e.g. /sys/class/block/sda/dev ), proc tam uplne stejne nemuze byt device node toho zarizeni. Pak by stacilo misto /dev proste pouzivat device nodes v /sys.
14.6.2016 22:07 wykys
Rozbalit Rozbalit vše Dotaz
Odpovědět | Sbalit | Link | Blokovat | Admin
Ahoj, zkoušel jsem podle vašeho popisu napsat pravidlo pro udev, aby mi po připojení klávesnice spustilo skript, který nastaví pro každou klávesu specifické podsvětlení, ale pokud použiju tohle pravidlo:

SUBSYSTEMS=="usb", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c331", ACTION="add", RUN="/home/wykys/.config/g810.sh"

Ta se nic nestane, pokud odstraním s pravidla ACTION="add", tak to funguje, ale zároveň to zatěžuje procesor, protože skript se spouští stále znovu.

14.6.2016 22:30 wykys
Rozbalit Rozbalit vše Re: Dotaz
Tak už to funguje, problém byl v zapomenutým rovnáse v podmínce.

ACTION=="add", ATTR{idVendor}=="046d", ATTR{idProduct}=="c331", RUN="/home/wykys/.config/g810.sh"

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.