Solaris のシステム管理

第 31 章 ファイルシステムの完全性チェック

この章の内容は以下のとおりです。

fsck のエラーメッセージについては、第 73 章「ファイルシステムで発生する問題の解決」を参照してください。

UFS ファイルシステムは、一連の内部テーブルに依存して i ノード数、使用済みブロック数、使用可能ブロック数を追跡します。これらの内部テーブルがディスク上のデータと正しく同期していないと、整合性が失われ、ファイルシステムの修復が必要になります。

次のような原因でオペレーティングシステムが異常終了すると、ファイルシステムが損傷したり、整合性が失われたりすることがあります。

ファイルシステムの破損は重大ですが、あまり頻繁に起きるものではありません。システムをブートすると、ファイルシステムの整合性チェックが (fsck プログラムを使用して) 自動的に実行されます。ほとんどの場合は、このファイルシステムのチェックによって問題が修復されます。

この章では、fsck プログラムでチェックされ修復される問題と fsck のオプションについて説明します。また、次の作業についても説明します。

fsck エラーメッセージについては、第 73 章「ファイルシステムで発生する問題の解決」を参照してください。

fsck プログラムは、割り当て済みだが参照されないファイルとディレクトリを lost+found ディレクトリに入れます。各ファイルの i ノード番号が名前として割り当てられます。lost+found ディレクトリが存在しない場合は、fsck によって作成されます。lost+found ディレクトリ内の領域が足りない場合は、そのサイズが fsck によって拡張されます。

ファイルシステムの状態はどのように記録されるか

fsck コマンドは、スーパーブロックに格納された状態フラグを使用して、ファイルシステムの状態を記録します。また、このフラグを使用して、ファイルシステムの整合性をチェックすべきかどうかが判断されます。このフラグはブート時には /sbin/rcS スクリプトによって使用され、コマンド行からは fsck-m オプションを指定した場合に使用されます。fsck-m オプションの結果を無視するのなら、状態フラグの設定に関係なく、すべてのファイルシステムをチェックできます。

表 31-1 に状態フラグを示します。

表 31-1 状態フラグの値

状態フラグの値 

説明 

FSCLEAN

ファイルシステムが正しくマウント解除されていない場合は、状態フラグが FSCLEAN に設定される。FSCLEAN 状態フラグが設定されているファイルシステムは、システムのブート時にチェックされない。

 

FSSTABLE

ファイルシステムはマウントされている (またはされた) が、前回のチェックポイント (sync または fsflush) 以後に変更がなかった。チェックポイントは、通常は 30 秒ごとに発生する。たとえば、カーネルはファイルシステムがアイドル状態かどうかを定期的にチェックし、アイドル状態であれば、スーパーブロック内の情報をディスクにフラッシュさせて FSSTABLE マークを設定する。システムがクラッシュした場合、ファイルシステムの構造は安定しているが、少量のデータが失われる。FSSTABLE マークが付いたファイルシステムは、マウント前のチェックをスキップできる。ファイルシステムの状態が FSCLEAN でも FSSTABLE でもなければ、mount(2) システムコールではファイルシステムは読み取り/書き込み用にマウントされない。

FSACTIVE

ファイルシステムがマウントされ、後から変更されると、状態フラグが FSACTIVE に設定される。ファイルシステムには整合性のなくなったものが含まれていることがある。変更後のメタデータがディスクに書き込まれる前に、ファイルシステムに FSACTIVE マークが付けられる。ファイルシステムが正常にマウント解除されると、状態フラグは FSCLEAN に設定される。FSACTIVE フラグが設定されたファイルシステムは、整合性がないので、fsck でチェックしなければならない。

FSBAD

ルート (/) ファイルシステムが、状態が FSCLEAN でも FSSTABLE でもないときにマウントされると、状態フラグが FSBAD に設定される。カーネルは、このファイルシステムの応対を FSCLEAN または FSSTABLE に変更しない。ルート (/) のファイルシステムにブートプロセスの一部として FSBAD フラグが設定されると、読み取り専用としてマウントされる。row のルートデバイス上で fsck を実行できる。その後で、ルート (/) ファイルシステムを読み取り/書き込みとしてマウントし直す。

表 31-2 は、状態フラグが変更される場合を示しています。

表 31-2 状態フラグが変更される場合

fsck の前

fsck の後

 

 

 

 

新しい状態  

 

初期状態

エラーなし

すべてのエラーを修正済み

エラーが未修正

不明 

安定 

安定 

不明 

有効 

安定 

安定 

有効 

安定 

安定 

安定 

有効 

クリーン 

クリーン 

安定 

有効 

不良 

安定 

安定 

不良 

fsck でチェックして修復される内容

この節では、ファイルシステムの通常の処理中に発生する問題、原因、fsck で検出される問題、およびそれらの修正方法について説明します。

非整合状態が発生する原因

労働日には毎日多数のファイルが作成、変更、または削除されます。ファイルが変更されるたびに、オペレーティングシステムは一連のファイルシステムの更新処理を実行します。これらの更新処理がディスクに確実に書き込まれると、整合性のあるファイルシステムが生成されます。

ユーザープログラムが書き込みなどの、ファイルシステムを変更する処理を実行すると、書き込まれるデータはまずカーネル内部のインコアバッファにコピーされます。一般に、ディスクの更新は非同期に処理されるので、書き込みシステムコールが値を返した後にしばらくデータの書き込みが発生しなくても、ユーザープロセスは進行できます。したがって、ファイルシステムは、ディスク上にある場合と同様に、インコア情報で表されるファイルシステムの状態から常に遅延することになります。

別の目的にバッファが必要になったり、カーネルが fsflush デーモンを自動的に (30 秒間隔で) 実行すると、インコア情報を反映するようにディスク情報が更新されます。システムがインコア情報を書き込まずに停止すると、ディスク上のファイルシステムの整合性がなくなります。

ファイルシステムの整合性は、さまざまな原因で失われることがあります。最も一般的な原因は、オペレータのエラーとハードウェア障害です。

システムを正しくシャットダウンしなかったり、マウントされているファイルシステムが正しくオフラインにされないと、「クリーンでない停止」が原因で問題が発生することがあります。クリーンでない停止を防ぐには、CPU を停止したり、ディスクをドライブから物理的に取り出したり、ディスクをオフライン状態にする前に、ファイルシステムの現在の状態をディスクに書き込んだりしなければなりません (つまり、同期させなければなりません)。

また、ハードウェアの欠陥が原因で整合性が失われることもあります。ディスクドライブ上ではいつでもブロックが損傷する可能性があり、ディスクコントローラが正常に機能しなくなる可能性があります。

整合性がチェックされる UFS 構成要素

この節では、UFS ファイルシステムの構成要素、つまりスーパーブロック、シリンダグループブロック、i ノード、間接ブロック、データブロックに fsck が適用する整合性チェックの種類について説明します。

スーパーブロック

スーパーブロックには集計情報が格納されており、UFS ファイルシステム内で最も破損しがちな構成要素です。ファイルシステムの i ノードやデータブロックが変更されるたびに、スーパーブロックも変更されます。CPU が停止した場合、直前のコマンドが sync コマンドでなければ、スーパーブロックはほぼ確実に破損します。

スーパーブロックの非整合性は、次の面からチェックされます。

ファイルシステムと i ノードリストのサイズ

ファイルシステムのサイズは、スーパーブロックに使用されるブロック数と i ノードリストに使用されるブロック数よりも大きくなければなりません。i ノード数は、ファイルシステムの最大許容数よりも小さくなければなりません。ファイルシステムのサイズとレイアウト情報は、fsck にとって最も重要な情報部分です。これらのサイズを実際にチェックする方法はありませんが、ファイルシステムの作成時に静的に判断されるので、fsck はサイズが妥当な範囲内にあるかどうかをチェックできます。他のすべてのファイルシステムをチェックするには、これらのサイズが正確でなければなりません。fsck が一次スーパーブロックの静的パラメタ内で破損を検出すると、オペレータに代替スーパーブロックの位置を指定するように促します。

空きブロック数

空きブロック数は、シリンダグループのブロックマップに格納されます。fsck は、空きマーク付きのすべてのブロックがファイルに取得されていないかどうかをチェックします。すべてのブロックをチェックし終わると、fsck は空きブロック数と i ノードに取得されるブロック数の合計がファイルシステム内の合計ブロック数に等しくなるかどうかをチェックします。ブロック割り当てマップ内に間違いがあると、fsck はブロックが割り当てられている状態のままで構築し直します。

スーパーブロック内の集計情報には、ファイルシステム内の空きブロックの合計数のカウントが入っています。fsck プログラムは、このブロック数をファイルシステム内で見つかった空きブロック数と比較します。数が一致しなければ、fsck はスーパーブロック内のブロック数を実際の空きブロック数で置き換えます。

空き i ノード数

スーパーブロック内の集計情報には、ファイルシステム内の空き i ノード数が入っています。fsck プログラムは、この i ノード数をファイルシステム内で見つかった空き i ノード数と比較します。数が一致しなければ、fsck はスーパーブロック内の i ノード数を実際の空き i ノード数で置き換えます。

i ノード数

i ノードリストは、i ノード 2 から順番にチェックされます (i ノード 0 と i ノード 1 は予約されています)。各 i ノードの非整合性は、次の面からチェックされます。

i ノードの形式とタイプ

各 i ノードには、そのタイプと状態を記述するモードのワードが入っています。i ノードには、次の 6 つのタイプがあります。

i ノードの状態は、次の 3 つに分かれています。

ファイルシステムが作成されると、一定数の i ノードが確保されますが、必要になるまでは割り当てられません。割り当て済みの i ノードとは、ファイルを指す i ノードです。未割り当ての i ノードは、ファイルを指さないので空のはずです。一部割り当て済みの状態は、i ノードが正しくフォーマットされていないことを意味します。たとえば、ハードウェア障害が原因で i ノードに不良データが書き込まれると、i ノードは一部割り当て済みの状態になることがあります。fsck が実行できる唯一の修正動作は、その i ノードを消去することです。

リンク数

各 i ノードには、そこにリンクされているディレクトリエントリ数が入っています。fsck プログラムは、ルートディレクトリから順番にディレクトリ構造全体を検査し、i ノードごとに実際のリンク数を計算して、各 i ノードのリンク数を検査します。

i ノードに格納されているリンク数が fsck によって判断された実際のリンク数と一致しない場合は、次の 3 つの状況が考えられます。

重複ブロック数

各 i ノードには、それが取得するすべてのブロックのリスト、またはリストを指すポインタ (間接ブロック) が入っています。間接ブロックは i ノードによって所有されるので、間接ブロックの整合性が失われると、それを所有する i ノードが直接影響を受けます。

fsck プログラムは、i ノードによって取得される各ブロック番号を、割り当て済みブロックのリストと比較します。別の i ノードがすでにブロック番号を取得していると、そのブロック番号は重複ブロックのリストに入れられます。それ以外の場合は、割り当て済みブロックのリストが更新され、ブロック番号が組み込まれます。

重複ブロックがあると、fsck は再び i ノードリストを調べて、各重複ブロックを取得するもう 1 つの i ノードを検索します (i ノード内に大量の重複ブロックが入っている場合は、ファイルシステムに間接ブロックが正しく書き込まれていない可能性があります)。どの i ノードにエラーがあるかを正確に判断することはできません。fsck プログラムは、保管する i ノードと消去する i ノードを選択するように促すプロンプトを表示します。

不良ブロック数

fsck プログラムは、i ノードが取得する各ブロック番号をチェックして、その値が最初のデータブロックよりも大きく、ファイルシステム内の最後のデータブロックより小さいかどうかを調べます。ブロック番号がこの範囲に含まれない場合は、不良ブロック番号と見なされます。

間接ブロックがファイルシステムに書き込まれていないことが原因で、i ノード内に不良ブロック番号が発生することがあります。fsck はその i ノードの消去を促すプロンプトを表示します。

i ノードサイズ

各 i ノードには、参照するデータブロック数が入っています。実際のデータブロック数は、割り当て済みのデータブロック数と間接ブロック数の合計です。fsck はデータブロック数を計算し、そのブロック数を i ノードが取得するブロック数と比較します。i ノードに不正なブロック数が入っていると、fsck はその修正を促すプロンプトを表示します。

各 i ノードには、64 ビットのサイズフィールドが入っています。このフィールドは、i ノードに関連付けられたファイル内の文字数 (データバイト数) を示します。i ノードのサイズフィールドに整合性があるかどうかは、サイズフィールド内の文字数を使用して、i ノードに関連付けるべきブロック数を計算し、その結果を i ノードが取得する実際のブロック数と比較して概算でチェックされます。

間接ブロック

間接ブロックは i ノードによって所有されます。したがって、間接ブロック内の整合性が失われると、それを所有する i ノードが影響を受けます。非整合性は、次の面からチェックできます。

また、間接ブロックの場合は整合性チェックも実行されます。

データブロック

i ノードは、3 種類のデータブロックを直接または間接に参照できます。参照されるブロックは、すべて同じ種類でなければなりません。次の 3 種類のデータブロックがあります。

プレーンデータブロックには、ファイルに格納される情報が入っています。シンボリックリンクデータブロックには、シンボリックリンクに格納されるパス名が入っています。ディレクトリデータブロックには、ディレクトリエントリが入っています。fsck はディレクトリデータブロックの妥当性しかチェックできません。

ディレクトリは、i ノードの mode フィールド内のエントリによって通常ファイルと区別されます。ディレクトリに関連付けらたデータブロックには、ディレクトリエントリが入っています。ディレクトリデータブロックの非整合性は、次の面からチェックされます。

未割り当てディレクトリ

ディレクトリデータブロック内の i ノード番号が未割り当て i ノードを指す場合、fsck はそのディレクトリエントリを削除します。この状況は、ディレクトリエントリが入っているデータブロックが変更されて書き出されたが、i ノードに書き込まれていない場合に発生します。また、警告なしに CPU が停止された場合にも発生します。

不良 i ノード番号

ディレクトリエントリの i ノード番号が i ノードリストの最後を超える位置を指す場合、fsck はそのディレクトリエントリを削除します。この状況は、不良データがディレクトリのデータブロックに書き込まれると発生します。

不正な「.」と「..」エントリ

.」のディレクトリ i ノード番号は、ディレクトリデータブロックの最初のエントリでなければなりません。また、それ自体を参照しなければなりません。つまり、その値はディレクトリデータブロックの i ノード番号に等しくなければなりません。

..」のディレクトリ i ノード番号は、ディレクトリデータブロックの第 2 のエントリでなければなりません。その値は、親ディレクトリの i ノード番号 (または、ディレクトリがルートディレクトリの場合は、それ自体の i ノード番号) に等しくなければなりません。

.」と「..」のディレクトリ i ノード番号が不正であれば、fsck は正しい値に置き換えます。ディレクトリへのハードリンクが複数個あると、最初に見つかった方が「..」が指す実際の親であると見なされます。この場合、fsck は他方の名前を削除するように促すプロンプトを表示します。

切り離されたディレクトリ

fsck プログラムは、ファイルシステム全体の接続状態をチェックします。ファイルシステムにリンクされていないディレクトリが見つかると、fsck はそのディレクトリをファイルシステムの lost+found ディレクトリにリンクします (i ノードがファイルシステムに書き込まれていても、それに対応するディレクトリデータブロックがないと、この条件が発生することがあります)。

通常データブロック

通常ファイルに関連付けられたデータブロックには、ファイルの内容が入っています。fsck は、通常ファイルのデータブロックの内容が有効かどうかはチェックしません。

自動ブートチェック機能の変更

ブート中には、ブートスクリプト /sbin/rcS を使用して、ハードディスクからマウントされるファイルシステムごとに予備チェックが実行されます。このスクリプトは、ルート (/) と /usr のファイルシステムをチェックします。他方の rc シェルスクリプトは、fsck コマンドを使用して他のファイルシステムを順番にチェックします。ファイルシステムが並行にチェックされることはありません。「fsck pass」の数値が 1 より大きい場合も、ブート中にはファイルシステムが順番にチェックされます。

/etc/vfstab ファイル

ファイルシステムを直接指定せずに、ファイルシステムをチェックしてマウントするコマンドを実行すると、各コマンドは各種フィールドで指定された情報を使用して、ファイルシステムテーブル (/etc/vfstab) を調べます。fsck pass フィールドは、ファイルシステムチェックのための情報を指定します。「mount at boot」フィールドは、ブート時にファイルシステムをマウントするための情報を指定します。

新しいファイルシステムを作成する場合は、ブート時にチェックしてマウントするかどうかを示すエントリを /etc/vfstab に追加します。/etc/vfstab ファイルにエントリを追加する方法の詳細は、第 28 章「ファイルシステムのマウントとマウント解除の手順」を参照してください。

/etc/vfstab ファイル内の情報は、各システムのスライスとファイルシステムに固有です。次の例は、/etc/vfstab ファイルを示しています。

$ more /etc/vfstab
#device         device          mount           FS      fsck    mount    mount
#to mount       to fsck         point           type    pass    at boot  options
#/dev/dsk/c1d0s2 /dev/rdsk/c1d0s2 /usr          ufs     1       yes     -
/proc           -               /proc           proc    -       no      -
fd              -               /dev/fd         fd      -       no      -
swap            -               /tmp            tmpfs   -       yes     -

/dev/dsk/c0t0d0s0 /dev/rdsk/c0t0d0s0 /          ufs     1       no      -
/dev/dsk/c0t0d0s1 -                  -          swap    -       no      -
/dev/dsk/c0t0d0s6 /dev/rdsk/c0t0d0s6 /usr       ufs     2       no      -
/dev/dsk/c0t0d0s7 /dev/rdsk/c0t0d0s7 /opt       ufs     3       yes     -
pluto:/export/svr4/man -    /usr/man        nfs     no      yes     -
$

表 31-3 に、「fsck pass」フィールドの機能を示します。

表 31-3 「fsck pass」フィールド

フィールドの設定 

機能 

備考 

- (ハイフン)

ファイルシステムの状態に関係なく、汎用 fsck コマンドはファイルシステムをチェックしない。

ハイフンを使用して、読み取り専用ファイルシステム、リモートファイルシステム、/proc などの疑似ファイルシステムを表す。これらはチェックされない。

0 以上

ファイルシステム専用の fsck コマンドが呼び出される。

値が UFS ファイルシステムよりも大きければ、ファイルシステムはチェックされない。 

1 以上または fsck -o p を使用

ファイルシステム専用の fsck は自動的に UFS ファイルシステムを並行チェックする。

この値には 1 より大きい任意の数値を使用できる。 

preen モードでは、fsck は 1 ディスクごとに 1 つしか有効なファイルシステムをチェックできず、あるチェックが完了した後でなければ次のチェックを開始しません。fsck は、ファイルシステムが存在するデバイスの整数部番号と小数部番号を自動的に使用して、同時に異なるディスク上でファイルシステムをチェックする方法を判断します。

fsck pass 番号が 1 であれば、ファイルシステムは /etc/vfstab ファイルに表示される順番にチェックします。通常、ルート (/) ファイルシステムの fsck pass は 1 に設定されます。


注 -

fsck は、fsck pass 番号を使用せずにファイルシステムのチェック順を判断します。


ブート中に実行される自動チェック機能を変更する方法

  1. スーパーユーザーになります。

  2. fsck pass」フィールド内の /etc/vfstab エントリを編集し、編集結果を保存します。

    次にシステムをブートしたときに、新しい値が使用されます。

UFS ファイルシステムを対話方式でチェックして修復する

次の場合には、ファイルシステムを対話方式でチェックする必要があります。

使用中のシステムの整合性が失われると、コンソールウィンドウにエラーメッセージが表示されたり、システムがクラッシュしたりすることがあります。

fsck を使用する前に、fsck コマンドの構文とオプション」第 73 章「ファイルシステムで発生する問題の解決」を参照してください。

ファイルシステムのチェックが必要かどうかを調べる方法

  1. スーパーユーザーになります。

  2. ファイルシステムをチェックします。

    # fsck -m /dev/rdsk/device-name
    

    このコマンドで指定したファイルシステムのスーパーブロック内の状態フラグがチェックされ、ファイルシステムがクリーンかチェックが必要かが判断されます。

    デバイス引数を省略すると、/etc/vfstab 内で「fsck pass」の値が 0 より大きいすべての UFS ファイルシステムがチェックされます。

例 - ファイルシステムのチェックが必要かどうかを調べる

次の例では、第 1 のファイルシステムはチェックが必要で、第 2 のファイルシステムはチェックが不要です。

# fsck -m /dev/rdsk/c0t0d0s6
** /dev/rdsk/c0t0d0s6
ufs fsck: sanity check: /dev/rdsk/c0t0d0s6 needs checking
# fsck -m /dev/rdsk/c0t0d0s7
** /dev/rdsk/c0t0d0s7
ufs fsck: sanity check: /dev/rdsk/c0t0d0s7 okay

ファイルシステムを対話方式でチェックする方法

  1. スーパーユーザーになります。

  2. ルート (/) と /usr 以外のローカルファイルシステムをマウント解除します。

    # umountall -l
    
  3. ファイルシステムをチェックします。

    # fsck
    

    /etc/vfstab ファイル内で、「fsck pass」フィールド内のエントリが 0 より大きいすべてのファイルシステムがチェックされます。また、fsck の引数として、マウントポイントディレクトリや /dev/rdsk/device-name も指定できます。非整合性メッセージが表示されます。エラーメッセージのプロンプトに応答して 1 つまたは複数の UFS ファイルシステムを対話方式でチェックする方法については、第 73 章「ファイルシステムで発生する問題の解決」を参照してください。

  4. エラーを修正し終わったら、fsck と入力して Return キーを押します。

    fsck は、一度の実行ですべてのエラーを修正できないことがあります。「FILE SYSTEM STATE NOT SET TO OKAY」というメッセージが表示される場合は、このコマンドをもう一度実行します。コマンドが機能しない場合は、fsck で修復できない UFS ファイルシステムを修正する方法」を参照してください。

  5. ファイル名を変更して lost+found ディレクトリに入れます。

    fsck によって lost+found ディレクトリに入れられた各ファイル名は、その i ノード番号を使用して変更されます。可能であれば、ファイル名を変更し、ファイルが含まれるディレクトリに移動してください。grep コマンドを使用すると各ファイルの内容を照合し、file コマンドを使用するとファイルタイプを識別できます。ディレクトリ全体を lost+found にダンプする場合は、所属先を指定して移動する方が簡単です。

例 - ファイルシステムを対話方式でチェックする

次の例では、/dev/rdsk/c0t0d0s6 がチェックされ、不正なブロック数が訂正されます。

# fsck /dev/rdsk/c0t0d0s6
checkfilesys: /dev/rdsk/c0t0d0s6
** Phase 1 - Check Block and Sizes
INCORRECT BLOCK COUNT I=2529 (6 should be 2)
CORRECT? y

** Phase 2 - Check Pathnames
** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
** Phase 5 - Cylinder Groups
929 files, 8928 used, 2851 free (75 frags, 347 blocks, 0.6%
fragmentation)
/dev/rdsk/c0t0d0s6 FILE SYSTEM STATE SET TO OKAY

***** FILE SYSTEM WAS MODIFIED *****

UFS ファイルシステムの修復

fsck修復オプション (fsck -o p) は、UFS ファイルシステムをチェックし、単純な問題を自動的に修正します。通常、この種の問題は予期しないシステム停止によるものです。オペレータの介入が必要な問題が発生すると、このコマンドは即座に終了します。また、修復オプションを使用すると、ファイルシステムを並行チェックできます。

-o p オプションを指定して fsck を実行すると、クリーンされずに停止した後でファイルシステムを修復できます。このモードでは、fsck はクリーンフラグを調べずに完全チェックを実行します。これらの処理は、fsck を対話形式で実行した場合の処理のサブセットです。

ファイルシステムを修復する方法

  1. スーパーユーザーになります。

  2. ファイルシステムをマウント解除します。

    # umount mount-point
    
  3. 修復オプションを指定して UFS ファイルシステムをチェックします。

    # fsck -o p /dev/rdsk/device-name
    

    fsck の引数として mount-point または /dev/rdsk/device-name を使用すると、各ファイルシステムを修復できます。

例 - ファイルシステムを修復する

次の例では、/usr ファイルシステムが修復されます。

# fsck -o p /usr

不良スーパーブロックの復元

ファイルシステムのスーパーブロックが損傷した場合は、復元しなければなりません。スーパーブロックが不良なときには、fsck からメッセージが表示されます。幸い、スーパーブロックの重複コピーがファイルシステム内に格納されています。fsck -o b を使用すると、問題のスーパーブロックをコピーに置き換えることができます。

不良スーパーブロックを復元する方法

  1. スーパーユーザーになります。

  2. 損傷したファイルシステムの外側のディレクトリに変更します。

  3. ファイルシステムをマウント解除します。

    # umount mount-point
    

    注意 - 注意 -

    次の手順では、必ず newfs といっしょに -N オプションを使用してください。-N オプションを省略すると、新しい空のファイルシステムが作成されます。


  4. newfs -N コマンドを使用して、スーパーブロックの値を表示します。

    # newfs -N /dev/rdsk/device-name
    

    このコマンドの出力には、newfs によってファイルシステムが作成されたときに、スーパーブロックのコピーに使用されたブロック番号が表示されます。

  5. fsck コマンドを使用して、代替スーパーブロックを指定します。

    # fsck -F ufs -o b=block-number /dev/rdsk/device-name
    

    fsck は、指定された代替スーパーブロックを使用して、一次スーパーブロックを復元します。いつでも代替ブロックとして 32 を試すことができます。また、newfs -N で表示された代替ブロックを使用することもできます。

例 - 不良スーパーブロックを復元する

次の例では、/files7 ファイルシステム用にスーパーブロックのコピー 5264 が復元されます。

# cd /
# umount /files7
# newfs -N /dev/rdsk/c0t3d0s7
/dev/rdsk/c0t3d0s7: 163944 sectors in 506 cylinders of 9 tracks, 36 sectors
 83.9MB in 32 cyl groups (16 c/g, 2.65MB/g, 1216 i/g)
super-block backups (for fsck -b #) at:
 32, 5264, 10496, 15728, 20960, 26192, 31424, 36656, 41888,
 47120, 52352, 57584, 62816, 68048, 73280, 78512, 82976, 88208,
 93440, 98672, 103904, 109136, 114368, 119600, 124832, 130064, 135296,
 140528, 145760, 150992, 156224, 161456,
# fsck -F ufs -o b=5264 /dev/rdsk/c0t3d0s7
Alternate superblock location: 5264.
** /dev/rdsk/c0t3d0s7
** Last 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
36 files, 867 used, 75712 free (16 frags, 9462 blocks, 0.0% fragmentation)
/dev/rdsk/c0t3d0s7 FILE SYSTEM STATE SET TO OKAY

***** FILE SYSTEM WAS MODIFIED *****
# 

ルート (/) ファイルシステム内のスーパーブロックが損傷し、システムをブートできない場合は、/kernel/unix をインストールし直し、newfs を使用してルート (/) ファイルシステムを再構築してください。スーパーブロックは newfs コマンドによって作成されるので、復元する必要はありません。

fsck で修復できない UFS ファイルシステムを修正する方法

あるパスで問題が訂正されても、前のパスで見つからなかった問題が解決されないため、fsck を何度か実行してファイルシステムを修正しなければならないことがあります。fsck はクリーンになるまで動作を続けるわけではないので、手作業で実行しなければなりません。

fsck で表示される情報に注目してください。問題を解決する上で参考になります。たとえば、メッセージは不良ディレクトリを指す場合があります。そのディレクトリを削除すると、fsck がクリーンな状態で動作していることがわかります。

それでも fsck でファイルシステムを修復できない場合は、fsdbffclri、または ncheck コマンドを使用し、間違いを指定して修正します。これらのコマンドの使用方法については、fsdb(1M)ff(1M)clri(1M)ncheck(1M) の各マニュアルページを参照してください。最終的には、ファイルシステムを作成し直し、その内容をバックアップ媒体から復元せざるを得ない場合があります。ファイルシステム全体を復元する方法については、第 35 章「ファイルとファイルシステムの復元の手順」を参照してください。

ファイルシステムを完全に修復できないが、読み取り専用としてマウントできる場合は、cptar、または cpio を使用して、データのすべてまたは一部をファイルシステムから取り出してください。

問題の原因がハードウェアディスクエラーであれば、ファイルシステムを作成し直して復元する前に、ディスクをフォーマットし直して再びスライスに分割しなければならない場合があります。一般に、ハードウェアエラーが発生すると、さまざまなコマンドで同じエラーが繰り返し表示されます。format(1M) コマンドはディスク上の不良ブロックを処理しようとします。ただし、ディスクの損傷が致命的でなければ、フォーマットし直した後も問題が解決されないことがあります。format コマンドの使用方法については、format(1M) のマニュアルページを参照してください。新しいディスクをインストールする方法については、第 23 章「SPARC: ディスク追加の手順」または第 24 章「x86 : ディスク追加の手順」を参照してください。

fsck コマンドの構文とオプション

fsck コマンドは、ファイルシステム内の非整合状態をチェックして修復します。次の 4 つのオプションがあります。

汎用 fsck コマンドの構文、オプション、および引数

fsck には、汎用コマンドとファイルシステム専用の 2 種類のコマンドがあります。汎用コマンドはほとんどのタイプのファイルシステムに使用でき、専用のコマンドはあるタイプのファイルシステムにのみ使用できます。必要に応じて、いつでも汎用コマンドを使用して、ファイルシステム専用のコマンドを呼び出すことができます。

通常、fsck を実行するにはスーパーユーザーにならなければなりません。スーパーユーザーにならなくても fsck コマンドを実行できますが、修復するにはファイルシステムをマウント解除しなければなりません。また、スライス用の raw デバイスファイルの読み取りアクセス権を持っていなければなりません (セキュリティ上の落とし穴になる可能性があります)。

汎用 fsck コマンドは、/etc/vfstab にアクセスして、どのファイルシステムをチェックするかを調べます。また、fsck pass 番号 - または 0 (UFS のみ) で除外されるものを除き、指定された各ファイルシステム上で、該当するファイルシステム専用の fsck コマンドを実行します。

汎用 fsck コマンドの構文は次のとおりです。

/usr/sbin/fsck [-F type] [-V] [-m] [special]
/usr/sbin/fsck [-F type] [-V] -[y|Y]|[n|N] [-o specific-options][special]

表 31-4 は、汎用 fsck コマンドのオプションと引数を示しています。

表 31-4 fsck コマンドのオプションと引数

オプションのタイプ 

オプション - 汎用 

説明 

汎用 

-F

ファイルシステムのタイプ (type) を指定する。コマンド行で type を指定しない場合は、/etc/vfstab ファイル内のエントリを、指定した raw デバイス名と照合して取得される。エントリが見つからない場合は、/etc/default/fs 内で指定されたデフォルトのローカルファイルシステムのタイプが使用される。

 

-V

完了したコマンド行が表示される (詳細モード)。表示行には、/etc/vfstab から取り出された詳細情報が含まれる。このオプションを使用すると、コマンド行を検査して有効性を確認できる。コマンド自体は実行されない。

 

-m

予備チェックのみを実行する。ファイルシステムの状態を示すコードを返す。0 は「クリーン」を示し、32 は「ダーティ」を示す。起動スクリプト /sbin/rcS は、このオプションを使用して、ファイルシステムのチェックが必要かどうかを判断する。

 

-y-Y-n、または -N

コマンドを自動的に実行し、すべてのプロンプトに yes または no で応答する。 

 

c

静的にテーブルが割り当てられている古い形式のシステムを、新しい形式の動的に割り当てられたテーブルに変換する。静的割り当ては最大テーブルサイズにハード制限が適用されることを示し、動的割り当ては、初期割り当ての後で必要に応じてテーブル用の領域を追加できることを意味する。ファイルシステムが新しい形式であれば、テーブル割り当てが古い形式で許される固定最大サイズを超えない限り、古い形式に変換される。fsck は変換方法を表示する。対話モードでは、fsck は変換前に確認を促すプロンプトを表示する。-o p オプションを使用すると、確認を促すプロンプトは表示されずに変換試行が実行される。このオプションは、多数のファイルシステムを一度に変換したい場合に便利である。ファイルシステムが古い形式か新しい形式かは、fstyp(1M) コマンドを実行し、最初に表示される行を調べれば判断できる。

 

w

書き込みアクセスできるファイルシステムのみをチェックする。 

 

special

1 つまたは複数のファイルシステムのマウントポイントまたは raw デバイス名を指定する。マウントポイントのエントリは、/etc/vfstab 内になければならない。special 引数を省略すると、指定した fsck デバイスと fsck pass の値が 0 より大きい /etc/vfstab 内のエントリがチェックされる。修復 (-o p) が有効で、fsck pass の値が 1 より大きいエントリが複数個あると、各ディスク上のファイルシステムが並行してチェックされる。

専用 

 

-o オプションに続くオプションをコンマで区切ったリスト。解釈のために UFS 固有の fsck コマンドに渡されるオプションを記述する。

 

p

修復。コマンドはプロンプトを表示せずに自動的に実行され、検出されたエラーは訂正されるが、オペレータの介入が必要な問題にぶつかると終了する。このオプションを使用すると、UFS ファイルシステムを並行にチェックすることもできる。 

 

b=blocknumber

指定した位置にある代替 (重複) スーパーブロックを使用する。このオプションを使用すると、不良スーパーブロックを種復できる。newfs -N コマンドを使用すると、代替スーパーブロックのリストを表示できる。