Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Was ist Linux 6.5 udev

Was ist Linux 6.5 udev

藏色散人
藏色散人Original
2023-04-10 11:00:171037Durchsuche

linux 6.5 udev ist der Gerätemanager des Linux-Kernels; seine Hauptfunktion besteht darin, die Geräteknoten im Verzeichnis „/dev“ zu verwalten. Er wird auch verwendet, um die Funktionen von devfs (Gerätedateisystem) und hotplug (hot plug) ;In herkömmlichen Linux-Systemen sind die Geräteknoten im Verzeichnis „/dev“ eine Reihe statisch vorhandener Dateien, während „udev“ tatsächlich im System vorhandene Geräteknoten dynamisch bereitstellt.

Was ist Linux 6.5 udev

Die Betriebsumgebung dieses Tutorials: Linux 6.5-System, Dell G3-Computer.

Linux 6.5 Was ist udev?

udev udevadm-Einführung und Linux-Geräteumbenennung und automatische Mount-Anwendungsbeispielanalyse

(1) UDEV-Einführung

Die Definition von udev in Wikipedia lautet: udev (userspace /dev) ist ein Gerätemanager für Als Nachfolger von devfsd und hotplug verwaltet udev hauptsächlich Geräteknoten im Verzeichnis /dev. Gleichzeitig verarbeitet udev auch alle Benutzerbereichsereignisse, die auftreten, wenn Hardwaregeräte zum System hinzugefügt oder daraus entfernt werden Laden je nach Bedarf für bestimmte Geräte. Auf Chinesisch: udev ist der Gerätemanager des Linux-Kernels. Seine Hauptfunktion besteht darin, Geräteknoten im Verzeichnis /dev zu verwalten. Es wird auch verwendet, um die Funktionen von devfs (Gerätedateisystem) und hotplug (Hot Plug) zu übernehmen, was bedeutet, dass es das /dev-Verzeichnis und alle Verhaltensweisen im Benutzerbereich beim Hinzufügen/Entfernen von Hardware, einschließlich beim Laden von Firmware, verwalten muss.

(1) udev-Zusammenfassung:

In herkömmlichen Linux-Systemen sind die Geräteknoten im Verzeichnis /dev eine Reihe statisch vorhandener Dateien, während udev tatsächlich im System vorhandene Geräteknoten dynamisch bereitstellt. Obwohl devfs ähnliche Funktionen bietet, hat udev Vorteile gegenüber devfs:

  • udev unterstützt eine feste Benennung von Geräten und ist nicht von der Reihenfolge abhängig, in der die Geräte in das System eingefügt werden. Die Standardeinstellungen von udev sehen eine feste Benennung von Speichergeräten vor. Ein Gerät kann anhand von vid (Anbieter), pid (Gerät), Gerätename (Modell) und anderen Attributen oder den entsprechenden Attributen seines übergeordneten Geräts bestätigt werden.
  • udev wird vollständig im Userspace ausgeführt, nicht im Kernelspace wie devfs. Das Ergebnis ist, dass udev die Benennungsrichtlinie aus dem Kernel entfernt und es jedem Programm ermöglicht, das Gerät in den Geräteeigenschaften zu benennen, bevor der Knoten erstellt wird.

(2) udev-Laufmodus:

udev ist ein universeller Kernel-Gerätemanager. Es läuft als Daemon auf Linux-Systemen und lauscht auf vom Kernel ausgegebene uevents (über den Netlink-Socket), wenn ein neues Gerät initialisiert oder aus dem System entfernt wird.
Das System stellt eine Reihe von Regeln zum Abgleich der exportierten Werte erkennbarer Geräteereignisse und -eigenschaften bereit. Übereinstimmungsregeln können Geräteknoten benennen und erstellen und Konfigurationsprogramme ausführen, um das Gerät zu konfigurieren. udev-Regeln können Attribute wie das Kernel-Subsystem, den Kernel-Gerätenamen, physikalische Eigenschaften des Geräts oder die Seriennummer des Geräts abgleichen. Regeln können auch Informationen von externen Programmen anfordern, um das Gerät zu benennen, oder einen benutzerdefinierten Namen angeben, der immer derselbe ist, unabhängig davon, wann das Gerät vom System erkannt wird

(3) udev-Systemarchitektur:

udev Das System kann in drei Teile unterteilt werden:

  • libudev-Funktionsbibliothek, mit der Geräteinformationen abgerufen werden können.
  • udevd-Daemon, der sich im Benutzerbereich befindet, wird zur Verwaltung von Virtual/Dev verwendet.
  • Der Verwaltungsbefehl udevadm wird zur Fehlerdiagnose verwendet.

Das System erhält die vom Kernel gesendeten Informationen über den Netlink-Socket. Frühere Versionen verwendeten Hotplug und fügten zu diesem Zweck einen Link zu sich selbst in /etc/hotplug.d/default hinzu.

(2) Einführung in den Befehl udevadm

Es wird so in der Linux-Manpage beschrieben. udevadm – udev-Verwaltungstool. Mit anderen Worten: Der Befehl udevadm ist ein Tool zur Verwaltung von udev. Wenn wir das Gerät umbenennen oder automatisch mounten möchten, verwenden wir tatsächlich auch udevadm, um udev-Informationen anzuzeigen und zu verfolgen.
udevadm kann verwendet werden, um das Laufzeitverhalten von udev zu überwachen und zu steuern, Kernel-Ereignisse anzufordern, Ereigniswarteschlangen zu verwalten und einen einfachen Debugging-Mechanismus bereitzustellen.

(1) udevadm-Hauptbefehl:

  • info Die sysfs- oder udev-Datenbank abfragen
  • trigger Ereignisse vom Kernel anfordern
  • settle Die udev-Ereigniswarteschlange anzeigen und beenden, wenn alle Ereignisse verarbeitet wurden
  • control Den internen Status von ändern Die udev-Hintergrundinformationen
  • monitor überwacht Kernel-UEvents
  • hwdb Verarbeitet den Hardware-Datenbankindex
  • test Debugging

(2) Befehlsanwendung:

(a) Geräteinformationen anzeigen:

udevadm info --query=all --name=sda 查询sda的所有信息
udevadm info --query=path --name=sda 查看sda的path
udevadm info --attribute-walk --name=/dev/nvme0n1  查看nvme0n1的所有父设备一直到sysfs的根节点

--query=type   Fragen Sie die angegebenen ab aus der Datenbank Art der Ausrüstung. --path und --name sind erforderlich, um das Gerät anzugeben. Zulässige Abfragedateien sind: Gerätename, Link, Pfad, Attribut
--path=devpath   Pfad des Geräts
--name=file   Geräteknoten oder Link
--attribute-walk   Drucken Sie die Attribute aller Sysfs-Datensätze des angegebenen Geräts aus Verwenden Sie udev-Regeln, um bestimmte Geräte abzugleichen. Diese Option druckt alle Geräteinformationen in der Kette, bis zum sys-Verzeichnis.
--device-id-of-file=file Gibt die Master-/Slave-Gerätenummer aus.
--export-db Gibt den Inhalt der udev-Datenbank aus.

(b) Überwachen Sie Geräteereignisse: udevadm monitor [Optionen] Überwachen Sie Kernel-Ereignisse und Von udev gesendete Ereignisse. Das Gerät, von dem das Druckereignis ausgegeben wurde. Das Ereignis-Timing kann durch Vergleich der Zeitstempel von Kernel- oder udev-Ereignissen analysiert werden.

udevadm monitor --property   输出事件的属性
udevadm monitor --kernel --property --subsystem-match=usb    过滤监听符合条件的时间

--kernel Kernel-Ereignisse ausgeben

--udev Udev-Ereignisse ausgeben, wenn udev-Regeln ausgeführt werden

--property Ereigniseigenschaften ausgeben
--subsystem-match=string Ereignisse nach Subsystem oder Gerätetyp filtern. Es werden nur udev-Geräteereignisse weitergeleitet, die mit dem Subsystemwert übereinstimmen.
--tag-match=string  Filtern Sie Ereignisse nach Attributen, und nur udev-Ereignisse, die mit dem Tag übereinstimmen, werden weitergeleitet.

(c) Simulieren Sie ein udev-Ereignis

udevadm test [Optionen] devpath Simulieren Sie ein udev-Ereignis und drucken Sie Debug-Informationen aus.

(d) Vom Kernel gesendete Geräteereignisse empfangen

udevadm-Trigger [Optionen] Vom Kernel gesendete Geräteereignisse empfangen. Wird hauptsächlich zur Wiedergabe von Coldplug-Ereignisinformationen verwendet

(Der Kernel hat die Hardwaregeräte des Systems beim Start erkannt und die Hardwaregeräteinformationen über das virtuelle Dateisystem des Sysfs-Kernels exportiert. udev scannt das Sysfs-Dateisystem und generiert Hot-Plugging basierend auf den Hardwaregeräteinformationen ( hotplug) liest udev dann diese Ereignisse und generiert die entsprechende Hardware-Gerätedatei. Da es keine tatsächliche Aktion zum Ein- und Ausstecken der Hardware gibt, wird dieser Vorgang als coldplug bezeichnet.

--verbose   Gibt die Liste der Geräte aus, die ausgelöst werden.
--dry-run    Löst eigentlich kein Ereignis aus.
--type=type    Löst ein spezielles Gerät aus. Zulässige Typen: Geräte, Subsystem, fehlgeschlagen. Der Standardwert ist Geräte
--action=action  Das Ereignis, das ausgelöst wird, der Standardwert ist change
--subsystem-match=subsystem  Das Geräteereignis, das das entsprechende Subsystem auslöst. Diese Option kann mehrfach angegeben werden und unterstützt den Shell-Mustervergleich.
--attr-match=attribute=value   Löst Geräteereignisse aus, die mit sysfs-Attributen übereinstimmen. Wenn ein Attributwert zusammen mit einem Attribut angegeben wird, kann der Wert des Attributs mithilfe von Shell-Mustern abgeglichen werden. Wenn kein Wert angegeben wird, werden vorhandene Eigenschaften erneut validiert. Diese Option kann mehrfach angegeben werden.
--attr-nomatch=attribute=value  Löst keine Geräteereignisse aus, die mit Attributen übereinstimmen. Wenn möglich, verwenden Sie Mustervergleich. Sie können
--property-match=property=value auch mehrmals angeben, um Geräte mit passenden Eigenschaften abzugleichen. Sie können mehrere Male angeben, um den Mustervergleich zu unterstützen
--tag-match=property    Geräte mit passenden Tags abgleichen. Kann mehrfach angegeben werden.
--sysname-match=name Gleicht Geräte mit demselben sys-Gerätenamen ab. Der Support-Pattern-Matching kann mehrfach angegeben werden.

(e) Zeigen Sie die udev-Ereigniswarteschlange an

udevadm setze [Optionen] Sehen Sie sich die udev-Ereigniswarteschlange an und beenden Sie den Vorgang, wenn alle Ereignisse verarbeitet wurden.

--timeout=seconds  Maximale Wartezeit, bis die Ereigniswarteschlange leer ist. Der Standardwert beträgt 180 Sekunden. Wenn es 0 ist, beenden Sie es sofort.

--seq-start=seqnum  Warten Sie nur bis zur angegebenen Sequenznummer.
--seq-end=seqnum  Warten Sie nur bis zur angegebenen Sequenznummer.
--exit-if-exists=file   Beenden, wenn die Datei vorhanden ist
--quiet  Keine Informationen ausgeben

(2) Anwendungsbeispiele:

Verwenden Sie udev, um USB, SD-Kartengeräteumbenennung, automatisches Mounten und automatische Deinstallation zu implementieren .

Eine einfache Anwendung dieser Funktion finden Sie in einem anderen Blog: „udev benennt den Geräteknotennamen um und mountet und unmountet die Speichergerätepartition automatisch“

In diesem Artikel werden hauptsächlich die bei der Verwendung auftretenden Probleme und Vorsichtsmaßnahmen beschrieben.

(三)注意事项:

(1)设备冲突问题:

    在海思平台,对于有些SD卡或是USB自动挂载有些时候会出现冲突的问题,问题现象就是自动挂载的时候有时候有时候U盘和SD卡自动挂载相互干扰。主要原因点是因为海思的HI35XX的很多设备不具备SDIO总线,所以如果要使用SD的设备,一般都是将SD卡通过读卡器转换为USB总线信号。对于对于这类问题,可以通过SD卡的读卡器ID来区分是USB还是SD卡设备。

在海思平台可以使用下面命令查看USB设备信息:

lsusb:

~ # lsusb
Bus 001 Device 002: ID 1c9e:9b3c
Bus 001 Device 003: ID 05e3:0610
Bus 001 Device 001: ID 1d6b:0002
Bus 002 Device 001: ID 1d6b:0001
Bus 001 Device 008: ID 0951:1642
Bus 001 Device 009: ID 05e3:0716
Bus 001 Device 006: ID 0bda:8176
~ #

cat device 

~ # cat /sys/kernel/debug/usb/devices 
T:  Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=12   MxCh= 2
B:  Alloc=  0/900 us ( 0%), #Int=  0, #Iso=  0
D:  Ver= 1.10 Cls=09(hub  ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1d6b ProdID=0001 Rev= 3.10
S:  Manufacturer=Linux 3.10.0 ohci_hcd
S:  Product=HIUSB OHCI
S:  SerialNumber=hiusb-ohci
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=  0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   2 Ivl=255ms

T:  Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=480  MxCh= 2
B:  Alloc=  0/800 us ( 0%), #Int=  5, #Iso=  0
D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1d6b ProdID=0002 Rev= 3.10
S:  Manufacturer=Linux 3.10.0 ehci_hcd
S:  Product=HIUSB EHCI
S:  SerialNumber=hiusb-ehci
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=  0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   4 Ivl=256ms

T:  Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  2 Spd=480  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1c9e ProdID=9b3c Rev= 3.18
S:  Manufacturer=LONGSUNG
S:  Product=USB Modem
C:* #Ifs= 5 Cfg#= 1 Atr=80 MxPwr=500mA
I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=42 Prot=01 Driver=option
E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:* If#= 1 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
E:  Ad=83(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
E:  Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:* If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
E:  Ad=85(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
E:  Ad=84(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:* If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
E:  Ad=87(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
E:  Ad=86(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:* If#= 4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=GobiNet
E:  Ad=89(I) Atr=03(Int.) MxPS=   8 Ivl=32ms
E:  Ad=88(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=05(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms

T:  Bus=01 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#=  3 Spd=480  MxCh= 4
D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=02 MxPS=64 #Cfgs=  1
P:  Vendor=05e3 ProdID=0610 Rev=32.98
S:  Product=USB2.0 Hub
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=100mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=01 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   1 Ivl=256ms
I:* If#= 0 Alt= 1 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=02 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   1 Ivl=256ms

T:  Bus=01 Lev=02 Prnt=03 Port=00 Cnt=01 Dev#=  8 Spd=480  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=0951 ProdID=1642 Rev= 1.00
S:  Manufacturer=Kingston
S:  Product=DT 101 G2
S:  SerialNumber=001CC0EC32F7BB40F71300BF
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=200mA
I:* If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms

T:  Bus=01 Lev=02 Prnt=03 Port=02 Cnt=02 Dev#=  9 Spd=480  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=05e3 ProdID=0716 Rev=97.27
S:  Manufacturer=Genesys
S:  Product=USB Reader
S:  SerialNumber=000000000013
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=500mA
I:* If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms

T:  Bus=01 Lev=02 Prnt=03 Port=03 Cnt=03 Dev#=  6 Spd=480  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=0bda ProdID=8176 Rev= 2.00
S:  Manufacturer=Realtek
S:  Product=802.11n WLAN Adapter
S:  SerialNumber=00e04c000001
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=500mA
I:* If#= 0 Alt= 0 #EPs= 4 Cls=ff(vend.) Sub=ff Prot=ff Driver=rtl8192cu
E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=84(I) Atr=03(Int.) MxPS=  64 Ivl=125us
~ #

查看上面信息可以知道USB相关的设备有:
Product=HIUSB EHCI   #海思USB总线
Product=USB Modem  #上网模块
Product=USB2.0 Hub   #USB HUB
Product=DT 101 G2    # U盘
Product=USB Reader # usb 读卡器
Product=802.11n WLAN Adapter #USB网卡

(2)多属性匹配问题

    对于一个设备如果要匹配他的多个属性,或者是同一个属性,它在不同的层级中有不同的值,那么这个时候需要使用GOTO功能。比如在一个设备中要重名名一个USB设备,它的命令如下:

KERNEL=="sd*",KERNELS=="*:0:0:1",ATTRS{scsi_level}=="0" ,ATTRS{product}=="USB Reader",ATTRS{idVendor}=="05e3",ATTRS{idProduct}=="0716",SYMLINK+="usbsda%n",OPTIONS="ignore_remove"

这里涉及到多个属性ATTRS 值的匹配,另外该USB因为有些经过了usbHUB,所以他的idVendor 和 idProduct 有多个,就有总线的,也有HUB的,还有USB设备的,这样的情况下是匹配不上设备的。具体是什么原因我没有找到一个合理的解释,但是我又一个可用的解决方案,那就是使用GOTO。将上面命令改成如下就可以了。

KERNEL=="sd*",KERNELS=="*:0:0:1",ATTRS{scsi_level}=="0" GOTO="hisi_end"
ATTRS{product}=="USB Reader",ATTRS{idVendor}=="05e3",ATTRS{idProduct}=="0716",SYMLINK+="usbsda%n",OPTIONS="ignore_remove"
LABEL="hisi_end"

(3)监控设备事件

    udev的一些匹配规则有些时候比较的莫名其妙,我也没有找到哪里有比较详细的说明,网上的介绍都它过于简单,实际应用的时候还是很多的问题,比如针对上面介绍的设备,如果要写一条卸载设备的命令,可以使用下面语句:

ACTION=="remove",KERNELS=="*:0:0:1",ATTRS{idVendor}=="05e3",ATTRS{idProduct}=="0716",RUN+="/bin/umount -l /opt/usb_sd1_1"

但是在实际使用的时候,他们匹配不上,ACTION=="remove",KERNELS=="*:0:0:1"与ATTRS{idVendor}=="05e3",ATTRS{idProduct}=="0716" 不能同时使用,如果直接改成:

ACTION=="remove",KERNELS=="*:0:0:1",RUN+="/bin/umount -l /opt/usb_sd1_1"

命令功能可以实现,但是这样会出现于设备冲突的情况,在拔出该设备的时候,会把KERNELS=="*:0:0:1" 的其他设备也卸载掉。

在这个时候,我们可以使用 devadm monitor --property  去监控设备拔出的时候它有哪些事件,有哪些属性可以被捕捉到并且与其他的设备属性不同以便区分不同的设备。下面是截取到的一部分数据:

[10:00:33]KERNEL[1555639338.737818] remove   /devices/platform/hiusb-ehci.0/usb1/1-2/1-2.3 (usb)
[10:00:33]UDEV_LOG=3
[10:00:33]ACTION=remove
[10:00:33]DEVPATH=/devices/platform/hiusb-ehci.0/usb1/1-2/1-2.3
[10:00:33]SUBSYSTEM=usb
[10:00:33]DEVNAME=bus/usb/001/007
[10:00:33]DEVTYPE=usb_device
[10:00:33]PRODUCT=5e3/716/9727
[10:00:33]TYPE=0/0/0
[10:00:33]BUSNUM=001
[10:00:33]DEVNUM=007
[10:00:33]SEQNUM=1024
[10:00:33]MAJOR=189
[10:00:33]MINOR=6

从上面可以看出,拔出的时候有个PRODUCT ,它是 idVendor 和 idProduct 值的一个组合,可以使用它来区分不同的设备。最终可以正常卸载设备的命令如下:

ACTION=="remove",SUBSYSTEM=="usb",ENV{PRODUCT}=="5e3/716/9727",RUN+="/bin/umount -l /opt/usb_sd1_1"

相关推荐:《Linux视频教程

Das obige ist der detaillierte Inhalt vonWas ist Linux 6.5 udev. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Was ist Linux VCS?Nächster Artikel:Was ist Linux VCS?