abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

dnes 11:00 | Zajímavý software
Na Good Old Games je v rámci aktuálních zimních slev zdarma k dispozici remasterovaná verze klasické point&click adventury Grim Fandago, a to bez DRM a pro mainstreamové OS včetně GNU/Linuxu. Akce trvá do 14. prosince, 15:00 SEČ.
Fluttershy, yay! | Komentářů: 0
dnes 07:22 | Pozvánky

Konference InstallFest 2018 proběhne o víkendu 3. a 4. března 2018 v Praze na Karlově náměstí 13. Spuštěno bylo CFP. Přihlásit přednášku nebo workshop lze do 18. ledna 2018.

Ladislav Hagara | Komentářů: 0
včera 20:22 | Nová verze

Před měsícem byla vydána Fedora 27 ve dvou edicích: Workstation pro desktopové a Atomic pro cloudové nasazení. Fedora Server byl "vzhledem k náročnosti přechodu na modularitu" vydán pouze v betaverzi. Finální verze byla naplánována na leden 2018. Plán byl zrušen. Fedora 27 Server byl vydán již dnes. Jedná se ale o "klasický" server. Modularita se odkládá.

Ladislav Hagara | Komentářů: 1
včera 10:22 | Zajímavý článek

Lukáš Růžička v článku Kuchařka naší Růži aneb vaříme rychlou polévku z Beameru na MojeFedora.cz ukazuje "jak si rychle vytvořit prezentaci v LaTeXu, aniž bychom se přitom pouštěli do jeho bezedných hlubin".

Ladislav Hagara | Komentářů: 13
včera 07:22 | Komunita

Od 26. do 29. října proběhla v Bochumi European Coreboot Conference 2017 (ECC'17). Na programu této konference vývojářů a uživatelů corebootu, tj. svobodné náhrady proprietárních BIOSů, byla řada zajímavých přednášek. Jejich videozáznamy jsou postupně uvolňovány na YouTube.

Ladislav Hagara | Komentářů: 0
11.12. 19:22 | Nová verze

Ondřej Filip, výkonný ředitel sdružení CZ.NIC, oznámil vydání verze 2.0.0 open source routovacího démona BIRD (Wikipedie). Přehled novinek v diskusním listu a v aktualizované dokumentaci.

Ladislav Hagara | Komentářů: 0
11.12. 09:22 | Pozvánky

V Praze dnes probíhá Konference e-infrastruktury CESNET. Na programu je řada zajímavých přednášek. Sledovat je lze i online na stránce konference.

Ladislav Hagara | Komentářů: 2
9.12. 20:11 | Nová verze

Byl vydán Debian 9.3, tj. třetí opravná verze Debianu 9 s kódovým názvem Stretch a Debian 8.10, tj. desátá opravná verze Debianu 8 s kódovým názvem Jessie. Řešeny jsou především bezpečnostní problémy, ale také několik vážných chyb. Instalační média Debianu 9 a Debianu 8 lze samozřejmě nadále k instalaci používat. Po instalaci stačí systém aktualizovat.

Ladislav Hagara | Komentářů: 5
9.12. 00:44 | Nová verze

Po 6 měsících vývoje od vydání verze 0.13.0 byla vydána verze 0.14.0 správce balíčků GNU Guix a na něm postavené systémové distribuce GuixSD (Guix System Distribution). Na vývoji se podílelo 88 vývojářů. Přibylo 1 211 nových balíčků. Jejich aktuální počet je 6 668. Aktualizována byla také dokumentace.

Ladislav Hagara | Komentářů: 4
8.12. 21:33 | Nová verze

Po půl roce vývoje od vydání verze 5.9 byla vydána nová stabilní verze 5.10 toolkitu Qt. Přehled novinek na wiki stránce. Současně byla vydána nová verze 4.5.0 integrovaného vývojového prostředí (IDE) Qt Creator nebo verze 1.10 nástroje pro překlad a sestavení programů ze zdrojových kódů Qbs.

Ladislav Hagara | Komentářů: 0
Jak se vás potenciálně dotkne trend odstraňování analogového audio konektoru typu 3,5mm jack z „chytrých telefonů“?
 (8%)
 (1%)
 (1%)
 (1%)
 (75%)
 (14%)
Celkem 971 hlasů
 Komentářů: 45, poslední 1.12. 19:00
    Rozcestník

    Píšeme pravidla pro udev

    26. 9. 2012 | Luboš Doležel | Návody | Systém | 7231×

    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.

           

    Hodnocení: 100 %

            špatnédobré        

    Nástroje: Tisk bez diskuse

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    26.9.2012 08:08 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: 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.

    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
    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
    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
    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
    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
    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
    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
    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
    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"

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.