• Linux 的热插拔机制通过 Udev(用户空间设备)实现、守护进程


    一、Udev作用概述

    • udev机制简介
    • 什么是 udev
    • 使用 udev 的好处
    • udev工作流程图

    二、如何配置和使用 udev

    • UDEV的配置文件
    • udev 的配置文件(/etc/udev/udev.conf)
    • 通过 udev 设定设备文件的权限

    三、udev 的规则和规则文件

    • Ubuntu udev rules
    • UDEV的配置文件(udev的rules编写)
    • udev 规则的匹配键和赋值键
    • udev 规则的所有操作符

    四、Linux的热拔插UDEV机制
    五、守护进程

    • 守护进程概念
    • 守护进程在后台运行
    • 基本特点

    六、守护进程和后台进程的区别

    一、Udev作用概述

    udev机制简介
    Linux 基础 – udev 和 rules 使用规则BestW2Y的博客-CSDN博客linux rules

    什么是 udev

    udev 是 Linux2.6 内核里的一个功能,它替代了原来的 devfs,成为当前 Linux 默认的设备管理工具。udev 以守护进程的形式运行,通过帧听内核发出来的 uevent 来管理 /dev 目录下的设备文件。不像之前的设备管理工具,udev 在用户空间(User space)运行,而不在内核空间(kernel space)运行。

    Udev(用户空间设备)是一个 Linux 系统中用于动态管理设备的设备管理器。它的主要作用是在设备插入或移除时,负责管理与这些事件相关联的设备节点以及执行相应的动作。以下是 Udev 的一些主要作用概述:

    1. 设备发现和管理: Udev 负责在 Linux 系统中检测和管理设备。当新设备插入或旧设备被移除时,Udev 负责识别这些变化,并在 /dev 目录下创建或删除相应的设备节点。

    2. 设备命名: Udev 为设备节点提供了一个规范的命名机制,以便用户和应用程序能够更容易地识别设备。这有助于确保相同类型的设备在不同系统上都有相似的设备节点名称。

    3. 热插拔支持: Udev 支持热插拔设备,即在系统运行时插入或移除设备。它可以动态地更新设备节点,而无需重新启动系统。

    4. 规则系统: Udev 使用规则文件来定义在设备事件发生时要执行的操作。这些规则可以基于设备属性、类型和其他标识符来匹配。规则允许用户执行自定义脚本、设置环境变量、创建符号链接等操作。

    5. 持久化设备节点: Udev 提供了机制,以确保设备节点的稳定性。即使设备在重新启动后未连接,Udev 仍会分配相同的设备节点名称,以便应用程序可以依赖特定的设备节点。

    6. 提供额外信息: Udev 为每个设备节点提供了大量的额外信息,例如设备类型、设备路径、驱动程序信息等。这些信息可用于用户空间的应用程序,以更好地理解和利用系统中的设备。

    总体而言,Udev 是 Linux 系统中一个重要的组件,它使设备的管理变得更加动态、灵活,并支持热插拔和用户空间的定制化设备管理。

    使用 udev 的好处

    我们都知道,所有的设备在 Linux 里都是以设备文件的形式存在。在早期的 Linux 版本中,/dev 目录包含了所有可能出现的设备的设备文件。很难想想 Linux 用户如何在这些大量的设备文件中找到匹配条件的设备文件。现在 udev 只为那些连接到 Linux 操作系统的设备产生设备文件。并且 udev 能通过定义一个 udev 规则(rule)来产生匹配设备属性的设备文件,这些设备属性可以是内核设备名称、总线路径、厂商名称、型号、序列号或者磁盘大小等等。

    • 动态管理:当设备添加/删除时,udev 守护进行帧听来自内核的 uevent,以此添加或者删除 /dev 下的设备文件,所以 udev 只为已经连接的设备产生设备文件,而不会在 /dev 下产生大量虚无的设备文件。

    • 自定义命名规则:通过 Linux 默认的规则文件,udev 在 /dev/ 里为所有的设备定义了内核设备名称,比如 /dev/sda、/dev/hda、/dev/fd 等等。由于 udev 是在用户空间(user space)运行,Linux 用户可以通过自定义的规则文件,灵活地产生标识性强的设备文件名,比如 /dev/boot_disk、/dev/root_disk、/dev/color_printer 等等。

    • 设定设备的权限和所有者/组:udev 可以按一定的条件来设置设备文件的权限和设备文件所有者/组。在不同的 udev 版本中,实现的方法不同,在 “如何配置和使用 udev” 中会详解。

    udev工作流程图:

    下面的流程图显示 udev 添加/删除 设备文件的过程。
    在这里插入图片描述
    相关术语:

    • 设备文件:由于本文以较通俗的方式讲解 udev,所以设备文件是泛指在 /dev/ 下,可被应用程序用来和设备驱动交互的文件。而不会特别地区分设备文件、设备节点或者设备特殊文件。
    • devfs:devfs 是 Linux 早期的设备管理工具,已经被 udev 取代。
    • sysfs:sysfs 是 Linux 2.6 内核里的一个虚拟文件系统(/sys)。它把设备和驱动的信息从内核的设备模型导出到用户空间(user space)。从该文件系统中,Linux 用户可以获取很多设备的属性。
    • devpath:本文的 devpath 是指一个设备在 sysfs 文件系统(/sys)下的相对路径,该路径包含了该设备的属性文件。udev 里的多数命令都是针对 devpath 操作的。例如:sda 的 devpath 是 /block/sda,sda2 的 devpath 是 /dev/sda/sda2。
    • 内核设备名称:设备在 sysfs 里的名称,是 udev 默认使用的设备文件名。

    二、如何配置和使用 udev

    配置和使用udev通常涉及创建和编辑udev规则,这些规则定义了设备在系统中的行为。以下是一些配置和使用udev的基本步骤:

    1. 了解udev的基本概念: 在使用udev之前,建议了解一些基本概念,例如subsystemKERNELACTION等。这有助于理解规则的语法和规则如何匹配设备。

    2. 查看已存在的规则:/etc/udev/rules.d/目录下,有一些默认的udev规则文件,例如70-persistent-net.rules。查看这些文件,了解已有的规则是如何编写的。

    3. 创建或编辑规则文件: 可以通过创建新的规则文件或编辑已有的规则文件来定义udev规则。规则文件的命名约定是以数字和描述性名称开头,例如10-local.rules。数字决定了规则的优先级,数字越小,规则越早被处理。

      sudo nano /etc/udev/rules.d/10-local.rules
      
      • 1
    4. 编写规则: 规则的编写使用基于键值对的语法。以下是一个简单的规则示例:

      # 当插入一个块设备并且设备的内核名是sda时,执行脚本
      SUBSYSTEM=="block", KERNEL=="sda", ACTION=="add", RUN+="/bin/my_custom_script"
      
      • 1
      • 2

      在这个例子中,SUBSYSTEM=="block"表示规则适用于块设备,KERNEL=="sda"表示设备的内核名是sdaACTION=="add"表示设备被添加,RUN+="/bin/my_custom_script"表示在添加时执行/bin/my_custom_script脚本。

    5. 重新加载规则: 在编辑或创建规则文件后,需要重新加载udev规则。

      sudo udevadm control --reload-rules
      
      • 1
    6. 测试规则: 插入或移除设备,观察规则是否按照预期执行。可以使用udevadm monitor命令来监视udev事件。

      sudo udevadm monitor
      
      • 1

      在另一个终端中插入或移除设备,观察监视器中的输出。

    7. 查看udev事件信息: 使用udevadm info命令来查看设备的udev信息。

      sudo udevadm info --attribute-walk --path=/sys/path/to/device
      
      • 1

      替换/sys/path/to/device为实际设备的路径。

    请注意,对udev的配置更改可能会影响设备的命名和系统的行为,因此在进行更改之前,请确保了解其影响。

    UDEV的配置文件

    udev(设备管理器)是Linux系统中用于管理设备的设备管理器。udev通过配置文件来定义设备规则,这些规则决定了设备在系统中的命名、权限以及其他属性。udev的配置文件通常存储在/etc/udev/目录下。

    以下是udev的两个主要配置文件:

    1. /etc/udev/udev.conf 这个文件包含全局udev配置。其中的一些配置项包括udev的日志级别、日志位置等。可以使用文本编辑器打开此文件进行编辑。

    2. /etc/udev/rules.d/目录: 这个目录包含设备规则文件。规则文件的命名约定是以数字和描述性名称开头,例如10-local.rules。数字的作用是确定规则的优先级,数字越小,规则越早被处理。

      规则文件的内容形式为一系列的规则,每个规则描述了设备的匹配条件以及设备被插入系统时应该执行的操作。以下是一个简单的规则示例:

      # 规则示例
      SUBSYSTEM=="block", KERNEL=="sda", ACTION=="add", RUN+="/bin/my_custom_script"
      
      • 1
      • 2

      这个规则的意思是当插入一个块设备(block subsystem)并且设备的内核名是sda时,执行名为my_custom_script的脚本。

    udev 的配置文件(/etc/udev/udev.conf)

    要注意的是,修改udev配置可能会影响系统的设备命名和管理,因此在进行修改之前,请确保了解你要进行的更改并备份相关文件。

    在通常的Linux系统中,udev的全局配置文件通常是/etc/udev/udev.conf。这个文件包含了udev守护进程的全局设置。你可以使用文本编辑器打开这个文件以查看或编辑其内容。

    以下是一个简单的udev.conf文件的例子:

    # /etc/udev/udev.conf
    # udev configuration
    
    # 关闭udev的对内核内置规则的加载,不使用/lib/udev/rules.d/目录下的规则
    # KERNEL=="eth*", NAME="my_eth%n"
    # 在/lib/udev/rules.d/中的规则不会加载,所以就不会有内核的eth规则了。
    udev_builtin_rules="no"
    
    # 决定对于来自内核的所有事件,是否使用/dev目录。
    # 建议设置为"yes",使udev创建设备节点。
    USEC_DEVFS="yes"
    
    # 设备文件和符号链接的权限,默认是0664
    # Udev允许更灵活的权限设置,例如OWNER、GROUP和MODE。
    # 详细参考 man udev。
    # Udev 183 以上的版本采用TAG标记来替代MODE
    # MODE="0664"
    TAG+="udev-acl"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这个文件中,注释行以#开头。重要的配置项有:

    • udev_builtin_rules: 控制是否加载内核内置的udev规则。在某些情况下,你可能希望关闭这个选项,以便自定义规则能够完全替代内核提供的规则。
    • USEC_DEVFS: 决定是否使用/dev目录。设置为"yes"表示使用,设置为"no"表示不使用。
    • TAG+="udev-acl": 这是一个用于设置权限的示例。你可以使用OWNERGROUPMODE来设置设备文件和符号链接的权限。

    请注意,udev的配置可能因Linux发行版而有所不同。在更改udev的配置之前,请确保备份配置文件,并了解更改可能带来的影响。

     [root@HOST_RHEL4 dev]# cat /etc/udev/udev.conf 
     # udev.conf 
     # The main config file for udev 
     # 
     # This file can be used to override some of udev's default values 
     # for where it looks for files, and where it places device nodes. 
     # 
     # WARNING: changing any value, can cause serious system breakage! 
     # 
     
     # udev_root - where in the filesystem to place the device nodes 
     udev_root="/dev/"
     
     # udev_db - The name and location of the udev database. 
     udev_db="/dev/.udev.tdb"
     
     # udev_rules - The name and location of the udev rules file 
     udev_rules="/etc/udev/rules.d/"
     
     # udev_permissions - The name and location of the udev permission file 
     udev_permissions="/etc/udev/permissions.d/"
     
     # default_mode - set the default mode for all nodes that have no 
     #                explicit match in the permissions file 
     default_mode="0600"
     
     # default_owner - set the default owner for all nodes that have no 
     #                 explicit match in the permissions file 
     default_owner="root"
     
     # default_group - set the default group for all nodes that have no 
     #                 explicit match in the permissions file 
     default_group="root"
     
     # udev_log - set to "yes" if you want logging, else "no"
     udev_log="no"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    Linux 用户可以通过改文件设置以下参数:

    • udev_root:udev 产生的设备所存放的目录,默认值是 /dev/。建议不要修改该参数,因为很多应用程序默认会从该目录调用设备文件。
    • udev_db:udev 信息存放的数据库或者所在目录,默认值是 /dev/.udev.tdb。
    • udev_rules:udev 规则文件的名称或者所在目录,默认值是 /et/udev/rules.d/。
    • udev_permissions:udev 权限文件的名字或者所在目录,默认值是 /etc/udev/permissions.d/。
    • default_mode/default_owner/default_group:如果设备文件的权限没有在权限文件里指定,就使用该参数作为默认权限,默认值分别是:0600/root/root。
    • udev_log:是否需要 syslog 记录 udev 日志的开关,默认值是 no。

    通过 udev 设定设备文件的权限

    通过udev设置设备文件的权限通常涉及编辑udev规则文件。这些规则文件位于/etc/udev/rules.d/目录中,文件名以数字和描述性名称的组合开头。规则文件的目的是在设备插入时执行自定义操作,例如设置设备文件的权限。

    以下是一个简单的udev规则文件示例,用于设置设备文件的权限:

    # /etc/udev/rules.d/99-my-custom.rules
    
    # 规则:当插入USB设备时,设置权限
    ACTION=="add", SUBSYSTEM=="usb", MODE="0666"
    
    • 1
    • 2
    • 3
    • 4

    在这个例子中:

    • ACTION=="add":表示当设备被添加时执行规则。
    • SUBSYSTEM=="usb":表示该规则仅适用于USB子系统的设备。
    • MODE="0666":表示设置权限为0666,即允许任何用户读写设备文件。

    请按照以下步骤操作:

    1. 创建一个新的udev规则文件,例如99-my-custom.rules。你可以选择一个数字前缀,确保它在其他规则文件之后加载。
    2. 在规则文件中添加适当的规则,根据你的需求设置ACTIONSUBSYSTEMMODE等选项。
    3. 保存文件并重启udev服务或重新插入设备。

    请注意,规则文件的加载顺序很重要。规则文件按照数字和字母顺序加载,因此确保你的规则文件的数字前缀足够大,以确保在其他规则之后加载。

    在修改udev规则之前,请确保备份相关文件,以防止不必要的问题。

    三、udev 的规则和规则文件

    udev是Linux系统中用于设备管理的守护进程,它负责设备的动态创建、删除以及设备文件的管理。udev的配置信息保存在规则文件中,规则文件定义了在特定条件下执行的动作。以下是关于udev规则和规则文件的一些基本概念:

    1. 规则(Rules):

    udev规则定义了在特定条件下执行的动作。这些条件通常基于设备属性、内核信息等。规则由键值对的形式组成,例如:

    ACTION=="add", SUBSYSTEM=="usb", RUN+="/path/to/my/script.sh"
    
    • 1

    在这个例子中,规则表示当USB设备被添加时(ACTION=="add"SUBSYSTEM=="usb"),将执行/path/to/my/script.sh脚本。

    2. 规则文件(Rules Files):

    规则文件是包含udev规则的文本文件。规则文件的命名通常遵循XX-descriptive-name.rules的格式,其中XX是两位数字,表示规则文件的加载顺序。规则文件中可以包含一个或多个规则。

    3. 规则文件的位置:

    udev规则文件通常存储在/etc/udev/rules.d/目录下。这个目录中的规则文件按照数字和字母的顺序加载,因此文件名的前缀数字决定了规则加载的顺序。

    4. 规则语法:

    规则的语法遵循键值对的形式,包括条件和对应的动作。条件由设备属性、内核信息等组成,而动作定义了在条件满足时执行的操作。

    CONDITION1=="value1", CONDITION2=="value2", ..., ACTION
    
    • 1

    5. 规则的执行动作:

    规则中的动作是在条件满足时执行的命令或脚本。这些动作可以是创建设备文件、运行脚本、加载驱动程序等。例如:

    RUN+="/path/to/my/script.sh"
    
    • 1

    这个规则表示在满足条件时执行/path/to/my/script.sh脚本。

    6. 重载规则:

    在修改udev规则文件后,通常需要重新加载规则使其生效。可以通过重新启动udev服务或使用udevadm命令进行规则的重新加载。

    sudo systemctl restart udev
    
    • 1

    或者

    sudo udevadm control --reload-rules
    
    • 1

    这些命令将使新的规则生效。

    总的来说,udev规则文件用于定义设备管理的行为,规则根据设备的属性、内核信息等条件触发相应的动作。规则文件的命名和加载顺序非常重要,因为它们决定了规则的优先级。

    Ubuntu udev rules

    在Ubuntu上,udev规则文件通常存储在/etc/udev/rules.d/目录下。您可以创建自定义规则文件以定义设备管理的行为。以下是在Ubuntu上创建和使用udev规则的一般步骤:

    1. 打开终端

      打开终端应用,您可以使用快捷键Ctrl + Alt + T

    2. 进入规则文件目录

      cd /etc/udev/rules.d/
      
      • 1
    3. 创建规则文件

      使用文本编辑器(例如nanogedit)创建一个新的规则文件。规则文件的命名通常遵循XX-descriptive-name.rules的格式,其中XX是两位数字。

      sudo nano 99-my-custom-rule.rules
      
      • 1

      在这个例子中,99表示这个规则文件将在其他规则之后加载。my-custom-rule.rules是文件的描述性名称。

    4. 编辑规则文件

      在打开的规则文件中,添加您的udev规则。规则的语法为条件和动作的键值对。

      例如,以下规则表示当USB设备插入时,在/tmp/usb_log.txt文件中写入一条日志:

      ACTION=="add", SUBSYSTEM=="usb", RUN+="/bin/sh -c 'echo USB device inserted >> /tmp/usb_log.txt'"
      
      • 1

      您可以根据自己的需求添加其他规则。

    5. 保存并退出

      nano中,按Ctrl + X,然后按Y确认保存,最后按Enter退出。

    6. 重启udev服务或重新加载规则

      重启udev服务或重新加载规则以使新规则生效。

      sudo systemctl restart udev
      
      • 1

      或者

      sudo udevadm control --reload-rules
      
      • 1

      请注意,重启udev服务会影响整个系统。

    以上是创建和使用udev规则的基本步骤。根据您的需求,可以添加不同的规则来定义不同的设备管理行为。

    UDEV的配置文件(udev的rules编写)

    规则文件是 udev 里最重要的部分,默认是存放在 /etc/udev/rule.d/ 下。
    所有的规则文件必须以 “.rules” 为后缀名。
    下面是一个简单的规则:

    KERNEL=="sda", NAME="my_root_disk", MODE="0660"
    KERNEL 是匹配键,NAME 和 MODE 是赋值键。
    
    • 1
    • 2

    这个udev规则的含义是,当内核检测到一个名为sda的块设备(例如硬盘)时,将该设备的名称设置为my_root_disk,并将其访问权限设置为0660

    • KERNEL=="sda":这是匹配键,指定了要匹配的设备的内核名称。在这个例子中,它匹配名称为sda的设备。

    • NAME="my_root_disk":这是赋值键,指定了要为设备设置的新名称。在这里,设备的名称将设置为my_root_disk

    • MODE="0660":这是赋值键,指定了要为设备设置的权限模式。在这里,设备的权限将设置为0660,表示读写权限分别对所有者和组有效,没有执行权限。

    udev 规则的匹配键和赋值键

    总的来说,这个规则的作用是为内核中检测到的sda设备设置新的名称和权限。这对于在系统中自定义设备名称和权限方面非常有用。
    udev规则中,有两个关键的概念:匹配键(Match Key)和赋值键(Assignment Key)。这两者决定了udev规则如何匹配和处理设备。

    匹配键(Match Key)

    匹配键用于指定规则匹配的条件,即在何种情况下规则会生效。一条udev规则可以有一个或多个匹配键。以下是一些常见的匹配键:

    • KERNEL: 匹配设备的内核名称。
    • SUBSYSTEM: 匹配设备的子系统。
    • DRIVER: 匹配设备的驱动程序。
    • ATTRENV等:用于匹配设备属性或环境变量。

    赋值键(Assignment Key)

    赋值键用于指定规则在匹配时要执行的操作,即如何处理匹配的设备。以下是一些常见的赋值键:

    • NAME: 为设备指定设备文件的名称。
    • SYMLINK: 为设备创建符号链接。
    • MODE: 设置设备文件的权限。
    • OWNERGROUP: 设置设备文件的所有者和组。

    示例规则:

    # 匹配键
    KERNEL=="sda1", SUBSYSTEMS=="block", DRIVERS=="sd", ATTRS{vendor}=="ABC", ATTRS{model}=="123", ENV{ID_FS_TYPE}=="ext4"
    
    # 赋值键
    NAME="my_disk", SYMLINK+="custom_link", MODE="0666", OWNER="user", GROUP="group"
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这个规则表示当设备的内核名称为sda1,子系统为block,驱动程序为sd,厂商为ABC,型号为123,文件系统类型为ext4 时,将为该设备创建一个名为my_disk的设备文件,同时创建一个名为custom_link的符号链接,设置设备文件的权限为0666,所有者为user,组为group

    udev 规则的所有操作符

    udev 规则中可以使用多种操作符来定义匹配条件。以下是一些常见的操作符:

    1. ==: 等于
    2. !=: 不等于
    3. +=: 追加,用于赋值键 SYMLINKENV 等,表示在已有值的基础上追加新的值。
    4. :=: 覆盖,用于赋值键,表示覆盖已有的值。
    5. ==?: 如果属性存在并且有非空值,匹配成功。
    6. =!: 如果属性不存在或者存在但值为空,匹配成功。

    示例:

    # 等于
    KERNEL=="sda", SUBSYSTEM=="block", ENV{ID_FS_TYPE}=="ext4"
    
    # 不等于
    KERNEL!="sdb", SUBSYSTEMS!="usb", ATTRS{serial}!="123456"
    
    # 追加
    SYMLINK+="custom_link"
    
    # 覆盖
    MODE:="0666"
    
    # 如果属性存在且非空值
    ENV{ID_MODEL}=="", GOTO="end"
    
    # 如果属性不存在或者存在但值为空
    ENV{ID_MODEL}!="", ENV{ID_SERIAL}!="", GOTO="end"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    这些操作符可以组合使用,以满足更复杂的匹配条件。

    四、Linux的热插拔UDEV机制

    Linux 的热插拔机制主要通过 Udev(用户空间设备)来实现。Udev 是 Linux 系统中用于动态管理设备的设备管理器。以下是 Udev 实现热插拔的主要机制:

    1. 设备事件监测: Udev 不断监听内核发出的事件,以便检测设备的插入和拔出。内核通过 Netlink 通信机制向 Udev 发送设备事件。

    2. 规则匹配: 当 Udev 检测到设备事件时,它会根据预定义的规则(规则文件)来匹配事件中的设备信息。规则可以基于设备的各种属性、类型、路径等进行匹配。

    3. 规则文件: Udev 的规则文件通常存储在 /etc/udev/rules.d/ 目录下。这些规则文件定义了在特定条件下要执行的操作。规则文件的命名约定通常是 XX-name.rules,其中 XX 是两位数字,用于确定规则文件的加载顺序。

    4. 执行动作: 当规则匹配成功时,Udev 将执行相关的动作。动作可以包括创建设备节点、设置环境变量、执行脚本等。例如,可以在设备插入时创建相应的设备节点、加载适当的驱动程序等。

    5. 设备节点管理: Udev 负责在 /dev 目录下创建或删除设备节点。这确保了用户和应用程序可以在一个标准位置找到设备节点,而无需关心设备插入的确切时刻。

    6. 持久化设备节点: Udev 确保设备节点的持久性,即使设备在重新启动后未连接,也会分配相同的设备节点名称。这有助于确保应用程序可以依赖特定的设备节点。

    总体而言,Udev 通过规则匹配和执行动作的方式,实现了对设备事件的监听和处理,从而支持 Linux 系统的热插拔机制。这使得在系统运行时插入或拔出设备时,系统能够动态地适应这些变化。
    在这里插入图片描述
    udev是一个设备管理工具,udev以守护进程的形式运行,通过侦听内核发出来的uevent来管理 /dev目录下的设备文件。
    通过侦听内核发出来的硬件数据(事件),在用户空间为这个硬件去创建对应代表该硬件的文件,应用程序例如adb就可以通过该文件操作到硬件设备
    udev在用户空间运行,而不在内核空间运行。它能够根据系统中的硬件设备的状态动态更新设备文件,包括设备文件的创建,删除等。
    设备文件通常放在 /dev目录下。使用 udev后,在 /dev目录下就只包含系统中真正存在的设备。

    五、守护进程

    守护进程概念

    守护进程(Daemon Process)是在计算机系统后台运行的一类进程,它们通常在系统启动时启动,不依赖于用户直接操作,一直运行在后台,不受用户登录或注销的影响。守护进程的存在主要是为了执行特定的系统任务或服务,例如服务器、网络服务、定时任务等。

    以下是守护进程的一些特点和常见特征:

    1. 后台运行: 守护进程通常在后台运行,不与任何终端关联,不接受用户的直接输入。

    2. 脱离终端: 守护进程通常会调用 fork 函数创建一个子进程,并使得子进程成为新的会话组长,从而脱离与终端的关联。

    3. 文件描述符: 守护进程通常会关闭与终端相关的文件描述符,以防止被终端关闭影响进程运行。

    4. 重定向标准输入输出: 守护进程通常会将标准输入、输出、错误重定向到 /dev/null 或其他适当的文件,以防止输出信息到终端。

    5. 权限: 守护进程通常以超级用户或其他特定用户的身份运行,以便执行需要特殊权限的任务。

    6. 信号处理: 守护进程通常会捕获并处理一些特定的信号,如 SIGHUP,以便在配置文件更改或其他条件下重新加载配置。

    7. 周期性任务: 守护进程通常执行一些周期性的任务,如定时清理、日志轮转等。

    8. 示例: 常见的守护进程包括 sshd(SSH 服务器守护进程)、httpd(Apache HTTP 服务器守护进程)等。

    创建守护进程的一般步骤包括:

    1. 调用 fork 函数: 创建一个子进程,父进程退出,子进程继续执行。

    2. 调用 setsid 函数: 创建一个新的会话组,使得子进程成为新的会话组长。

    3. 修改工作目录: 为了防止卸载文件系统导致守护进程找不到文件,通常需要更改工作目录。

    4. 重定向标准输入输出: 将标准输入、输出、错误重定向到适当的文件。

    5. 关闭文件描述符: 关闭不需要的文件描述符,避免占用系统资源。

    6. 处理信号: 捕获并处理一些信号,如 SIGHUP

    创建和管理守护进程需要谨慎处理,确保进程以安全和可靠的方式在后台运行。

    守护进程在后台运行

    Linux Daemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的。常见的守护进程包括系统日志进程syslogd、 web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等。守护进程的名称通常以d结尾
    UDEV守护进程,它能够根据系统中的硬件设备的状态动态更新设备文件,包括设备文件的创建,删除等。

    基本特点

    • 生存周期长[非必须],一般操作系统启动的时候就启动,关闭的时候关闭。
    • 守护进程和终端无关联,也就是他们没有控制终端,所以当控制终端退出,也不会导致守护进程退出
    • 守护进程是在后台运行,不会占着终端,终端可以执行其他命令
    • 一个守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是一个由init继承的孤儿进程

    ps -efj 是一个用于显示进程信息的命令。具体解释如下:

    ps -efj
    
    • 1
    • ps: 进程状态命令。
    • -e: 显示所有进程,而不仅仅是与终端相关的进程。
    • -f: 以全格式显示。
    • -j: 以作业格式显示。

    在这个命令中,-ef 是常用组合,用于显示所有进程的详细信息。而 -j 则以作业格式显示,包括作业控制的信息。
    在这里插入图片描述
    输出的各列含义如下:

    1. UID (User ID): 进程的用户标识。
    2. PID (Process ID): 进程的唯一标识号。
    3. PPID (Parent Process ID): 父进程的标识号。
    4. PGID (Process Group ID): 进程组的标识号。
    5. SID (Session ID): 会话的标识号。
    6. TTY (Controlling Terminal): 控制终端。
    7. TPGID (Foreground Group ID of the controlling terminal): 控制终端的前台进程组的标识号。
    8. STAT (Process Status): 进程的状态,如 R(运行)、S(睡眠)、Z(僵尸)等。
    9. TIME (Cumulative CPU time): 进程执行的累计 CPU 时间。
    10. COMMAND (Command with all its arguments): 进程的命令及其参数。

    这个命令的输出显示了当前系统上所有进程的详细信息,以及它们的层次结构和作业控制信息。

    六、守护进程和后台进程的区别

    1. 守护进程和终端不挂钩;后台进程能往终端上输出东西(和终端挂钩);
    2. 守护进程关闭终端时不受影响,守护进程不会随着终端的退出而退出;

    守护进程(Daemon Process)和后台进程(Background Process)是两个不同的概念,它们有以下区别:

    1. 启动方式:

      • 守护进程: 通常由系统启动,独立于控制终端,以在后台运行的方式启动。
      • 后台进程: 可以由用户手动将一个前台进程移至后台,即使它最初是由用户启动的。
    2. 是否与终端关联:

      • 守护进程: 通常不与任何控制终端关联,因此它们不受终端关闭的影响。
      • 后台进程: 可以从终端启动,并且可能受终端的影响。
    3. 执行环境:

      • 守护进程: 在后台执行,并且通常在系统引导时启动。它们通常在系统运行期间一直存在。
      • 后台进程: 通常是用户在前台启动的进程,后来放到后台执行,可能在终端关闭后继续运行。
    4. 继承环境:

      • 守护进程: 通常会脱离终端会话,重新设置文件权限,改变工作目录等,以确保独立于用户终端的环境。
      • 后台进程: 通常继承自其父进程(通常是终端 Shell)的环境。
    5. 用户交互性:

      • 守护进程: 通常不与用户进行交互,因为它们不关联于任何终端。
      • 后台进程: 在启动时可能与用户进行交互,但放到后台后通常不再与用户直接交互。

    总的来说,守护进程是一种设计用于在系统后台一直运行的进程,而后台进程是一种在终端启动后被放到后台执行的进程。

  • 相关阅读:
    python基于PHP+MySQL高校资产管理系统
    【C语言】【strerro函数的使用】
    【Java-LangChain:面向开发者的提示工程-8】聊天机器人
    qml 无法修改listview表头控件文本
    【MySql】MySQL概述及其语法概述
    密码密钥硬编码检查
    【Redis】list列表
    动态顺序表的代码实现
    什么是响应式设计?响应式设计的基本原理是什么?如何兼容低版本的 IE?
    Go Machine Learning
  • 原文地址:https://blog.csdn.net/m0_62140641/article/details/134306483