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 件のコメント:
コメントを投稿