自主健康顾问文件系统(AHAFS)在IBM®AIX®中提供了事件监视框架。 用户可以监视预定义的系统事件并获得有关它们的通知。 每个事件都表示为伪文件系统(称为AHAFS)中的文件。 应用程序可以使用标准文件API(例如打开,读取,写入,关闭和选择)来监视文件和检索事件数据。 必须安装事件基础结构文件系统的实例以监视事件。 您可以在《 使用AIX事件基础结构进行事件监视简介 》 一文中找到有关使用AHAFS的更多信息。
AIX中的热插拔和电流限制
热插拔功能可以在设备插入系统后立即对其进行动态检测。 此功能在用户系统中非常常见,以使其易于被用户发现和使用。 由于安全原因,AIX服务器系统中禁止使用此功能,并且系统管理员必须运行cfgmgr命令来发现新设备。 由于此限制,也不会动态发现和配置USB设备。
本文提供了有关如何对USB设备使用热插拔(即插即用)功能的详细步骤。 通过对USB设备使用热插拔功能,应用程序可以使用动态发现连接到AIX系统的USB设备,而无需依赖管理员来运行cfgmgr
命令。
安装与配置
支持USB热插拔的最低AIX版本是7.2 TL1和7.1 TL4 SP3。
AIX中的USB堆栈使用AHAFS(AIX中的事件基础结构)。 bos.ahafs文件集是热插拔起作用的先决条件。
有两种方法可以使用AIX中的USB热插拔功能。
- 可以从MON文件输出监视AIX系统上的USB设备连接和分离事件。 您可以将此输出定向到文件,并编写自己的程序以根据设备的附加和分离事件触发操作。
- 轮询MON文件中的事件,然后运行
cfgmgr
命令以检测USB设备,并运行rmdev
命令以在分离事件中删除该设备。
在随后的部分中将详细解释这两种方式。
方法1:捕获USB设备的附加/分离事件
执行以下步骤以捕获事件:
- 挂载AHAFS以监听USB设备事件。
#mount -v ahafs /aha /aha
如果
/aha
不是现有目录,则可以创建一个。 该命令可以从任何目录运行。 - 启动一个单独的AIX Shell,然后运行以下命令来监视USB设备的连接/分离事件。
#/usr/samples/ahafs/bin/aha.pl -m /aha/usbdEvProd.monFactory/usbd.mon "CHANGED=YES;INFO_LVL=3"
在上述命令等待事件时,金士顿USB闪存驱动器已与AIX系统断开连接并重新连接回去。 它提供以下事件数据输出:
Monitoring the AHAFS event "/aha/usbdEvProd.monFactory/usbd.mon". AHAFS event: /aha/usbdEvProd.monFactory/usbd.mon --------------------------------------------------- BEGIN_EVENT_INFO Time : Thu Oct 13 14:33:47 2016 Sequence Num : 1 RC_FROM_EVPROD=0 BEGIN_EVPROD_INFO USBDevice Disconnected VendorID=2385 ProductID=5718 PortNumber=5 DeviceAddress=1 Class=8 SubClass=6 Protocol=80 PortPath=5 HCDevno=8000000D00000000 connwhere=1.1.0 END_EVPROD_INFO END_EVENT_INFO AHAFS event: /aha/usbdEvProd.monFactory/usbd.mon --------------------------------------------------- BEGIN_EVENT_INFO Time : Thu Oct 13 14:33:52 2016 Sequence Num : 2 RC_FROM_EVPROD=0 BEGIN_EVPROD_INFO USBDevice Connected VendorID=2385 ProductID=5718 PortNumber=5 DeviceAddress=1 Class=8 SubClass=6 Protocol=80 PortPath=5 HCDevno=8000000D00000000 connwhere=1.1.0 END_EVPROD_INFO END_EVENT_INFO
usbEvProd
是事件生产者名称,该名称已经在usbd
内核扩展中注册。monFactory
是所有事件生产者名称的通用扩展。 usbd.mon是AHAFS监视文件,用于订阅来自内核扩展的事件。 AHAFS监视文件的名称是用户定义的。aha.pl是示例脚本,用于监视文件中列出的一组事件。 它是从bos.ahafs文件集中安装的。 它有多个选项可以监听和订阅事件。 在本文中,我们仅说明将事件数据打印到标准输出的一种情况。
请参阅AIX Event Infrastructure组件以找到有关AHAFS的更多信息。
- 了解事件数据输出
该事件的前5行仅供参考。
USB相关事件从事件的第6行开始。 例如,如果您拔下USB设备,则事件将显示为Device Disconnected 。 如果您插入USB设备,该事件将显示为Device Connected 。
除此之外,还会显示以下信息:
- 供应商ID :设备的制造商。 (有关将供应商ID映射到制造商的信息,请参见https://www.usb.org/developers/tools/comp_dump )。
- 产品ID :制造商提供的设备的产品代码。
- 端口号 :此设备连接到的父设备的端口号。 该设备可以通过根集线器(主机上的USB适配器)或外部集线器连接到系统。
- 设备地址 :由主机控制器分配的设备的地址。
- 类,子类,协议 :用于标识设备功能的信息。 (请参阅https://www.usb.org/developers/defined_class以了解类代码的含义)。
- 端口路径 :标识设备拓扑的路径。 如果设备直接连接到根集线器(主机上的适配器),则仅显示端口号。
- 例如,
portpath = 7
表示设备已连接到主机上适配器(根集线器)的端口7。 - 例如,
portpath = 7.2
表示设备连接到中间集线器的端口2,而中间集线器又连接到主机上适配器(根集线器)的端口7。
- 例如,
- HCDevno :此设备连接到的主机控制器设备的设备号。
- Connwhere :设备地址,设备的配置号和接口号的组合。
在这种方法中,程序仅显示与USB连接和分离有关的事件以及设备信息,而不会配置或初始化设备。 用户可以将此输出定向到文件并采取相应的措施。
下例提供了有关捕获事件以及采取必要措施以配置和初始化设备或删除设备的详细信息。
方法2:检测和配置热插拔设备的示例
请参考hotplug_usb.c程序(可在“可下载资源”部分中找到)以检测USB连接/分离事件并触发适当的操作。
read_data()
:此函数读取事件数据并根据事件触发适当的操作。 如果是attach事件,它将运行cfgmgr
命令来配置和初始化设备。 如果这是一个分离事件,它将运行rmdev
命令以rmdev
初始化该设备并将其从系统中删除。
remove_device()
:此函数通过运行rmdev
命令删除设备。 需要检索设备名称才能在设备上运行rmdev
命令。 因此,这个函数被调用connwhere
设备的,它从获取的设备名称CuDv
类。
注意 :如果启用了libusb
,则remove_device()
函数还将负责删除libusb
设备。 有关AIX中libusb
支持以及启用/禁用它的更多信息,请参见https://www.ibm.com/support/knowledgecenter/ssw_aix_72/com.ibm.aix.files/usblibdev.htm
执行以下步骤来编译和运行程序:
- 使用以下标志编译程序。
#cc hotplug_usb.c -o hotplug_usb -lodm -lcfg
- 挂载AHAFS并运行hotplug_usb程序。
- 使用以下命令挂载AHAFS:
#mount -v ahafs /aha /aha
- 在单独的外壳窗口中运行二进制文件。
./hotplug_usb /aha/usbdEvProd.monFactory/usbd.mon "CHANGED=YES;INFO_LVL=3" 10 /tmp/nodestateevent
- 使用以下命令挂载AHAFS:
- 插入USB设备,然后拔下它以检查事件。 您将在新窗口中获取事件。 上面命令的输出(在步骤2b中)如下:
Entering select() to wait till the event corresponding to the AHA node /aha/usbdEvProd.monFactory/usbd.mon occurs. The select() completed. The event corresponding to the AHA node /aha/usbdEvProd.monFactory/usbd.mon has occurred. TIME_tvsec=1461163157 TIME_tvnsec=694334371 SEQUENCE_NUM=2 RC_FROM_EVPROD=0 BEGIN_EVPROD_INFO USBDevice Disconnected VendorID=2385 ProductID=5718 PortNumber=3 DeviceAddress=2 Class=8 SubClass=6 Protocol=80 PortPath=3 HCDevno=8000002700000000 connwhere=2.1.0 END_EVPROD_INFO END_EVENT_INFO device to be deleted: usbms0 usbms0 deleted device to be deleted : usblibdev1 usblibdev1 deleted Entering select() to wait till the event corresponding to the AHA node /aha/usbdEvProd.monFactory/usbd.mon occurs. The select() completed. The event corresponding to the AHA node /aha/usbdEvProd.monFactory/phani.mon has occurred. TIME_tvsec=1461163226 TIME_tvnsec=908116599 SEQUENCE_NUM=3 RC_FROM_EVPROD=0 BEGIN_EVPROD_INFO USBDevice Connected VendorID=1137 ProductID=18526 PortNumber=3 DeviceAddress=2 Class=3 SubClass=0 Protocol=0 PortPath=3 HCDevno=8000002600000000 connwhere=2.1.0 END_EVPROD_INFO END_EVENT_INFO New Devices configured and initialized
hotplug_usb
程序连续监视附加/分离事件。 根据事件,将采取适当的措施来配置或删除设备。 该程序可以执行的事件数作为输入给出。 在上面的示例中,事件计数为10。偶数输出可以重定向到文件以了解有关正在发现和删除的设备的更多详细信息。 在上面的示例中, /tmp/nodetstatevent
被作为输入存储事件数据。
翻译自: https://www.ibm.com/developerworks/aix/library/au-aix-ahafs/index.html