Macのファイル構造について


データ復旧のプロが教えるデータ復元から消去までの豆知識:メールマガジン

================================================================================
 ■■      ■             ■      豆知識  Vol.03-07
■  ■     ■             ■ ■  Macのファイル構造について
■  ■ ◆■■ ■■■ ■ ■ ■■◆ ■■ ■ ■  ■  ■
■  ■ ■ ■ ■  ■■ ■  ■ ■   ■■  ■■ ■ ■■ ■ ■ ■
■  ■ ■ ■ ■  ■  ■  ■ ■ ■ ■ ■  ■ ■■ ■ ■ ■■■■
 ■■  ■ ■ ■■ ■   ■■◆ ■■ ■ ■ ■  ■ ■■  ■ ■
=============================================================2005.07.25=========

Macintoshのファイル構造について

Mac(虫食いリンゴ)のファイル構造について紹介してみましょう。(^^)
今回はもっともMacらしい、漢字Talk以降で使用されているHFS
(Hierarchical File System)について説明いたします。 Mac OS 8
からはHFS+に移行していますが、これではHFSのボリューム構造の上に
入れ子の形で新しい構造を構築しています。 このHFS+については又
何時か日を改めて・・・

まずは、Mac(M6800/PowerPC系)とAT互換機(Intel系)のメモリー構成の
違いについて・・・

【メモリー空間】

メモリー空間(論理=物理)

    00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0000 ┏━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┓
0010 ┣━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━┫
0020 ┣━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━┫
0030 ┣━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━┫
0040 ┣━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━┫
0050 ┣━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━┫
0060 ┣━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━┫
0070 ┣━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━┫

連続のメモリー空間を表現するには通常、上図の様に表しますが、モトローラ系
をはじめ一般的なMPUでは、上図の様に論理配置と物理配置は一致して
います。 しかしながら、インテル系のCPU/チップセットでは偶/奇アドレス
が逆転している為、実メモリー上では次の様に配置されます。

    01 00 03 02 05 04 07 06 09 08 0B 0A 0D 0C 0F 0E
0000 ┏━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┓
0010 ┣━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━┫
0020 ┣━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━┫
0030 ┣━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━┫
0040 ┣━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━┫
0050 ┣━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━┫
0060 ┣━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━┫
0070 ┣━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━╋━┫

メモリー基板を2枚セットで交換しなければならないチップセットの場合は
2枚のメモリー基板に以下の様に割当てられます。

Bank-0 01 03 05 07 09 0B 0D 0F
0000 ┏━┳━┳━┳━┳━┳━┳━┳━┓
0010 ┣━╋━╋━╋━╋━╋━╋━╋━┫
0020 ┣━╋━╋━╋━╋━╋━╋━╋━┫
0030 ┣━╋━╋━╋━╋━╋━╋━╋━┫
0040 ┣━╋━╋━╋━╋━╋━╋━╋━┫
0050 ┣━╋━╋━╋━╋━╋━╋━╋━┫
0060 ┣━╋━╋━╋━╋━╋━╋━╋━┫
0070 ┣━╋━╋━╋━╋━╋━╋━╋━┫

Bank-1 00 02 04 06 08 0A 0C 0E
0000 ┏━┳━┳━┳━┳━┳━┳━┳━┓
0010 ┣━╋━╋━╋━╋━╋━╋━╋━┫
0020 ┣━╋━╋━╋━╋━╋━╋━╋━┫
0030 ┣━╋━╋━╋━╋━╋━╋━╋━┫
0040 ┣━╋━╋━╋━╋━╋━╋━╋━┫
0050 ┣━╋━╋━╋━╋━╋━╋━╋━┫
0060 ┣━╋━╋━╋━╋━╋━╋━╋━┫
0070 ┣━╋━╋━╋━╋━╋━╋━╋━┫

【Mac OS の推移】

Mac OSはアップル社が開発した同社のコンピュータ「Macintosh」
用のOSで、現行のMac OSは1990年に登場した「System7」の
系列になるものです。 日本では92年に「System7」をベースにした
漢字Talk7.1がリリースされ、現在に至りますがが、97年に名称は
「Mac OS」(Mac OS 7.6)に統一された。

 OS名称       CPU         ファイルシステム
漢字Talk 7.x   680x0       HFS
            PowerPC
Mac OS 7.61   PowerPC60x  HFS
Mac OS 8.x    PowerPC60x  HFS/HFS+
Mac OS 9.x    PowerPC G3   HFS/HFS+
Mac OS X.x    PowerPC G4   HFS/HFS+/UFS

【Mac OS のファイル構造】

[HFS=階層化ファイルシステム(Hierarchical File System)]

《HFS ボリューム構造》

┏━━━━━━━┳━━━━┳━━━━━━┳━━━━━━━━━━━━━━┓
┃物理セクタ番号┃識別文字┃  略号  ┃     内容       ┃
┣━━━━━━━╋━━━━╋━━━━━━╋━━━━━━━━━━━━━━┫━━┓
┃     0 ┃ ER ┃ ER   ┃Drive Discriptor Map    ┃  ┃
┣━━━━━━━╋━━━━╋━━━━━━╋━━━━━━━━━━━━━━┫┳┓┃
┃     1 ┃ PM ┃ PM-PM ┃Apple Partition Map     ┃┃┃┃
┣━━━━━━━╋━━━━╋━━━━━━╋━━━━━━━━━━━━━━┫┃┃┃
┃     2 ┃ PM ┃ PM-DR ┃Apple Driver        ┃┃┃
┣━━━━━━━╋━━━━╋━━━━━━╋━━━━━━━━━━━━━━┫PM-PM②
┃     3 ┃ PM ┃ PM-HF ┃Apple HFS          ┃┃PM-PM④
┣━━━━━━━╋━━━━╋━━━━━━╋━━━━━━━━━━━━━━┫┃┃┃
┃     4 ┃ PM ┃ PM-FR ┃Apple Free         ┃┃┃┃
┣━━━━━━━╋━━━━╋━━━━━━╋━━━━━━━━━━━━━━┫┛┃┃
┃  5-63 ┃    ┃      ┃複数区画割り当て領域    ┃ ┃┃
┣ER⑧━━━━━╋━━━━╋━━━━━━╋━━━━━━━━━━━━━━┫┳┛┃
┃ 64-95 ┃    ┃ DR   ┃Disk Driver         ┃ER⑨┃
┣PM-HF③ ━━━╋━━━━╋━━━━━━╋━━━━━━━━━━━━━━┫┫ ┃
┃ 96-97 ┃ LK ┃ LK   ┃Boot Block         ┃┃ ┃
┣━━━━━━━╋━━━━╋━━━━━━╋━━━━━━━━━━━━━━┫┃ ER③
┃    98 ┃ BD ┃ VIB  ┃Volume Information Block  ┃┃ ┃
┣━━━━━━━╋━━━━╋━━━━━━╋━━━━━━━━━━━━━━┫┃ ┃
┃ 99-114 ┃    ┃ ABM  ┃Allocation Bit Map     ┃┃ ┃
┣━━━━━━━╋━━━━╋━━━━━━╋━━━━━━━━━━━━━━┫┃ ┃
┃  115-2162 ┃    ┃ ETA  ┃Extent Tree Area      ┃┃ ┃
┣━━━━━━━╋━━━━╋━━━━━━╋━━━━━━━━━━━━━━┫┃ ┃
┃  2163-4210 ┃    ┃ CTA  ┃Catalogue Tree Area     ┃PM-HF④
┣━━━━━━━╋━━━━╋━━━━━━╋━━━━━━━━━━━━━━┫┃ ┃
┃ 4211~ ┃    ┃ DA   ┃Data Area          ┃┃ ┃
┃       ┃    ┃      ┃この領域にデータフォーク、 ┃┃ ┃
=       =    =      =リソースフォーク及び拡張  =┃ ┃
┃       ┃    ┃      ┃Tree Area が収納される   ┃┃ ┃
┣━━━━━━━╋━━━━╋━━━━━━╋━━━━━━━━━━━━━━┫┃ ┃
┃ Volume終端-1 ┃ BD ┃ MIR-BD┃BDの複製         ┃┃ ┃
┣━━━━━━━╋━━━━╋━━━━━━╋━━━━━━━━━━━━━━┫┃ ┃
┃ Volume終端  ┃    ┃      ┃空き            ┃┃ ┃
┣━━━━━━━╋━━━━╋━━━━━━╋━━━━━━━━━━━━━━┫┛ ┃
┃ 残余領域  ┃    ┃      ┃Apple Free Area       ┃  ┃
┗━━━━━━━┻━━━━┻━━━━━━┻━━━━━━━━━━━━━━┛━━┛

I/O Block Size(論理I/Oサイズ)=>FATクラスタサイズ相当

 Allocation block Size = PM-HF④ / 65535 の切り上げ
 I/O Block Size = Allocaction Block Size * ER②

-ERブロックの構造

    00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0000 ┏━━━┳━━━┳━━━━━━━┳━━━┳━━━┳━━━━━━━┓
   ┃ ① ┃ ② ┃   ③   ┃ ④ ┃ ⑤ ┃   ⑥   ┃
0010 ┣━━━╋━━━┻━━━┳━━━╋━━━╋━━━┻━━━━━━━┛
   ┃ ⑦ ┃   ⑧   ┃ ⑨ ┃ ⑩ ┃
   ┗━━━┻━━━━━━━┻━━━┻━━━┛

① sbSig      (word)         このセクタがDrive Discriptor Mapである事を
               示す文字列「ER」が格納される。
② sbBlkSize  (word)         このデバイスのブロックサイズを示す
③ sbBlkCount (double word)  デバイスに割当てられたブロック数を示す。
④ sbDevType  (word)         媒体種別を表す。
⑤ sbDevID    (word)         SCSI デバイスIDを示す。
⑥ sbData     (double word)  未使用
⑦ sbDrvrCount(word)         Driver Descriptorの数を表す。
⑧ ddBlock    (double word)  ドライバーの最初のブロックの位置を示す。
⑨ ddSize     (word)         ドライバーが使うブロックの数を示す。
⑩ ddType     (word)         System Type

-PMブロックの構造

PMブロックは複数のブロックからなり、物理セクタ1~63迄に配置される。
各ブロックの先頭には「PM」という識別文字が入る。 これには機能により
次の4種がある。

・ パーティションマップ
・ HFS情報(ボリューム情報に相当)
・ ドライバー情報(MacではHDD単位にサードパーティ製のディスク
          ドライバーを使用する事が可能でこれを格納する領域を
          定義するもの)
・ フリーエリア情報(未使用領域情報)

    00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0000 ┏━━━┳━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━┓
   ┃ ① ┃未使用┃   ②   ┃   ③   ┃   ④   ┃
0010 ┣━━━┻━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┫
   ┃               ⑤               ┃
   ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

① pdSig      (word)         このセクタがDevice Partition Mapである事を
               示す「PM」が格納される。
② pmBlkCnt   (double word)  Device Partition Mapが幾つあるかを示す。
               パーティションマップの場合のみ有効。
③ pdStart    (double word)  この機能ブロックが始まるブロックアドレスが
               格納される。
④ pbBlkCnt   (double word)  この機能ブロックに割当てられているブロック
               数が入る。
⑤ pdType     (32Byte)       パーティションマップの種類を示す文字列が
               格納される。
             ・ Apple partition map
             ・ Apple HFS
             ・ Apple Driver
             ・ Apple Free    の何れかが格納される。

《ブートブロックの構造》

ブートフロック以降がボリュームとして扱われる。 区画論理ブロックの先頭0
がこれに当たる。

    00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0000 ┏━━━┳━━━━━━━┳━━━┳━━━┳━━━━━━━━━━━┓
   ┃ ① ┃   ②   ┃ ③ ┃未使用┃  ④        ┃
0010 ┣━━━┻━━━━━━━┻━━━┻━━━╋━━━━━━━━━━━┫
   ┃System File Name           ┃  ⑤        ┃
0020 ┣━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━┫
   ┃Finder File Name           ┃  ⑥        ┃
0030 ┣━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━┫
   ┃Debugger File Name          ┃  ⑦        ┃
0040 ┣━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━┫
   ┃Disassembler File Name        ┃  ⑧        ┃
0050 ┣━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━┫
   ┃Startup Screen File Name       ┃  ⑨        ┃
0060 ┣━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━┫
   ┃Initial File to RUN          ┃  ⑩        ┃
0070 ┣━━━━━━━━━━━━━━━━━━━╋━━━┳━━━┳━━━┫
   ┃Cripboard File Name          ┃ ⑪ ┃ ⑫ ┃ ⑬ ┃
0080 ┣━━━┳━━━┳━━━┳━━━━━━━╋━━━┻━━━┻━━━┫
   ┃未使用┃未使用┃未使用┃   ⑭   ┃     ⑮     ┃
   ┗━━━┻━━━┻━━━┻━━━━━━━┻━━━━━━━━━━━┛

① bbSig      (word)         このセクタがブートブロックである事を示す
               「LK」が格納される。
② bbCodeSec  (double word)  ブートプログラムコードセクションへの分岐
               命令そのものが格納される。
③ bbVer      (word)         ブートプログラムのバージョン情報が入る。
④ ④ System File Name ~⑩ Cripboard File Name 迄は起動シーケンスの
~ 中で使用されるシステムファイルの名称が格納される。
⑩
⑪ bbMaxFil   (word)         オープン出来るファイルの最大数を示す。
⑫ bbMaxEV    (word)         イベントマネージャが管理する最大のイベント
               数を示す。
⑬ bbSyh128   (word)         128KB ROM システムでのシステムヒープサイズ
               を示す。
⑭ bbSyn512   (double word)  512KB ROM システムでのシステムヒープサイズ
               を示す。
⑮ Boot Program Code Section これ以降に起動プログラムが格納される。

《ボリュームインフォメーションブロック(VIB)の構造》

VIBにはボリューム名、アロケーションブロック情報、ファイル管理に使用
するエクステント・ツリー及びカタログ・ツリーの位置情報等が含まれている。

    00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0000 ┏━━━┳━━━━━━━┳━━━━━━━┳━━━┳━━━┳━━━┓
   ┃ 01 ┃   02   ┃   03   ┃ 04 ┃ 05 ┃ 06 ┃
0010 ┣━━━╋━━━┳━━━┻━━━┳━━━┻━━━╋━━━╋━━━┫
   ┃ 07 ┃ 08 ┃   09   ┃   10   ┃ 11 ┃ 12 ┃
0020 ┣━━━╋━━━╋━┳━━━━━┻━━━━━━━┻━━━┻━━━┫
   ┃   ┃ 13 ┃14┃  15                  ┃
0030 ┣━━━┻━━━┻━┻━━━━━━━━━━━━━━━━━━━━━┫
   ┃                               ┃
0040 ┣━━━━━━━┳━━━┳━━━━━━━┳━━━━━━━┳━━━┫
   ┃   16   ┃ 17 ┃   18   ┃   19   ┃ 20 ┃
0050 ┣━━━┳━━━╋━━━┻━━━┳━━━┻━━━┳━━━┻━━━┫
   ┃   ┃ 21 ┃   22   ┃   23   ┃  24    ┃
0060 ┣━━━┻━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┫
   ┃                               ┃
0070 ┣━━━━━━━━━━━━━━━━━━━━━━━┳━━━┳━━━┫
   ┃                       ┃ 25 ┃ 26 ┃
0080 ┣━━━┳━━━━━━━┳━━━━━━━━━━━┻━━━┻━━━┫
   ┃ 27 ┃   28   ┃  29                ┃
0090 ┣━━━╋━━━━━━━╋━━━━━━━━━━━━━━━━━━━┫
   ┃   ┃   30   ┃  31                ┃
00A0 ┣━━━╋━━━━━━━┻━━━━━━━━━━━━━━━━━━━┛
   ┃   ┃
   ┗━━━┛

01 drSib      (word)         VIB を示す「DB」が格納される。
02 drCrDat    (double word)  ボリュームを作成した日付・時間が入る。
03 drLsMod    (double word)  最後に変更を行った日付・時間が入る。
04 drAtrb     (word)         ボリュームの属性が入る。
05 drNmFls    (word)         ディレクトリに含まれるファイルの総数。
06 drVBMST    (word)         ボリューム・ビットマップの最初のブロック
               番号が入る。
07 drAllocPtr (word)         システムが使用。
08 drNmBlks   (word)         このボリュームのアロケーションブロックの
               総数が入る。
09 drAlBliSiz (double word)  アロケーションブロックのサイズ(byte)が
               入る。
10 drClpSiz   (double word)  クランプサイズの初期値が入る。
               (連続しているアロケーションブロック数)
11 drAlBlSt   (word)         ビットマップ中の最初のブロックアドレス。
12 drNxtCNID  (double word)  次の未使用ディレクトリID若しくはファイル
               番号が入る。
13 drFreeBrs  (word)         未使用アロケーションブロックの数。
14 drVN       (byte)         ボリューム名の長さ(最大27バイト)
15 drVN+1 からボリューム名が格納される。
16 drVolBkUp  (double word)  最後にバックアップを行った日付・時間が入る。
17 drVSeqNum  (word)         システム使用域
18 drWrCnt    (double word)  ボリュームへの書込み回数。
19 drXTClpSiz (double word)  エクステント・ツリーのクランプサイズ。
20 drCTClpSiz (double word)  カタログ・ツリーのクランプサイズ。
21 drNmRtDir  (word)         ルートに含まれるディレクトリの数。
22 drFilCnt   (double word)  ボリュームに含まれるファイルの総数。
23 drDirCnt   (double word)  ボリュームに含まれるディレクトリの総数。
24 drFndrInfo (32byte)       Finder が使用する情報領域。
25 drVCSize   (word)         システム内部使用域。
26 drVCBMSize (word)         システム内部使用域。
27 drCtlCSize (word)         システム内部使用域。
28 drXTFlSize (double word)  エクステント・ツリーの長さ
29 drXTExtRec (12byte)       エクステント・ツリー拡張レコード。
30 drCTFlSize (double word)  カタログ・ツリーの長さ
31 drCTExtRec (12byte)       カタログ・ツリーの最初の拡張レコード。


29/30 のエクステント/カタログ・ツリー拡張レコードの構成

drXTExtRec/drCTExtRec にはそれぞれ3つ迄のエクステント・ツリー/カタログ
・ツリーのスタート位置と大きさに関する情報が格納される。

    00 01 02 03 04 05 06 07 08 09 0A 0B
0000 ┏━━━┯━━━┳━━━┯━━━┳━━━┯━━━┓
   ┃ ① │ ② ┃   │   ┃   │   ┃
   ┗━━━┷━━━┻━━━┷━━━┻━━━┷━━━┛

① TrRec     (word)          各ツリー領域が始まるアロケーションブロック
               番号
② TrSiz     (word)          ツリー領域のアロケーションブロック数

注)最初のエクステント・ツリー領域はボリュームビットマップの直後に取られ
  その先頭がアロケーションブロック#0になる。

【ツリー構造の基礎】

Macにおけるディレクトリ構造やファイルの論理情報及びその格納位置等は
B*ツリーと呼ばれる構造を採っています。 B*ツリーはノードと呼ばれる
情報格納単位の集合となります。

《B*ツリー構造》

    00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0000 ┏━━━━━━━┳━━━━━━━┳━┳━┳━━━┳━━━┳━━━┓
   ┃   ①   ┃   ②   ┃③┃④┃ ⑤ ┃ ⑥ ┃   ┃
0010 ┣━━━━━━━┻━━━━━━━┻━┻━┻━━━┻━━━┛   ┃
   ┃node-record-0 (20byte)                    ┃
0020 ┃   ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
   ┃   ┃node-record-1 (26byte)                ┃
0030 ┣━━━┛                   ┏━━━━━━━┫
   ┃                       ┃node-record-2 ┃
0040 ┣━━━━━━━━━━━━━━━━━━━━━━━┛       ┃
   ┃                               ┃
0050 ┃       ┏━━━━━━━━━━━━━━━━━━━━━━━┫
   ┃       ┃node-record-3                 ┃
0060 ┣━━━━━━━┛                       =
   =                               ┃
0xD0 ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
   ┃free Space                          ┃
0xE0 ┃                               ┃
   ┃                               ┃
0xF0 ┃           ┏━━━┳━━━┳━━━┳━━━┳━━━┫
   ┃           ┃ NR-F ┃ NR-3 ┃ NR-2 ┃ NR-1 ┃ NR-0 ┃
   ┗━━━━━━━━━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛

① ndFLink    (double word)  前のノード番号
② ndBlink    (double word)  次のノード番号
③ ndType     (byte)         インデックス・ノード:00
               ヘッダ・ノード   :01
               マップ・ノード   :02
               リーフ・ノード   :03
④ ndNHeight  (byte)         各ノードのレベルを示す番号が入る。
               リーフ・ノード   :01
               インデックス・ノードはルートに近づく程
               大きな値を持つ。 逆に言えば、同じ番号を
               持つインデックスノードのブロックはルート
               からの深さが同じ事を示している事になる。
⑤ ndRecs     (word)         このノードブロックに含まれるレコードの数を
               示す。
⑥ ndReserv   (word)         未使用

  NR-0    (word)         最初のノードレコードの格納位置が入る。
               この値は常に“000E”hである。
  NR-1    (word)         2番目のノードレコードの格納位置が入る。
               このケースでは“0022”hである。
  NR-2    (word)         3番目のノードレコードの格納位置が入る。
               このケースでは“003C”hである。
  NR-3    (word)         4番目のノードレコードの格納位置が入る。
               このケースでは“0054”hである。
  NR-F    (word)         未使用領域の先頭オフセットが入る。
               このケースでは“0xD0”hである。

この図は“Macで削除を行うとデータの回収は不能な理由”を示している。
例えば上図の node-record-1 が削除された場合、

・ node-record-2 以降 Free Space 迄の内容を node-record-1 の先頭位置
  迄26バイト前詰めする。
・ NR-2 ~ NR-F の値から夫々26を引いた上で NR-1 にシフトする。
・ ⑤のndRecs の値から1を引く。

  という動作をします。

これからお分かりの様に、ノードレコード自体が上書きされてしまいますので
削除した瞬間、ファイルディレクトリに関する全ての論理情報を失って
しまいます。


《ヘッダ・ノードの構造》

エクステント/カタログ・ツリー領域の最初のブロックは何れもヘッダ・ノード
で、この中に各ツリー全体の構造を示す情報を格納している。

    00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0000 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━┓
   ┃                           ┃ ① ┃
0010 ┣━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━┻━━━┫
   ┃   ②   ┃   ③   ┃   ④   ┃   ⑤   ┃
0020 ┣━━━┳━━━╋━━━━━━━╋━━━━━━━╋━━━━━━━┫
   ┃ ⑥ ┃ ⑦ ┃   ⑧   ┃   ⑨   ┃       ┃
0030 ┣━━━┻━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┫
   ┃                               ┃
0040 ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
   =                               =
0070 ┣━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┫
   ┃               ┃node-record-2 (System work)  ┃
0080 ┣━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━┫
   ┃                               ┃
0070 ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
   =                               =
00F0 ┣━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┫
   ┃               ┃node-record-3 (Bitmap)    ┃
00x0 ┣━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━┫

① word       フォルダ構造の最大階層数
② double word    ルートノード番号
③ double word    リーフノードの数
④ double word    最初のリーフノードの番号
⑤ double word    最後のリーフノードの番号
⑥ word       ノードブロックのサイズ
⑦ word       検索キーの最大長(byte)
⑧ double word    使用ノード数
⑨ double word    未使用ノード数

node-record-2     ファイルマネージャが使用する作業領域。
           先頭オフセットは “78”h から始まる事が多い。
node-record-3     このツリーのビットマップ。先頭のオフセットは
           “F8”h から始まる事が多い。
           このビットマップはどのノードが使用されているかを
           示すもの。

【エクステント/カタログ・ツリーの基本レコード構造】

┏━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┓
┃①┃    ②    ┃         ③            ┃
┗━┻━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━┛

① ノード長  1byte   キーの長さ
② キー   255byte以内 検索キー
③ データ又はポインタ   データではキーに続く1バイトによって示される
              レコードの種類によってこのフィールドの形態と
              長さが決まる。

【エクステント・ツリー・レコードの構造】

エクステント・ツリー領域にはファイルが分断記録される場合、その情報が
格納される。 そのフォーマットは以下の通り。

    00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0000 ┏━┳━┳━━━━━━━┳━━━┳━━━┯━━━┳━━━┯━━━┓
   ┃①┃②┃   ③   ┃ ④ ┃ ⑤ │ ⑥ ┃ ⑦ │ ⑧ ┃
0010 ┣━┻━┿━━━┳━━━┻━━━┻━━━┷━━━┻━━━┷━━━┛
   ┃ ⑨ │ ⑩ ┃
   ┗━━━┷━━━┛

① byte       キーの長さ(②~④がキー、通常は“07”h)
② byte       フォークの種類  “00”h : データ・フォーク
                    “01”h : リソース・フォーク
③ double word    ファイルのID番号
④ word       このファイル用の先頭アロケーション・ブロック番号
⑤+⑥/⑦+⑧/⑨+⑩   1つのエクステント・ツリー・レコードには3つ迄の
           フラグメント情報を記録出来る。
⑤/⑦/⑨ double word フラグメントのアロケーション・ブロック番号
⑥/⑧/⑩ double word フラグメントの使用アロケーション・ブロック数

3つを超える場合は、インデックスを介して、他のレコードに入る。

【カタログ・ツリーの構造】

カタログ・ツリーには、全てのファイル/ディレクトリの名称が格納される。
又、このツリーの位置と大きさは VIBの中に記述される。

カタログ・ツリーは1セクター単位の“ノード”の集合である。 全てのノードは
固有の「カタログ・ノードID」(CNID)を持っており、ディレクトリのID
は「ディレクトリID」、ファイルのIDは「ファイルID」と呼ばれる。

最初の16個のIDはシステムが使用する。 この中には、
・ ルート・ディレクトリのペアレントID
・ ルート・ディレクトリのディレクトリID
・ エクステント・ファイルのファイル番号
・ カタログ・ファイルのファイル番号
・ バッド・アロケーション・ブロック・ファイルのファイル番号
等が収められている。

《カタログ・ツリーに含まれるノードの種類》

カタログ・ツリーの中には以下の5種類のノードが存在する。

-ヘッダ・ノード    カタログ・ツリーの全体構造を示す。 構造体自体は
            前出のヘッダー・ノードに同じ。
-インデックス・ノード B*ツリーの検索に関する情報を格納する。
            ルートレベル>インデックスノードレベル>1
-リーフ・ノード    ファイル情報を格納する、B*ツリーの末端レコード
            これには4種類のレコードがある。
-ルート・ノード    Bツリー構造のおおもと。 すべての検索はこの
            レコードから始まる。

《リーフ・ノードの構造》

-ディレクトリ・レコード

offset  バイト数          項目
 0000     1    キーの長さ(これ自身は含まず)
 0001     1    未使用
 0002     4    ペアレント・ディレクトリのノードID
 0006     1    ディレクトリの名称の長さ
 0007     n    ディレクトリの名称
            ワードバウンダリ迄は“20”hで埋められる
     これまでがキー領域
 +0001     1    レコードの種類 ディレクトリ・レコード:01
 +0002     1    未使用
 +0003     2    ディレクトリ・フラグ(詳細は不明)
 +0005     2    ディレクトリ中のファイル数
 +0007     4    ディレクトリID
 +000B     4    作成日付と時間
 +000E     4    最終変更日付と時間
 +0013     4    最終バックアップ日付と時間
以降          ファインダが使用する領域

-ファイル・レコード

offset  バイト数          項目
 0000     1    キーの長さ(これ自身は含まず)
 0001     1    未使用
 0002     4    ペアレント・ディレクトリのノードID
 0006     1    ファイル名称の長さ
 0007     n    ファイルの名称
            ワードバウンダリ迄は“20”hで埋められる
     これまでがキー領域
 +0001     1    レコードの種類 ファイル・レコード:02
 +0002     1    未使用
 +0003     1    ファイル・フラグ
            Bit0 : ファイル・ロック
            Bit1 : ファイル・スレッド・レコードあり
            Bit7 : ファイルは使用中
 +0004     1    ファイル種類 現状は常に0
 +0005    16    ファインダ用の作業領域
 +0015     4    ファイルID
 +0019     2    データ・フォークの先頭アロケーションブロック番号
 +001B     4    データ・フォークの最終・論理アロケーションブロック番号
 +001F     4    データ・フォークの最終・物理アロケーションブロック番号
 +0023     2    リソース・フォークの先頭アロケーションブロック番号
 +0025     4    リソース・フォークの最終・論理アロケーションブロック番号
 +0029     4    リソース・フォークの最終・物理アロケーションブロック番号
 +002D     4    作成日付と時間
 +0031     4    最終変更日付と時間
 +0035     4    最終バックアップ日付と時間
 +0039    16    ファインダ用の作業領域
 +0049     2    ファイル・クランプサイズ
 +004B    12    データ・フォークの先頭エクステント・レコード
            (3つ迄の分断はここに記録される)
 +0057    12    リソース・フォークの先頭エクステント・レコード
            (3つ迄の分断はここに記録される)

-ディレクトリ(インデックス)・スレッド・レコード

offset  バイト数          項目
 0000     1    キーの長さ(これ自身は含まず)
 0001     1    未使用
 0002     4    ペアレント・ディレクトリのノードID
 0006     1    ディレクトリの名称の長さ
 0007     n    ディレクトリの名称
            ワードバウンダリ迄は“20”hで埋められる
     これまでがキー領域
 +0001     1    レコードの種類 ディレクトリ・スレッド・レコード:03
 +0002     1    未使用
 +0003     8    未使用
 +000B     4    ペアレント・ディレクトリID
 +000F    32    ディレクトリの名称

-ファイル・スレッド・レコード

offset  バイト数          項目
 0000     1    キーの長さ(これ自身は含まず)
 0001     1    未使用
 0002     4    ペアレント・ディレクトリのノードID
 0006     1    ディレクトリの名称の長さ
 0007     n    ディレクトリの名称
            ワードバウンダリ迄は“20”hで埋められる
     これまでがキー領域
 +0001     1    レコードの種類 ファイル・スレッド・レコード:04
 +0002     1    未使用
 +0003     8    未使用
 +000B     4    このファイルが属するディレクトリID
 +000F    32    ファイルの名称

ユーザーが使用する名称はこのオフセット+000Fからの32バイトの
フィールドに納められる為、Macに許されるファイル/ディレクトリの
名称は32バイトに止まる。

【ファイル・データの構造】

-データ・フォークの構造

多くのアプリケーションはその先頭部に作成したアプリケーションを示す識別子を
入れているが、データフォークは生データだけが収められていると考えて良い。

-リソース・フォークの構造

offset  バイト数          項目
 0000     4    リソース・データのスタート・オフセット
 0004     4    リソース・マップのスタート・オフセット
 0008     4    リソース・データの長さ
 000C     4    リソース・マップの長さ
 0010   可変    リソース・データ
 0nnn   可変    リソース・マップ



							以上
================================================================================
   A1Data RecoveryServices--
======================================================豆知識===Vol.03-07=END====

※本記事は、A1データ株式会社の前身、株式会社ワイ・イー・データ時代に執筆・記載されたコラムです。