ubifs superblock
- 1 superblock node.
- store system data
- superblock node be rewritten only if an automatic resize occurs. (image size < volume size -> resizing)
ubi對LEB的操作是原子操作,以保證資料更新成功。
superblock資料定義在下面這個檔案中。
fs/ubifs/ubifs-media.h
這個檔案描述了ubifs的格式及相關的資料結構和常量的定義。
所有ubifs on-flash objects都是以節點的形式存放的。
所有節點都是以ubifs node magic number開始,并具有相同的的header。
Nodes是8-byte aligned. Node header sizes也是8-byte aligned,(除了indexing node與padding node)。
在看superblock前,記住下面的結構。
#define UBIFS_NODE_MAGIC 0x06101831
struct ubifs_ch {
__le32 magic; // * @magic: UBIFS node magic number (%UBIFS_NODE_MAGIC)
__le32 crc; // * @crc: CRC-32 checksum of the node header
__le64 sqnum; // * @sqnum: sequence number
__le32 len; //* @len: full node length
__u8 node_type; // * @node_type: node type
__u8 group_type; // * @group_type: node group type
__u8 padding[2]; // * @padding: reserved for future, zeroes
} __packed;
struct ubifs_sb_node {
struct ubifs_ch ch; // * @ch: common header
__u8 padding[2]; // * @padding: reserved for future, zeroes
__u8 key_hash; // * @key_hash: type of hash function used in keys
__u8 key_fmt; // * @key_fmt: format of the key
__le32 flags; // * @flags: file-system flags: UBIFS_FLG_BIGLPT or UBIFS_FLG_SPACE_FIXUP???
__le32 min_io_size; // 最小讀寫單元
__le32 leb_size; // LEB大小,機關位元組
__le32 leb_cnt; //系統使用的的leb 數量
__le32 max_leb_cnt; //系統使用的最大leb數量
__le64 max_bud_bytes; // * @max_bud_bytes: maximum amount of data stored in buds ???
__le32 log_lebs; // log area占用的leb數量
__le32 lpt_lebs; // lpt area 占用的leb數量
__le32 orph_lebs; //orphon area占用的leb數量
__le32 jhead_cnt; //journal header 數量
__le32 fanout; // * @fanout: tree fanout (max. number of links per indexing node) ???
__le32 lsave_cnt; // LPT save table中LEB Numbers的數目,LEB saved table用來在mount時加快查找LPT中空閑eraseblocks的速度.
__le32 fmt_version; // * @fmt_version: UBIFS on-flash format version
__le16 default_compr; //預設壓縮算法
__u8 padding1[2]; // * @padding1: reserved for future, zeroes
__le32 rp_uid; // * @rp_uid: reserve pool UID
__le32 rp_gid; // * @rp_gid: reserve pool GID
__le64 rp_size; // * @rp_size: size of the reserved pool in bytes
__le32 time_gran; // * @time_gran: time granularity in nanoseconds
__u8 uuid[16]; // * @uuid: UUID (全局唯一标示符)generated when the file system image was created
__le32 ro_compat_version; // * @ro_compat_version: UBIFS R/O compatibility version
__u8 padding2[3968]; // * @padding2: reserved for future, zeroes
} __packed;
super block的資料很少改動,除了resize的時候。