首页 > 其他分享 >字符设备和块设备以及设备绑定

字符设备和块设备以及设备绑定

时间:2023-12-22 22:56:34浏览次数:36  
标签:字符 KERNEL -- 绑定 udev raw dev 设备

什么是字符设备和块设备?都有哪些区别?

这两个文件都与从一处向另一处写入数据和读取数据有关。 但它们之间的区别在于它们读取/写入数据的方式。

字符文件:字符文件是一种以字符方式读取/写入数据的硬件文件。 一些经典的例子是键盘、鼠标、串行打印机。 如果用户使用 char 文件写入数据,则其他用户不能使用相同的 char 文件写入数据,这会阻止其他用户的访问。 字符文件使用同步技术来写入数据。 您观察到字符文件用于通信目的,并且无法安装它们。

字符文件示例:/dev/autofs、/dev/console、/dev/crash、/dev/lp0、/dev/null、/dev/ppp、/dev/random、/dev/tty

char 文件的 ls -l 输出:

[root@yumserver dev]# ls -l tty0
crw–w—- 1 root root 4, 0 Dec 31 11:45 tty0
[root@yumserver dev]#

块文件:块文件是一种硬件文件,它以块的形式而不是逐个字符地读取/写入数据。 当我们想要批量写入/读取数据时,这种类型的文件非常有用。 我们所有的磁盘(例如 HDD、USB 和 CDROM)都是块设备。 这就是我们在格式化时考虑块大小的原因。 数据写入以异步方式完成,并且是 CPU 密集型活动。 这些设备文件用于在真实硬件上存储数据,并且可以挂载以便我们可以访问我们写入的数据。 请参阅我们关于获取设备块大小的另一篇文章。

块文件示例:/dev/loop0、/dev/ram0、/dev/sda1、/dev/sr0

ls -l 块文件的输出

[root@yumserver dev]# ls -l sda1
brw-rw—- 1 root disk 8, 1 Dec 31 11:45 sda1
[root@yumserver dev]#

获取块设备的大小

这是一个关于获取 Linux 机器中文件系统块大小的小指南。

什么是文件系统?

简而言之,这是我们将数据写入磁盘的一种方式,称为文件系统。 Linux 支持许多文件系统。

Linux 中的块大小是多少?

块是具有固定长度的位或字节序列,即 512 字节、4kB、8kB、16kB、32kB 等。

blockdev --getbsz partition

例如:

# blockdev --getbsz /dev/sda1 
4096

块设备绑定

在Linux系统中,块设备(Block device)是指可以以块为单位进行读写操作的设备,例如硬盘、固态硬盘等。在块设备绑定(Multipath)中,有两种常见的方式:多路径方式(Multiple Paths)和UUID方式(Universally Unique Identifier)。

多路径方式(Multiple Paths)

定义:多路径方式是通过多个物理路径连接到同一个存储设备,这样可以提高设备的冗余性和性能。

配置:在多路径配置中,每个路径都被视为一个独立的设备,并通过设备文件进行表示,例如/dev/sdX, 这些设备文件都指向同一个物理存储设备。

优点:

冗余性提高:如果一个路径发生故障,系统可以通过其他可用路径继续访问存储设备。

性能提高:多路径可以充分利用多个路径,提高读写性能。

缺点:

设备标识变化:当系统重新启动或者路径变化时,设备文件名可能会发生变化,导致需要更新相关配置。

udev 是一个 Linux 内核子系统,它负责在 Linux 系统启动和运行时,管理设备的动态设备节点创建和管理。“udev” 代表 “userspace device”,意味着udev 在用户空间中运行。

udev 的主要功能包括:

  1. 动态设备节点管理:当新设备连接到系统或设备状态发生变化时,udev 监听事件并动态创建或删除设备节点。这样,应用程序可以通过设备节点来识别和访问设备。
  2. 设备属性管理:udev 通过提取设备的各种属性(例如设备型号、供应商ID、产品ID等),为设备节点提供详细信息。这些属性可以被应用程序用于设备的自动识别和配置。
  3. 规则和脚本:udev 使用一系列规则和脚本来处理设备事件。这些规则和脚本可以根据设备属性、设备类型等条件来执行自定义的操作和配置。

udev 通过与 sysfs 文件系统协同工作,以及利用内核提供的设备事件通知机制,实现了设备的动态管理和配置。它在 Linux 系统中的作用非常重要,使得系统能够自动处理设备的连接和断开,提供了设备热插拔功能,并提供了一种方便的方法来管理设备的属性和事件。

多路径配置

参考[多路径multipath配置,udev绑定 - 天天开訫 - 博客园 (cnblogs.com)](https://www.cnblogs.com/doufy/p/10730438.html#:~:text=多路径multipath配置 以root用户登录 1.查看共享磁盘是否挂载成功 %23fdisk -l 2.生成配置文件 %23mpathconf,--enable 修改配置文件权限 %23chmod 644 %2Fetc%2Fmultipath.conf 查看挂载磁盘 (本机挂载的磁盘为sdc--sdn) 挂载磁盘为6)

设备绑定

[root@xxx ~]# cat /etc/udev/rules.d/99-oracle-asmdevices.rules 
KERNEL=="dm-*",ENV{DM_UUID}=="mpath-36005076xxx000000000010cb",SYMLINK+="asm/hdisk001",OWNER="grid",GROUP="asmadmin",MODE="0660"
KERNEL=="dm-*",ENV{DM_UUID}=="mpath-36005076xxx000000000010cc",SYMLINK+="asm/hdisk002",OWNER="grid",GROUP="asmadmin",MODE="0660"
KERNEL=="dm-*",ENV{DM_UUID}=="mpath-36005076xxx000000000010cd",SYMLINK+="asm/hdisk003",OWNER="grid",GROUP="asmadmin",MODE="0660"

这个配置文件是一个udev规则文件,用于在Linux系统中创建设备符号链接以及设置设备的权限和所有者。udev是Linux系统中的设备管理器,用于在系统启动时动态创建和管理设备文件。
这个配置文件中的规则针对KERNEL=="dm-*"的设备,即设备映射(Device Mapper)的块设备。这些设备通常与多路径(multipath)配置有关。
让我们逐行解释这个规则文件:

  • KERNEL=="dm-*":该规则适用于设备映射(Device Mapper)的块设备,其中*是通配符,匹配任意字符。
  • ENV{DM_UUID}=="mpath-36005076xxx000000000010cb":这个条件用于匹配设备的DM_UUID环境变量,如果设备的DM_UUID等于指定的值,就会触发这个规则。这里的DM_UUID看起来是多路径设备的唯一标识符。
  • SYMLINK+="asm/hdisk001":如果规则匹配,就会创建一个符号链接,将设备映射到/dev/asm/hdisk001。这样,你可以通过这个符号链接引用实际的设备。
  • OWNER="grid", GROUP="asmadmin", MODE="0660":这三个选项分别指定了创建的符号链接的所有者(Owner)、所属组(Group)以及权限模式。在这里,符号链接的所有者是"grid",所属组是"asmadmin",权限模式是"0660"。

这个规则的作用是为指定的多路径设备创建符号链接,方便用户和组对这些设备进行访问。这对于诸如Oracle ASM(Automatic Storage Management)等存储系统非常有用。确保配置文件的内容与系统实际使用的设备和标识符相匹配。

UUID方式(Universally Unique Identifier)

定义:UUID是一种全局唯一的标识符,用于唯一标识设备。在多路径配置中,可以使用设备的UUID来标识设备,而不依赖于具体的设备文件名。

配置:使用UUID方式配置时,不再依赖于设备文件名,而是使用设备的UUID来标识路径。

优点:

不受设备文件名变化的影响:由于使用UUID,不受设备文件名变化的影响,配置更加稳定。

缺点:

配置相对繁琐:相对于直接使用设备文件名,使用UUID方式配置相对繁琐一些。

KERNEL=="sd?",SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="36000c29c410a60e54ae604a731e06cc9", SYMLINK+="dmdcr",OWNER="dmdba", GROUP="dinstall",MODE="0660"
KERNEL=="sd?",SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="36000c29e912d081ee6282add0327fff7", SYMLINK+="dmvote",OWNER="dmdba", GROUP="dinstall",MODE="0660"
KERNEL=="sd?",SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="36000c2902354c5b2f6ebcdfe4d2a5df4", SYMLINK+="asm-d",OWNER="dmdba", GROUP="dinstall",MODE="0660"
KERNEL=="sd?",SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="36000c298c722c8de0493319f9773fb91", SYMLINK+="dmdata",OWNER="dmdba", GROUP="dinstall",MODE="0660"
KERNEL=="sd?",SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="36000c295920294d45bf9f8505767866a", SYMLINK+="dmarchive",OWNER="dmdba", GROUP="dinstall",MODE="0660"
KERNEL=="sd?",SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="36000c29cd90c725f9731eaff1a18ae24", SYMLINK+="asm-diskg",OWNER="dmdba", GROUP="dinstall",MODE="0660"
KERNEL=="sd?",SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="36000c296a2b878077c8972d18c2de926", SYMLINK+="dmredo",OWNER="dmdba", GROUP="dinstall",MODE="0660"
  • KERNEL=="sd?":这个条件匹配任何以 "sd" 开头,后跟一个字符的块设备,其中 "?" 是一个通配符,表示任何单个字符。这通常用于匹配 SCSI 设备,如硬盘。
  • SUBSYSTEM=="block":规定匹配的设备必须属于 block 子系统。
  • PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name":这是一个程序调用,用于获取 SCSI 设备的唯一标识符(UUID)。--whitelisted 参数表示忽略黑名单,--replace-whitespace 参数表示替换空格。
  • RESULT=="36000c296a2b878077c8972d18c2de926":这个条件检查上述程序调用的结果是否等于指定的 SCSI 设备标识符。
  • SYMLINK+="dmredo":如果所有的前面的条件都满足,那么就会创建一个符号链接,将匹配的设备映射到 /dev/dmredo。
  • OWNER="dmdba", GROUP="dinstall", MODE="0660":设置创建的符号链接 /dev/dmredo 的所有者为 dmdba,所属组为 dinstall,权限为 0660。

综合来说,多路径方式侧重于利用多个物理路径提高冗余性和性能,而UUID方式侧重于使用设备的唯一标识符来防止配置在设备文件名变化时的不稳定性。在实际应用中,可以根据具体需求选择合适的方式。

字符设备绑定

vi /etc/udev/rules.d/99-raw.rules
ACTION=="add",KERNEL=="sdb",RUN+="/bin/raw /dev/raw/raw1 %N"
ACTION=="add",KERNEL=="sdc",RUN+="/bin/raw /dev/raw/raw2 %N"
ACTION=="add",KERNEL=="sdd",RUN+="/bin/raw /dev/raw/raw3 %N"
ACTION=="add",KERNEL=="sde",RUN+="/bin/raw /dev/raw/raw4 %N"
KERNEL=="raw[1-4]", OWNER="dmdba", GROUP="dinstall", MODE="660"

/sbin/udevadm trigger --type=subsystems --action=add
/sbin/udevadm trigger --type=devices --action=add
/sbin/udevadm control --reload-rules
  • 对于每个匹配的设备(sdb, sdc, sdd, sde),当其被添加到系统时执行相应的命令,其中 %N 会被替换为设备的节点名。
  • /bin/raw 是一个命令,通常用于创建原始(raw)设备。每个规则都在不同的设备上执行 /bin/raw 命令,为 sdb 创建 /dev/raw/raw1,为 sdc 创建 /dev/raw/raw2,以此类推。
  • KERNEL=="raw[1-4]", OWNER="dmdba", GROUP="dinstall", MODE="660"
    对于由上述规则创建的 /dev/raw/raw1 到 /dev/raw/raw4,设置它们的所有者为 dmdba,所属组为 dinstall,权限为 660。
  • /sbin/udevadm trigger --type=subsystems --action=add:触发 udev 对子系统的事件响应,这可能包括加载相应的内核模块等。
    /sbin/udevadm trigger --type=devices --action=add:触发 udev 对设备的事件响应,这可能包括对新添加设备的设备节点创建等。
    /sbin/udevadm control --reload-rules:重新加载 udev 规则,以应用最新的规则更改。

总体来说,这段配置文件的目的是在设备插入时为指定的块设备创建原始设备,并设置相应的所有者、所属组和权限。接着,通过触发 udev 事件和重新加载规则,确保新规则得以生效。

标签:字符,KERNEL,--,绑定,udev,raw,dev,设备
From: https://www.cnblogs.com/lixiaomeng/p/17922503.html

相关文章

  • [字符编码] 实战篇:QT中文乱码的解决办法
    作者:丶布布1.编码科普常见的两种编码是:UTF-8和GBK:UTF-8:编码包含全世界所有国家需要用的字符,它比较灵活,长度在1-6个字节,UTF-8编码格式很强大,支持所有国家的语言,如果你的网站涉及到多个国家的语言,那么建议你选择UTF-8编码。正是因为它的强大,才会导致它占用的空间大小要比GBK大,对于......
  • [字符编码] 理论篇:常见字符集与编码方式
    作者:丶布布文章预览:一.基本概念1、字符集2、编码字符集3、字符编码方式4、编码字符集与编码方式间对应关系二.字符集与编码1、ASCII字符集&编码2、GBXXXX字符集&编码3、UCS字符集&编码4、Unicode字符集&编码5、ANSI编码6、源字符集编码7、可执行字符集编码三、总结......
  • 『LeetCode』3. 无重复字符的最长子串 Longest Substring Without Repeating Characte
    『1』双指针算法我的想法:一般看到字符串子串问题想到用双指针解,看到字符串子序列问题想到用动态规划解。此题用双指针可以很快解题。遍历字符串中的每个字符s.charAt[i],对于每一个i,找到j使得双指针[j,i]维护的是以s.charAt[i]结尾的无重复字符的最长子串,长度为i-j+1,......
  • Java中使用JTS实现WKB数据写入、转换字符串、读取
    场景Java中使用JTS实现WKT字符串读取转换线、查找LineString的list中距离最近的线、LineString做缓冲区扩展并计算点在缓冲区内的方位角:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/132755202WKB介绍WKB(Well-KnownBinary)用二进制流描述几何对象信息。WK......
  • STM32MP157驱动开发——USB设备驱动
    一、简介  由于USB协议太过庞大和复杂,所以本节只对STM32MP157自带的USB驱动进行使能和测试。详细的USB接口和协议的介绍,可以参考原子哥的资料《USB2.0协议中文版.pdf》和《USB3.0协议中文版.pdf》。  USB全称为UniversalSerialBus,翻译过来就是通用串行总线,用......
  • 确定字符串是否包含为以字符串
    用一个算法来识别一个字符串是否是唯一的,如果是就yes如果不是就no废话不多说,直接上代码#include<iostream>usingnamespacestd;constintN=24;inta[N];//a数组用来统计每个字符出现的次数intmain(){strings;//规定了一个字符串cin>>s;intf=0;intlen=s.......
  • python批量给文本文件txt内容添加特殊符号等内容:-----------------------------------
    python脚本内容如下:#导入需要使用的模块importosimporttkinter.filedialogfn=tkinter.filedialog.askopenfilename(title='选择了一个文件',filetypes=[('文本文件','.txt'),('所有文件','.*')])print("打开了文件:"+fn)line_count=0f=open......
  • linux 如何删掉一些特殊字符的文件夹,比如带有空格,单引号,双引号的
    在Linux中删除包含特殊字符(如空格、单引号、双引号)的文件夹,你需要使用转义字符或引号来正确地指定文件夹名。以下是一些常用方法:使用反斜杠(\)转义特殊字符:如果文件夹名包含空格,比如MyFolder,你可以使用\来转义空格:rm-rMy\Folder/对于包含单引号或双引号的文件夹,同样......
  • 字符串优化
    在C#中,string是引用类型,每次动态创建一个string,c#都会在堆内存中分配一个内存用于存放字符串(包括字符串拼接、字符串分割等)。解决方法有两种:1.自建缓存机制,可以用一些标志性的Key值来一一对应字符串,比如游戏项目中常用ID来构造某个字符串,伪代码如下:ResDatadata=GetDataById......
  • Linux设备树
    Linux设备树Linux设备树语法详解-Abnor-博客园(cnblogs.com)Linux设备树(2)——设备树格式和使用-Hello-World3-博客园(cnblogs.com)https://www.cnblogs.com/hellokitty2/p/10999432.html1、概念​设备树的出现是为了实现驱动代码和设备信息的分离,在设备树......