DiskSuite を使用すればルート (/)、swap、/usr をミラー化できるため、ハードウェアのエラーやオペレータのミスによって、システムのブート時に特殊な障害が発生することがあります。この節で説明する作業は、このような潜在的な障害に対する解決法です。
これらの障害と適切な解決法について表 7-1 に示します。
表 7-1 DiskSuite の一般的なブート障害
システムがブートしない理由 |
参照先 |
---|---|
/etc/vfstab ファイルの情報に誤りがある。 | |
状態データベースの複製が不足している。 | |
ブートデバイス (ディスク) が故障した。 | |
ブートミラーが故障した。 |
エラーにより、メタデバイスドライバがメタデバイスをオフラインにした場合は、障害の発生したディスク上のファイルシステムをすべてマウント解除します。各ディスクスライスは独立しているため、1 つのディスクに複数のファイルシステムがマウントされていることがあります。メタディスクドライバに障害が発生した場合は、同じディスク上の他のスライスにも、まもなく障害が発生する可能性があります。ディスクスライスに直接マウントされたファイルシステムには、メタディスクドライバのエラー処理という保護機能がないため、このようなファイルシステムをマウントしたままで放置すると、システムのクラッシュによってデータを失う危険性があります。
サブミラーを無効にしたりオフラインにした状態で実行する時間を最小限に抑えます。再同期やオンラインバックアップの処理中、ミラー化による保護は不完全になります。
たとえば、ルート (/) をミラー化するときなど、/etc/vfstab ファイル内に誤ったエントリを作成した場合、システムは、最初は適切にブーティングしているように見えても、障害が発生します。このような場合、シングルユーザーモードで /etc/vfstab を編集する必要があります。
不適切な /etc/vfstab ファイルのエントリから回復するための手順を次に示します。
システムをシングルユーザーモードにブートする
ミラーメタデバイス上で fsck(1M) を実行する
ファイルシステムを読み書きモードで再マウントする
オプション : ルート (/) ミラー用の metaroot(1M) コマンドを実行する
/etc/vfstab ファイルがファイルシステムに記述されているメタデバイスを正しく参照することを確認する
リブートする
次の例では、ルート (/) は 2 面のミラー d0 でミラー化されます。/etc/vfstab 内のルート (/) エントリは、どういうわけかファイルシステムの元のスライスに戻りました。しかし、/etc/system 内の情報は、まだミラー d0 からのブートを示しています。通常考えられる理由としては、/etc/system と /etc/vfstab の保守に metaroot(1M) コマンドが使用されなかったか、または /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 - fd - /dev/fd fd - no - swap - /tmp tmpfs - yes - |
エラーのため、マシンがブートされると自動的にシングルユーザーモードとなります。
ok boot ... SunOS Release 5.5 Version Generic [UNIX(R) System V Release 4.0] Copyright (c) 1983-1995, Sun Microsystems, Inc. configuring network interfaces: le0. Hostname: antero 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): <パスワードを入力> |
この時点で、ルート (/) と /usr は読み取り専用でマウントされます。次の手順に従ってください。
ルート (/) ミラー上で fsck(1M) を実行する。
ルートには正しいメタデバイスを使用するよう注意してください。
# 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(1M) コマンドを実行する。
# metaroot d0 |
これは /etc/system と /etc/vfstab のファイルを編集して、ルート (/) ファイルシステムが現在メタデバイス d0 上にあることを指定します。
/etc/vfstab ファイルに正しいメタデバイスエントリが収められていることを確認する。
/etc/vfstab ファイル内のルート (/) エントリが次のようになっていると、ファイルシステムがミラーを正しく参照します。
#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 - fd - /dev/fd fd - no - swap - /tmp tmpfs - yes - |
リブートする。
システムは通常の動作に復帰します。
たとえば、ドライブの障害など、何らかの理由によって状態データベースの複製が規定数に満たない場合、システムはリブートできません。DiskSuite の用語では、これを状態データベースが「無効」になったと表現します。ここでは、その回復方法について説明します。
この作業の手順を次に示します。
無効な状態データベースの複製を削除してリブートする
故障したディスクを修復する
状態データベースの複製を追加して戻す
次の例では、2 つの複製を含むディスクが不良となりました。システムには正常な複製が 2 つしか残されておらず、システムはリブートできません。
マシンをブートして、どの状態データベースの複製が障害を受けているのかを判定する。
ok boot ... Hostname: demo metainit: demo: stale databases Insufficient metadevice database replicas located. Use metadb to delete databases which are broken. Ignore any "Read-only file system" error messages. Reboot the system when finished to reload the metadevice database. After reboot, repair any broken database replicas which were deleted. Type Ctrl-d to proceed with normal startup, (or give root password for system maintenance): <パスワードを入力> Entering System Maintenance Mode SunOS Release 5.5 Version Generic [UNIX(R) System V Release 4.0] |
metadb(1M) コマンドを使用してメタデバイスの状態データベースを調べ、状態データベースの複製のうち、使用できないものを判定する。
# metadb -i flags first blk block count a m p lu 16 1034 /dev/dsk/c0t3d0s3 a p l 1050 1034 /dev/dsk/c0t3d0s3 M p unknown unknown /dev/dsk/c1t2d0s3 M p unknown unknown /dev/dsk/c1t2d0s3 ... |
システムは、障害の発生したディスクに含まれるスライス /dev/dsk/c1t2d0s3 上では、もう状態データベースの複製を検出できません。metadb コマンドは、このスライス上の複製に対して、マスターブロックに障害があるというフラグを立てます。
-d オプション付きの metadb(1M) コマンドを使用して、不良ディスク上の状態データベースの複製を削除する。
この時点では、ルート (/) ファイルシステムは読み取り専用である。mddb.cf のエラーメッセージは無視できる。
# metadb -d -f c1t2d0s3 metadb: demo: /etc/lvm/mddb.cf.new: Read-only file system |
複製が削除されたことを確認する。
# metadb -i flags first blk block count a m p lu 16 1034 /dev/dsk/c0t3d0s3 a p l 1050 1034 /dev/dsk/c0t3d0s3 |
リブートする。
交換用のディスクを用意できたらシステムを停止し、故障したディスクを交換し、もう一度システムをリブートする。format(1M) コマンドまたは fmthard(1M) コマンドを使用して、ディスクを故障の前と同じようにパーティション分割する。
# halt ... ok boot ... # format /dev/rdsk/c1t2d0s0 ... |
metadb(1M) コマンドを使用して、状態データベースの複製を追加して戻し、状態データベースの複製が正常であることを確認する。
# metadb -a -c 2 c1t2d0s3 # metadb flags first blk block count a m p luo 16 1034 dev/dsk/c0t3d0s3 a p luo 1050 1034 dev/dsk/c0t3d0s3 a u 16 1034 dev/dsk/c1t2d0s3 a u 1050 1034 dev/dsk/c1t2d0s3 |
-c 2 オプション付きの metadb コマンドは、同じスライスに状態データベースの複製を 2 つ追加します。
ルート (/) ミラーがあり、ブートデバイスが故障した場合、代わりのブートデバイスを設定する必要があります。
この作業での手順を次に示します。
代替ルート (/) サブミラーからのブート
エラーの発生した状態データベースの複製とメタデバイスの判定
故障ディスクの修復
メタデバイスの状態データベースとメタデバイスを元の状態に復元
次の例では、6 つの状態データベースの複製のうち 2 つと、ルート (/)、swap、/usr の各サブミラーを含んだブートデバイスに障害が発生しました。
まず、ブートデバイスに障害が発生すると、次のようなメッセージが表示されます。このメッセージは、アーキテクチャによって異なります。
Rebooting with command: Boot device: /iommu/sbus/dma@f,81000/esp@f,80000/sd@3,0 File and args: kadb kadb: kernel/unix The selected SCSI device is not responding Can't open boot device ... |
このメッセージが表示されたら、デバイスをメモしてから、次の手順に従います。
他のルート (/) サブミラーからブートする。
この例では、6 つの状態データベースの複製のうち、エラーであるのは 2 つだけなので、まだブートが可能です。そうでない場合、シングルユーザーモードで無効な状態データベースの複製を削除する必要があります。この作業については、「状態データベースの複製の不足からの回復方法 (コマンド行)」を参照してください。
ルート (/) ファイルシステム用のミラーを作成する場合、その作業の一部として、代替ブートデバイスを記録する必要があります。この例では、disk2 がその代替ブートデバイスです。
ok boot disk2 ... SunOS Release 5.5 Version Generic [UNIX(R) System V Release 4.0] Copyright (c) 1983-1995, Sun Microsystems, Inc. Hostname: demo ... demo console login: root Password: <パスワードを入力> Last login: Wed Dec 16 13:15:42 on console SunOS Release 5.1 Version Generic [UNIX(R) System V Release 4.0] ... |
metadb(1M) コマンドを使用して、2 つの状態データベースの複製が障害を受けていることを確認する。
# 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(1M) コマンドを使用して、ルート (/)、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 ... 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 は、次のサブミラーに保守が必要なことを示します。
サブミラー d10、デバイス c0t3d0s0
サブミラー d11、デバイス c0t3d0s1
サブミラー d12、デバイス c0t3d0s6
システムを停止し、ディスクを修復し、format(1M) コマンドまたは fmthard(1M) コマンドを使用して、ディスクを障害を受ける前と同じようにパーティション分割する。
# halt ... Halted ... ok boot ... # format /dev/rdsk/c0t3d0s0 |
リブートする。
なお、ルート (/) ミラーの残った片方からリブートしなければなりません。ミラーを作成する際に、代替ブートデバイスを記録しておいてください。
# halt ... ok boot disk2 |
metadb(1M) コマンドを使用し、故障した状態データベースの複製を削除してから、追加して戻す。
# 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(1M) コマンドを使用して、サブミラーを再び有効にする。
# 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 |
しばらくすると、再同期が終了します。これで元のデバイスからブートできるようになります。
ルート (/) をミラー化するとき、後で一次デバイスが障害を受けた場合に、代替ブートデバイスへのパスが必要になることがあります。
この例では、ルート (/) ミラーに 2 番目のサブミラーとして接続されているスライス上で ls -l コマンドを使用することによって、代替ブートデバイスへのパスを調べます。
# ls -l /dev/rdsk/c1t3d0s0 lrwxrwxrwx 1 root root 55 Mar 5 12:54 /dev/rdsk/c1t3d0s0 -> ../. ./devices/sbus@1,f8000000/esp@1,200000/sd@3,0:a |
ここでは、/devices ディレクトリに続く文字列を記録します。 /sbus@1,f8000000/esp@1,200000/sd@3,0:a
一部の新しい Sun ハードウェアでは、/devices ディレクトリ名を sd@ から disk@ に変更する必要があります。
OpenBoot PROM 付きのシステムを使用している DiskSuite ユーザーは、OpenBoot の nvalias コマンドを使用して、二次ルートミラー用の「バックアップルート」デバイス別名を定義できます。たとえば、
ok nvalias backup_root /sbus@1,f8000000/esp@1,200000/sd@3,0:a |
一次ルートディスクに障害が発生した場合、次のように入力します。
ok boot backup_root |
この例では、ルート (/) ミラーに 2 番目のサブミラーとして接続されているスライス上で ls -l コマンドを使用することによって、代替ブートデバイスへのパスを調べます。
# ls -l /dev/rdsk/c1t0d0s0 lrwxrwxrwx 1 root root 55 Mar 5 12:54 /dev/rdsk/c1t0d0s0 -> ../. ./devices/eisa/eha@1000,0/cmdk@1,0:a |
ここでは、/devices ディレクトリに続く文字列を記録します。 /eisa/eha@1000,0/cmdk@1,0:a
代替ブートデバイスから SPARC システムをブートするには、次のように入力します。
# boot <代替ブートデバイス> |
代替ブートデバイスの確認方法については、「代替ブートデバイスへのパスを記録する方法 (コマンド行)」を参照してください。
この作業は、代替ブートデバイスから x86 システムをブートするために使用します。
マルチデバイスブート (MDB) フロッピーディスクからシステムをブートする。
しばらくすると、次のような画面が表示されます。
Solaris/x86 Multiple Device Boot Menu Code Device Vendor Model/Desc Rev ============================================================ 10 DISK COMPAQ C2244 0BC4 11 DISK SEAGATE ST11200N SUN1.05 8808 12 DISK MAXTOR LXT-213S SUN0207 4.24 13 CD SONY CD-ROM CDU-8812 3.0a 14 NET SMC/WD I/O=300 IRQ=5 80 DISK First IDE drive (Drive C:) 81 DISK Second IDE drive (Drive D:) Enter the boot device code: |
画面に表示された選択項目の中から、代替ディスクのコードを入力する。
次の画面が表示されます。
Solaris 2.4 for x86 Secondary Boot Subsystem,vsn 2.11 <<<Current Boot Parameters>>> Boot path:/eisa/eha@1000,0/cmdk@0,0:a Boot args:/kernel/unix Type b[file-name] [boot-flags] <ENTER> to boot with options or i<ENTER> to enter boot interpreter or <ENTER> to boot with defaults <<<timeout in 5 seconds>>> |
i を入力してインタプリタを選択する。
次のコマンドを入力する。
>setprop boot-path /eisa/eha@1000,0/cmdk@1,0:a >^D |
Control-D を入力して、インタプリタを終了します。