UFSフォーマットの中を見てみる

2012/09/01

UFS(Unix File System)の構造

UFS ファイルシステムのシリンダグループの構造 - Solaris のシステム管理 (デバイスとファイルシステム)

構造体定義と usr/src/uts/common/fs/ufs/ufs_alloc.c から ufs ファイルシステムの構造を解析してみる。

まずスライスの先頭を読む。

# dd if=/dev/rdsk/c0t0d0s7 of=slice_data count=2048

読み込んだデータは下記の構造になっている。

ブロックの種類 格納されている情報の種類
ブートブロック システムブート時に使用される情報
スーパーブロック ファイルシステムに関する大部分の情報
iノードブロック ファイルに関する名前以外のすべ ての情報
記憶域またはデータブロック 各ファイルのデータ

●ブートブロック[0x00000000~0x00001fff]
ブートプログラムそのものが入っている。起動時に HW によって読み込まれ、カーネルをロードする。

●スーパーブロック[0x00002000~0x00003fff]

002000  00 00 00 00 00 00 00 02 00 00 00 10 00 00 00 18
002010  00 00 00 20 00 00 02 D0 00 00 00 20 FF FF FF F0
002020  4A 23 8C 6E 00 51 F4 F8 00 50 A5 66 00 00 00 7A
002030  00 00 20 00 00 00 04 00 00 00 00 08 00 00 00 01
002040  00 00 00 00 00 00 00 5A FF FF E0 00 FF FF FC 00
002050  00 00 00 0D 00 00 00 0A 00 00 00 10 00 00 08 00
002060  00 00 00 03 00 00 00 01 00 00 08 00 FF FF FE 00
002070  00 00 00 09 00 00 08 00 00 00 00 40 00 00 00 02
002080  00 00 00 00 00 00 00 3F 00 00 00 01 00 00 00 00
002090  00 00 00 00 00 00 00 00 00 00 02 D0 00 00 08 00
0020A0  00 00 20 00 00 00 00 10 00 00 00 3F 00 00 03 F0
0020B0  00 00 29 A1 00 00 00 58 00 00 15 80 00 00 AD 40
0020C0  00 00 00 5E 00 09 F8 A0 00 0A 3E 26 00 00 00 A5
0020D0  00 FD 00 00 2F 65 78 70 6F 72 74 2F 68 6F 6D 65
0020E0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
                          :
                          :
0022C0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0022D0  00 00 00 00 00 00 00 09 00 00 03 00 01 13 C8 00
0022E0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0022F0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
002300  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
002310  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
002320  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
002330  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
002340  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
002350  00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 20
002360  00 01 00 21 00 02 00 22 00 03 00 23 00 00 00 00
002370  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
                          :
                          :
002510  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
002520  00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 D0
002530  00 00 00 00 00 00 00 00 32 03 10 CA 00 00 00 00
002540  00 00 1F FF 00 00 00 00 00 00 03 FF 00 00 00 01
002550  00 00 00 08 00 00 03 5C 00 00 05 60 00 01 19 54

スーパーブロック定義(sys/fs/ufs_fs.h)に当てはめてみる。

fs_link = 0x00000000
fs_rolled = 0x00000002
fs_sblkno = 0x00000010       /* スーパブロックのアドレス */
fs_cblkno = 0x00000018       /* シリンダブロックのオフセット */
fs_iblkno = 0x00000020       /* inode ブロックのオフセット */
fs_dblkno = 0x000002D0       /* データブロックのオフセット */
fs_cgoffset = 0x00000020     /* シリンダ内のシリンダグループオフセット */
fs_cgmask = 0xFFFFFFF0       /* mod fs_ntrak の計算に使われる */
fs_time = 0x4A238C6E         /* 最後に書き込まれた時刻 */
fs_size = 0x0051F4F8         /* fs 内のブロック数 */
fs_dsize = 0x0050A566        /* fs 内のデータブロック数 */
fs_ncg = 0x0000007A          /* シリンダグループの数 */
fs_bsize = 0x00002000        /* fs 内の基本ブロックサイズ */
fs_fsize = 0x00000400        /* fs 内のフラグメントブロックサイズ */
fs_frag = 0x00000008         /* fs の1ブロック中のフラグメント数 */
fs_minfree = 0x00000001      /* フリーブロックの最小パーセンテージ */
fs_rotdelay = 0x00000000     /* 最適な次ブロックのための ms 数 */
fs_rps = 0x0000005A          /* 1 秒あたりのディスク回転 */
fs_bmask = 0xFFFFE000        /* blkoff ブロックオフセットの計算 */
fs_fmask = 0xFFFFFC00        /* fragoff フラグメントオフセットの計算 */
fs_bshift = 0x0000000D       /* lblkno 論理ブロック番号の計算 */
fs_fshift = 0x0000000A       /* numfrags フラグメント数の計算 */
fs_maxcontig = 0x00000010    /* 連続したブロックの最大数 */
fs_maxbpg = 0x00000800       /* シリンダグループあたりの最大ブロック数 */
fs_fragshift = 0x00000003
fs_fsbtodb = 0x00000001
fs_sbsize = 0x00000800       /* スーパーブロックの実際のサイズ */
fs_csmask = 0xFFFFFE00
fs_csshift = 0x00000009
fs_nindir = 0x00000800       /* NINDIR の値 */
fs_inopb = 0x00000040        /* INOPB の値 */
fs_nspf = 0x00000002         /* NSPF の値 */
fs_optim = 0x00000000
fs_npsect = 0x0000003F
fs_si = 0x00000001
fs_trackskew = 0x00000000    /* トラックあたりのセクタ 0 ゆがみ */
fs_id[0] = 0x00000000        /* ユニークなファイルシステム ID */
fs_id[1] = 0x00000000        /* ユニークなファイルシステム ID */
fs_csaddr = 0x000002D0       /* シリンダグループ総括領域のブロックアドレス */
fs_cssize = 0x00000800       /* シリンダグループ総括領域のサイズ */
fs_cgsize = 0x00002000       /* シリンダグループサイズ */
fs_ntrak = 0x00000010        /* シリンダあたりのトラック数 */
fs_nsect = 0x0000003F        /* トラックあたりのセクタ数 */
fs_spc = 0x000003F0          /* シリンダあたりのセクタ数 */
fs_ncyl = 0x000029A1         /* ファイルシステムのシリンダ数 */
fs_cpg = 0x00000058          /* グループあたりのシリンダ数 */
fs_ipg = 0x00001580          /* グループあたりの inode 数 */
fs_fpg = 0x0000AD40          /* グループあたりのブロック数 * fs_frag */
fs_cstotal.cs_ndir = 0x0000005E        /* シリンダ総括情報 */
fs_cstotal.cs_nbfree =0x0009F8A0
fs_cstotal.cs_nifree = 0x000A3E26
fs_cstotal.cs_nffree = 0x000000A5
fs_fmod = 0x00               /* スーパブロック変更フラグ */
fs_clean = 0xFD              /* ファイルシステムがクリーンであるフラグ */
fs_ronly = 0x00              /* 読み込み専用でマウントされたフラグ */
fs_flags = 0x00              /* 現在未使用のフラグ */
fs_fsmnt[] = "/export/home"  /* マウントされている名前 */
fs_cgrotor = 0x00000009      /* 最後に検索された cg */
fs_u.fs_csp_pad[32] = ...    /* fs_cs 情報バッファのリスト */
(fs_u.fs_csp)
fs_cpc = 0x00000000          /* postbl 内のサイクルあたりのシリンダ */
fs_opostbl[16][8] = ...      /* 旧回転ブロックリストヘッド */
fs_sparecon[51] = ...        /* 将来のために予約された定数 */
fs_version = 0x00000000
fs_logbno = 0x00000000
fs_reclaim = 0x320310CA
fs_sparecon2 = 0x00000000    /* 将来のために予約された定数 */
fs_state = 0x00001FFF        /* fs_clean フィールドが有効であることを示す */
fs_qbmask = 0x00000000       /* ~fs_bmask - 64 ビットサイズで使う */
fs_qfmask = 0x000003FF       /* ~fs_fmask - 64 ビットサイズで使う */
fs_postblformat = 0x00000001 /* 位置レイアウトテーブルのフォーマット */
fs_nrpos = 0x00000008        /* 回転位置の数 */
fs_postbloff = 0x0000035C    /* 回転ブロックリストヘッド */
fs_rotbloff = 0x00000560     /* 各回転毎のブロック */
fs_magic = 0x00011954        /* マジックナンバ */
fs_space[1] = 0x04           /* 各回転毎のブロックのリスト */

●シリンダーグループ
inodeビットマップ、空きブロックビットマップなどの情報

006000  00 00 00 00 00 09 02 55 4A 24 CC ED 00 00 00 00
006010  00 58 15 80 00 00 AD 40 00 00 00 53 00 00 12 4A
006020  00 00 14 BE 00 00 00 51 00 00 1E A8 00 00 17 D8
006030  00 00 00 B0 00 00 00 00 00 00 00 01 00 00 00 01
006040  00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 04
006050  00 00 00 07 00 00 00 A8 00 00 02 08 00 00 07 88
006060  00 00 0A 38 00 00 1F E0 00 00 00 00 00 00 00 00
006070  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
006080  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
006090  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0060A0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0060B0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0060C0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0060D0  00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 2C
0060E0  00 00 00 33 00 00 00 32 00 00 00 3F 00 00 00 3F
0060F0  00 00 00 3F 00 00 00 3F 00 00 00 3F 00 00 00 3F

シリンダグループ定義(sys/fs/ufs_fs.h)に当てはめてみる

cg_link = 0x00000000           /* 未使用領域 */
cg_magic = 0x00090255          /* マジックナンバー */
cg_time = 0x4A24CCED           /* 最終書き込み時間 */
cg_cgx = 0x00000000            /* cg_cgx */
cg_ncyl = 0x0058               /* シリンダ数/グループ */
cg_niblk = 0x1580              /* inodeブロック数/グループ */
cg_ndblk =0x0000AD40           /* dataブロック数/グループ */
cg_cs.cs_ndir = 0x00000053     /* シリンダ総括情報 */
cg_cs.cs_nbfree = 0x0000124A
cg_cs.cs_nifree = 0x000014BE
cg_cs.cs_nffree = 0x00000051
cg_rotor = 0x00001EA8          /* 最後に使用したブロック */
cg_frotor = 0x000017D8         /* 最後に使用したフラグメント */
cg_irotor = 0x000000B0         /* 最後に使用した inode */
cg_frsum[8] = 00000000 00000001 00000001 00000000  /* counts of available frags */
              00000000 00000001 00000004 00000007
cg_btotoff = 0x000000A8        /* 空きブロックテーブルオフセット */
cg_boff = 0x00000208           /* free block positions */
cg_iusedoff = 0x00000788       /* 使用済み inodeビットマップオフセット */
cg_freeoff = 0x00000A38        /* 空きブロックビットマップオフセット */
cg_nextfreeoff = 0x00001FE0    /* next available space */
cg_sparecon[16] = ...          /* 予約領域 */
cg_space[1] = ...              /* 空きブロック数/シリンダ */

●i-node ブロック[0x008000~]
i-node は、ファイルのデータのディスク上のアドレスのテーブルを保持している。アドレスの一覧表は、次のように10 個の直接ブロックと、 3 個の間接ブロック(シングル、ダブル、トリプル)という形になっている。

直接ブロック データブロックのアドレスを直接ポイント
間接ブロック(シングル) 256個の直接ブロックからなるテーブルをポイント
間接ブロック(ダブル) 256個の間接ブロック(シングル)からなるテーブルをポイント
間接ブロック(トリプル) 256個の間接ブロック(ダブル)からなるテーブルをポイント
008000  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
008010  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
008020  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
008030  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
008040  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
008050  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
008060  00 00 00 00 00 00 00 00 00 00 00 00 6A 1C D5 1F
008070  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

008080  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
008090  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0080A0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0080B0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0080C0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0080D0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0080E0  00 00 00 00 00 00 00 00 00 00 00 00 5E 1C 02 1D
0080F0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

008100  41 ED 00 07 00 00 00 00 00 00 00 00 00 00 02 00
008110  4A 24 CC D3 00 0E 61 78 4A 1B AE AE 00 03 BB 07
008120  4A 1B AE AE 00 03 BB 07 00 00 02 E0 00 00 00 00
008130  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
008140  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
008150  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
008160  00 00 00 00 00 00 00 00 00 00 00 02 10 0E 68 66
008170  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

008180  41 C0 00 02 00 00 00 00 00 00 00 00 00 00 20 00
008190  4A 24 CC 96 00 0B 08 91 49 D4 5C 1B 00 00 00 00
0081A0  49 D4 5C 1B 00 00 00 00 00 00 02 D8 00 00 00 00
0081B0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0081C0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0081D0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0081E0  00 00 00 00 00 00 00 00 00 00 00 10 7D 5F 44 5A
0081F0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

009D80  81 A4 00 01 00 65 00 01 00 00 00 00 02 62 00 00
009D90  49 E8 27 03 00 0A A5 39 49 E8 27 08 00 0B 8F 14
009DA0  49 E8 27 08 00 0B 8F 14 00 00 18 98 00 00 19 20
009DB0  00 00 19 28 00 00 19 30 00 00 19 38 00 00 19 40
009DC0  00 00 19 48 00 00 19 50 00 00 19 58 00 00 19 60
009DD0  00 00 19 68 00 00 19 70 00 00 B0 F8 00 01 5A 88
009DE0  00 00 00 00 00 00 00 00 00 01 31 40 65 D2 D2 B0
009DF0  00 00 00 00 00 00 00 65 00 00 00 01 00 00 00 00

inode テーブルの定義(sys/fs/ufs_inode.h)に当てはめてみる

  59 -rw-r--r--   1 nishioka   other    39976960  4月 17日  15:51 137137-09.zip
アドレスは i_number(59) * 128 + INOPB(0x40) * 512 = 0x009D80
ic_smode = 0x81A4               /* ファイルタイプ */
ic_nlink = 0x0001               /* リンク数 */
ic_suid = 0x0065                /* 所有者uid */
ic_sgid = 0x0001                /* 所有者gid */
ic_lsize = 0x0000000002620000   /* ファイルサイズ */
ic_atime = 0x49E82703000AA539   /* 最終アクセス時刻 */
ic_mtime = 0x49E82708000B8F14   /* 最終更新時刻 */
ic_ctime = 0x49E82708000B8F14   /* 最終状態変更時刻 */
ic_db[12] = 00001898 00001920 00001928 00001930 00001938 /* 直接ブロック */
            00001940 00001948 00001950 00001958 00001960
            00001968 00001970
ic_ib[3] = 0000B0F8 00015A88 00000000                    /* 間接ブロック*/
ic_flags = 0x00000000           /* cflags */
ic_blocks = 0x00013140          /* ブロック数 */
ic_gen = 0x65D2D2B0             /* ジェネレーション Number */
ic_shadow = 0x00000000          /* シャドウ inode */
ic_uid = 0x00000065             /* EFT バージョン uid */
ic_gid = 0x00000001             /* EFT バージョン gid */
ic_oeftflag = 0x00000000        /* ic_oeftflag */

0 件のコメント:

コメントを投稿