本章提供有关在 Solaris OS 中动态配置设备的说明。如果系统组件支持热插拔,则在系统仍然处于运行状态时,可在 Solaris OS 中添加、移除或更换设备。如果系统组件不支持热插拔,则可以重新引导系统以重新配置设备。
有关与动态配置设备关联的过程信息,请参见以下内容:
有关使用 cfgadm 命令热插拔 USB 设备的信息,请参见使用 cfgadm 命令热插拔 USB 设备。
有关访问设备的信息,请参见第 10 章,访问设备(概述)。
热插拔是指在系统运行的同时以物理方式添加、移除或更换系统组件的能力。动态重新配置是指热插拔系统组件的能力。此术语还指在系统中四处移动系统资源(硬件和软件),或以某种方式禁用这些系统资源而不以物理方式将其从系统中移除的一般能力。
一般情况下,可以热插拔以下总线类型:
USB
光纤通道
1394
ATA
SCSI
SPARC 和 x86 平台上的 USB 设备
SPARC 和 x86 平台上的 SCSI 设备
SPARC 和 x86 平台上的 PCI 设备
x86 平台上的 PCIe 设备
cfgadm 命令包括以下功能:
显示系统组件状态
测试系统组件
更改组件配置
显示配置帮助消息
使用 cfgadm 命令重新配置系统组件的优点是可在系统运行的同时添加、移除或更换组件。另一优点是 cfgadm 命令可引导逐步完成添加、移除或更换系统组件所需执行的步骤。
有关热插拔组件的逐步说明,请参见以下内容:
并非所有 SCSI 和 PCI 控制器都支持使用 cfgadm 命令进行热插拔。
作为 Sun 的高可用性策略的一部分,动态重新配置预计会与其他分层产品(如替代路径设置软件或故障转移软件)结合使用。这两种产品都可在出现设备故障的情况下提供容错功能。
如果没有任何高可用性软件,则可通过手动停止相应的应用程序,卸载非关键的文件系统,然后继续执行添加或删除操作来更换出现故障的设备。
某些系统同时具有可热插拔和不可热插拔的插槽。有关在特定硬件配置(如在企业级系统上)中热插拔设备的信息,请参阅硬件配置文档。
cfgadm 命令可以显示有关附加点的信息,附加点是指系统中可以执行动态重新配置操作的位置。
附加点由以下几项组成:
插卡,表示可在系统中配置的硬件组件
插座,是指插入插卡的位置
附加点由逻辑附加点 ID 和物理附加点 ID (Ap_Id) 表示。物理 Ap_Id 是附加点的物理路径名。逻辑 Ap_Id 是物理 Ap_Id 的用户友好替代项。有关 Ap_Id 的更多信息,请参阅 cfgadm(1M)。
SCSI 主机总线适配器 (Host Bus Adapter, HBA) 或 SCSI 控制器的逻辑 Ap_Id 通常由控制器编号表示,如 c0。
如果未向 SCSI HBA 指定控制器编号,则将提供内部生成的唯一标识符。以下是 SCSI 控制器的唯一标识符的示例:
fas1:scsi
SCSI 设备的逻辑 Ap_Id 通常具有以下格式:
HBA-logical-apid::device-identifier
在以下示例中,c0 是 SCSI HBA 的逻辑 Ap_Id:
c0::dsk/c0t3d0
设备标识符通常由 /dev 目录中的设备的逻辑设备名称派生而来。例如,逻辑设备名称为 /dev/rmt/1 的磁带设备具有以下逻辑 Ap_Id:
c0::rmt/1
如果 SCSI 设备的逻辑 Ap_Id 无法从 /dev 目录中的逻辑名称派生而来,则将提供内部生成的唯一标识符。以下是 /dev/rmt/1 磁带设备的标识符的示例:
c0::st4
有关 SCSI Ap_Id 的更多信息,请参阅 cfgadm_scsi(1M)。
cfgadm 命令按照一组通用状态(如已配置和未配置)和操作(如连接、配置、取消配置等)来表示所有资源和动态重新配置操作。有关这些通用状态和操作的更多信息,请参见 cfgadm(1M)。
下表列出了 SCSI HBA 附加点的插座和插卡的状态。
插座状态 |
说明 |
插卡状态 |
说明 |
---|---|---|---|
empty |
N/A(对于 SCSI HBA) |
configured |
在总线上配置了一个或多个设备 |
disconnected |
总线处于静止状态 |
unconfigured |
未配置任何设备 |
connected |
总线处于活动状态 |
|
|
下表列出了 SCSI 设备附加点的插座和插卡的状态。
插座状态 |
说明 |
插卡状态 |
说明 |
---|---|---|---|
empty |
N/A(对于 SCSI 设备) |
configured |
设备已配置 |
disconnected |
总线处于静止状态 |
unconfigured |
设备未配置 |
connected |
总线处于活动状态 |
|
|
如果特殊硬件未另行指示其他状态,则 SCSI 附加点的状态是未知的。有关显示 SCSI 组件信息的说明,请参见如何显示有关 SCSI 设备的信息。
如果设备驱动程序支持热插拔,则可以移除承载非重要系统资源的 PCI 适配卡。如果 PCI 适配卡是重要的系统资源,则不可将其拆离。要使 PCI 适配卡可拆离,必须满足以下条件:
设备驱动程序必须支持热插拔。
必须可通过替代路径访问关键资源。
例如,如果系统中仅安装了一块以太网卡,则拆离该以太网卡必然会断开网络连接。此拆离操作需要其他分层软件支持,以使网络连接保持活动状态。
只要满足以下条件,便可以向系统中添加 PCI 适配卡。
具有可用插槽。
设备驱动程序支持对此适配卡进行热插拔。
有关添加或移除 PCI 适配卡的逐步说明,请参见使用 cfgadm 命令执行 PCI 或 PCIe 热插拔。
任务 |
说明 |
参考 |
---|---|---|
显示有关 SCSI 设备的信息。 |
显示有关 SCSI 控制器和设备的信息。 | |
取消配置 SCSI 控制器。 |
取消配置 SCSI 控制器。 | |
配置 SCSI 控制器。 |
配置以前取消配置的 SCSI 控制器。 | |
配置 SCSI 设备。 |
配置特定的 SCSI 设备。 | |
断开 SCSI 控制器的连接。 |
断开特定 SCSI 控制器的连接。 | |
连接 SCSI 控制器。 |
连接以前断开的特定 SCSI 控制器。 | |
将 SCSI 设备添加到 SCSI 总线中。 |
将特定的 SCSI 设备添加到 SCSI 总线中。 | |
更换 SCSI 控制器上的相同设备。 |
将 SCSI 总线上的设备更换为同一类型的其他设备。 | |
移除 SCSI 设备。 |
从系统中移除 SCSI 设备。 | |
对 SCSI 配置问题进行疑难解答。 |
解析失败的 SCSI 取消配置操作。 |
本节介绍可使用 cfgadm 命令执行的各种 SCSI 热插拔过程。
一般情况下,SCSI 框架支持 SCSI 设备的热插拔。但是,您应该查询硬件文档,以确认 SCSI 设备是否支持热插拔。
这些过程以特定设备为例,说明如何使用 cfgadm 命令来热插拔 SCSI 组件。您提供的以及 cfgadm 命令显示的设备信息取决于系统配置。
以下过程在使用 cfgadm 命令显示设备类型配置信息的示例中使用 SCSI 控制器 c0 和 c1 以及与其连接的设备。
如果 cfgadm 命令不支持 SCSI 设备,则该设备不会显示在 cfgadm 命令输出中。
成为超级用户。
# cfgadm -l Ap_Id Type Receptacle Occupant Condition c0 scsi-bus connected configured unknown c1 scsi-bus connected configured unknown |
在本示例中,c0 和 c1 表示两个 SCSI 控制器。
显示有关系统的 SCSI 控制器及其连接设备的信息。
# cfgadm -al Ap_Id Type Receptacle Occupant Condition c0 scsi-bus connected configured unknown c0::dsk/c0t0d0 disk connected configured unknown c0::rmt/0 tape connected configured unknown c1 scsi-bus connected configured unknown c1::dsk/c1t3d0 disk connected configured unknown c1::dsk/c1t4d0 unavailable connected unconfigured unknown |
cfgadm -l 命令显示有关 SCSI HBA 而不是 SCSI 设备的信息。使用 cfgadm -al 命令可显示有关 SCSI 设备(如磁盘和磁带)的信息。
以下过程在取消配置 SCSI 控制器的示例中使用 SCSI 控制器 c1。
成为超级用户。
# cfgadm -c unconfigure c1 |
验证是否已取消配置 SCSI 控制器。
# cfgadm -al Ap_Id Type Receptacle Occupant Condition c0 scsi-bus connected configured unknown c0::dsk/c0t0d0 disk connected configured unknown c0::rmt/0 tape connected configured unknown c1 scsi-bus connected unconfigured unknown |
请注意,c1 的 Occupant 列指定 unconfigured,表明 SCSI 总线没有已配置的插卡。
如果取消配置操作失败,请参见如何解析失败的 SCSI 取消配置操作。
以下过程在配置 SCSI 控制器的示例中使用 SCSI 控制器 c1。
成为超级用户。
# cfgadm -c configure c1 |
验证 SCSI 控制器是否已配置。
# cfgadm -al Ap_Id Type Receptacle Occupant Condition c0 scsi-bus connected configured unknown c0::dsk/c0t0d0 disk connected configured unknown c0::rmt/0 tape connected configured unknown c1 scsi-bus connected configured unknown c1::dsk/c1t3d0 disk connected configured unknown c1::dsk/c1t4d0 unavailable connected unconfigured unknown |
前面的取消配置过程移除了 SCSI 总线上的所有设备。现在,所有设备都已配置回系统中。
以下过程在配置 SCSI 设备的示例中使用 SCSI 磁盘 c1t4d0。
成为超级用户。
# cfgadm -al Ap_Id Type Receptacle Occupant Condition c0 scsi-bus connected configured unknown c0::dsk/c0t0d0 disk connected configured unknown c0::rmt/0 tape connected configured unknown c1 scsi-bus connected configured unknown c1::dsk/c1t3d0 disk connected configured unknown c1::dsk/c1t4d0 unavailable connected unconfigured unknown |
配置 SCSI 设备。
# cfgadm -c configure c1::dsk/c1t4d0 |
验证 SCSI 设备是否已配置。
# cfgadm -al Ap_Id Type Receptacle Occupant Condition c0 scsi-bus connected configured unknown c0::dsk/c0t0d0 disk connected configured unknown c0::rmt/0 tape connected configured unknown c1 scsi-bus connected configured unknown c1::dsk/c1t3d0 disk connected configured unknown c1::dsk/c1t4d0 disk connected configured unknown |
断开 SCSI 设备连接时必须非常谨慎,特别是在处理包含关键文件系统(如根 (/)、usr、var 和 swap 分区)的控制器任务时。动态重新配置软件无法检测到系统挂起可能导致的所有情况。使用此过程时应谨慎。
以下过程在断开 SCSI 设备连接的示例中使用 SCSI 控制器 c1。
成为超级用户。
验证断开设备连接之前是否已连接该设备。
# cfgadm -al Ap_Id Type Receptacle Occupant Condition c0 scsi-bus connected configured unknown c0::dsk/c0t0d0 disk connected configured unknown c0::rmt/0 tape connected configured unknown c1 scsi-bus connected configured unknown c1::dsk/c1t3d0 disk connected configured unknown c1::dsk/c1t4d0 disk connected configured unknown |
断开 SCSI 控制器的连接。
# cfgadm -c disconnect c1 WARNING: Disconnecting critical partitions may cause system hang. Continue (yes/no)? y |
此命令可以暂停 SCSI 总线上的所有 I/O 活动,直到使用 cfgadm -c connect 命令为止。cfgadm 命令可执行一些基本检查,以防止断开关键分区的连接,但不能检测到所有情况。如果此命令使用不当,则可能会导致系统挂起并且可能需要重新引导系统。
验证 SCSI 总线是否已断开连接。
# cfgadm -al Ap_Id Type Receptacle Occupant Condition c0 scsi-bus connected configured unknown c0::dsk/c0t0d0 disk connected configured unknown c0::rmt/0 tape connected configured unknown c1 unavailable disconnected configured unknown c1::dsk/c1t3d0 unavailable disconnected configured unknown c1::dsk/c1t4d0 unavailable disconnected configured unknown |
控制器及其连接的所有设备都将与系统断开连接。
以下过程在连接 SCSI 控制器的示例中使用 SCSI 控制器 c1。
成为超级用户。
# cfgadm -al Ap_Id Type Receptacle Occupant Condition c0 scsi-bus connected configured unknown c0::dsk/c0t0d0 disk connected configured unknown c0::rmt/0 tape connected configured unknown c1 unavailable disconnected configured unknown c1::dsk/c1t3d0 unavailable disconnected configured unknown c1::dsk/c1t4d0 unavailable disconnected configured unknown |
连接 SCSI 控制器。
# cfgadm -c connect c1 |
验证 SCSI 控制器是否已连接。
# cfgadm -al Ap_Id Type Receptacle Occupant Condition c0 scsi-bus connected configured unknown c0::dsk/c0t0d0 disk connected configured unknown c0::rmt/0 tape connected configured unknown c1 scsi-bus connected configured unknown c1::dsk/c1t3d0 disk connected configured unknown c1::dsk/c1t4d0 disk connected configured unknown |
在如何将 SCSI 设备添加到 SCSI 总线的示例中使用的是 SCSI 控制器 c1。
添加设备时,应指定与设备连接的 SCSI HBA(控制器)的 Ap_Id,而不是设备本身的 Ap_Id。
成为超级用户。
# cfgadm -al Ap_Id Type Receptacle Occupant Condition c0 scsi-bus connected configured unknown c0::dsk/c0t0d0 disk connected configured unknown c0::rmt/0 tape connected configured unknown c1 scsi-bus connected configured unknown c1::dsk/c1t3d0 disk connected configured unknown |
将 SCSI 设备添加到 SCSI 总线。
键入以下 cfgadm 命令。
例如:
# cfgadm -x insert_device c1 Adding device to SCSI HBA: /devices/sbus@1f,0/SUNW,fas@1,8800000 This operation will suspend activity on SCSI bus: c1 |
在 Continue (yes/no)? 提示符下键入 y 以继续操作。
Continue (yes/no)? y SCSI bus quiesced successfully. It is now safe to proceed with hotplug operation. |
正在执行热插拔操作的同时,SCSI 总线上的 I/O 活动会暂停。
连接设备,然后打开设备电源。
在 Enter y if operation is complete or n to abort (yes/no)? 提示符下键入 y。
Enter y if operation is complete or n to abort (yes/no)? y |
验证是否已添加了设备。
# cfgadm -al Ap_Id Type Receptacle Occupant Condition c0 scsi-bus connected configured unknown c0::dsk/c0t0d0 disk connected configured unknown c0::rmt/0 tape connected configured unknown c1 scsi-bus connected configured unknown c1::dsk/c1t3d0 disk connected configured unknown c1::dsk/c1t4d0 disk connected configured unknown |
新磁盘已添加到控制器 c1 中。
以下过程在 SCSI 控制器上更换相同设备的示例中使用 SCSI 磁盘 c1t4d0。
成为超级用户。
# cfgadm -al Ap_Id Type Receptacle Occupant Condition c0 scsi-bus connected configured unknown c0::dsk/c0t0d0 disk connected configured unknown c0::rmt/0 tape connected configured unknown c1 scsi-bus connected configured unknown c1::dsk/c1t3d0 disk connected configured unknown c1::dsk/c1t4d0 disk connected configured unknown |
将 SCSI 总线上的设备更换为同一类型的其他设备。
键入以下 cfgadm 命令。
例如:
# cfgadm -x replace_device c1::dsk/c1t4d0 Replacing SCSI device: /devices/sbus@1f,0/SUNW,fas@1,8800000/sd@4,0 This operation will suspend activity on SCSI bus: c1 |
在 Continue (yes/no)? 提示符下键入 y 以继续操作。
正在执行热插拔操作的同时,SCSI 总线上的 I/O 活动会暂停。
Continue (yes/no)? y SCSI bus quiesced successfully. It is now safe to proceed with hotplug operation. |
关闭要移除的设备的电源,然后将其移除。
添加替换设备。然后,关闭该设备的电源。
替换设备应该与要移除的设备类型相同并且具有同一地址(目标和 LUN)。
在 Enter y if operation is complete or n to abort (yes/no)? 提示符下键入 y。
Enter y if operation is complete or n to abort (yes/no)? y |
验证是否已更换了设备。
# cfgadm -al Ap_Id Type Receptacle Occupant Condition c0 scsi-bus connected configured unknown c0::dsk/c0t0d0 disk connected configured unknown c0::rmt/0 tape connected configured unknown c1 scsi-bus connected configured unknown c1::dsk/c1t3d0 disk connected configured unknown c1::dsk/c1t4d0 disk connected configured unknown |
以下过程在移除 SCSI 控制器上的设备示例中使用 SCSI 磁盘 c1t4d0。
成为超级用户。
# cfgadm -al Ap_Id Type Receptacle Occupant Condition c0 scsi-bus connected configured unknown c0::dsk/c0t0d0 disk connected configured unknown c0::rmt/0 tape connected configured unknown c1 scsi-bus connected configured unknown c1::dsk/c1t3d0 disk connected configured unknown c1::dsk/c1t4d0 disk connected configured unknown |
从系统中移除 SCSI 设备。
键入以下 cfgadm 命令。
例如:
# cfgadm -x remove_device c1::dsk/c1t4d0 Removing SCSI device: /devices/sbus@1f,0/SUNW,fas@1,8800000/sd@4,0 This operation will suspend activity on SCSI bus: c1 |
在 Continue (yes/no)? 提示符下键入 y 以继续操作。
Continue (yes/no)? y SCSI bus quiesced successfully. It is now safe to proceed with hotplug operation. |
正在执行热插拔操作的同时,SCSI 总线上的 I/O 活动会暂停。
关闭要移除的设备的电源,然后将其移除。
在 Enter y if operation is complete or n to abort (yes/no)? 提示符下键入 y。
Enter y if operation is complete or n to abort (yes/no)? y |
验证是否已从系统中移除了设备。
# cfgadm -al Ap_Id Type Receptacle Occupant Condition c0 scsi-bus connected configured unknown c0::dsk/c0t0d0 disk connected configured unknown c0::rmt/0 tape connected configured unknown c1 scsi-bus connected configured unknown c1::dsk/c1t3d0 disk connected configured unknown |
本节提供有关 SCSI 配置问题的错误消息和可能的解决方案。有关对 SCSI 配置问题进行疑难解答的更多信息,请参见 cfgadm(1M)。
cfgadm: Component system is busy, try again: failed to offline: device-path Resource Information ------------------ -------------------------- /dev/dsk/c1t0d0s0 mounted filesystem "/file-system" |
尝试移除或更换已挂载文件系统的设备。
取消挂载错误消息中列出的文件系统,并重试 cfgadm 操作。
cfgadm: Component system is busy, try again: failed to offline: device-path Resource Information ------------------ -------------------------- /dev/dsk/device-name swap area |
如果使用 cfgadm 命令移除系统资源(如交换设备或专用转储设备),则在系统资源仍然处于活动状态时将显示一条类似的错误消息。
取消配置指定设备上的交换区域,并重试 cfgadm 操作。
cfgadm: Component system is busy, try again: failed to offline: device-path Resource Information ------------------ -------------------------- /dev/dsk/device-name dump device (swap) |
尝试移除或更换在交换区域中配置的转储设备。
取消配置在交换区域中配置的转储设备,并重试 cfgadm 操作。
cfgadm: Component system is busy, try again: failed to offline: device-path Resource Information ------------------ -------------------------- /dev/dsk/device-name dump device (dedicated) |
尝试移除或更换专用转储设备。
取消配置该专用转储设备,并重试 cfgadm 操作。
如果一个或多个目标设备繁忙并且 SCSI 取消配置操作失败,请使用此过程。 否则,将来对此控制器和目标设备进行动态重新配置操作会失败,并会显示 dr in progress 消息。
以下任务列表介绍了在系统上管理 PCI 或 PCIe 设备的任务。
任务 |
说明 |
参考 |
---|---|---|
显示 PCI 插槽配置信息。 |
显示系统上的 PCI 可热插拔设备和插槽的状态。 | |
移除 PCI 适配卡。 |
取消配置该卡,断开插槽的电源,然后从系统中移除该卡。 | |
添加 PCI 适配卡。 |
将适配卡插入可热插拔的插槽中,连接插槽的电源,然后配置该卡。 | |
对 PCI 配置问题进行疑难解答。 |
确定错误消息和可能的解决方案,以解析 PCI 配置问题。 |
本节提供有关热插拔 x86 系统上的 PCI 或 PCIe 适配卡的逐步说明。
除了 cfgadm 命令以外,在热插拔操作过程中,prtconf 命令也非常有帮助。prtconf 命令可以显示与硬件有关的其他配置信息。
添加硬件后,可以使用 prtconf 命令来验证该硬件是否正确配置。例如,在配置操作后,使用 prtconf -D 命令可验证是否已向新安装的硬件设备附加了驱动程序。如果在配置硬件之前未将设备驱动程序添加到系统中,则可以使用 add_drv 命令手动添加该驱动程序。
有关更多信息,请参见 prtconf(1M) 和 add_drv(1M)。
在这些示例中,为了简便起见,仅列出了 PCI 附加点。系统上显示的附加点取决于系统配置。
您可能需要观察系统上的 LED 指示灯,以直观地了解有关插槽热插拔操作的状态。如果使用 PCI Express,则 LED 的行为符合 PCI Express 规范中定义的行为,否则该行为可能与平台相关。
有关具体的详细信息,请参阅平台指南。如果使用 PCI Express,则按“注意”按钮时,电源指示灯将会闪烁,表示状态转换开始。状态转换结束后,即会停止闪烁。
此过程在 Solaris 10 6/06 发行版中已进行了更新,包括 PCIe 配置信息。
cfgadm 命令可显示系统上的 PCI 可热插拔设备和插槽的状态。有关更多信息,请参见 cfgadm(1M)。
成为超级用户。
显示 PCI 插槽配置信息。
例如:
# cfgadm Ap_Id Type Receptacle Occupant Condition pci1:hpc0_slot0 unknown empty unconfigured unknown pci1:hpc0_slot1 unknown empty unconfigured unknown pci1:hpc0_slot2 unknown empty unconfigured unknown pci1:hpc0_slot3 ethernet/hp connected configured ok pci1:hpc0_slot4 unknown empty unconfigured unknown |
显示特定的 PCI 设备信息。
例如:
# cfgadm -s "cols=ap_id:type:info" pci Ap_Id Type Information pci1:hpc0_slot0 unknown Slot 7 pci1:hpc0_slot1 unknown Slot 8 pci1:hpc0_slot2 unknown Slot 9 pci1:hpc0_slot3 ethernet/hp Slot 10 pci1:hpc0_slot4 unknown Slot 11 |
逻辑 Ap_Id pci1:hpc0_slot0 是可热插拔插槽 Slot 7 的逻辑 Ap_Id。组件 hpc0 表示此插槽的可热插拔适配卡,pci1 表示 PCI 总线实例。Type 字段表示插槽中存在的 PCI 适配卡的类型。
显示 PCIe 插槽配置信息。
例如:
# cfgadm pci Ap_Id Type Receptacle Occupant Condition pcie1 unknown empty unconfigured unknown pcie2 unknown empty unconfigured unknown pcie3 unknown empty unconfigured unknown pcie4 etherne/hp connected configured ok pcie5 pci-pci/hp connected configured ok pcie6 unknown disconnected unconfigured unknown |
显示特定的 PCIe 设备信息。
例如:
# cfgadm -s "cols=ap_id:busy:o_state" pci Ap_Id Busy Occupant pcie1 n unconfigured pcie2 n unconfigured pcie3 n unconfigured pcie4 n configured pcie5 n configured pcie6 n configured |
在大多数情况下,逻辑 Ap_Id 都应该与系统机箱上用丝网印花法标记的插槽标签匹配。有关可热插拔插槽的 cfgadm 输出,请参阅平台指南。显示 Busy 字段可确保尝试热插拔操作之前 Ap_Id 未转换为其他状态。
在 Solaris 10 6/06 发行版中,以下过程已经更新,可用于移除 PCIe 适配卡。但是,无论使用 PCI 还是 PCIe,移除适配卡的过程都是相同的。
成为超级用户。
确定 PCI 适配卡所在的插槽。
例如:
# cfgadm pci Ap_Id Type Receptacle Occupant Condition pcie1 unknown empty unconfigured unknown pcie2 unknown empty unconfigured unknown pcie3 unknown empty unconfigured unknown pcie4 etherne/hp connected configured ok pcie5 pci-pci/hp connected configured ok pcie6 unknown disconnected unconfigured unknown |
停止用于打开设备的应用程序。
按照如下方式使用 cfgadm(1M) 命令手动取消配置设备。或者,如果您有 PCIe 适配卡,也可使用自动配置方法,如按平台指南中定义的方式按插槽的“注意”按钮。
# cfgadm -c unconfigure pcie4 |
确认是否已取消配置设备。
例如:
# cfgadm pci Ap_Id Type Receptacle Occupant Condition pcie1 unknown empty unconfigured unknown pcie2 unknown empty unconfigured unknown pcie3 unknown empty unconfigured unknown pcie4 unknown connected unconfigured unknown pcie5 pci-pci/hp connected configured ok pcie6 unknown disconnected unconfigured unknown |
如果取消配置设备,则 Type 和 Condition 也将成为 unknown。
手动断开插槽的电源。如果使用自动配置方法,则此步骤是不必要的。有关更多信息,请参阅平台指南。
# cfgadm -c disconnect pcie4 |
确认是否已断开设备连接。
例如:
# cfgadm pci Ap_Id Type Receptacle Occupant Condition pcie1 unknown empty unconfigured unknown pcie2 unknown empty unconfigured unknown pcie3 unknown empty unconfigured unknown pcie4 unknown disconnected unconfigured unknown pcie5 pci-pci/hp connected configured ok pcie6 unknown disconnected unconfigured unknown |
遵照平台指南中的相应说明移除 PCI 适配卡。移除该卡后,插座状态即为空。
例如:
# cfgadm pci Ap_Id Type Receptacle Occupant Condition pcie1 unknown empty unconfigured unknown pcie2 unknown empty unconfigured unknown pcie3 unknown empty unconfigured unknown pcie4 unknown empty unconfigured unknown pcie5 pci-pci/hp connected configured ok pcie6 unknown disconnected unconfigured unknown |
可以在引导时启用或禁用自动配置方法,具体取决于平台的实现。请针对环境设置合适的自动配置方法。
在 Solaris 10 6/06 发行版中,以下过程已经更新,可用于添加 PCIe 适配卡。但是,无论使用 PCI 还是 PCIe,添加适配卡的过程都是相同的。
成为超级用户。
例如,pcie3。
# cfgadm pci Ap_Id Type Receptacle Occupant Condition pcie1 unknown empty unconfigured unknown pcie2 unknown empty unconfigured unknown pcie3 unknown empty unconfigured unknown pcie4 unknown empty unconfigured unknown pcie5 pci-pci/hp connected configured ok pcie6 unknown disconnected unconfigured unknown |
遵照平台指南中的相应说明将 PCI 适配卡插入插槽。
确定插入 PCI 适配卡后该卡所在的插槽。
例如:
# cfgadm pci Ap_Id Type Receptacle Occupant Condition pcie1 unknown empty unconfigured unknown pcie2 unknown empty unconfigured unknown pcie3 unknown disconnected unconfigured unknown pcie4 unknown empty unconfigured unknown pcie5 pci-pci/hp connected configured ok pcie6 unknown disconnected unconfigured unknown |
使用 cfgadm 命令手动连接插槽的电源。或者,如果您有 PCIe 适配卡,也可使用自动配置方法,如按平台指南中定义的方式按插槽的“注意”按钮。
例如:
# cfgadm -c connect pcie3 |
确认附加点已连接。
例如:
# cfgadm pci Ap_Id Type Receptacle Occupant Condition pcie1 unknown empty unconfigured unknown pcie2 unknown empty unconfigured unknown pcie3 unknown connected unconfigured unknown pcie4 unknown empty unconfigured unknown pcie5 pci-pci/hp connected configured ok pcie6 unknown disconnected unconfigured unknown |
按照如下方式使用 cfgadm 命令手动配置 PCI 适配卡。如果使用自动配置方法,此步骤应该是不必要的。有关更多信息,请参阅平台指南。
例如:
# cfgadm -c configure pcie3 |
验证插槽中的 PCI 适配卡的配置。
例如:
# cfgadm pci Ap_Id Type Receptacle Occupant Condition pcie1 unknown empty unconfigured unknown pcie2 unknown empty unconfigured unknown pcie3 etherne/hp connected configured unknown pcie5 pci-pci/hp connected configured ok pcie6 unknown disconnected unconfigured unknown |
如果此设备为新设备,请配置任何支持的软件。
例如,如果此设备是一块以太网卡,请使用 ifconfig 命令来设置接口。
可以在引导时启用或禁用自动配置方法,具体取决于平台的实现。请针对环境设置合适的自动配置方法。
cfgadm: Configuration operation invalid: invalid transition |
尝试进行无效转换。
检查是否正确发出了 cfgadm -c 命令。使用 cfgadm 命令检查当前的插座和插卡状态,并确保 Ap_Id 正确。
cfgadm: Attachment point not found |
未找到指定的附加点。
检查附加点是否正确。使用 cfgadm 命令显示可用附加点的列表。另外,请检查物理路径,以查看附加点是否仍然在正确的位置。
重新配置调整管理器 (Reconfiguration Coordination Manager, RCM) 是用于管理动态移除系统组件的框架。通过使用 RCM,可以按顺序注册和释放系统资源。
可以使用新的 RCM 脚本功能来编写您自己的脚本,以关闭应用程序,或在动态重新配置过程中从应用程序中完全释放设备。如果重新配置请求影响通过脚本注册的资源,则 RCM 框架将自动启动脚本来响应该请求。
动态移除资源之前,还可以手动从应用程序中释放资源。或者,也可以使用带有 -f 选项的 cfgadm 命令来强制执行重新配置操作。但是,此操作可能会使应用程序处于未知状态。另外,从应用程序中手动释放资源通常还会导致错误。
RCM 脚本功能可以简化并更好地控制动态重新配置过程。通过创建 RCM 脚本,可以执行以下操作:
动态移除设备时,自动释放该设备。如果设备是通过应用程序打开,则此过程还将关闭该设备。
从系统中动态移除设备时,运行特定于站点的任务。
RCM 守护进程运行的可执行 shell 脚本(Perl、sh、csh 或 ksh)或二进制程序。Perl 是建议使用的语言。
通过使用脚本文件属主的用户 ID 在其自身的地址空间中运行的脚本。
使用 cfgadm 命令动态重新配置系统资源时,由 RCM 守护进程运行的脚本。
动态移除设备时,可以使用 RCM 脚本从应用程序中释放该设备。如果设备当前处于打开状态,则 RCM 脚本还会将其关闭。
例如,磁带备份应用程序的 RCM 脚本可以通知磁带备份应用程序关闭磁带机或磁带备份应用程序。
可以按照以下方式调用 RCM 脚本:
$ script-name command [args ...] |
RCM 脚本可执行以下基本步骤:
通过命令行参数获取 RCM 命令。
执行该命令。
将结果作为名称-值对写入 stdout 中。
以适当的退出状态退出。
RCM 守护进程每次只运行一个脚本实例。例如,如果某一脚本正在运行,则在该脚本退出之前,RCM 守护进程不会运行该脚本的其他实例。
scriptinfo-收集脚本信息
register-注册重要资源
resourceinfo-收集资源信息
可以包括以下某些或所有 RCM 命令:
queryremove-查询是否可以释放资源
preremove-释放资源
postremove-提供资源移除后的通知
undoremove-撤消在 preremove 中执行的操作
有关这些 RCM 命令的完整说明,请参见 rcmscript(4)。
动态移除设备时,RCM 守护进程将运行以下命令:
脚本的 register 命令,用于收集脚本中标识的资源(设备名称)的列表。
脚本的 queryremove 和 preremove 命令,在移除资源之前运行,前提是脚本的已注册资源受到动态移除操作的影响。
脚本的 postremove 命令,前提是移除操作成功。但是,如果移除操作失败,RCM 守护进程会运行该脚本的 undoremove 命令。
以下各节介绍了应用程序开发者和系统管理员的 RCM 脚本任务。
以下任务列表介绍了创建 RCM 脚本的应用程序开发者的任务。
任务 |
说明 |
参考 |
---|---|---|
1. 确定应用程序使用的资源。 |
确定应用程序使用的可能要动态移除的资源(设备名称)。 | |
2. 确定用于释放资源的命令。 |
确定用于通知应用程序从应用程序中正常释放资源的命令。 |
应用程序文档 |
3. 确定用于资源移除后进行后续处理的命令。 |
包括用于通知应用程序资源移除的命令。 | |
4. 确定资源移除失败时使用的命令。 |
包括用于通知应用程序可用资源的命令。 | |
5. 编写 RCM 脚本。 |
根据任务 1-4 中标识的信息,编写 RCM 脚本。 | |
6. 安装 RCM 脚本。 |
将脚本添加到相应的脚本目录中。 | |
7. 测试 RCM 脚本 |
通过手动运行脚本命令和启动动态重新配置操作来测试脚本。 |
以下任务列表介绍了创建 RCM 脚本进行站点自定义的系统管理员的任务。
任务 |
说明 |
参考 |
---|---|---|
1. 确定要动态删除的资源。 |
使用 cfgadm -l 命令确定可能要删除的资源(设备名称)。 | |
2. 确定要停止的应用程序。 |
确定用于正常停止应用程序的命令。 |
应用程序文档 |
3. 确定用于在删除资源前后进行各种处理的命令。 |
确定删除资源前后要执行的操作。 | |
4. 编写 RCM 脚本。 |
根据任务 1-3 中标识的信息,编写 RCM 脚本。 | |
5. 安装 RCM 脚本。 |
将脚本添加到相应的脚本目录中。 | |
6. 测试 RCM 脚本。 |
通过手动运行脚本命令和启动动态重新配置操作来测试脚本。 |
必须按以下形式命名脚本,vendor,service,其中:
提供脚本的供应商的股票代号,或标识供应商的任何独特名称。
脚本表示的服务名称。
必须是超级用户 (root) 才能安装或删除 RCM 脚本。使用下表可确定应安装 RCM 脚本的位置。
表 6–1 RCM 脚本目录
目录位置 |
脚本类型 |
---|---|
/etc/rcm/scripts |
特定系统的脚本 |
/usr/platform/`uname -i`/lib/rcm/scripts |
特定硬件实现的脚本 |
/usr/platform/`uname -m`/lib/rcm/scripts |
特定硬件类的脚本 |
/usr/lib/rcm/scripts |
任何硬件的脚本 |
成为超级用户。
将脚本复制到相应目录。
请参见表 6–1。
例如:
# cp SUNW,sample.pl /usr/lib/rcm/scripts |
将脚本的用户 ID 和组 ID 更改为所需的值。
# chown user:group /usr/lib/rcm/scripts/SUNW,sample.pl |
将 SIGHUP 发送到 RCM 守护进程。
# pkill -HUP -x -u root rcm_daemon |
成为超级用户。
从 RCM 脚本目录中删除脚本。
例如:
# rm /usr/lib/rcm/scripts/SUNW,sample.pl |
将 SIGHUP 发送到 RCM 守护进程。
# pkill -HUP -x -u root rcm_daemon |
运行脚本之前,在命令行 shell 中设置环境变量,如 RCM_ENV_FORCE。
例如,在 Korn shell 中,请使用以下命令:
$ export RCM_ENV_FORCE=TRUE |
通过从命令行手动运行脚本命令来测试脚本。
例如:
$ script-name scriptinfo $ script-name register $ script-name preremove resource-name $ script-name postremove resource-name |
确保脚本中的每个 RCM 脚本命令都会列显 stdout 的相应输出。
在相应的脚本目录中安装脚本。
有关更多信息,请参见如何安装 RCM 脚本。
通过启动动态删除操作来测试脚本。
例如,假定脚本注册了设备 /dev/dsk/c1t0d0s0。请尝试键入以下命令。
$ cfgadm -c unconfigure c1::dsk/c1t0d0 $ cfgadm -f -c unconfigure c1::dsk/c1t0d0 $ cfgadm -c configure c1::dsk/c1t0d0 |
请确保您熟悉这些命令,因为这些命令可以改变系统的状态,并会导致系统故障。
本示例说明如何使用 RCM 脚本执行磁带备份。
磁带备份 RCM 脚本可执行以下步骤:
设置 RCM 命令的分发表。
调用与指定的 RCM 命令对应的分发例程,并对于未实现的 RCM 命令以状态 2 退出。
设置 scriptinfo 部分。
rcm_script_func_info=Tape backup appl script for DR |
通过在 stdout 中列显所有磁带机设备名称,在系统中注册所有磁带机。
rcm_resource_name=/dev/rmt/$f |
如果出现错误,则该脚本将在 stdout 中列显错误信息。
rcm_failure_reason=$errmsg |
为磁带设备设置资源信息。
rcm_resource_usage_info=Backup Tape Unit Number $unit |
通过检查备份应用程序是否使用该设备,设置 preremove 信息。如果备份应用程序未使用该设备,则动态重新配置操作将继续进行。如果备份应用程序使用该设备,则该脚本将检查 RCM_ENV_FORCE。如果将 RCM_ENV_FORCE 设置为 FALSE,则该脚本将拒绝动态重新配置操作,并列显以下消息:
rcm_failure_reason=tape backup in progress pid=... |
如果将 RCM_ENV_FORCE 设置为 TRUE,则将停止备份应用程序,重新配置操作则继续进行。
以下是使用 cfgadm 命令移除不包含 RCM 脚本的磁带设备时的各种结果。
如果使用 cfgadm 命令并且备份应用程序未使用磁带设备,则该操作将成功。
如果使用 cfgadm 命令并且备份应用程序使用磁带设备,则该操作将失败。
以下是使用 cfgadm 命令移除包含 RCM 脚本的磁带设备时的各种结果。
如果使用 cfgadm 命令并且备份应用程序未使用磁带设备,则该操作将成功。
如果使用不带 -f 选项的 cfgadm 命令并且备份应用程序使用磁带设备,则该操作将失败,并会显示以下错误消息:
tape backup in progress pid=... |
如果使用 cfgadm -f 命令并且备份应用程序使用磁带设备,则该脚本会停止备份应用程序,cfgadm 操作将成功。
#! /usr/bin/perl -w # # A sample site customization RCM script. # # When RCM_ENV_FORCE is FALSE this script indicates to RCM that it cannot # release the tape drive when the tape drive is being used for backup. # # When RCM_ENV_FORCE is TRUE this script allows DR removing a tape drive # when the tape drive is being used for backup by killing the tape # backup application. # use strict; my ($cmd, %dispatch); $cmd = shift(@ARGV); # dispatch table for RCM commands %dispatch = ( "scriptinfo" => \&do_scriptinfo, "register" => \&do_register, "resourceinfo" => \&do_resourceinfo, "queryremove" => \&do_preremove, "preremove" => \&do_preremove ); if (defined($dispatch{$cmd})) { &{$dispatch{$cmd}}; } else { exit (2); } sub do_scriptinfo { print "rcm_script_version=1\n"; print "rcm_script_func_info=Tape backup appl script for DR\n"; exit (0); } sub do_register { my ($dir, $f, $errmsg); $dir = opendir(RMT, "/dev/rmt"); if (!$dir) { $errmsg = "Unable to open /dev/rmt directory: $!"; print "rcm_failure_reason=$errmsg\n"; exit (1); } while ($f = readdir(RMT)) { # ignore hidden files and multiple names for the same device if (($f !~ /^\./) && ($f =~ /^[0-9]+$/)) { print "rcm_resource_name=/dev/rmt/$f\n"; } } closedir(RMT); exit (0); } sub do_resourceinfo { my ($rsrc, $unit); $rsrc = shift(@ARGV); if ($rsrc =~ /^\/dev\/rmt\/([0-9]+)$/) { $unit = $1; print "rcm_resource_usage_info=Backup Tape Unit Number $unit\n"; exit (0); } else { print "rcm_failure_reason=Unknown tape device!\n"; exit (1); } } sub do_preremove { my ($rsrc); $rsrc = shift(@ARGV); # check if backup application is using this resource #if (the backup application is not running on $rsrc) { # allow the DR to continue # exit (0); #} # # If RCM_ENV_FORCE is FALSE deny the operation. # If RCM_ENV_FORCE is TRUE kill the backup application in order # to allow the DR operation to proceed # if ($ENV{RCM_ENV_FORCE} eq 'TRUE') { if ($cmd eq 'preremove') { # kill the tape backup application } exit (0); } else { # # indicate that the tape drive can not be released # since the device is being used for backup by the # tape backup application # print "rcm_failure_reason=tape backup in progress pid=...\n" ; exit (3); } } |