この章の内容は以下のとおりです。
fsck のエラーメッセージについては、第 73 章「ファイルシステムで発生する問題の解決」を参照してください。
UFS ファイルシステムは、一連の内部テーブルに依存して i ノード数、使用済みブロック数、使用可能ブロック数を追跡します。これらの内部テーブルがディスク上のデータと正しく同期していないと、整合性が失われ、ファイルシステムの修復が必要になります。
次のような原因でオペレーティングシステムが異常終了すると、ファイルシステムが損傷したり、整合性が失われたりすることがあります。
電源障害
不注意によるシステム電源の切断
正しいシャットダウン手順以外の方法によるシステム電源の切断
カーネル内のソフトウェアエラー
ファイルシステムの破損は重大ですが、あまり頻繁に起きるものではありません。システムをブートすると、ファイルシステムの整合性チェックが (fsck プログラムを使用して) 自動的に実行されます。ほとんどの場合は、このファイルシステムのチェックによって問題が修復されます。
この章では、fsck プログラムでチェックされ修復される問題と fsck のオプションについて説明します。また、次の作業についても説明します。
ブート時に実行される自動チェック機能を変更する方法
ファイルシステムのチェックが必要かどうかを調べる方法
UFS ファイルシステムを対話形式でチェックして修復する方法
不良スーパーブロックを復元する方法
fsck で修復できない UFS ファイルシステムを修復する方法
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 で検出される問題、およびそれらの修正方法について説明します。
労働日には毎日多数のファイルが作成、変更、または削除されます。ファイルが変更されるたびに、オペレーティングシステムは一連のファイルシステムの更新処理を実行します。これらの更新処理がディスクに確実に書き込まれると、整合性のあるファイルシステムが生成されます。
ユーザープログラムが書き込みなどの、ファイルシステムを変更する処理を実行すると、書き込まれるデータはまずカーネル内部のインコアバッファにコピーされます。一般に、ディスクの更新は非同期に処理されるので、書き込みシステムコールが値を返した後にしばらくデータの書き込みが発生しなくても、ユーザープロセスは進行できます。したがって、ファイルシステムは、ディスク上にある場合と同様に、インコア情報で表されるファイルシステムの状態から常に遅延することになります。
別の目的にバッファが必要になったり、カーネルが fsflush デーモンを自動的に (30 秒間隔で) 実行すると、インコア情報を反映するようにディスク情報が更新されます。システムがインコア情報を書き込まずに停止すると、ディスク上のファイルシステムの整合性がなくなります。
ファイルシステムの整合性は、さまざまな原因で失われることがあります。最も一般的な原因は、オペレータのエラーとハードウェア障害です。
システムを正しくシャットダウンしなかったり、マウントされているファイルシステムが正しくオフラインにされないと、「クリーンでない停止」が原因で問題が発生することがあります。クリーンでない停止を防ぐには、CPU を停止したり、ディスクをドライブから物理的に取り出したり、ディスクをオフライン状態にする前に、ファイルシステムの現在の状態をディスクに書き込んだりしなければなりません (つまり、同期させなければなりません)。
また、ハードウェアの欠陥が原因で整合性が失われることもあります。ディスクドライブ上ではいつでもブロックが損傷する可能性があり、ディスクコントローラが正常に機能しなくなる可能性があります。
この節では、UFS ファイルシステムの構成要素、つまりスーパーブロック、シリンダグループブロック、i ノード、間接ブロック、データブロックに fsck が適用する整合性チェックの種類について説明します。
スーパーブロックには集計情報が格納されており、UFS ファイルシステム内で最も破損しがちな構成要素です。ファイルシステムの i ノードやデータブロックが変更されるたびに、スーパーブロックも変更されます。CPU が停止した場合、直前のコマンドが sync コマンドでなければ、スーパーブロックはほぼ確実に破損します。
スーパーブロックの非整合性は、次の面からチェックされます。
ファイルシステムのサイズ
i ノード数
空きブロック数
空き i ノード数
ファイルシステムのサイズは、スーパーブロックに使用されるブロック数と i ノードリストに使用されるブロック数よりも大きくなければなりません。i ノード数は、ファイルシステムの最大許容数よりも小さくなければなりません。ファイルシステムのサイズとレイアウト情報は、fsck にとって最も重要な情報部分です。これらのサイズを実際にチェックする方法はありませんが、ファイルシステムの作成時に静的に判断されるので、fsck はサイズが妥当な範囲内にあるかどうかをチェックできます。他のすべてのファイルシステムをチェックするには、これらのサイズが正確でなければなりません。fsck が一次スーパーブロックの静的パラメタ内で破損を検出すると、オペレータに代替スーパーブロックの位置を指定するように促します。
空きブロック数は、シリンダグループのブロックマップに格納されます。fsck は、空きマーク付きのすべてのブロックがファイルに取得されていないかどうかをチェックします。すべてのブロックをチェックし終わると、fsck は空きブロック数と i ノードに取得されるブロック数の合計がファイルシステム内の合計ブロック数に等しくなるかどうかをチェックします。ブロック割り当てマップ内に間違いがあると、fsck はブロックが割り当てられている状態のままで構築し直します。
スーパーブロック内の集計情報には、ファイルシステム内の空きブロックの合計数のカウントが入っています。fsck プログラムは、このブロック数をファイルシステム内で見つかった空きブロック数と比較します。数が一致しなければ、fsck はスーパーブロック内のブロック数を実際の空きブロック数で置き換えます。
スーパーブロック内の集計情報には、ファイルシステム内の空き i ノード数が入っています。fsck プログラムは、この i ノード数をファイルシステム内で見つかった空き i ノード数と比較します。数が一致しなければ、fsck はスーパーブロック内の i ノード数を実際の空き i ノード数で置き換えます。
i ノードリストは、i ノード 2 から順番にチェックされます (i ノード 0 と i ノード 1 は予約されています)。各 i ノードの非整合性は、次の面からチェックされます。
形式とタイプ
リンク数
重複ブロック
不良ブロック番号
i ノードのサイズ
各 i ノードには、そのタイプと状態を記述するモードのワードが入っています。i ノードには、次の 6 つのタイプがあります。
割り当て済み
未割り当て
一部割り当て済み
ファイルシステムが作成されると、一定数の i ノードが確保されますが、必要になるまでは割り当てられません。割り当て済みの i ノードとは、ファイルを指す i ノードです。未割り当ての i ノードは、ファイルを指さないので空のはずです。一部割り当て済みの状態は、i ノードが正しくフォーマットされていないことを意味します。たとえば、ハードウェア障害が原因で i ノードに不良データが書き込まれると、i ノードは一部割り当て済みの状態になることがあります。fsck が実行できる唯一の修正動作は、その i ノードを消去することです。
各 i ノードには、そこにリンクされているディレクトリエントリ数が入っています。fsck プログラムは、ルートディレクトリから順番にディレクトリ構造全体を検査し、i ノードごとに実際のリンク数を計算して、各 i ノードのリンク数を検査します。
i ノードに格納されているリンク数が fsck によって判断された実際のリンク数と一致しない場合は、次の 3 つの状況が考えられます。
格納されたリンク数が 0 でなく、実際のリンク数が 0 の場合
この状況は、i ノードのディレクトリエントリが存在しない場合に発生することがあります。この場合、fsck は切り離されたファイルを lost+found ディレクトリに入れます。
格納されたリンク数が 0 でなく、実際のリンク数も 0 でないが、2 つのリンク数が等しくない場合
この状況は、ディレクトリエントリが追加または削除されたが、i ノードが更新されていない場合に発生することがあります。この場合、fsck は格納されたリンク数を実際のリンク数で置き換えます。
格納されたリンク数が 0 で実際のリンク数が 0 でない場合
この場合、fsck は i ノードのリンク数を実際のリンク数に変更します。
各 i ノードには、それが取得するすべてのブロックのリスト、またはリストを指すポインタ (間接ブロック) が入っています。間接ブロックは i ノードによって所有されるので、間接ブロックの整合性が失われると、それを所有する i ノードが直接影響を受けます。
fsck プログラムは、i ノードによって取得される各ブロック番号を、割り当て済みブロックのリストと比較します。別の i ノードがすでにブロック番号を取得していると、そのブロック番号は重複ブロックのリストに入れられます。それ以外の場合は、割り当て済みブロックのリストが更新され、ブロック番号が組み込まれます。
重複ブロックがあると、fsck は再び i ノードリストを調べて、各重複ブロックを取得するもう 1 つの i ノードを検索します (i ノード内に大量の重複ブロックが入っている場合は、ファイルシステムに間接ブロックが正しく書き込まれていない可能性があります)。どの i ノードにエラーがあるかを正確に判断することはできません。fsck プログラムは、保管する i ノードと消去する i ノードを選択するように促すプロンプトを表示します。
fsck プログラムは、i ノードが取得する各ブロック番号をチェックして、その値が最初のデータブロックよりも大きく、ファイルシステム内の最後のデータブロックより小さいかどうかを調べます。ブロック番号がこの範囲に含まれない場合は、不良ブロック番号と見なされます。
間接ブロックがファイルシステムに書き込まれていないことが原因で、i ノード内に不良ブロック番号が発生することがあります。fsck はその i ノードの消去を促すプロンプトを表示します。
各 i ノードには、参照するデータブロック数が入っています。実際のデータブロック数は、割り当て済みのデータブロック数と間接ブロック数の合計です。fsck はデータブロック数を計算し、そのブロック数を i ノードが取得するブロック数と比較します。i ノードに不正なブロック数が入っていると、fsck はその修正を促すプロンプトを表示します。
各 i ノードには、64 ビットのサイズフィールドが入っています。このフィールドは、i ノードに関連付けられたファイル内の文字数 (データバイト数) を示します。i ノードのサイズフィールドに整合性があるかどうかは、サイズフィールド内の文字数を使用して、i ノードに関連付けるべきブロック数を計算し、その結果を i ノードが取得する実際のブロック数と比較して概算でチェックされます。
間接ブロックは i ノードによって所有されます。したがって、間接ブロック内の整合性が失われると、それを所有する i ノードが影響を受けます。非整合性は、次の面からチェックできます。
すでに別の i ノードに取得されているブロック数
ファイルシステムの範囲に含まれないブロック番号
また、間接ブロックの場合は整合性チェックも実行されます。
i ノードは、3 種類のデータブロックを直接または間接に参照できます。参照されるブロックは、すべて同じ種類でなければなりません。次の 3 種類のデータブロックがあります。
プレーンデータブロック
シンボリックリンクデータブロック
ディレクトリデータブロック
プレーンデータブロックには、ファイルに格納される情報が入っています。シンボリックリンクデータブロックには、シンボリックリンクに格納されるパス名が入っています。ディレクトリデータブロックには、ディレクトリエントリが入っています。fsck はディレクトリデータブロックの妥当性しかチェックできません。
ディレクトリは、i ノードの mode フィールド内のエントリによって通常ファイルと区別されます。ディレクトリに関連付けらたデータブロックには、ディレクトリエントリが入っています。ディレクトリデータブロックの非整合性は、次の面からチェックされます。
未割り当て i ノードを指すディレクトリ i ノード番号
ファイルシステム内の i ノード数より大きいディレクトリ i ノード番号
「.」と「..」ディレクトリには許されないディレクトリ i ノード番号
ファイルシステムから切り離されたディレクトリ
ディレクトリデータブロック内の i ノード番号が未割り当て i ノードを指す場合、fsck はそのディレクトリエントリを削除します。この状況は、ディレクトリエントリが入っているデータブロックが変更されて書き出されたが、i ノードに書き込まれていない場合に発生します。また、警告なしに CPU が停止された場合にも発生します。
ディレクトリエントリの 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) を調べます。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 番号を使用せずにファイルシステムのチェック順を判断します。
次の場合には、ファイルシステムを対話方式でチェックする必要があります。
マウントできない場合
使用中に問題が発生する場合
使用中のシステムの整合性が失われると、コンソールウィンドウにエラーメッセージが表示されたり、システムがクラッシュしたりすることがあります。
fsck を使用する前に、「fsck コマンドの構文とオプション」と 第 73 章「ファイルシステムで発生する問題の解決」を参照してください。
ファイルシステムをチェックします。
# 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
スーパーユーザーになります。
ルート (/) と /usr 以外のローカルファイルシステムをマウント解除します。
# umountall -l
ファイルシステムをチェックします。
# fsck
/etc/vfstab ファイル内で、「fsck pass」フィールド内のエントリが 0 より大きいすべてのファイルシステムがチェックされます。また、fsck の引数として、マウントポイントディレクトリや /dev/rdsk/device-name も指定できます。非整合性メッセージが表示されます。エラーメッセージのプロンプトに応答して 1 つまたは複数の UFS ファイルシステムを対話方式でチェックする方法については、第 73 章「ファイルシステムで発生する問題の解決」を参照してください。
エラーを修正し終わったら、fsck と入力して Return キーを押します。
fsck は、一度の実行ですべてのエラーを修正できないことがあります。「FILE SYSTEM STATE NOT SET TO OKAY」というメッセージが表示される場合は、このコマンドをもう一度実行します。コマンドが機能しない場合は、「fsck で修復できない UFS ファイルシステムを修正する方法」を参照してください。
ファイル名を変更して 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 *****
fsck の修復オプション (fsck -o p) は、UFS ファイルシステムをチェックし、単純な問題を自動的に修正します。通常、この種の問題は予期しないシステム停止によるものです。オペレータの介入が必要な問題が発生すると、このコマンドは即座に終了します。また、修復オプションを使用すると、ファイルシステムを並行チェックできます。
-o p オプションを指定して fsck を実行すると、クリーンされずに停止した後でファイルシステムを修復できます。このモードでは、fsck はクリーンフラグを調べずに完全チェックを実行します。これらの処理は、fsck を対話形式で実行した場合の処理のサブセットです。
ファイルシステムをマウント解除します。
# umount mount-point
修復オプションを指定して UFS ファイルシステムをチェックします。
# fsck -o p /dev/rdsk/device-name
fsck の引数として mount-point または /dev/rdsk/device-name を使用すると、各ファイルシステムを修復できます。
次の例では、/usr ファイルシステムが修復されます。
# fsck -o p /usr
ファイルシステムのスーパーブロックが損傷した場合は、復元しなければなりません。スーパーブロックが不良なときには、fsck からメッセージが表示されます。幸い、スーパーブロックの重複コピーがファイルシステム内に格納されています。fsck -o b を使用すると、問題のスーパーブロックをコピーに置き換えることができます。
スーパーユーザーになります。
損傷したファイルシステムの外側のディレクトリに変更します。
ファイルシステムをマウント解除します。
# umount mount-point
次の手順では、必ず newfs といっしょに -N オプションを使用してください。-N オプションを省略すると、新しい空のファイルシステムが作成されます。
newfs -N コマンドを使用して、スーパーブロックの値を表示します。
# newfs -N /dev/rdsk/device-name
このコマンドの出力には、newfs によってファイルシステムが作成されたときに、スーパーブロックのコピーに使用されたブロック番号が表示されます。
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 を何度か実行してファイルシステムを修正しなければならないことがあります。fsck はクリーンになるまで動作を続けるわけではないので、手作業で実行しなければなりません。
fsck で表示される情報に注目してください。問題を解決する上で参考になります。たとえば、メッセージは不良ディレクトリを指す場合があります。そのディレクトリを削除すると、fsck がクリーンな状態で動作していることがわかります。
それでも fsck でファイルシステムを修復できない場合は、fsdb、ff、clri、または ncheck コマンドを使用し、間違いを指定して修正します。これらのコマンドの使用方法については、fsdb(1M)、ff(1M)、clri(1M)、ncheck(1M) の各マニュアルページを参照してください。最終的には、ファイルシステムを作成し直し、その内容をバックアップ媒体から復元せざるを得ない場合があります。ファイルシステム全体を復元する方法については、第 35 章「ファイルとファイルシステムの復元の手順」を参照してください。
ファイルシステムを完全に修復できないが、読み取り専用としてマウントできる場合は、cp、tar、または cpio を使用して、データのすべてまたは一部をファイルシステムから取り出してください。
問題の原因がハードウェアディスクエラーであれば、ファイルシステムを作成し直して復元する前に、ディスクをフォーマットし直して再びスライスに分割しなければならない場合があります。一般に、ハードウェアエラーが発生すると、さまざまなコマンドで同じエラーが繰り返し表示されます。format(1M) コマンドはディスク上の不良ブロックを処理しようとします。ただし、ディスクの損傷が致命的でなければ、フォーマットし直した後も問題が解決されないことがあります。format コマンドの使用方法については、format(1M) のマニュアルページを参照してください。新しいディスクをインストールする方法については、第 23 章「SPARC: ディスク追加の手順」または第 24 章「x86 : ディスク追加の手順」を参照してください。
fsck コマンドは、ファイルシステム内の非整合状態をチェックして修復します。次の 4 つのオプションがあります。
ファイルシステムをマウントできるかどうかだけをチェックする (fsck -m)
修復する前に確認を促すプロンプトを表示する (fsck)
すべての修復に yes または no の応答を想定する (fsck -y)
対話方式でなくファイルシステムを修復し、予期される (小さな) 非整合箇所をすべて修復 (preen) するが、重大な問題にぶつかると終了する (fsck -o p)
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 コマンドのオプションと引数