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

发布时间 2023-12-22 22:52:59作者: 真喜欢落叶与飞花起舞

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

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

字符文件:字符文件是一种以字符方式读取/写入数据的硬件文件。 一些经典的例子是键盘、鼠标、串行打印机。 如果用户使用 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 事件和重新加载规则,确保新规则得以生效。