Solaris Volume Manager 管理指南

从引导问题中恢复

由于 Solaris Volume Manager 允许您镜像根 (/)、swap/usr 目录,因此在引导系统时可能会出现特殊问题。硬件故障或操作员错误都有可能引起这些问题。本节中的过程提供了针对类似潜在问题的解决方案。

下表描述了这些问题并介绍了相应的解决方案。

表 25–1 Solaris Volume Manager 的常见引导问题

出现引导问题的原因 

参考 

/etc/vfstab 文件中包含错误的信息。

如何从错误的 /etc/vfstab 项中恢复

未定义足够的状态数据库副本。 

如何从状态数据库副本不足中恢复

引导设备(磁盘)出现故障。 

如何从引导设备故障中恢复

有关引导问题的背景信息

如何从错误的 /etc/vfstab 项中恢复

如果在 /etc/vfstab 文件中创建了一个错误的项(例如,在镜像根 (/) 文件系统时),系统最初看起来在正确引导,但随后会失败。要解决此问题,需要在单用户模式下编辑 /etc/vfstab 文件。

下面是从 /etc/vfstab 文件中错误的项进行恢复所需的概括性步骤:

  1. 在单用户模式下引导系统

  2. 针对镜像卷运行 fsck 命令

  3. 重新挂载文件系统并启用读写选项

  4. 可选:针对根 (/) 镜像运行 metaroot 命令

  5. 验证 /etc/vfstab 文件是否能够正确地引用与该文件系统项相对应的卷

  6. 重新引导系统

Procedure从根 (/) RAID-1(镜像)卷中恢复

在以下示例中,根 (/) 文件系统是用双向镜像 d0 镜像的。/etc/vfstab 文件中的根 (/) 项由于某种原因而恢复到文件系统的原始片。但是,/etc/system 文件中的信息仍显示为从镜像 d0 引导。最有可能的原因就是,没有使用 metaroot 命令来维护 /etc/system/etc/vfstab 文件。另一个可能的原因就是,将 /etc/vfstab 文件的旧副本又重新复制到当前的 /etc/vfstab 文件中。

错误的 /etc/vfstab 文件与以下信息类似:


#device        device          mount          FS      fsck   mount    mount

#to mount      to fsck         point          type    pass   at boot  options

#

/dev/dsk/c0t3d0s0 /dev/rdsk/c0t3d0s0  /       ufs      1     no       -

/dev/dsk/c0t3d0s1 -                   -       swap     -     no       -

/dev/dsk/c0t3d0s6 /dev/rdsk/c0t3d0s6  /usr    ufs      2     no       -

#

/proc             -                  /proc    proc     -     no       -

swap              -                  /tmp     tmpfs    -     yes      -

由于出现错误,您将在系统引导时自动进入单用户模式:


ok boot

...

configuring network interfaces: hme0.

Hostname: host1

mount: /dev/dsk/c0t3d0s0 is not this fstype.

setmnt: Cannot open /etc/mnttab for writing



INIT: Cannot create /var/adm/utmp or /var/adm/utmpx



INIT: failed write of utmpx entry:"  "



INIT: failed write of utmpx entry:"  "



INIT: SINGLE USER MODE



Type Ctrl-d to proceed with normal startup,

(or give root password for system maintenance): <root-password>

此时,根 (/) 和 /usr 文件系统都以只读方式挂载。请按照以下步骤操作:

  1. 针对根 (/) 镜像运行 fsck 命令。


    注 –

    注意使用根 (/) 镜像的正确的卷。



    # fsck /dev/md/rdsk/d0
    
    ** /dev/md/rdsk/d0
    
    ** Currently Mounted on /
    
    ** Phase 1 - Check Blocks and Sizes
    
    ** Phase 2 - Check Pathnames
    
    ** Phase 3 - Check Connectivity
    
    ** Phase 4 - Check Reference Counts
    
    ** Phase 5 - Check Cyl groups
    
    2274 files, 11815 used, 10302 free (158 frags, 1268 blocks,
    
    0.7% fragmentation)
  2. 重新以读/写方式挂载根 (/) 文件系统,以便您可以编辑 /etc/vfstab 文件。


    # mount -o rw,remount /dev/md/dsk/d0 /
    
    mount: warning: cannot lock temp file </etc/.mnt.lock>
  3. 运行 metaroot 命令。


    # metaroot d0
    

    此命令会编辑 /etc/system/etc/vfstab 文件,以便指定根 (/) 文件系统现在位于 d0 卷上。

  4. 验证 /etc/vfstab 文件是否包含正确的卷项。

    /etc/vfstab 文件中的根 (/) 项应如下所示,从而使文件系统的项可以正确地引用 RAID-1 卷:

    #device           device              mount    FS      fsck   mount   mount
    
    #to mount         to fsck             point    type    pass   at boot options
    
    #
    
    /dev/md/dsk/d0    /dev/md/rdsk/d0     /        ufs     1      no      -
    
    /dev/dsk/c0t3d0s1 -                   -        swap    -      no      -
    
    /dev/dsk/c0t3d0s6 /dev/rdsk/c0t3d0s6  /usr     ufs     2      no      -
    
    #
    
    /proc             -                  /proc     proc    -      no      -
    
    swap              -                  /tmp      tmpfs   -      yes     -
  5. 重新引导系统。

    系统将恢复到正常的运行状态。

Procedure如何从引导设备故障中恢复

如果您有一个根 (/) 镜像,那么,当引导设备出现故障时,您需要设置备用引导设备。

以下是此任务的概括性步骤:

最初,当引导设备出现故障时,您将看到一条与以下示例类似的消息。该消息可能会因体系结构而异。


Rebooting with command:

Boot device: /iommu/sbus/dma@f,81000/esp@f,80000/sd@3,0   

The selected SCSI device is not responding

Can't open boot device

...

在看到此消息时,请记下该设备。然后按照以下步骤操作:

  1. 从另一个根 (/) 子镜像引导。

    此示例中共有六个状态数据库副本,由于只有两个副本出现错误,因此仍可以引导系统。如果不是这种情况,则需要在单用户模式下删除不可访问的状态数据库副本。此过程在如何从状态数据库副本不足中恢复中介绍。

    在为根 (/) 文件系统创建镜像时,应在执行过程时记录备用根设备。在此示例中,disk2 是需要记录的备用根设备。


    ok boot disk2
    
    SunOS Release 5.9 Version s81_51 64-bit
    
    Copyright 1983-2001 Sun Microsystems, Inc.  All rights reserved.
    
    Hostname: demo
    
    ...
    
    demo console login: root
    
    Password: <root-password>
    
    Dec 16 12:22:09 host1 login: ROOT LOGIN /dev/console
    
    Last login: Wed Dec 12 10:55:16 on console
    
    Sun Microsystems Inc.   SunOS 5.9       s81_51  May 2002
    
    ...
  2. 使用 metadb 命令来确定有多少个状态数据库副本失败。


    # metadb
    
           flags         first blk    block count
    
        M     p          unknown      unknown      /dev/dsk/c0t3d0s3
    
        M     p          unknown      unknown      /dev/dsk/c0t3d0s3
    
        a m  p  luo      16           1034         /dev/dsk/c0t2d0s3
    
        a    p  luo      1050         1034         /dev/dsk/c0t2d0s3
    
        a    p  luo      16           1034         /dev/dsk/c0t1d0s3
    
        a    p  luo      1050         1034         /dev/dsk/c0t1d0s3

    在此示例中,系统无法再在 /dev/dsk/c0t3d0s3 片上检测状态数据库副本,该片位于出现故障的磁盘上。

  3. 使用 metastat 命令确定根 (/)、swap/usr 镜像的一半是否已失败。


    # metastat
    
    d0: Mirror
    
        Submirror 0: d10
    
          State: Needs maintenance
    
        Submirror 1: d20
    
          State: Okay
    
    ...
    
     
    
    d10: Submirror of d0
    
        State: Needs maintenance
    
        Invoke: "metareplace d0 /dev/dsk/c0t3d0s0 <new device>"
    
        Size: 47628 blocks
    
        Stripe 0:
    
    	Device              Start Block  Dbase State        Hot Spare
    
    	/dev/dsk/c0t3d0s0          0     No    Maintenance 
    
     
    
    d20: Submirror of d0
    
        State: Okay
    
        Size: 47628 blocks
    
        Stripe 0:
    
    	Device              Start Block  Dbase State        Hot Spare
    
    	/dev/dsk/c0t2d0s0          0     No    Okay  
    
     
    
    d1: Mirror
    
        Submirror 0: d11
    
          State: Needs maintenance
    
        Submirror 1: d21
    
          State: Okay
    
    ...
    
     
    
    d11: Submirror of d1
    
        State: Needs maintenance
    
        Invoke: "metareplace d1 /dev/dsk/c0t3d0s1 <new device>"
    
        Size: 69660 blocks
    
        Stripe 0:
    
    	Device              Start Block  Dbase State        Hot Spare
    
    	/dev/dsk/c0t3d0s1          0     No    Maintenance 
    
     
    
    d21: Submirror of d1
    
        State: Okay
    
        Size: 69660 blocks
    
        Stripe 0:
    
    	Device              Start Block  Dbase State        Hot Spare
    
    	/dev/dsk/c0t2d0s1          0     No    Okay        
    
     
    
    d2: Mirror
    
        Submirror 0: d12
    
          State: Needs maintenance
    
        Submirror 1: d22
    
          State: Okay
    
    ...
    
     
    
    d12: Submirror of d2
    
        State: Needs maintenance
    
        Invoke: "metareplace d2 /dev/dsk/c0t3d0s6 <new device>"
    
        Size: 286740 blocks
    
        Stripe 0:
    
    	Device              Start Block  Dbase State        Hot Spare
    
    	/dev/dsk/c0t3d0s6          0     No    Maintenance 
    
     
    
     
    
    d22: Submirror of d2
    
        State: Okay
    
        Size: 286740 blocks
    
        Stripe 0:
    
    	Device              Start Block  Dbase State        Hot Spare
    
    	/dev/dsk/c0t2d0s6          0     No    Okay  

    在此示例中,metastat 命令显示以下子镜像需要维护:

    • 位于设备 c0t3d0s0 上的子镜像 d10

    • 位于设备 c0t3d0s1 上的子镜像 d11

    • 位于设备 c0t3d0s6 上的子镜像 d12

  4. 停止系统,然后替换磁盘。使用 format 命令或 fmthard 命令按照磁盘在出现故障之前的状态对磁盘进行分区。


    提示 –

    如果新磁盘与现有的磁盘相同(在此示例中为镜像中保持不变的一面),请快速格式化新磁盘。为此,请使用 prtvtoc /dev/rdsk/c0t2d0s2 | fmthard -s - /dev/rdsk/c0t3d0s2 命令(在此示例中为 c0t3d0)。



    # halt
    
    ...
    
    Halted
    
    ...
    
    ok boot
    
    ...
    
    # format /dev/rdsk/c0t3d0s0
    
  5. 重新引导系统。

    请注意,必须从根 (/) 镜像的另一半重新引导。在创建镜像时,应当已经记录了备用根设备。


    # halt
    
    ...
    
    ok boot disk2
    
  6. 要删除失败的状态数据库副本并重新添加它们,请使用 metadb 命令。


    # metadb
    
           flags         first blk    block count
    
        M     p          unknown      unknown      /dev/dsk/c0t3d0s3
    
        M     p          unknown      unknown      /dev/dsk/c0t3d0s3
    
        a m  p  luo      16           1034         /dev/dsk/c0t2d0s3
    
        a    p  luo      1050         1034         /dev/dsk/c0t2d0s3
    
        a    p  luo      16           1034         /dev/dsk/c0t1d0s3
    
        a    p  luo      1050         1034         /dev/dsk/c0t1d0s3
    
    # metadb -d c0t3d0s3
    
    # metadb -c 2 -a c0t3d0s3
    
    # metadb
    
           flags         first blk    block count
    
         a m  p  luo     16           1034         /dev/dsk/c0t2d0s3
    
         a    p  luo     1050         1034         /dev/dsk/c0t2d0s3
    
         a    p  luo     16           1034         /dev/dsk/c0t1d0s3
    
         a    p  luo     1050         1034         /dev/dsk/c0t1d0s3
    
         a        u      16           1034         /dev/dsk/c0t3d0s3
    
         a        u      1050         1034         /dev/dsk/c0t3d0s3
  7. 使用 metareplace 命令重新启用子镜像。


    # metareplace -e d0 c0t3d0s0
    
    Device /dev/dsk/c0t3d0s0 is enabled
    
     
    
    # metareplace -e d1 c0t3d0s1
    
    Device /dev/dsk/c0t3d0s1 is enabled
    
     
    
    # metareplace -e d2 c0t3d0s6
    
    Device /dev/dsk/c0t3d0s6 is enabled

    在一段时间之后,重新同步将完成。现在可以返回到从原始设备引导。