系统管理指南:设备和文件系统

第 6 章 动态配置设备(任务)

本章提供有关在 Solaris OS 中动态配置设备的说明。如果系统组件支持热插拔,则在系统仍然处于运行状态时,可在 Solaris OS 中添加、移除或更换设备。如果系统组件不支持热插拔,则可以重新引导系统以重新配置设备。

有关与动态配置设备关联的过程信息,请参见以下内容:

有关使用 cfgadm 命令热插拔 USB 设备的信息,请参见使用 cfgadm 命令热插拔 USB 设备

有关访问设备的信息,请参见第 10 章,访问设备(概述)

动态重新配置和热插拔

热插拔是指在系统运行的同时以物理方式添加、移除或更换系统组件的能力。动态重新配置是指热插拔系统组件的能力。此术语还指在系统中四处移动系统资源(硬件和软件),或以某种方式禁用这些系统资源而不以物理方式将其从系统中移除的一般能力。

一般情况下,可以热插拔以下总线类型:

此外,还可以使用 cfgadm 命令热插拔以下设备:

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 或 PCIe 适配卡

如果设备驱动程序支持热插拔,则可以移除承载非重要系统资源的 PCI 适配卡。如果 PCI 适配卡是重要的系统资源,则不可将其拆离。要使 PCI 适配卡可拆离,必须满足以下条件:

例如,如果系统中仅安装了一块以太网卡,则拆离该以太网卡必然会断开网络连接。此拆离操作需要其他分层软件支持,以使网络连接保持活动状态。

连接 PCI 或 PCIe 适配卡

只要满足以下条件,便可以向系统中添加 PCI 适配卡。

有关添加或移除 PCI 适配卡的逐步说明,请参见使用 cfgadm 命令执行 PCI 或 PCIe 热插拔

使用 cfgadm 命令执行 SCSI 热插拔(任务列表)

任务 

说明 

参考 

显示有关 SCSI 设备的信息。 

显示有关 SCSI 控制器和设备的信息。 

如何显示有关 SCSI 设备的信息

取消配置 SCSI 控制器。 

取消配置 SCSI 控制器。 

如何取消配置 SCSI 控制器

配置 SCSI 控制器。 

配置以前取消配置的 SCSI 控制器。 

如何配置 SCSI 控制器

配置 SCSI 设备。 

配置特定的 SCSI 设备。 

如何配置 SCSI 设备

断开 SCSI 控制器的连接。 

断开特定 SCSI 控制器的连接。 

如何断开 SCSI 控制器连接

连接 SCSI 控制器。 

连接以前断开的特定 SCSI 控制器。 

SPARC: 如何连接 SCSI 控制器

将 SCSI 设备添加到 SCSI 总线中。 

将特定的 SCSI 设备添加到 SCSI 总线中。 

SPARC: 如何将 SCSI 设备添加到 SCSI 总线中

更换 SCSI 控制器上的相同设备。 

将 SCSI 总线上的设备更换为同一类型的其他设备。 

SPARC: 如何更换 SCSI 控制器上的相同设备

移除 SCSI 设备。 

从系统中移除 SCSI 设备。 

SPARC: 如何移除 SCSI 设备

对 SCSI 配置问题进行疑难解答。 

解析失败的 SCSI 取消配置操作。 

如何解析失败的 SCSI 取消配置操作

使用 cfgadm 命令执行 SCSI 热插拔

本节介绍可使用 cfgadm 命令执行的各种 SCSI 热插拔过程。


注 –

一般情况下,SCSI 框架支持 SCSI 设备的热插拔。但是,您应该查询硬件文档,以确认 SCSI 设备是否支持热插拔。


这些过程以特定设备为例,说明如何使用 cfgadm 命令来热插拔 SCSI 组件。您提供的以及 cfgadm 命令显示的设备信息取决于系统配置。

Procedure如何显示有关 SCSI 设备的信息

以下过程在使用 cfgadm 命令显示设备类型配置信息的示例中使用 SCSI 控制器 c0c1 以及与其连接的设备。


注 –

如果 cfgadm 命令不支持 SCSI 设备,则该设备不会显示在 cfgadm 命令输出中。


  1. 成为超级用户。

  2. 显示有关系统上的附加点的信息。


    # cfgadm -l
    
    Ap_Id                Type         Receptacle   Occupant     Condition
    
    c0                   scsi-bus     connected    configured   unknown
    
    c1                   scsi-bus     connected    configured   unknown

    在本示例中,c0c1 表示两个 SCSI 控制器。

  3. 显示有关系统的 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 设备(如磁盘和磁带)的信息。


Procedure如何取消配置 SCSI 控制器

以下过程在取消配置 SCSI 控制器的示例中使用 SCSI 控制器 c1

  1. 成为超级用户。

  2. 取消配置 SCSI 控制器。


    # cfgadm -c unconfigure c1
    
  3. 验证是否已取消配置 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

    请注意,c1Occupant 列指定 unconfigured,表明 SCSI 总线没有已配置的插卡。

    如果取消配置操作失败,请参见如何解析失败的 SCSI 取消配置操作

Procedure如何配置 SCSI 控制器

以下过程在配置 SCSI 控制器的示例中使用 SCSI 控制器 c1

  1. 成为超级用户。

  2. 配置 SCSI 控制器。


    # cfgadm -c configure c1
    
  3. 验证 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 总线上的所有设备。现在,所有设备都已配置回系统中。

Procedure如何配置 SCSI 设备

以下过程在配置 SCSI 设备的示例中使用 SCSI 磁盘 c1t4d0

  1. 成为超级用户。

  2. 确定要配置的设备。


    # 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
  3. 配置 SCSI 设备。


    # cfgadm -c configure c1::dsk/c1t4d0
    
  4. 验证 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

Procedure如何断开 SCSI 控制器连接


注意 – 注意 –

断开 SCSI 设备连接时必须非常谨慎,特别是在处理包含关键文件系统(如根 (/)、usrvarswap 分区)的控制器任务时。动态重新配置软件无法检测到系统挂起可能导致的所有情况。使用此过程时应谨慎。


以下过程在断开 SCSI 设备连接的示例中使用 SCSI 控制器 c1

  1. 成为超级用户。

  2. 验证断开设备连接之前是否已连接该设备。


    # 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
  3. 断开 SCSI 控制器的连接。


    # cfgadm -c disconnect c1
    
    WARNING: Disconnecting critical partitions may cause system hang.
    
    Continue (yes/no)? y
    

    注意 – 注意 –

    此命令可以暂停 SCSI 总线上的所有 I/O 活动,直到使用 cfgadm -c connect 命令为止。cfgadm 命令可执行一些基本检查,以防止断开关键分区的连接,但不能检测到所有情况。如果此命令使用不当,则可能会导致系统挂起并且可能需要重新引导系统。


  4. 验证 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

    控制器及其连接的所有设备都将与系统断开连接。

ProcedureSPARC: 如何连接 SCSI 控制器

以下过程在连接 SCSI 控制器的示例中使用 SCSI 控制器 c1

  1. 成为超级用户。

  2. 验证连接设备之前该设备是否已断开连接。


    # 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
  3. 连接 SCSI 控制器。


    # cfgadm -c connect c1
    
  4. 验证 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

ProcedureSPARC: 如何将 SCSI 设备添加到 SCSI 总线中

在如何将 SCSI 设备添加到 SCSI 总线的示例中使用的是 SCSI 控制器 c1


注 –

添加设备时,应指定与设备连接的 SCSI HBA(控制器)的 Ap_Id,而不是设备本身的 Ap_Id


  1. 成为超级用户。

  2. 确定当前的 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
  3. 将 SCSI 设备添加到 SCSI 总线。

    1. 键入以下 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
    2. Continue (yes/no)? 提示符下键入 y 以继续操作。


      Continue (yes/no)? y
      
      SCSI bus quiesced successfully.
      
      It is now safe to proceed with hotplug operation.

      正在执行热插拔操作的同时,SCSI 总线上的 I/O 活动会暂停。

    3. 连接设备,然后打开设备电源。

    4. 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
      
  4. 验证是否已添加了设备。


    # 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 中。

ProcedureSPARC: 如何更换 SCSI 控制器上的相同设备

以下过程在 SCSI 控制器上更换相同设备的示例中使用 SCSI 磁盘 c1t4d0

  1. 成为超级用户。

  2. 确定当前的 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
  3. 将 SCSI 总线上的设备更换为同一类型的其他设备。

    1. 键入以下 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
    2. Continue (yes/no)? 提示符下键入 y 以继续操作。

      正在执行热插拔操作的同时,SCSI 总线上的 I/O 活动会暂停。


      Continue (yes/no)? y
      
      SCSI bus quiesced successfully.
      
      It is now safe to proceed with hotplug operation.
    3. 关闭要移除的设备的电源,然后将其移除。

    4. 添加替换设备。然后,关闭该设备的电源。

      替换设备应该与要移除的设备类型相同并且具有同一地址(目标和 LUN)。

    5. 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
      
  4. 验证是否已更换了设备。


    # 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

ProcedureSPARC: 如何移除 SCSI 设备

以下过程在移除 SCSI 控制器上的设备示例中使用 SCSI 磁盘 c1t4d0

  1. 成为超级用户。

  2. 确定当前的 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
  3. 从系统中移除 SCSI 设备。

    1. 键入以下 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
    2. Continue (yes/no)? 提示符下键入 y 以继续操作。


      Continue (yes/no)? y
      
      SCSI bus quiesced successfully.
      
      It is now safe to proceed with hotplug operation.

      正在执行热插拔操作的同时,SCSI 总线上的 I/O 活动会暂停。

    3. 关闭要移除的设备的电源,然后将其移除。

    4. 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
      
  4. 验证是否已从系统中移除了设备。


    # 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 配置问题的错误消息和可能的解决方案。有关对 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 操作。

Procedure如何解析失败的 SCSI 取消配置操作

如果一个或多个目标设备繁忙并且 SCSI 取消配置操作失败,请使用此过程。 否则,将来对此控制器和目标设备进行动态重新配置操作会失败,并会显示 dr in progress 消息。

  1. 成为超级用户。

  2. 重新配置控制器。


    # cfgadm -c configure device-name
    

使用 cfgadm 命令执行 PCI 或 PCIe 热插拔(任务列表)

以下任务列表介绍了在系统上管理 PCI 或 PCIe 设备的任务。

任务 

说明 

参考 

显示 PCI 插槽配置信息。 

显示系统上的 PCI 可热插拔设备和插槽的状态。 

如何显示 PCI 插槽配置信息

移除 PCI 适配卡。 

取消配置该卡,断开插槽的电源,然后从系统中移除该卡。 

如何移除 PCI 适配卡

添加 PCI 适配卡。 

将适配卡插入可热插拔的插槽中,连接插槽的电源,然后配置该卡。 

如何添加 PCI 适配卡

对 PCI 配置问题进行疑难解答。 

确定错误消息和可能的解决方案,以解析 PCI 配置问题。 

对 PCI 配置问题进行疑难解答

使用 cfgadm 命令执行 PCI 或 PCIe 热插拔

本节提供有关热插拔 x86 系统上的 PCI 或 PCIe 适配卡的逐步说明。

除了 cfgadm 命令以外,在热插拔操作过程中,prtconf 命令也非常有帮助。prtconf 命令可以显示与硬件有关的其他配置信息。

添加硬件后,可以使用 prtconf 命令来验证该硬件是否正确配置。例如,在配置操作后,使用 prtconf -D 命令可验证是否已向新安装的硬件设备附加了驱动程序。如果在配置硬件之前未将设备驱动程序添加到系统中,则可以使用 add_drv 命令手动添加该驱动程序。

有关更多信息,请参见 prtconf(1M)add_drv(1M)

在这些示例中,为了简便起见,仅列出了 PCI 附加点。系统上显示的附加点取决于系统配置。

PCIe LED 指示灯行为

您可能需要观察系统上的 LED 指示灯,以直观地了解有关插槽热插拔操作的状态。如果使用 PCI Express,则 LED 的行为符合 PCI Express 规范中定义的行为,否则该行为可能与平台相关。

有关具体的详细信息,请参阅平台指南。如果使用 PCI Express,则按“注意”按钮时,电源指示灯将会闪烁,表示状态转换开始。状态转换结束后,即会停止闪烁。

Procedure如何显示 PCI 插槽配置信息

此过程在 Solaris 10 6/06 发行版中已进行了更新,包括 PCIe 配置信息。

cfgadm 命令可显示系统上的 PCI 可热插拔设备和插槽的状态。有关更多信息,请参见 cfgadm(1M)

  1. 成为超级用户。

  2. 显示 PCI 配置信息。

    • 显示 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 未转换为其他状态。


Procedure如何移除 PCI 适配卡

在 Solaris 10 6/06 发行版中,以下过程已经更新,可用于移除 PCIe 适配卡。但是,无论使用 PCI 还是 PCIe,移除适配卡的过程都是相同的。

  1. 成为超级用户。

  2. 确定 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
  3. 停止用于打开设备的应用程序。

    例如,如果设备是一块以太网卡,请使用 ifconfig 命令停用相应的接口,并取消检测该接口。

  4. 按照如下方式使用 cfgadm(1M) 命令手动取消配置设备。或者,如果您有 PCIe 适配卡,也可使用自动配置方法,如按平台指南中定义的方式按插槽的“注意”按钮。


    # cfgadm -c unconfigure pcie4
    
  5. 确认是否已取消配置设备。

    例如:


    # 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

    注 –

    如果取消配置设备,则 TypeCondition 也将成为 unknown。


  6. 手动断开插槽的电源。如果使用自动配置方法,则此步骤是不必要的。有关更多信息,请参阅平台指南。


    # cfgadm -c disconnect pcie4
    
  7. 确认是否已断开设备连接。

    例如:


    # 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 
  8. 遵照平台指南中的相应说明移除 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

    注 –

    可以在引导时启用或禁用自动配置方法,具体取决于平台的实现。请针对环境设置合适的自动配置方法。


Procedure如何添加 PCI 适配卡

在 Solaris 10 6/06 发行版中,以下过程已经更新,可用于添加 PCIe 适配卡。但是,无论使用 PCI 还是 PCIe,添加适配卡的过程都是相同的。

  1. 成为超级用户。

  2. 标识可热插拔的插槽并打开锁。

    例如,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 
  3. 遵照平台指南中的相应说明将 PCI 适配卡插入插槽。

  4. 确定插入 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 
  5. 使用 cfgadm 命令手动连接插槽的电源。或者,如果您有 PCIe 适配卡,也可使用自动配置方法,如按平台指南中定义的方式按插槽的“注意”按钮。

    例如:


    # cfgadm -c connect pcie3
    
  6. 确认附加点已连接。

    例如:


    # 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
  7. 按照如下方式使用 cfgadm 命令手动配置 PCI 适配卡。如果使用自动配置方法,此步骤应该是不必要的。有关更多信息,请参阅平台指南。

    例如:


    # cfgadm -c configure pcie3
    
  8. 验证插槽中的 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
  9. 如果此设备为新设备,请配置任何支持的软件。

    例如,如果此设备是一块以太网卡,请使用 ifconfig 命令来设置接口。


    注 –

    可以在引导时启用或禁用自动配置方法,具体取决于平台的实现。请针对环境设置合适的自动配置方法。


对 PCI 配置问题进行疑难解答

错误消息

cfgadm: Configuration operation invalid: invalid transition
原因

尝试进行无效转换。

解决方案

检查是否正确发出了 cfgadm -c 命令。使用 cfgadm 命令检查当前的插座和插卡状态,并确保 Ap_Id 正确。

错误消息

cfgadm: Attachment point not found
原因

未找到指定的附加点。

解决方案

检查附加点是否正确。使用 cfgadm 命令显示可用附加点的列表。另外,请检查物理路径,以查看附加点是否仍然在正确的位置。

重新配置调整管理器 (Reconfiguration Coordination Manager, RCM) 脚本概述

重新配置调整管理器 (Reconfiguration Coordination Manager, RCM) 是用于管理动态移除系统组件的框架。通过使用 RCM,可以按顺序注册和释放系统资源。

可以使用新的 RCM 脚本功能来编写您自己的脚本,以关闭应用程序,或在动态重新配置过程中从应用程序中完全释放设备。如果重新配置请求影响通过脚本注册的资源,则 RCM 框架将自动启动脚本来响应该请求。

动态移除资源之前,还可以手动从应用程序中释放资源。或者,也可以使用带有 -f 选项的 cfgadm 命令来强制执行重新配置操作。但是,此操作可能会使应用程序处于未知状态。另外,从应用程序中手动释放资源通常还会导致错误。

RCM 脚本功能可以简化并更好地控制动态重新配置过程。通过创建 RCM 脚本,可以执行以下操作:

什么是 RCM 脚本?

RCM 脚本的功能

动态移除设备时,可以使用 RCM 脚本从应用程序中释放该设备。如果设备当前处于打开状态,则 RCM 脚本还会将其关闭。

例如,磁带备份应用程序的 RCM 脚本可以通知磁带备份应用程序关闭磁带机或磁带备份应用程序。

RCM 脚本流程的工作原理

可以按照以下方式调用 RCM 脚本:


$ script-name command [args ...]

RCM 脚本可执行以下基本步骤:

  1. 通过命令行参数获取 RCM 命令。

  2. 执行该命令。

  3. 将结果作为名称-值对写入 stdout 中。

  4. 以适当的退出状态退出。

RCM 守护进程每次只运行一个脚本实例。例如,如果某一脚本正在运行,则在该脚本退出之前,RCM 守护进程不会运行该脚本的其他实例。

RCM 脚本命令

必须在 RCM 脚本中包括以下 RCM 命令:

可以包括以下某些或所有 RCM 命令:

有关这些 RCM 命令的完整说明,请参见 rcmscript(4)

RCM 脚本处理环境

动态移除设备时,RCM 守护进程将运行以下命令:

RCM 脚本任务

以下各节介绍了应用程序开发者和系统管理员的 RCM 脚本任务。

应用程序开发者 RCM 脚本(任务列表)

以下任务列表介绍了创建 RCM 脚本的应用程序开发者的任务。

任务 

说明 

参考 

1. 确定应用程序使用的资源。 

确定应用程序使用的可能要动态移除的资源(设备名称)。 

cfgadm(1M)

2. 确定用于释放资源的命令。 

确定用于通知应用程序从应用程序中正常释放资源的命令。 

应用程序文档 

3. 确定用于资源移除后进行后续处理的命令。 

包括用于通知应用程序资源移除的命令。 

rcmscript(4)

4. 确定资源移除失败时使用的命令。 

包括用于通知应用程序可用资源的命令。  

rcmscript(4)

5. 编写 RCM 脚本。 

根据任务 1-4 中标识的信息,编写 RCM 脚本。 

磁带备份 RCM 脚本示例

6. 安装 RCM 脚本。 

将脚本添加到相应的脚本目录中。 

如何安装 RCM 脚本

7. 测试 RCM 脚本 

通过手动运行脚本命令和启动动态重新配置操作来测试脚本。 

如何测试 RCM 脚本

系统管理员 RCM 脚本(任务列表)

以下任务列表介绍了创建 RCM 脚本进行站点自定义的系统管理员的任务。

任务 

说明 

参考 

1. 确定要动态删除的资源。 

使用 cfgadm -l 命令确定可能要删除的资源(设备名称)。

cfgadm(1M)

2. 确定要停止的应用程序。 

确定用于正常停止应用程序的命令。 

应用程序文档 

3. 确定用于在删除资源前后进行各种处理的命令。 

确定删除资源前后要执行的操作。 

rcmscript(4)

4. 编写 RCM 脚本。 

根据任务 1-3 中标识的信息,编写 RCM 脚本。 

磁带备份 RCM 脚本示例

5. 安装 RCM 脚本。 

将脚本添加到相应的脚本目录中。 

如何安装 RCM 脚本

6. 测试 RCM 脚本。 

通过手动运行脚本命令和启动动态重新配置操作来测试脚本。 

如何测试 RCM 脚本

命名 RCM 脚本

必须按以下形式命名脚本,vendor,service,其中:

vendor

提供脚本的供应商的股票代号,或标识供应商的任何独特名称。

service

脚本表示的服务名称。

安装或删除 RCM 脚本

必须是超级用户 (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

任何硬件的脚本 

Procedure如何安装 RCM 脚本

  1. 成为超级用户。

  2. 将脚本复制到相应目录。

    请参见表 6–1

    例如:


    # cp SUNW,sample.pl /usr/lib/rcm/scripts
    
  3. 将脚本的用户 ID 和组 ID 更改为所需的值。


    # chown user:group /usr/lib/rcm/scripts/SUNW,sample.pl
    
  4. SIGHUP 发送到 RCM 守护进程。


    # pkill -HUP -x -u root rcm_daemon
    

Procedure如何删除 RCM 脚本

  1. 成为超级用户。

  2. 从 RCM 脚本目录中删除脚本。

    例如:


    # rm /usr/lib/rcm/scripts/SUNW,sample.pl
    
  3. SIGHUP 发送到 RCM 守护进程。


    # pkill -HUP -x -u root rcm_daemon
    

Procedure如何测试 RCM 脚本

  1. 运行脚本之前,在命令行 shell 中设置环境变量,如 RCM_ENV_FORCE

    例如,在 Korn shell 中,请使用以下命令:


    $ export RCM_ENV_FORCE=TRUE
    
  2. 通过从命令行手动运行脚本命令来测试脚本。

    例如:


    $ script-name scriptinfo
    
    $ script-name register
    
    $ script-name preremove resource-name
    
    $ script-name postremove resource-name
    
  3. 确保脚本中的每个 RCM 脚本命令都会列显 stdout 的相应输出。

  4. 在相应的脚本目录中安装脚本。

    有关更多信息,请参见如何安装 RCM 脚本

  5. 通过启动动态删除操作来测试脚本。

    例如,假定脚本注册了设备 /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 脚本可执行以下步骤:

  1. 设置 RCM 命令的分发表。

  2. 调用与指定的 RCM 命令对应的分发例程,并对于未实现的 RCM 命令以状态 2 退出。

  3. 设置 scriptinfo 部分。


    rcm_script_func_info=Tape backup appl script for DR
  4. 通过在 stdout 中列显所有磁带机设备名称,在系统中注册所有磁带机。


    rcm_resource_name=/dev/rmt/$f

    如果出现错误,则该脚本将在 stdout 中列显错误信息。


    rcm_failure_reason=$errmsg
  5. 为磁带设备设置资源信息。


    rcm_resource_usage_info=Backup Tape Unit Number $unit
  6. 通过检查备份应用程序是否使用该设备,设置 preremove 信息。如果备份应用程序未使用该设备,则动态重新配置操作将继续进行。如果备份应用程序使用该设备,则该脚本将检查 RCM_ENV_FORCE。如果将 RCM_ENV_FORCE 设置为 FALSE,则该脚本将拒绝动态重新配置操作,并列显以下消息:


    rcm_failure_reason=tape backup in progress pid=...

    如果将 RCM_ENV_FORCE 设置为 TRUE,则将停止备份应用程序,重新配置操作则继续进行。

磁带备份重新配置方案的结果

以下是使用 cfgadm 命令移除不包含 RCM 脚本的磁带设备时的各种结果。

以下是使用 cfgadm 命令移除包含 RCM 脚本的磁带设备时的各种结果。

示例-磁带备份 RCM 脚本


#! /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);

            }

    }