由于 Solaris Volume Manager 允许您镜像根 (/)、swap 和 /usr 目录,因此在引导系统时可能会出现特殊问题。硬件故障或操作员错误都有可能引起这些问题。本节中的过程提供了针对类似潜在问题的解决方案。
下表描述了这些问题并介绍了相应的解决方案。
表 25–1 Solaris Volume Manager 的常见引导问题
出现引导问题的原因 |
参考 |
---|---|
/etc/vfstab 文件中包含错误的信息。 | |
未定义足够的状态数据库副本。 | |
引导设备(磁盘)出现故障。 |
如果 Solaris Volume Manager 由于错误而使卷脱机,请取消挂载出现故障的磁盘上的所有文件系统。
由于磁盘上的每个片都是相互独立的,因此可以在一个磁盘上挂载多个文件系统。如果软件遇到了故障,则同一个磁盘上的其他片将有可能很快遇到故障。直接在磁盘片上挂载的文件系统不具有 Solaris Volume Manager 错误处理保护功能。如果使这样的文件系统保持挂载,则很可能会出现系统崩溃和数据丢失的情况。
请尽可能缩短使用已禁用或处于脱机状态的子镜像运行的时间。在重新同步过程中和联机备份间隔期间,镜像将失去所有的保护。
如果在 /etc/vfstab 文件中创建了一个错误的项(例如,在镜像根 (/) 文件系统时),系统最初看起来在正确引导,但随后会失败。要解决此问题,需要在单用户模式下编辑 /etc/vfstab 文件。
下面是从 /etc/vfstab 文件中错误的项进行恢复所需的概括性步骤:
在单用户模式下引导系统
针对镜像卷运行 fsck 命令
重新挂载文件系统并启用读写选项
可选:针对根 (/) 镜像运行 metaroot 命令
验证 /etc/vfstab 文件是否能够正确地引用与该文件系统项相对应的卷
重新引导系统
在以下示例中,根 (/) 文件系统是用双向镜像 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 文件系统都以只读方式挂载。请按照以下步骤操作:
针对根 (/) 镜像运行 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) |
重新以读/写方式挂载根 (/) 文件系统,以便您可以编辑 /etc/vfstab 文件。
# mount -o rw,remount /dev/md/dsk/d0 / mount: warning: cannot lock temp file </etc/.mnt.lock> |
运行 metaroot 命令。
# metaroot d0 |
此命令会编辑 /etc/system 和 /etc/vfstab 文件,以便指定根 (/) 文件系统现在位于 d0 卷上。
验证 /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 - |
重新引导系统。
系统将恢复到正常的运行状态。
如果您有一个根 (/) 镜像,那么,当引导设备出现故障时,您需要设置备用引导设备。
以下是此任务的概括性步骤:
从备用根 (/) 子镜像中引导
确定出现错误的状态数据库副本和卷
修理出现故障的磁盘
将状态数据库副本和卷恢复到其原始状态
最初,当引导设备出现故障时,您将看到一条与以下示例类似的消息。该消息可能会因体系结构而异。
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 ... |
在看到此消息时,请记下该设备。然后按照以下步骤操作:
从另一个根 (/) 子镜像引导。
此示例中共有六个状态数据库副本,由于只有两个副本出现错误,因此仍可以引导系统。如果不是这种情况,则需要在单用户模式下删除不可访问的状态数据库副本。此过程在如何从状态数据库副本不足中恢复中介绍。
在为根 (/) 文件系统创建镜像时,应在执行过程时记录备用根设备。在此示例中,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 ... |
使用 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 片上检测状态数据库副本,该片位于出现故障的磁盘上。
使用 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
停止系统,然后替换磁盘。使用 format 命令或 fmthard 命令按照磁盘在出现故障之前的状态对磁盘进行分区。
如果新磁盘与现有的磁盘相同(在此示例中为镜像中保持不变的一面),请快速格式化新磁盘。为此,请使用 prtvtoc /dev/rdsk/c0t2d0s2 | fmthard -s - /dev/rdsk/c0t3d0s2 命令(在此示例中为 c0t3d0)。
# halt ... Halted ... ok boot ... # format /dev/rdsk/c0t3d0s0 |
重新引导系统。
请注意,必须从根 (/) 镜像的另一半重新引导。在创建镜像时,应当已经记录了备用根设备。
# halt ... ok boot disk2 |
要删除失败的状态数据库副本并重新添加它们,请使用 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 |
# 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 |
在一段时间之后,重新同步将完成。现在可以返回到从原始设备引导。