Udev
Az udev (user /dev) a systemd eszközkezelője a Linux kernel számára. Ez kezeli az eszközcsomópontokat a /dev könyvtárban, és minden felhasználói térbeli műveletet ellát az eszközök hozzáadásakor vagy az eltávolításukkor.
A udev a sys-apps/systemd-utils szoftvercsomagból alapértelmezett eszközkezelőként van használva a Gentoo operációs rendszerekben, amelyek a OpenRC init rendszert alkalmazzák, függetlenül a systemd init rendszertől.
Mi az udev?
A /dev könyvtár
A legtöbb Linux-felhasználó megérti, hogy a /dev/sda1 csak egy gyors módja annak, hogy a kernel által talált első lemez első partíciójára hivatkozzon. Ez elég könnyű, igaz?
De vegyük figyelembe az üzem közben cserélhető eszközöket, mint az USB, IEEE 1394, üzem közben cserélhető PCI stb. Ezek közül melyik az első eszköz, és meddig az? Mi lesz a többi készülék neve, ha az első eltűnik? Milyen hatással lesz ez a folyamatban lévő tranzakciókra? Nem lenne mókás, ha egy nyomtatási feladat hirtelen átkerülne egy csúcskategóriás lézernyomtatóból egy majdnem halott mátrixnyomtatóba, csak azért, mert valaki úgy döntött, hogy kihúzza a lézernyomtatót (ami véletlenül az első nyomtató volt)?
Lépjen be az eszközkezelőbe. Egy modern eszközkezelőnek:
- Felhasználói térben fut.
- Dinamikusan hoz létre és távolít el eszközfájlokat.
- Konzisztens eszközelnevezést biztosít.
- Felhasználói térben szolgáltat alkalmazásprogramozási felületet (API-t).
Minden alkalommal, amikor változás történik az eszközstruktúrán belül, a kernel egy uevent-et bocsát ki, amelyet az eszközkezelő veszi fel. az eszközkezelő ezután követi az /etc/udev/rules.d, /run/udev/rules.d és /lib/udev/rules.d könyvtárakat. Az uevent-ben található információk alapján megkeresi a kiváltáshoz szükséges szabályt vagy szabályokat, és végrehajtja a szükséges műveleteket. Ezek a műveletek magukban foglalhatják eszközfájlok létrehozását vagy törlését, és bizonyos firmware-fájlok kernelmemóriába való betöltését is kiválthatják.
Telepítés
A udev frissítésekor ellenőrizze az udev frissítési útmutatót az olyan információkért, amelyek megelőzhetik az operációs rendszer bootolhatatlanságát.
Kernel
A udev a következő kernelopciókat igényli:
General setup --->
[*] Configure standard kernel features (expert users) --->
[ ] Enable deprecated sysfs features to support old userspace tools
[*] Enable signalfd() system call
Enable the block layer --->
[*] Block layer SG support v4
Networking support --->
Networking options --->
<*> Unix domain sockets
Device Drivers --->
Generic Driver Options --->
() path to uevent helper
[*] Maintain a devtmpfs filesystem to mount at /dev
< > ATA/ATAPI/MFM/RLL support (DEPRECATED) --->
File systems --->
[*] Inotify support for userspace
Pseudo filesystems --->
[*] /proc file system support
[*] sysfs file system support
USE jelölőzászlók
A Portage szoftvercsomag-kezelő ismeri a udev
USE jelölőzászlót, amely lehetővé teszi az udev támogatását más szoftvercsomagokban. Ennek a USE jelölőzászló értéknek a USE jelölőzászló listához való hozzáadása (alapértelmezett minden Linux profilban) automatikusan behúzza a virtual/udev szoftvercsomagot.
/etc/portage/make.conf
USE="udev"
USE flags for sys-apps/systemd-utils Utilities split out from systemd for OpenRC users
+acl
|
Add support for Access Control Lists |
+kmod
|
Enable kernel module loading via sys-apps/kmod |
+tmpfiles
|
Enable systemd-tmpfiles |
+udev
|
Enable systemd-udev (userspace device manager) |
boot
|
Enable systemd-boot (UEFI boot manager) |
kernel-install
|
Enable kernel-install |
secureboot
|
Automatically sign efi executables using user specified key |
selinux
|
!!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur |
split-usr
|
Enable behavior to support maintaining /bin, /lib*, /sbin and /usr/sbin separately from /usr/bin and /usr/lib* |
sysusers
|
Enable systemd-sysusers |
test
|
Enable dependencies and/or preparations necessary to run tests (usually controlled by FEATURES=test but can be toggled independently) |
ukify
|
Enable systemd-ukify |
Emerge
A USE jelölőzászlók beállítása után frissítse az operációs rendszert annak érdekében, hogy a változtatások érvénybe lépjenek:
root #
emerge --ask --changed-use --deep @world
Beállítás
Szolgáltatás
Az udev bootoláskor történő indítás érdekében adja hozzá a sysinit futási szinthez. Ez a következő parancs kiadásával hajtható végre root jogosultságokkal:
root #
rc-update add udev sysinit
Fejlett beállítás
Szabályok
Az udev egy szabálykészletet biztosít, amely az uesemények (a kernel által küldött események) exportált értékeivel és a felfedezett eszköz tulajdonságaival egyezik. Egy megfelelő szabály esetleg elnevez és létrehoz egy eszközcsomópontot, valamint beállított programokat futtat az eszköz beállításához.
A szabálydefiníciók két helyen vannak tárolva:
- /lib/udev/rules.d/ – Ebben a könyvtárban található szabályokat bizonyos szoftvercsomagok telepítik, és általában a felhasználóknak nem kell módosítaniuk őket;
- /etc/udev/rules.d/ – Ez a könyvtár a végfelhasználó által meghatározott szabályok számára van fenntartva. Minden új szabályt ebben a könyvtárban kell hozzáadni;
Ezekben a könyvtárakban több szabályfájl (a .rules utótaggal) alfanumerikus sorrendben kerül bejárásra. A szabályfájlokban a udev olyan kifejezéseket talál, amelyek megfelelhetnek egy ueseménynek, valamint az állapotnak, amelyhez illeszkedik (az uesemény egy eszköz hozzáadása vagy eltávolítása miatt történik), és a végrehajtandó parancsnak.
Az eseményillesztés olyan információkon alapul, mint például:
- Az uesemény SUBSYSTEM-je (milyen típusú eszközre lett az uesemény kiváltva);
- Az elvégzett ACTION (hozzáadás, módosítás vagy eltávolítás);
- Egy vagy több attribútum (ATTR vagy ATTRS segítségével), például az eszköz osztálya, gyártója vagy egyéb eszközinformációk;
- A kernel által biztosított név (KERNEL segítségével), például sd* (SCSI/SATA lemezekhez) vagy input* (bejövő eszközökhöz, mint egerek és billentyűzetek);
- Egy vagy több környezeti beállítás (ENV segítségével), amelyet az információ továbbítására használnak több szabály között.
A fent említett információk alapján a szabály meghatározhatja, hogy:
- Bizonyos információkat későbbi eseményekkel kell megosztani (környezeti változókon keresztül).
- Linkeket kell létrehozni a /dev könyvtárban.
- Parancsokat kell végrehajtani.
A udev minden megfelelő szabályra végrehajtja a műveletet (nem áll meg az első egyezés után), hogy rugalmas eszközkezelési megközelítést biztosítson.
Állandó eszköznevek
A kernel aszinkron módon észleli az eszközöket, az udev tükrözi a kernel sysfs fájlrendszerét, így az eszközök az észlelési sorrendben kerülnek elnevezésre és számozásra. Alapértelmezés szerint az udev nem biztosít tartós eszközneveket. Azonban egyes eszközosztályok számára léteznek mechanizmusok ezek biztosítására:
- Az udev az adathordozókhoz további szimbolikus linkeket hoz létre az adathordozó azonosítója, címke, UUID és útvonala alapján. Tekintse meg a /dev/disk/by-* könyvtárat. Tehát a /dev/sda eszközfájl helyett használja a /dev/disk/by-label/SOME_LABEL fájlt.
- Ugyanez érvényes a beviteli eszközökre a /dev/input könyvtárban.
- Egyedi szabályok használatával a felhasználók saját eszközfájlokat hozhatnak létre.
Megjósolható hálózati interfész elnevezés
Az új hálózati interfész elnevezési konvenció eltérő. Ezért a szimbolikus linkeket, amelyeket a netifrc használ, újra kell kapcsolni. Használja a /etc/init.d/net.lo fájlt link célpontként azokhoz az interfésznevekhez, amelyeket hozzá kell adni. Ügyeljen arra, hogy a lentebb található parancsokban az <interface_name>
helyére az aktuálisan a rendszeren lévő Ethernet interfésznevek kerüljenek. Az interfészek felfedezéséhez futtassa az ip link parancsot.
user $
ip link
Hozzon létre egy szimbolikus linket a meglévő interfészekhez a /etc/init.d/ könyvtárban:
root #
ln -s /etc/init.d/net.lo /etc/init.d/net.<interface_name>
Szerkessze a /etc/conf.d/net fájlt az összes interfészhez szükséges beállítással.
Adja hozzá a szkripteket az alapértelmezett futási szinthez, hogy az interfészek automatikusan elinduljanak:
root #
rc-update add net.<interface_name> default
Opcionális: A megjósolható hálózati interfész elnevezés letiltása vagy felülbírálása
A kernel által biztosított hálózati eszköznevek, például eth0
vagy wlan0
, rendszerindításkor általában megváltoznak (lásd dmesg) a /lib/udev/rules.d/80-net-setup-link.rules udev szabály és a /lib/systemd/network/99-default.link fájlban található NamePolicy szerint.
Ez a viselkedés többféleképpen tiltható le:
- Szimbolikus link létrehozása a /etc/systemd/network/99-default.link fájlhoz, amely a /dev/null könyvtárba mutat: ln -s /dev/null /etc/systemd/network/99-default.link.
- Egy alacsonyabb számozású .link fájl létrehozása a /etc/systemd/network könyvtárban, amely más nevet rendel az interfészhez.
- Az
net.ifnames=0
paraméter megadása a kernel parancssorban.
Hivatkozás: https://systemd.io/PREDICTABLE_INTERFACE_NAMES/
Billentyűk és billentyűgombok újbóli elrendezése
A udev lehetőséget biztosít a billentyűk és billentyűgombok újbóli kiosztására a hwdb segítségével:
/etc/udev/hwdb.d/keyboard-example.hwdb
evdev:name:AT Translated Set 2 keyboard:*
KEYBOARD_KEY_db=58 # <scancode in HEX>=<keycode in DEC or keycode in HEX prefixed with 0x>
Az eszköz neve megtalálható a app-misc/evtest szoftvercsomag segítségével:
root #
evtest
/dev/input/event3: AT Translated Set 2 keyboard
Miután kiválasztotta az eszközt (az evtest egy interaktív eszköz) és megnyomott egy billentyűgombot, az evtest információkat jelenít meg a billentyűgombról. Ebben a példában a lenyomott billentyűgomb szkenkódja 0xDB
, és az 58
billentyűgomb kódját utánozza:
Event: time 1708679751.175244, type 4 (EV_MSC), code 4 (MSC_SCAN), value db Event: time 1708679751.175244, type 1 (EV_KEY), code 58 (KEY_CAPSLOCK), value 1
A teljes billentyűgombok listája elérhető a Linux forráskódban. Például a #define KEY_CAPSLOCK 58
átalakul 58
értékre.
Másik eszközök billentyűkódjai is engedélyezettek (például a bal egérgomb 0x110
).
A módosítások végrehajtásához a hardveradatbázist, azaz a /etc/udev/hwdb.bin fájlt frissíteni kell (ez OpenRC esetén is megfelelő).
root #
systemd-hwdb update
Az új beállítás az újraindítás után lép életbe.
Használat
Néhány hasznos parancs:
- Az összes udev tevékenység figyelése:
root #
udevadm monitor
- Az összes üzenet megjelenítése egy adott eszközfájlról:
root #
udevadm info --query=all --name=/dev/DEVICE_FILE
- Az adott sys path eszközfájlról szóló udev információ megjelenítése (ez beszerezhető az udevadm monitor segítségével):
root #
udevadm info --attribute-walk --path=/devices/DEVICE_FILE
- Udev szabályfájl példa – állandó név hozzárendelése egy Ethernet eszközhöz:
- FILE
/etc/udev/rules.d/50-ethernet.rules
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="01:23:45:67:89:ab", NAME="ethernet0"
- Miután módosította a szabályfájlt a /etc/udev/rules.d/ könyvtárban, vagy indítsa újra az operációs rendszert, vagy töltse be újra az udev szabályokat az alábbi paranccsal:
root #
udevadm control --reload-rules
- A már hozzáadott eszközök esetén (például csatlakoztatott USB) az újratöltött szabályok akkor lépnek életbe, ha az eszközt megváltoztatják (például újracsatlakoztatják az USB-t), vagy ha az udev ismét kernel eseményeket kér a udevadm trigger paranccsal. Különböző eseményakciók aktiválhatók. Alapértelmezetten a change eseményakció kerül aktiválásra.
root #
udevadm trigger
További információért tekintse meg a udevadm(8) man page oldalt.
Hibaelhárítás
Naplófigyelő üzenetek
Az összes üzenet naplózásához, amikor az udevadm monitor fut, módosítsa a következő beállításfájlt:
/etc/conf.d/udev
udev_monitor="YES"
Ez létrehozza az új naplófájlt a következő helyen: /run/udev/udevmonitor.log.
Hibakeresési mód
A hibakeresési mód engedélyezése több naplóüzenetet generál:
/etc/conf.d/udev
udev_debug="YES"
Állítsa be a naplózási prioritást:
/etc/udev/udev.conf
udev_log="debug"
A /run/udev/debug.log naplófájl létrejön, de nem kerülnek bele üzenetek. Az udev legújabb verziói minden üzenetet a dmesg naplóba írnak.
Hiányzó /dev/null és /dev/console eszközfájlok
Néhány udev verzió megfelelő működéséhez szüksége van a /dev/null és /dev/console fájlokra, de ezeket önállóan nem tudja létrehozni. Az alábbi parancsokkal root jogosultsággal manuálisan hozhatja létre ezeket az eszközfájlokat:
root #
mkdir test
root #
mount --bind / test
root #
cd test/dev
root #
mknod -m 660 console c 5 1
root #
mknod -m 660 null c 1 3
root #
cd ../..
root #
umount test
root #
rmdir test
Hálózati kártya (a NIC) az eth0 interfészhez lett hozzárendelve, de áthelyeződött az eth1 interfészre
Azon felhasználóknak akiknek az alaplapjukon kettő hálózati kártyájuk (NIC) van, találkozhatnak olyan helyzettel, amikor a ip link nem mutat eth0 vagy eth1 interfészt. A dmesg kimenetben a hálózati kártya először eth0 néven azonosítható, majd később áthelyeződik az eth1 interfész nevére. A ip link parancs futtatása szintén az eth1 interfészként jeleníti meg a hálózati kártyát. Ennek oka az, hogy alapértelmezés szerint a kernel által kiosztott neveket használják. A felhasználóknak egyedi szabályokat kell írniuk, például a következő fájlban: /etc/udev/rules.d/70-my-network.rules, hogy szabadon választható neveket, például lan0 vagy wireless0 használjanak, vagy alkalmazzák az előre meghatározott interfészneveket, amelyek az udev 197-es verziójától kezdve alapértelmezés szerint engedélyezve vannak.
Ne feledje, hogy el kell távolítani a régi fájlokat a korábbi udev verziókból is.
root #
rm /etc/udev/rules.d/70-persistent-net.rules /etc/udev/rules.d/80-net-setup-link.rules /etc/udev/rules.d/80-net-name-slot.rules /etc/systemd/network/99-default.link
Ügyeljen arra, hogy ne adja meg a net.ifnames=0
beállítást a kernel parancssorában. Ez a beállítás teljesen letiltaná az udev előre meghatározott interfésznév funkcióját.
További olvasnivaló a témában
- Eudev — az udev, a systemd eszközfájl kezelőjének egy fejlesztési elágazása a Linux kernel számára.
Külső források
- Hiba 575718 – Tanácsi döntési kérelem a virtual/udev alapértelmezett szolgáltatójával kapcsolatban – Az alapértelmezett virtual/udev szolgáltató megváltozott: Mostantól sys-fs/eudev az alapértelmezett.