EXT4檔案系統學習(10)VFS之磁碟結構Group和superblock
direntry建立了各級目錄和檔案之間的聯絡,inode建立了檔案與資料之間聯絡,但這還不夠,還需要記錄inode和資料塊從哪裡開始從哪裡結束,以及哪些是空閒的,這樣才能正確的分配檔案。
Group
塊組是一個邏輯概念,把一個分割槽分成若干個組,用來限制檔案的資料塊不要過於散落,儘量保證一個檔案的資料塊在一個組,這樣可以提高讀寫效率,
格式化一個ext4檔案系統後在磁碟上的結構:
Group 0: (Blocks 1-8192)
Primary superblock at 1, Group descriptors at 2-2
Reserved GDT blocks at 3-246
Block bitmap at 247 (+246)
Inode bitmap at 251 (+250)
Inode table at 255-499 (+254)
5481 free blocks, 1916 free inodes, 7 directories
Free blocks: 1268-2657, 2866-4096, 5327-6112, 6119-8192
Free inodes: 39, 46-1960
超級塊
超級塊記錄著一個分割槽的整體資訊,有多少inode,多少個組,多少個block資料塊,多少個空閒塊。
Group descriptors組描述符記錄了這個組中的inode數量,空閒塊數量等資訊。
Block bitmap是資料塊的點陣圖,記錄著資料塊的狀態。
Inode bitmap是inode的點陣圖,記錄著inode的狀態。
磁碟超級塊結構如下:
/*
* Structure of the super block
*/
struct ext4_super_block {
/*00*/ __le32 s_inodes_count; /* Inodes count */inode總數量
__le32 s_blocks_count_lo; /* Blocks count */block總數量
__le32 s_r_blocks_count_lo; /* Reserved blocks count */預留block總數量
__le32 s_free_blocks_count_lo; /* Free blocks count */空閒block總數量
/*10*/ __le32 s_free_inodes_count; /* Free inodes count */空閒inode總數量
__le32 s_first_data_block; /* First Data Block */第一個資料塊的編號
__le32 s_log_block_size; /* Block size */塊大小,一般是4KB,可配置
__le32 s_log_cluster_size; /* Allocation cluster size */分片功能沒有啟用
/*20*/ __le32 s_blocks_per_group; /* # Blocks per group */每個組中多個個塊
__le32 s_clusters_per_group; /* # Clusters per group */
__le32 s_inodes_per_group; /* # Inodes per group */
__le32 s_mtime; /* Mount time */
/*30*/ __le32 s_wtime; /* Write time */
__le16 s_mnt_count; /* Mount count */被掛載的總次數
__le16 s_max_mnt_count; /* Maximal mount count */最大掛載次數,達到後就會進行檔案系統檢測
__le16 s_magic; /* Magic signature */
__le16 s_state; /* File system state */檔案系統狀態,為0表示被mount狀態,掛載之前會檢測此狀態防止重複掛載
__le16 s_errors; /* Behaviour when detecting errors */
__le16 s_minor_rev_level; /* minor revision level */
/*40*/ __le32 s_lastcheck; /* time of last check */上一次檔案系統檢測的時間
__le32 s_checkinterval; /* max. time between checks */檢測的最大間隔
__le32 s_creator_os; /* OS */
__le32 s_rev_level; /* Revision level */
/*50*/ __le16 s_def_resuid; /* Default uid for reserved blocks */
__le16 s_def_resgid; /* Default gid for reserved blocks */
/*
* These fields are for EXT4_DYNAMIC_REV superblocks only.
*
* Note: the difference between the compatible feature set and
* the incompatible feature set is that if there is a bit set
* in the incompatible feature set that the kernel doesn't
* know about, it should refuse to mount the filesystem.
*
* e2fsck's requirements are more strict; if it doesn't know
* about a feature in either the compatible or incompatible
* feature set, it must abort and not try to meddle with
* things it doesn't understand...
*/
__le32 s_first_ino; /* First non-reserved inode */
__le16 s_inode_size; /* size of inode structure */inode佔用空間大小,一般是256位元組
__le16 s_block_group_nr; /* block group # of this superblock */
__le32 s_feature_compat; /* compatible feature set */
/*60*/ __le32 s_feature_incompat; /* incompatible feature set */
__le32 s_feature_ro_compat; /* readonly-compatible feature set */
/*68*/ __u8 s_uuid[16]; /* 128-bit uuid for volume */UID
/*78*/ char s_volume_name[16]; /* volume name */分割槽名字
/*88*/ char s_last_mounted[64]; /* directory where last mounted */
/*C8*/ __le32 s_algorithm_usage_bitmap; /* For compression */
/*
* Performance hints. Directory preallocation should only
* happen if the EXT4_FEATURE_COMPAT_DIR_PREALLOC flag is on.
*/
__u8 s_prealloc_blocks; /* Nr of blocks to try to preallocate*/
__u8 s_prealloc_dir_blocks; /* Nr to preallocate for dirs */
__le16 s_reserved_gdt_blocks; /* Per group desc for online growth */
/*
* Journaling support valid if EXT4_FEATURE_COMPAT_HAS_JOURNAL set.
*/
/*D0*/ __u8 s_journal_uuid[16]; /* uuid of journal superblock */
/*E0*/ __le32 s_journal_inum; /* inode number of journal file */
__le32 s_journal_dev; /* device number of journal file */
__le32 s_last_orphan; /* start of list of inodes to delete */
__le32 s_hash_seed[4]; /* HTREE hash seed */
__u8 s_def_hash_version; /* Default hash version to use */
__u8 s_jnl_backup_type;
__le16 s_desc_size; /* size of group descriptor */
/*100*/ __le32 s_default_mount_opts;
__le32 s_first_meta_bg; /* First metablock block group */
__le32 s_mkfs_time; /* When the filesystem was created */
__le32 s_jnl_blocks[17]; /* Backup of the journal inode */
/* 64bit support valid if EXT4_FEATURE_COMPAT_64BIT */
/*150*/ __le32 s_blocks_count_hi; /* Blocks count */
__le32 s_r_blocks_count_hi; /* Reserved blocks count */
__le32 s_free_blocks_count_hi; /* Free blocks count */
__le16 s_min_extra_isize; /* All inodes have at least # bytes */
__le16 s_want_extra_isize; /* New inodes should reserve # bytes */
__le32 s_flags; /* Miscellaneous flags */
__le16 s_raid_stride; /* RAID stride */
__le16 s_mmp_update_interval; /* # seconds to wait in MMP checking */
__le64 s_mmp_block; /* Block for multi-mount protection */
__le32 s_raid_stripe_width; /* blocks on all data disks (N*stride)*/
__u8 s_log_groups_per_flex; /* FLEX_BG group size */
__u8 s_checksum_type; /* metadata checksum algorithm used */
__u8 s_encryption_level; /* versioning level for encryption */
__u8 s_reserved_pad; /* Padding to next 32bits */
__le64 s_kbytes_written; /* nr of lifetime kilobytes written */
__le32 s_snapshot_inum; /* Inode number of active snapshot */
__le32 s_snapshot_id; /* sequential ID of active snapshot */
__le64 s_snapshot_r_blocks_count; /* reserved blocks for active
snapshot's future use */
__le32 s_snapshot_list; /* inode number of the head of the
on-disk snapshot list */
#define EXT4_S_ERR_START offsetof(struct ext4_super_block, s_error_count)
__le32 s_error_count; /* number of fs errors */
__le32 s_first_error_time; /* first time an error happened */
__le32 s_first_error_ino; /* inode involved in first error */
__le64 s_first_error_block; /* block involved of first error */
__u8 s_first_error_func[32]; /* function where the error happened */
__le32 s_first_error_line; /* line number where error happened */
__le32 s_last_error_time; /* most recent time of an error */
__le32 s_last_error_ino; /* inode involved in last error */
__le32 s_last_error_line; /* line number where error happened */
__le64 s_last_error_block; /* block involved of last error */
__u8 s_last_error_func[32]; /* function where the error happened */
#define EXT4_S_ERR_END offsetof(struct ext4_super_block, s_mount_opts)
__u8 s_mount_opts[64];
__le32 s_usr_quota_inum; /* inode for tracking user quota */
__le32 s_grp_quota_inum; /* inode for tracking group quota */
__le32 s_overhead_clusters; /* overhead blocks/clusters in fs */
__le32 s_backup_bgs[2]; /* groups with sparse_super2 SBs */
__u8 s_encrypt_algos[4]; /* Encryption algorithms in use */
__u8 s_encrypt_pw_salt[16]; /* Salt used for string2key algorithm */
__le32 s_lpf_ino; /* Location of the lost+found inode */
__le32 s_reserved[100]; /* Padding to the end of the block */
__le32 s_checksum; /* crc32c(superblock) */
};
ext4_super_block與磁碟上面的超級塊資料基本是對應的,可直接讀出到結構體記憶體。
組描述符在磁碟上的格式如下:
/*
* Structure of a blocks group descriptor
*/
struct ext4_group_desc
{
__le32 bg_block_bitmap_lo; /* Blocks bitmap block */表示bmap在這個組的那一塊
__le32 bg_inode_bitmap_lo; /* Inodes bitmap block */表示imap在這個組的那一塊
__le32 bg_inode_table_lo; /* Inodes table block */這個組的inode所在起始塊號
__le16 bg_free_blocks_count_lo;/* Free blocks count */空閒塊數量
__le16 bg_free_inodes_count_lo;/* Free inodes count */空閒inode數量
__le16 bg_used_dirs_count_lo; /* Directories count */
__le16 bg_flags; /* EXT4_BG_flags (INODE_UNINIT, etc) */
__le32 bg_exclude_bitmap_lo; /* Exclude bitmap for snapshots */
__le16 bg_block_bitmap_csum_lo;/* crc32c(s_uuid+grp_num+bbitmap) LE */
__le16 bg_inode_bitmap_csum_lo;/* crc32c(s_uuid+grp_num+ibitmap) LE */
__le16 bg_itable_unused_lo; /* Unused inodes count */
__le16 bg_checksum; /* crc16(sb_uuid+group+desc) */
__le32 bg_block_bitmap_hi; /* Blocks bitmap block MSB */
__le32 bg_inode_bitmap_hi; /* Inodes bitmap block MSB */
__le32 bg_inode_table_hi; /* Inodes table block MSB */
__le16 bg_free_blocks_count_hi;/* Free blocks count MSB */
__le16 bg_free_inodes_count_hi;/* Free inodes count MSB */
__le16 bg_used_dirs_count_hi; /* Directories count MSB */
__le16 bg_itable_unused_hi; /* Unused inodes count MSB */
__le32 bg_exclude_bitmap_hi; /* Exclude bitmap block MSB */
__le16 bg_block_bitmap_csum_hi;/* crc32c(s_uuid+grp_num+bbitmap) BE */
__le16 bg_inode_bitmap_csum_hi;/* crc32c(s_uuid+grp_num+ibitmap) BE */
__u32 bg_reserved;
};
組描述符佔用64位元組,一個塊佔用4KB,所以每個組裡面的組描述符塊儲存了所有組描述符。應該是為了防止資料損壞進行修復使用。
超級塊的備份會在2n-1的組裡面,防止資料損壞進行修復。
相關文章
- EXT4檔案系統學習(9)VFS之磁碟結構inode和direntry
- EXT4檔案系統學習(14)VFS之VFS inode
- EXT4檔案系統學習(15)VFS之VFS 檔案/目錄物件物件
- EXT4檔案系統學習(11)VFS之記憶體結構sb和inode記憶體
- EXT4檔案系統學習(13)VFS之VFS超級塊super_blockBloC
- EXT4檔案系統學習(12)VFS之檔案系統物件file_system_type物件
- Macbook磁碟系統結構/檔案/目錄介紹分析Mac
- 04 磁碟儲存和檔案系統
- ext4和xfs檔案系統的擴容和收縮
- 簡單瞭解EXT4檔案系統
- 恢復ext4檔案系統被誤刪的檔案
- 檔案系統(六):一文看懂linux ext4檔案系統工作原理Linux
- Linux學習(三)之系統目錄結構Linux
- 二、Linux檔案系統結構Linux
- 磁碟管理與檔案系統
- [資料庫系統]儲存和檔案結構資料庫
- 深入理解 ext4 等 Linux 檔案系統Linux
- JVM學習--Class類檔案結構JVM
- Linux下的檔案系統結構Linux
- 檔案系統的物理結構分配
- Linux檔案系統目錄結構Linux
- ext4 lvreduce報錯superblock or the partition table is likely to be corruptVRBloC
- Linux Centos系統 磁碟分割槽和檔案系統管理 (深入理解)LinuxCentOS
- 如何系統學習C 語言(下)之 檔案篇
- Linux磁碟管理與檔案系統(關於磁碟方面)Linux
- Linux EXT4檔案系統TF卡空間容量顯示和計算Linux
- 檔案和檔案系統
- ros學習檔案系統介紹ROS
- 如何系統學習C 語言(中)之 結構體篇結構體
- 檔案系統&&磁碟管理(六)–swap分割槽、迴環裝置、檔案系統配置檔案fstab
- PE檔案結構複習
- HBase學習之Hbase的邏輯結構和物理結構
- WSL子系統檔案遷移至其他磁碟
- Linux 磁碟分割槽及檔案系統管理Linux
- 在FreeBSD上mount Ext4檔案系統的行動硬碟硬碟
- NTFS、exFAT、FAT32、Ext4檔案系統的區別
- Linux系統中有哪些比較重要的檔案系統結構?Linux
- i.MX6ULL終結者Linux檔案系統的構建BusyBox構建根檔案系統Linux