Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ fsdb(8) — NEWS-os 4.1C

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

fsck(8)

dir(4)

fs(4)

FSDB(8)  —  NEWS-OS Programmer’s Manual

名称

fsdb − ファイルシステム・デバッガ

形式

/etc/fsdb [ options ] special

オプション

fsdb で使用できるオプションは次のとおりです。

−?  使用方法を表示する

−o いくつかのエラー状態を無視する

−p’string’ プロンプトの文字列を設定する

−w 書き込みのためにオープンする

解説

fsdb は、 クラッシュの後で、 ダメージを受けたファイルシステムを修復するために用いられます。 ブロックと i ノード番号を対応するディスクアドレスに変換できます。 また、i ノードの各部分を参照するのに、 ニーモニックオフセットを使用することができます。 これらは、制御ブロックを修正したり、 ファイル システム ツリーを下に向かってたどっていく作業を とても簡単にします。

fsdb には、i ノードとブロックアドレスを照合するための エラーチェックルーチンがいくつかあります。 これらは、必要ならば、 −o オプションを付けて fsdb を呼び出すか、 o コマンドを使うことによって禁止できます。

fsdb は、一度に 1 ブロックを読みますから、 raw デバイスに対してもブロック I/O と同様に動作します。 read システムコールの回数を減らすため、 共通に使われるデータブロックを保持するバッファ管理ルーチンが使用されます。 すべての代入操作は、 対応するブロックへの即時書き込みを行います。 ディスクのいかなる部分を変更するにも、 −w オプションを付けて fsdb を起動しなければならないことに注意してください。

fsdb を使い易くするために、できる限り adb に近いシンタックスが採用されました。

数は、デフォルトでは 16進と解釈されます。 しかし、データをどんなふうに表示し受け付けるかは、 ユーザが制御できます。 base コマンドは、入出力の基数を表示したり設定したりします。 一度設定されると、 すべての入力はこの基数をデフォルトとし、 すべての出力はこの基数で表示されます。 16進には 0x を、10進には 0t を、8 進には、 0 を直前に付けることによって、 入力時の基数を一時的に無視できます。 a−f または A−F で始まる 16進数は、コマンドと区別するために 0x を直前に付けなければなりません。

fsdb によるディスクアドレッシングは、バイトレベルで行われます。 しかし、 fsdb が提供するコマンドの多くは、 i ノードや、ディレクトリエントリ、ブロック、 スーパブロックなどをバイトアドレスに変換してくれるので、 それらを指定できます。 一度、そのアドレスが計算されると、 fsdb は、その結果を dot に記録します(次のパラグラフ参照)。

fsdb は、いくつかのグローバルな値を持っています。

現在の基数(base で参照される)
現在のアドレス(dot で参照される)
現在の i ノード(inode で参照される)
現在の回数(count で参照される)
現在のタイプ(type で参照される)

たいていのコマンドは、実行時に dot のプリセット値を使用します。 たとえば、

> 2:inode

は、最初に dot の値を 2 に設定し、 : でコマンドの開始を告げ、 inode コマンドが inode を 2 に設定します。 回数は、 , の後で指定します。 count は一度設定されると、新しいコマンドに出会うまでずっとその値が使われます。 新しいコマンドでは、その値は 1 (デフォルト)にリセットされます。 したがって、もし

> 2000,400/X

が入力されると、 2000 番地から 400 個の long の値が 16進で表示されます。 そして、コマンド終了後は、 dot の値が 2000 + 400 ∗ sizeof (long) に設定されます。 キャリッジリターンが入力されると、 出力ルーチンは、 dot、count、type の現在の値を使用し、さらに 400 個の long の値を表示します。 ∗ でブロック全体を表示します。

フラグメント、ブロック、ファイルの最後は、 fsdb が知っています。 フラグメントまたはブロックとしてデータを表示している時、 その最後に達すると、エラーメッセージが表示されます。 db、 ib、 directory、 file の各コマンドを使ってデータを表示している時、 ファイルの最後に達すると、エラーメッセージが表示されます。 これは主に、ディレクトリやファイルの最後を通り過ぎて、 わけの分からない、かつ望ましくない結果になることを避けるために 必要なことです。

いくつかのコマンドとキャリッジリターンの使用例を示します。

> 2:ino; 0:dir?d

または

> 2:ino; 0:db:block?d

この 2 つの例は、 ファイルシステムのルートの最初のディレクトリエントリへの到達という 点では同じことです。 一度そこに行くと、 その次のキャリッジリターン(または +、−)は 次のエントリに進みます。

> 2:inode; :ls

と

> :ls /

も同じ意味です。

式

fsdb によって認識されるシンボル。

キャリッジリターン
type の現在の値によって dot の値を更新し、 count の現在の値を使って表示を行います。

# 数式は、 +、 −、 ∗、 % という演算子(左から右へ評価される)で構成され、 括弧を使うこともできます。 評価されると、 dot の値が更新されます。

, count 回数表示。 count のグローバルな値が count に更新されます。 count の値は、新しいコマンドが実行されるまで変わりません。 回数指定に ∗ を使うと、ブロック単位の情報を表示します。 count のデフォルトは 1 です。

? f フォーマット指定 f に従って、 構造を持った形で表示します(フォーマット出力の項参照)。

/ f フォーマット指定 f に従って、 構造を持たない形で表示します(フォーマット出力の項参照)。

.  dot の値。

+e 式 e により dot の値を増加させます。 実際の増加量は、 type のサイズに依存します。 dot = dot + e ∗ sizeof (type) e のデフォルトの値は 1 です。

−e 式 e により dot の値を減少させます (+ 参照)。

∗e dot の値に式 e の値を掛けます。 乗算と除算は type を使用しません。 上記の dot の計算では、 sizeof (type) を 1 と見なします。

%e dot の値を式 e の値で割ります (∗ 参照)。

< name
レジスタ name に退避していたアドレスを元に戻します。 name は 1 つの文字または数字でなければなりません。

> name
レジスタ name にアドレスを退避します。 name は 1 つの文字または数字でなければなりません。

= f インジケータを表示します。 f が正しいフォーマット指定であれば(フォーマット出力の項参照)、 dot の値はフォーマット指定 f を用いて表示されます。 そうでなければ、代入と見なされます(次の項参照)。

= [s] [e]
代入指定。 dot で指されるアドレスの内容を式 e の値、または引用符(")付きの文字列 s の ASCII 表現に変更します。 これは、ディレクトリ名や ASCII ファイル情報を 変更するのに役立ちます。

=+ e 加算代入。 dot で指されるアドレスの内容に式 e の値を加えます。

=− e 減算代入。 dot で指されるアドレスの内容から式 e の値を引きます。

コマンド

コマンドの直前には : が必要です。 コマンドは、 他のコマンドと区別するのに十分な文字数だけでかまいません。 空白、タブ、 ; で区切ることによって、 1 行に複数のコマンドを入力できます。

アンマウントされたディスクを無理のない手段で眺めるために、 cd、 pwd、 ls、 find コマンドが提供されています。 これらのコマンドの機能は、 UNIX にあるものの機能と本質的に同じものです(詳細は、 個々のコマンドを参照)。 ワイルドカード文字の ∗、?、[ - ] が使用できます。

base=b
基数を表示または設定します。 前述のようにすべての入出力は現在の base に従います。 =b を省略すると、現在の base が表示されます。 そうでなければ、現在の base が b に設定されます。 この b は base の以前の値を使って解釈されますから、 base を変更するときは、正しく設定できるように 0、0t、0x を数の前に付けてください。 base のデフォルトは、16進です。

block dot の値をブロックアドレスに変換します。

cd dir 現在のディレクトリを dir に変更します。 inode と dot の現在の値も変更されます。 dir が指定されないと、ディレクトリを inode 2 ("/")に変更します。

cg dot の値をシルンダグループに変更します。

directory
現在の inode がディレクトリなら、 dot の値がそのディレクトリのスロットオフセットに変換されます。 そして、 dot がこのエントリを指すようになります。

file dot の値がそのファイルの先頭からの相対ブロックカウントと見なされます。 dot の値は、このブロックの最初のバイトに更新されます。

find dir [ −name n ] [ −inum i ]
名前または i ノード番号でファイルを検索します。 find は、ディレクトリ dir の下を再帰的に、i ノード番号が i に一致するもの、または名前が n に一致するものを検索します。 2 つのオプション (−name または −inum)は、 一度に 1 つだけが指定できます。 −print は必要ありませんし、受け付けられません。

fill=p ディスクのある領域全部にパターン p を書き込みます。 ディスクの領域は、 dot と count で区切られます。

fragment
dot の値をフラグメントアドレスに変換します。 fragment コマンドと block コマンドの唯一の違いは、表示する量です。

inode dot の値を i ノードアドレスに変換します。 成功すれば、 inode の現在の値は、 dot の値と同様に更新されます。 便利な書き方として、 :inode が行の先頭に表れたら、 その i ノードが i ノードフォーマットで表示されます。

ls [ −R ] [ −l ] pat1 pat2 ... 
ディレクトリまたはファイルの一覧を表示します。 ファイル名が指定されないと、 現在のディレクトリと見なされます。 どちらか、または両方のオプションを指定できます。 ただし、その場合は必ずファイル名指定の前になければなりません。 また、前述のようにワイルドカード文字が使用でき、 複数の引数を与えてもかまいません。 −l による表示は、i ノード番号と名前だけです。 さらに情報が必要な場合は、 ?i 付きの inode コマンドを使用してください。

override
無視する値をオン/オフ(トグル)します。 override がオンに設定されると、 いくつかのエラー状態が無視されます。

prompt p
fsdb のプロンプトを p にします。 p は、" で囲まなければなりません。

pwd 現在のワーキングディレクトリを表示します。

quit fsdb を終了します。

sb dot の値をシリンダグループ番号と見なし、 そのシリンダグループのスーパーブロックのアドレスに変換します。 :sb を行の先頭に付けると、 dot の値をそのスーパーブロックに設定し、 スーパーブロックフォーマットで表示します。

!  シェルにエスケープします。

i ノードコマンド

上記のコマンドに加え、 i ノードフィールドを扱うコマンドや、 現在の inode に対して直接操作を行うコマンド (: が必要)があります。 これらを使用すると、 ある特定のフィールドを表示したり、変更したりするのことが もっと容易になります。 dot の値は、 :db、:ib コマンドで使用されるだけです。 コマンド実行終了時には、 dot の値はそのフィールドを指すように変更されます。 例えば、

> :ln=+1

これは、現在の inode のリンクカウントを 1 増やします。 そして、 dot の値をリンクカウントフィールドのアドレスに設定します。

at アクセス時刻

bs ブロックサイズ

ct 生成時刻

db dot の現在の値をダイレクトブロックインデックスとして使用します。 ダイレクトブロック番号は 0 〜 11 です。 ブロック自身を表示するためには、この結果を block コマンド、または fragment コマンドにパイプする必要があります。 例えば、 > 1:db:block,20/X これは、i ノードからデータブロックフィールド 1 の内容を獲得し、 それをブロックアドレスに変換します。 それから、20 個の long が 16 進で 表示されます(フォーマット出力の項参照)。

gid グループ ID

ib dot の現在の値をインダイレクトブロックインデックスとして使用します。 インダイレクトブロック番号は 0 〜 2 です。 これは、インダイレクトブロック自身を獲得するだけです(そのブロックは、 実際のブロックを指すポインタを持っています)。 実際のブロックを獲得するためには、 file コマンドを使ってブロック 12 から始めてください。

ln リンクカウント

mt 変更時刻

md モード

maj メジャーデバイス番号

min マイナーデバイス番号

nm ここに挙げていますが、このコマンドは実際には ディレクトリ名フィールドに対して操作を行います。 希望するディレクトリエントリに落ち着くと (directory コマンドを使用)、 このコマンドにより、ディレクトリ名を変更したり表示したりできます。 例えば、 > 7:dir:nm="foo" これは、現在の inode の 7 番目のディレクトリエントリを獲得し、 その名前を foo に変更します。 名前は、セットアップされているフィールドより長くはできません。 そうしようとすると、文字列は適当な長さに短くされ、 このことが警告メッセージとして表示されます。

sz ファイルサイズ

uid ユーザ ID

フォーマット出力

2 つのスタイルと多くのフォーマットタイプがあります。 2 つのスタイルは、構造型と非構造型です。 構造型の出力は、 i ノード、ディレクトリ、スーパーブロックなどを 表示するのに用いられます。 非構造型はデータをそのまま表示するものです。 以下の表では、異なる表示方法を示しています。

? 

c シリンダグループとして表示します

i i ノードとして表示します

d ディレクトリとして表示します

s スーパーブロックをして表示します

/

b バイトとして表示します

c 文字として表示します

o O 8 進の short または long として表示します

d D 10 進の short または long として表示します

x X 16 進の short または long として表示します

/ または ?  の直後に フォーマット指定が続きます。 /b およびすべての ?  フォーマットによって表示される値は、 現在の base で表示されます。 また、 type は、コマンド実行終了後、適当に更新されます。

使用例

> 2000+400%(20+20)=D
10 進で 2010 を表示します(複雑な計算をするのに、電卓として fsdb を使用)。

> 386:ino?i i ノード番号 386 を i ノードフォーマットで表示します。 これが現在の inode になります。

> :ln=4 現在の inode に関するリンクカウントを 4 に変更します。

> :ln=+1 リンクカウントを 1 増やします。

> :ct=X 生成時刻を 16 進の long で表示します。

> :mt=t 変更時刻を時刻フォーマットで表示します。

> 0:file/c 現在の inode に関連するファイルのブロック 0 を ASCII で表示します。

> 2:ino,∗?d このファイルシステムのルート i ノードについての ディレクトリエントリに相当する最初のブロックを表示します。 eof に達すると停止します。

> 5:dir:inode; 0:file,∗/c
現在の i ノードを、現在の inode の 5 番目(0 から数える)のディレクトリに関連するものに変更します。 それから、ファイルの最初の論理ブロックを ASCII で表示します。

> :sb このファイルシステムのスーパーブロックを表示します。

> 1:cg?c シリンダグループ 1 のシリンダグループの情報と概要を表示します。

> 2:inode; 7:dir=3
ルートディレクトリの 7 番目のスロットに 関する i ノードを 3 に変更します。

> 7:dir:nm="name"
ディレクトリスロットの名前フィールドを name に変更します。

> 2:db:block,∗?d
現在の inode の 3 番目のブロックをディレクトリエントリとして表示します。

> 3c3:fragment,20:fill=0x20
フラグメント 3c3 を獲得し、20 個の type エレメント全部に 0x20 を書き込みます。

> 2050=0xffffffff
アドレス 2050 の内容を 0xffffffff に設定します。 0xffffffff は、現在の type に従って短く縮められます。

> 1c92434="this is some text"
1c92434 に ASCII 文字列を書き込みます。

関連事項

fsck(8), dir(4), fs(4). 

NEWS-OSRelease 4.1C

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026