驱动部署实战:udev 规则、模块自动加载与 sysfs 状态检查脚本)
Linux 内核 ATA over EthernetAoE驱动部署实战udev 规则、模块自动加载与 sysfs 状态检查脚本【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linuxATA over EthernetAoE是一种在内网中提供块存储简单访问的网络协议Linux 内核自带aoe块设备驱动。本文以内核文档树中 Documentation/admin-guide/aoe/examples.rst 为主体完整解析它引用的四份用户态支撑文件——udev 设备节点规则、udev 规则安装脚本、AoE 存储状态查询脚本、内核模块自动加载脚本并结合 drivers/block/aoe/ 驱动源码印证每个字符设备、模块参数与设备号的来龙去脉读完后可独立完成 AoE 驱动的设备节点配置、模块加载策略与运行状态监控。一、文档定位examples.rst 及其引用的四份配套文件examples.rst 本身是一份“示例索引”文档通过 Sphinx 的include与literalinclude指令把同目录下四份可执行/可安装文件直接排入正文示例文件用途仓库路径udev.txtAoE 驱动所需 udev 设备节点规则Documentation/admin-guide/aoe/udev.txtudev-install.sh把 udev 规则安装进系统的脚本Documentation/admin-guide/aoe/udev-install.shstatus.sh汇总并展示 sysfs 中 AoE 存储状态的脚本Documentation/admin-guide/aoe/status.shautoload.sh配置 modprobe 别名实现 aoe 模块自动加载Documentation/admin-guide/aoe/autoload.sh同目录的 aoe.rst 对此有明确说明这些脚本的目的是文档化驱动的用法如果安装了官方用户态工具包 aoetools则这些脚本并非必需。也就是说本文介绍的方案是“无 aoetools 环境下手工部署 AoE”的参考实现也是理解驱动用户态接口的最佳教材。二、udev 规则udev.txt为 AoE 创建正确的设备节点udev.txt 是本文的核心示例。文件开头注释说明这些规则告诉 udev 为 aoe 支持创建哪些设备节点并提示需查阅 udev 手册第 8 节确认你的 udev 版本是否支持SUBSYSTEM匹配、以及SUBSYSTEM/KERNEL用单个还是两个等号。2.1 规则逐行解读规则文件有效内容分两组# aoe char devices SUBSYSTEMaoe, KERNELdiscover, NAMEetherd/%k, GROUPdisk, MODE0220 SUBSYSTEMaoe, KERNELerr, NAMEetherd/%k, GROUPdisk, MODE0440 SUBSYSTEMaoe, KERNELinterfaces, NAMEetherd/%k, GROUPdisk, MODE0220 SUBSYSTEMaoe, KERNELrevalidate, NAMEetherd/%k, GROUPdisk, MODE0220 SUBSYSTEMaoe, KERNELflush, NAMEetherd/%k, GROUPdisk, MODE0220 # aoe block devices KERNELetherd*, GROUPdisk五个字符设备规则对SUBSYSTEMaoe的五个内核对象discover、err、interfaces、revalidate、flush统一重命名为etherd/原名并归入disk组。MODE0220表示组可写这些设备节点需要写入来触发操作其中err节点是0440组只读——因为它只用于读错误诊断输出阻塞式cat等待重传包等信息。块设备规则所有etherd*块设备归入disk组即发现后自动出现的e{shelf}.{slot}盘与e{shelf}.{slot}p{part}分区。从源码结构看这五个字符设备名与驱动实现一一对应aoechr.c 中register_chrdev(AOE_MAJOR, aoechr, aoe_fops)注册了字符设备主设备号随后在 aoechr.c#L305 处通过device_create(aoe_class, ...)为chardevs数组中的各 minor 创建类设备udev 规则中的NAMEetherd/%k把它们归拢到/dev/etherd/目录下。块设备则由 aoemain.c#L66 的register_blkdev(AOE_MAJOR, DEVICE_NAME)注册主设备号常量AOE_MAJOR 152定义在 aoe.h#L5。2.2 安装方式注释中给出的操作步骤udev.txt 头部注释以实际终端操作演示了安装流程ecashinmakki ~$ su Password: bash# find /etc -type f -name udev.conf /etc/udev/udev.conf bash# grep udev_rules /etc/udev/udev.conf udev_rules/etc/udev/rules.d/ bash# ls /etc/udev/rules.d/ 10-wacom.rules 50-udev.rules bash# cp /path/to/linux/Documentation/admin-guide/aoe/udev.txt \ /etc/udev/rules.d/60-aoe.rules要点先定位udev.conf确认规则目录udev_rules常见为/etc/udev/rules.d/然后把udev.txt复制为该目录下的60-aoe.rules。文件数字前缀保证其在默认50-udev.rules之后处理。三、udev-install.sh自动化的规则安装脚本udev-install.sh 把上述手工步骤脚本化逻辑分三段值得逐段研读mebasename $0 # 1. 定位 udev.conf优先 /etc/udev/udev.conf否则全盘 find if test -z $conf; then if test -r /etc/udev/udev.conf; then conf/etc/udev/udev.conf else conffind /etc -type f -name udev.conf 2 /dev/null if test -z $conf || test ! -r $conf; then echo $me Error: no udev.conf found 12 exit 1 fi fi fi # 2. 从 udev.conf 解析规则目录缺省回退 /etc/udev/rules.d rules_dsed -n /^udev_rules/{ s!udev_rules!!; s!\!!g; p; } $conf if test -z $rules_d ; then rules_d/etc/udev/rules.d fi if test ! -d $rules_d; then echo $me Error: cannot find udev rules directory 12 exit 1 fi sh -xc cp dirname $0/udev.txt $rules_d/60-aoe.rules三个设计细节允许环境变量覆盖if test -z $conf意味着调用者可以conf/custom/path/udev.conf ./udev-install.sh指定配置文件位置sed 一行解析sed -n /^udev_rules/{ s!udev_rules!!; s!\!!g; p; } $conf提取udev_rules行的值并剥掉引号找不到时回退到约定目录sh -xc复制末行用sh -xc执行cp-x会把实际执行的复制命令打印出来便于审计。注意它复制的是脚本自身所在目录下的udev.txtdirname $0/udev.txt因此udev.txt必须与脚本同目录分发。四、status.sh用 sysfs 汇总 AoE 存储状态status.sh 演示了如何仅凭 sysfs 属性查看本机所有 AoE 设备的状态#! /bin/sh # collate and present sysfs information about AoE storage # # A more complete version of this script is aoe-stat, in the # aoetools. set -e format%8s\t%8s\t%8s\n mebasename $0 sysd${sysfs_dir:-/sys} # Suse 9.1 Pro doesnt put /sys in /etc/mtab test ! -d $sysd/block { echo $me Error: sysfs is not mounted 12 exit 1 } for d in ls -d $sysd/block/etherd* 2/dev/null | grep -v p end; do # maybe ls comes up empty, so we use end test $d end continue devecho $d | sed s/.*!// printf $format \ $dev \ cat \$d/netif\ \ cat \$d/state\ done | sort逐点说明sysd${sysfs_dir:-/sys}sysfs 挂载点默认/sys可用环境变量sysfs_dir覆盖——这是内核自带脚本的惯例写法方便在 chroot/构建环境中测试ls -d $sysd/block/etherd* | grep -v p遍历块设备时排除分区分区名形如e0.2p1含字母p只处理整盘末尾追加哨兵值end是为了在ls无输出时避免空循环sed s/.*!///sys/block下的目录名实际是etherd!e10.0这样的形式!后为设备标识符此步提取出e10.0这类可读名输出三列设备名、netif本地与之通信的网络接口、state设备状态最后sort排序。aoe.rst 对这三个 sysfs 属性有权威解释state为up表示设备可 I/O、down表示已被发现但不可用down,closewait表示设备仍被打开、关闭前无法重新上线mac是远端 AoE 设备的以太网地址netif是本机用于与远端通信的网卡。运行该脚本的典型输出引自 aoe.rst 的示例e10.0 eth3 up e10.1 eth3 up e4.0 eth1 up e4.1 eth1 up脚本头注释也注明功能更完整的版本是 aoetools 包中的aoe-stat命令。五、autoload.sh通过设备号别名实现模块自动加载autoload.sh 只有十几行但它依赖一个内核事实AoE 的主设备号是152。脚本全文#!/bin/sh # set aoe to autoload by installing the # aliases in /etc/modprobe.d/ f/etc/modprobe.d/aoe.conf if test ! -r $f || test ! -w $f; then echo cannot configure $f for module autoloading 12 exit 1 fi grep major-152 $f /dev/null if [ $? 1 ]; then echo alias block-major-152 aoe $f echo alias char-major-152 aoe $f fi向/etc/modprobe.d/aoe.conf追加两条别名alias block-major-152 aoe与alias char-major-152 aoe这样块设备主设备号 152 或字符设备主设备号 152 被使用时modprobe 会自动加载aoe模块grep major-152用于幂等判断避免重复追加先检查目标文件可读可写否则报错退出。152 这个数字不是凭空出现的aoe.h#L5 中#define AOE_MAJOR 152块设备aoemain.c 的register_blkdev(AOE_MAJOR, ...)与字符设备aoechr.c 的register_chrdev(AOE_MAJOR, ...)共用这一主设备号分别由 minor 区分。这正是脚本同时写block-major-152与char-major-152两条别名的原因。需要提醒的是aoe.rst 明确建议预加载优于自动加载AoE 的发现discovery需要几秒时间自动加载场景下第一次执行命令时设备可能尚不存在、稍后才出现容易造成困惑。autoload.sh更多是展示配置方法生产环境建议直接把aoe加入预加载列表。六、源码级印证驱动选项与模块参数examples.rst 的四份示例都围绕“让 aoe 驱动正确加载并被用户使用”。与 aoe.rst “Driver Options” 一节结合可在源码中逐一确认这些参数的实现位置参数源码定义位置作用aoe_iflistaoenet.c#L33module_param_string(aoe_iflist, aoe_iflist, IFLISTSZ, 0600)将 AoE 流量限制在白名单网卡内另提供内核启动参数解析 aoenet.c#L40-L46 的__setup(aoe_iflist, aoe_iflist_setup)内建驱动时可用aoe_iflistdev1,dev2内核命令行传入aoe_deadsecsaoecmd.c#L29module_param(aoe_deadsecs, int, 0644)等待 AoE 设备响应的最长时间秒超时后设备标记为down取值 0 用于测试表示一直重试aoe_maxoutaoecmd.c#L33module_param(aoe_maxout, int, 0644)发往同一 AoE 目标的最大未应答包数默认 128aoe_dyndevsaoedev.c#L22module_param(aoe_dyndevs, int, 0644)默认 1按发现顺序动态分配 minor支持更大范围 shelf/slot 地址设为 0 可用 aoetools 的aoe-mkshelf按静态 minor 方案预创建节点另有一个 aoe.rst 未展开的参数aoe_maxsectors在 aoeblk.c#L29 以module_param(aoe_maxsectors, int, 0644)定义用于限制单次 I/O 扇区数上限。aoe_iflist还有一个用户态写入口aoechr.c 中字符设备interfaces的写操作调用set_aoe_iflist()声明见 aoe.h#L247即echo eth2 eth4 /dev/etherd/interfaces的底层实现aoe.rst 同时建议改用可读写、更现代的/sys/module/aoe/parameters/aoe_iflist并在设置后重新触发发现echo /dev/etherd/discover或 aoetools 的aoe-discover。安全提示aoe.rst 强调来自不受信任网络的 AoE 流量应当被忽略aoe_iflist/interfaces接口正是为此设计。未显式限制时所有网卡都可能被用于 AoE 流量aoe_iflist为空时 aoenet.c#L78 处的判断即放行全部接口。部署时建议始终显式指定白名单网卡。七、小结围绕 examples.rst 的四份示例构成了一个完整的无 aoetools 部署闭环设备节点用 udev.txt 规则可由 udev-install.sh 自动安装为/etc/udev/rules.d/60-aoe.rules让 udev 创建/dev/etherd/{discover,err,interfaces,revalidate,flush}五个控制节点及etherd*块设备全部归入disk组模块加载用 autoload.sh 写入block-major-152/char-major-152别名实现自动加载但生产环境建议预加载以规避发现延迟状态监控用 status.sh 读取/sys/block/etherd*/{netif,state}属性按“设备/网卡/状态”三列输出全盘清单。驱动侧的实现细节主设备号 152、五个字符设备、四个模块参数均可在 drivers/block/aoe/ 目录中找到对应代码这为需要定制或排障的读者提供了直接的源码入口。若已安装 aoetoolsaoe-stat、aoe-discover、aoe-mkshelf等上述脚本可整体省略但理解它们仍有助于掌握内核 AoE 驱动的用户态接口全貌。【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考