add_drv [-b basedir] [-c class_name] [-i 'identify_name...'] [-m 'permission','...'] [-p 'policy'] [-P privilege] [-n] [-f] [-u] [-v] device_driver
add_drv 命令用于通知系统新安装的设备驱动程序。
系统上的每个设备都有关联的名称。此名称由设备的 name 属性表示。同样,设备可能还有关联的驱动程序名称列表。此列表由设备的 compatible 属性表示。
系统通过检查每个设备上 name 属性和 compatible 属性(如果存在)的内容来确定添加的驱动程序将管理哪些设备。如果 name 属性中的值与添加的驱动程序不匹配,则会按顺序尝试 compatible 属性中的每个条目,直到找到匹配项或者尝试完 compatible 属性中的所有条目为止。
在某些情况下,添加新驱动程序可能需要重新配置引导。请参见“附注”部分。
如果别名包含数字,可能需要引起来(使用双引号)。请参见“示例”部分。
add_drv 和 update_drv(1M) 读取 /etc/minor_perm 文件以获取权限信息。指定的权限应用于连接绑定到驱动程序的设备时创建的匹配次要节点。可以通过 chmod(1) 手动更改次要节点的权限。对于此类节点,将应用指定的权限,以覆盖通过 add_drv 或 update_drv(1M) 指定的缺省权限。
/etc/minor_perm 文件的格式如下:
name:minor_name permissions owner group
minor_name 可以是次要节点的实际名称,也可以包含表示多个次要节点的 shell 元字符(请参见 sh(1))。
例如:
sd:* 0640 root sys zs:[a-z],cu 0600 uucp uucp mm:kmem 0640 root bin
第一行将 sd 节点导出的所有设备设置为 0640 权限、由 root 所有,属于组 sys。在第二行中,由 zs 驱动程序导出的 a,cu 和 z,cu 等设备设置为 0600 权限,由 uucp 所有,属于组 uucp。在第三行中,由 mm 驱动程序导出的 kmem 设备设置为 0640 权限,由 root 所有,属于组 bin。
在软件包的安装后脚本上下文中运行 add_drv 时,您必须考虑软件包将添加到系统映像还是正在运行的系统。如果软件包将安装到系统映像,则 BASEDIR 变量引用映像的基目录。在这种情况下,应该通过 –b $BASEDIR 调用 add_drv。这将导致 add_drv 仅更新映像的系统文件;需要重新引导系统或客户机才能使驱动程序正常运行。
如果软件包将安装到正在运行的系统本身上,则与上面的情况一样,需要更新系统文件。然而,无需重新引导即可通知正在运行的内核存在新驱动程序。为完成此操作,安装后脚本必须在不使用 –b 选项的情况下调用 add_drv 。相应地,调用 add_drv 的安装后脚本应按如下方式编写:
if [ "${BASEDIR:=/}" = "/" ] then ADD_DRV="add_drv" else ADD_DRV="add_drv -b ${BASEDIR}" fi $ADD_DRV [<options>] <driver>
...或者:
if [ "${BASEDIR:=/}" != "/" ] then BASEDIR_OPT="-b $BASEDIR" fi add_drv $BASEDIR_OPT [<options>] <driver>
–b 选项在下面进行说明。
将驱动程序安装到根目录为 basedir 的系统上,而不是安装到执行 add_drv 的系统上。软件包不安装到执行 pkgadd 命令的系统上时,通常在软件包安装后脚本中使用此选项。使用 basedir 作为其根目录的系统必须重新引导才能完成驱动程序安装。
由添加到系统的驱动程序导出类 class_name。
通常,如果需要重新配置引导才能完成驱动程序在系统中的配置,add_drv 将不会添加驱动程序。强制标志强制 add_drv 添加驱动程序,即使需要重新配置引导也是如此。请参见 – v 标志。
驱动程序 device_driver 的别名的空格分隔列表。
指定由系统代表 device_driver 创建的设备节点的文件系统权限。
不尝试装入并连接 device_driver,仅修改 device_driver 的系统配置文件。
指定其他设备安全策略。
设备安全策略由空格分隔的多个令牌组成:
{minorspec {token=value}+}+
minorspec 是次要设备的简单通配符模式。单个 * 匹配所有次要设备。仅允许在模式中使用一个 *。
按以下顺序匹配模式:
无通配符的条目
有通配符的条目,首先处理最长的通配符
定义了以下令牌:read_priv_set 和 write_priv_set。read_priv_set 定义打开设备进行读取时需要在调用进程的有效特权集合中声明的特权。write_priv_set 定义打开设备进行写入时需要在调用进程的有效特权集合中声明的特权。请参见 privileges(5)。
定义了以下令牌:read_priv_set、write_priv_set 和 tpd_member。read_priv_set 定义打开设备进行读取时需要在调用进程的有效集合中声明的特权。write_priv_set 定义打开设备进行写入时需要在调用进程的有效集合中声明的特权。tpd_member 仅用于不可变全局区域。tpd_member 设置为 'true' 的设备在不可变全局区域中是只读的。在 write_priv_set=ALL 的设备上缺省启用此设置。请参见 privileges(5)。
缺失的次要规范被解释为 *。
指定驱动程序使用的其他特权,使用逗号分隔。您还可以使用设备策略中的特定特权。
将驱动程序添加到系统,使其处于非活动状态以便稍后使用 devfsadm(1M) –u 进行配置。–u 的行为与 –n 不同,因为 –n 仅更新系统文件,需要重新引导才能连接驱动程序。通过 –u 添加的驱动程序可以通过运行 devfsadm –u 来连接,无需重新引导。驱动程序编写人员应通过驱动程序的行为来验证驱动程序。有关其他注意事项,请参见“附注”。–u 选项不能与 –n 或 –b 一起使用。
详细标志导致 add_drv 提供有关在系统中配置驱动程序是成功还是失败的其他信息。请参见“示例”部分。
以下示例将别名为 SUNW,alias 的 SUNW,example 驱动程序添加到 32 位系统。本例假定驱动程序已复制到 /usr/kernel/drv。
example# add_drv –m '* 0666 bin bin','a 0644 root sys' \ –p 'a write_priv_set=sys_config * write_priv_set=none' \ –i 'SUNW,alias' SUNW,example
系统为 SUNW,example 驱动程序创建的每个次要节点将具有 0666 权限,由用户 bin 所有,属于 bin 组,但次要设备 a 除外,此设备由 root 所有,属于 sys 组,具有权限 0644。根据指定的设备策略,无需其他特权即可打开所有次要节点,但次要设备 a 除外,在打开设备进行写入时该设备需要 sys_config 特权。
示例 2 将驱动程序添加到客户机 /export/root/sun1以下示例将驱动程序添加到客户机 /export/root/sun1。驱动程序在客户机 sun1 重新引导时安装和装入。此第二个示例与第一个示例具有相同的结果,但无磁盘客户机 sun1 发生了改变,该客户机必须重新引导才能安装驱动程序。
example# add_drv –m '* 0666 bin bin','a 0644 root sys' \ –i 'SUNW,alias' -b /export/root/sun1 \ SUNW,example
请参见上文 –b 选项说明中的“注意”部分,其中指明了有关将此选项与 Solaris 区域功能一起使用的警告。
示例 3 为已由现有驱动程序管理的设备添加驱动程序以下示例说明了为已由现有驱动程序管理的设备添加新驱动程序的情况。请考虑当前由驱动程序 dumb_framebuffer 管理的某个设备。此设备的 name 和 compatible 属性如下所示:
name="display" compatible="whizzy_framebuffer", "dumb_framebuffer"
如果使用 add_drv 添加 whizzy_framebuffer 驱动程序,则将生成以下内容。
example# add_drv whizzy_framebuffer Error: Could not install driver (whizzy_framebuffer) Device managed by another driver.
如果指定了 –v 标志,则将生成以下内容。
example# add_drv -v whizzy_framebuffer Error: Could not install driver (whizzy_framebuffer) Device managed by another driver. Driver installation failed because the following entries in /devices would be affected: /devices/iommu@f,e0000000/sbus@f,e0001000/display[:*] (Device currently managed by driver "dumb_framebuffer") The following entries in /dev would be affected: /dev/fbs/dumb_framebuffer0
如果指定了 –v 和 –f 标志,则将添加驱动程序并生成以下内容。
example# add_drv -vf whizzy_framebuffer A reconfiguration boot must be performed to complete the installation of this driver. The following entries in /devices will be affected: /devices/iommu@f,e0000000/sbus@f,e0001000/display[:*] (Device currently managed by driver "dumb_framebuffer" The following entries in /dev will be affected: /dev/fbs/dumb_framebuffer0
上面的示例当前仅与导出通用设备名称的设备相关。
示例 4 指定驱动程序别名时使用双引号以下示例显示了如何在指定包含数字的驱动程序别名时使用双引号。
example# add_drv -i '"pci10c5,25"' smc
add_drv 在成功时返回 0,在失败时返回 1。
32 位引导设备驱动程序
64 位 SPARC 引导设备驱动程序
64位 x86 引导设备驱动程序
可能会在平台之间共享的其他 32 位驱动程序
可能会在平台之间共享的其他 64 位 SPARC 驱动程序
可能会在平台之间共享的其他 64 位 x86 驱动程序
32 位依赖平台的驱动程序
64 位依赖 SPARC 平台的驱动程序
64 位依赖 x86 平台的驱动程序
驱动程序别名文件
驱动程序类文件
次要节点权限
主编号绑定
设备策略
设备特权
有关下列属性的说明,请参见 attributes(5):
|
boot(1M)、chmod(1)、devfsadm(1M)、kernel(1M)、modinfo(1M)、rem_drv(1M)、update_drv(1M)、driver.conf(4)、system(4)、attributes(5)、privileges(5)、tpd(5)、devfs(7FS)、ddi_create_minor_node(9F)
编写适用于 Oracle Solaris 11.2 的设备驱动程序
可以为已由其他驱动程序管理的设备添加驱动程序,这种情况下添加的驱动程序在设备 compatible 列表中将显示在当前驱动程序之前。在此类情况下,需要重新配置引导(请参见 boot(1M) 和 kernel(1M))。重新配置引导之后,/dev 中的设备链接和对这些文件的引用可能不再有效(请参见 –v 标志)。如果需要重新配置引导才能完成驱动程序安装,add_drv 将失败,除非指定了 –f 选项。请参见“示例”部分中的示例 3。
引入设备策略后,一些驱动程序更改了其次要权限并建立了设备策略。典型网络驱动程序应使用以下设备策略:
add_drv -p 'read_priv_set=net_rawaccess\ write_priv_set=net_rawaccess' -m '* 666 root sys'\ mynet
该文档不涉及 API。/etc/minor_perm、/etc/name_to_major、/etc/driver_classes 和 /devices 在未来的发行版中可能不存在,或者具有不同的内容或解释。此通知的存在并不表示没有此通知的任何其他文档涉及 API。
/etc/minor_perm 只能由 add_drv(1M)、rem_drv(1M) 或 update_drv(1M) 更新。
对于当前版本的 add_drv,在命令行中使用时通过双引号指定别名是可选的。然而,在软件包脚本中使用 add_drv 时,您应继续使用双引号指定别名。
一些驱动程序不能直接在系统中添加和配置,只能在系统引导时配置。此限制的原因包括但不限于:驱动程序依赖于引导初期所执行的配置,或者依赖于在添加驱动程序的同时安装或更新了某个内核组件。此类驱动程序只能使用 –n 标志添加到系统,因此仅在系统重新引导时才装入和配置驱动程序,从而保证在环境中可以正确配置驱动程序。
add_drv 的早期版本接受对 device_driver 使用路径名。现在不再支持此功能,这样做将导致失败。