ubifs - superblock

本文详细介绍了UBIFS文件系统的超级块结构,包括其节点定义、数据存储方式和关键属性,如序列号、节点类型、LEB大小、LEB数量等。超级块在非resize情况下保持不变,确保数据的稳定性和一致性。了解这些内容有助于深入理解UBIFS的运行机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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前,记住下面的结构。

/* UBIFS node magic number (must not have the padding byte first or last) */
#define UBIFS_NODE_MAGIC  0x06101831


/**
 * struct ubifs_ch - common header node.

 * 每个ubifs node都是以common part开始的,如果有key,那么key会紧随common header
 */
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的时候。

#!/bin/sh #mount oem_app dir SYSCFG_oem_app_ubifs_MNT=/tmp/syscfg SLOT="$(find_system_slot)" echo "Active system$SLOT" # return 1 on failed 0 for success oem_app_ubifs_volume_support() { # for SDTIM support mtdpart_idx_oem_app="$(find_mtd_index oem_app$SLOT-mount)" if [ -z "$mtdpart_idx_oem_app" ] then mtdpart_idx_oem_app="$(find_mtd_index oem_app$SLOT)" if [ -z "$mtdpart_idx_oem_app" ] then # oem_app may has only one partition mtdpart_idx_oem_app="$(find_mtd_index oem_app)" [ -z "$mtdpart_idx_oem_app" ] && return 1 fi fi grep -qs ubifs /proc/filesystems || return 1 echo "found oem_app partition and ubifs support" return 0 } __oem_app_ubifs_mount() { recover_oem_app_ubifs=0 [ ! -e /dev/ubi2 ] && ubiattach /dev/ubi_ctrl -m $mtdpart_idx_oem_app -d 2 || recover_oem_app_ubifs=1 if [ $recover_oem_app_ubifs -eq 0 ] then ubi2_nod_id=`cat /sys/class/ubi/ubi2/dev | tr -s ":" " "` [ ! -e /dev/ubi2 ] && mknod /dev/ubi2 c ${ubi2_nod_id} if [ ! -e /sys/class/ubi/ubi2_0/dev ] then # no volume recover_oem_app_ubifs=1 else # check for "oem_app" volume ubi2_0_nod_id=`cat /sys/class/ubi/ubi2_0/dev | tr -s ":" " "` [ ! -e /dev/ubi2_0 ] && mknod /dev/ubi2_0 c ${ubi2_0_nod_id} { ubinfo /dev/ubi2_0 | grep "oem_app" ; } || \ recover_oem_app_ubifs=1 fi fi if [ $recover_oem_app_ubifs -eq 1 ] then echo "err: ubi attach failed, oem_app partition damaged?" ##need reboot and switch other slot fi mount -t ubifs -o ro,noatime,bulk_read ubi2_0 /oemapp return 0 } oem_app_ubifs_mount() { __oem_app_ubifs_mount || { echo "oem_app mount fail" #mtd erase oem_app$SLOT #__oem_app_ubifs_mount } return 0 } do_mount_oem_app_ubifs_overlay() { { oem_app_ubifs_volume_support && \ oem_app_ubifs_mount ; } } boot_hook_add preinit_main do_mount_oem_app_ubifs_overlay 解释下这个骄傲本的作用
最新发布
06-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值