[[Superblocks]] == Superblocks Each AG starts with a superblock. The first one, in AG 0, is the primary superblock which stores aggregate AG information. Secondary superblocks are only used by xfs_repair when the primary superblock has been corrupted. A superblock is one sector in length. The superblock is defined by the following structure. The description of each field follows. [source, c] ---- struct xfs_dsb { __be32 sb_magicnum; __be32 sb_blocksize; __be64 sb_dblocks; __be64 sb_rblocks; __be64 sb_rextents; uuid_t sb_uuid; __be64 sb_logstart; __be64 sb_rootino; __be64 sb_rbmino; __be64 sb_rsumino; __be32 sb_rextsize; __be32 sb_agblocks; __be32 sb_agcount; __be32 sb_rbmblocks; __be32 sb_logblocks; __be16 sb_versionnum; __be16 sb_sectsize; __be16 sb_inodesize; __be16 sb_inopblock; char sb_fname[XFSLABEL_MAX]; __u8 sb_blocklog; __u8 sb_sectlog; __u8 sb_inodelog; __u8 sb_inopblog; __u8 sb_agblklog; __u8 sb_rextslog; __u8 sb_inprogress; __u8 sb_imax_pct; __be64 sb_icount; __be64 sb_ifree; __be64 sb_fdblocks; __be64 sb_frextents; __be64 sb_uquotino; __be64 sb_gquotino; __be16 sb_qflags; __u8 sb_flags; __u8 sb_shared_vn; __be32 sb_inoalignmt; __be32 sb_unit; __be32 sb_width; __u8 sb_dirblklog; __u8 sb_logsectlog; __be16 sb_logsectsize; __be32 sb_logsunit; __be32 sb_features2; __be32 sb_bad_features2; /* version 5 superblock fields start here */ __be32 sb_features_compat; __be32 sb_features_ro_compat; __be32 sb_features_incompat; __be32 sb_features_log_incompat; __le32 sb_crc; __be32 sb_spino_align; __be64 sb_pquotino; __be64 sb_lsn; uuid_t sb_meta_uuid; __be64 sb_metadirino; __be32 sb_rgcount; __be32 sb_rgextents; __u8 sb_rgblklog; __u8 sb_pad[7]; __be64 sb_rtstart; __be64 sb_rtreserved; /* must be padded to 64 bit alignment */ }; ---- *sb_magicnum*:: Identifies the filesystem. Its value is +XFS_SB_MAGIC+ ``XFSB'' (0x58465342). *sb_blocksize*:: The size of a basic unit of space allocation in bytes. Typically, this is 4096 (4KB) but can range from 512 to 65536 bytes. *sb_dblocks*:: Total number of blocks available for data and metadata on the filesystem. *sb_rblocks*:: Number blocks in the real-time disk device. Refer to xref:Real-time_Devices[real-time sub-volumes] for more information. *sb_rextents*:: Number of extents on the real-time device. *sb_uuid*:: UUID (Universally Unique ID) for the filesystem. Filesystems can be mounted by the UUID instead of device name. *sb_logstart*:: First block number for the journaling log if the log is internal (ie. not on a separate disk device). For an external log device, this will be zero (the log will also start on the first block on the log device). The identity of the log devices is not recorded in the filesystem, but the UUIDs of the filesystem and the log device are compared to prevent corruption. *sb_rootino*:: Root inode number for the filesystem. Normally, the root inode is at the start of the first possible inode chunk in AG 0. This is 128 when using a 4KB block size. *sb_rbmino*:: Bitmap inode for real-time extents. *sb_rsumino*:: Summary inode for real-time bitmap. *sb_rextsize*:: Realtime extent size in blocks. *sb_agblocks*:: Size of each AG in blocks. For the actual size of the last AG, refer to the xref:AG_Free_Space_Management[free space] +agf_length+ value. *sb_agcount*:: Number of AGs in the filesystem. *sb_rbmblocks*:: Number of real-time bitmap blocks. *sb_logblocks*:: Number of blocks for the journaling log. *sb_versionnum*:: Filesystem version number. This is a bitmask specifying the features enabled when creating the filesystem. Any disk checking tools or drivers that do not recognize any set bits must not operate upon the filesystem. Most of the flags indicate features introduced over time. If the value of the lower nibble is >= 4, the higher bits indicate feature flags as follows: .Version 4 Superblock version flags [options="header"] |===== | Flag | Description | +XFS_SB_VERSION_ATTRBIT+ | Set if any inode have extended attributes. If this bit is set; the +XFS_SB_VERSION2_ATTR2BIT+ is not set; and the +attr2+ mount flag is not specified, the +di_forkoff+ inode field will not be dynamically adjusted. See the section about xref:Extended_Attribute_Versions[extended attribute versions] for more information. | +XFS_SB_VERSION_NLINKBIT+ | Set if any inodes use 32-bit di_nlink values. | +XFS_SB_VERSION_QUOTABIT+ | Quotas are enabled on the filesystem. This also brings in the various quota fields in the superblock. | +XFS_SB_VERSION_ALIGNBIT+ | Set if sb_inoalignmt is used. | +XFS_SB_VERSION_DALIGNBIT+ | Set if sb_unit and sb_width are used. | +XFS_SB_VERSION_SHAREDBIT+ | Set if sb_shared_vn is used. | +XFS_SB_VERSION_LOGV2BIT+ | Version 2 journaling logs are used. | +XFS_SB_VERSION_SECTORBIT+ | Set if sb_sectsize is not 512. | +XFS_SB_VERSION_EXTFLGBIT+ | Unwritten extents are used. This is always set. | +XFS_SB_VERSION_DIRV2BIT+ | Version 2 directories are used. This is always set. | +XFS_SB_VERSION_MOREBITSBIT+ | Set if the sb_features2 field in the superblock contains more flags. |===== If the lower nibble of this value is 5, then this is a v5 filesystem; the +XFS_SB_VERSION2_CRCBIT+ feature must be set in +sb_features2+. *sb_sectsize*:: Specifies the underlying disk sector size in bytes. Typically this is 512 or 4096 bytes. This determines the minimum I/O alignment, especially for direct I/O. *sb_inodesize*:: Size of the inode in bytes. The default is 256 (2 inodes per standard sector) but can be made as large as 2048 bytes when creating the filesystem. On a v5 filesystem, the default and minimum inode size are both 512 bytes. *sb_inopblock*:: Number of inodes per block. This is equivalent to +sb_blocksize / sb_inodesize+. *sb_fname[12]*:: Name for the filesystem. This value can be used in the mount command. *sb_blocklog*:: log~2~ value of +sb_blocksize+. In other terms, +sb_blocksize = 2^sb_blocklog^+. *sb_sectlog*:: log~2~ value of +sb_sectsize+. *sb_inodelog*:: log~2~ value of +sb_inodesize+. *sb_inopblog*:: log~2~ value of +sb_inopblock+. *sb_agblklog*:: log~2~ value of +sb_agblocks+ (rounded up). This value is used to generate inode numbers and absolute block numbers defined in extent maps. *sb_rextslog*:: log~2~ value of +sb_rextents+. *sb_inprogress*:: Flag specifying that the filesystem is being created. *sb_imax_pct*:: Maximum percentage of filesystem space that can be used for inodes. The default value is 5%. *sb_icount*:: Global count for number inodes allocated on the filesystem. This is only maintained in the first superblock. *sb_ifree*:: Global count of free inodes on the filesystem. This is only maintained in the first superblock. *sb_fdblocks*:: Global count of free data blocks on the filesystem. This is only maintained in the first superblock. *sb_frextents*:: Global count of free real-time extents on the filesystem. This is only maintained in the first superblock. *sb_uquotino*:: Inode for user quotas. This and the following two quota fields only apply if +XFS_SB_VERSION_QUOTABIT+ flag is set in +sb_versionnum+. Refer to xref:Quota_Inodes[quota inodes] for more information. *sb_gquotino*:: Inode for group or project quotas. Group and project quotas cannot be used at the same time on v4 filesystems. On a v5 filesystem, this inode always stores group quota information. *sb_qflags*:: Quota flags. It can be a combination of the following flags: .Superblock quota flags [options="header"] |===== | Flag | Description | +XFS_UQUOTA_ACCT+ | User quota accounting is enabled. | +XFS_UQUOTA_ENFD+ | User quotas are enforced. | +XFS_UQUOTA_CHKD+ | User quotas have been checked. | +XFS_PQUOTA_ACCT+ | Project quota accounting is enabled. | +XFS_OQUOTA_ENFD+ | Other (group/project) quotas are enforced. | +XFS_OQUOTA_CHKD+ | Other (group/project) quotas have been checked. | +XFS_GQUOTA_ACCT+ | Group quota accounting is enabled. | +XFS_GQUOTA_ENFD+ | Group quotas are enforced. | +XFS_GQUOTA_CHKD+ | Group quotas have been checked. | +XFS_PQUOTA_ENFD+ | Project quotas are enforced. | +XFS_PQUOTA_CHKD+ | Project quotas have been checked. |===== If the +XFS_SB_FEAT_INCOMPAT_METADIR+ feature is enabled, the +sb_qflags+ field will persist across mounts if no quota mount options are provided. *sb_flags*:: Miscellaneous flags. .Superblock flags [options="header"] |===== | Flag | Description | +XFS_SBF_READONLY+ | Only read-only mounts allowed. |===== *sb_shared_vn*:: Reserved and must be zero (``vn'' stands for version number). *sb_inoalignmt*:: Inode chunk alignment in fsblocks. Prior to v5, the default value provided for inode chunks to have an 8KiB alignment. Starting with v5, the default value scales with the multiple of the inode size over 256 bytes. Concretely, this means an alignment of 16KiB for 512-byte inodes, 32KiB for 1024-byte inodes, etc. If sparse inodes are enabled, the +ir_startino+ field of each inode B+tree record must be aligned to this block granularity, even if the inode given by +ir_startino+ itself is sparse. *sb_unit*:: Underlying stripe or raid unit in blocks. *sb_width*:: Underlying stripe or raid width in blocks. *sb_dirblklog*:: log~2~ multiplier that determines the granularity of directory block allocations in fsblocks. *sb_logsectlog*:: log~2~ value of the log subvolume's sector size. This is only used if the journaling log is on a separate disk device (i.e. not internal). *sb_logsectsize*:: The log's sector size in bytes if the filesystem uses an external log device. *sb_logsunit*:: The log device's stripe or raid unit size. This only applies to version 2 logs +XFS_SB_VERSION_LOGV2BIT+ is set in +sb_versionnum+. *sb_features2*:: Additional version flags if +XFS_SB_VERSION_MOREBITSBIT+ is set in +sb_versionnum+. The currently defined additional features include: .Extended Version 4 Superblock flags [options="header"] |===== | Flag | Description | +XFS_SB_VERSION2_LAZYSBCOUNTBIT+ | Lazy global counters. Making a filesystem with this bit set can improve performance. The global free space and inode counts are only updated in the primary superblock when the filesystem is cleanly unmounted. | +XFS_SB_VERSION2_ATTR2BIT+ | Extended attributes version 2. Making a filesystem with this optimises the inode layout of extended attributes. If this bit is set and the +noattr2+ mount flag is not specified, the +di_forkoff+ inode field will be dynamically adjusted. See the section about xref:Extended_Attribute_Versions[extended attribute versions] for more information. | +XFS_SB_VERSION2_PARENTBIT+ | Parent pointers. All inodes must have an extended attribute that points back to its parent inode. The primary purpose for this information is in backup systems. | +XFS_SB_VERSION2_PROJID32BIT+ | 32-bit Project ID. Inodes can be associated with a project ID number, which can be used to enforce disk space usage quotas for a particular group of directories. This flag indicates that project IDs can be 32 bits in size. | +XFS_SB_VERSION2_CRCBIT+ | Metadata checksumming. All metadata blocks have an extended header containing the block checksum, a copy of the metadata UUID, the log sequence number of the last update to prevent stale replays, and a back pointer to the owner of the block. This feature must be and can only be set if the lowest nibble of +sb_versionnum+ is set to 5. | +XFS_SB_VERSION2_FTYPE+ | Directory file type. Each directory entry records the type of the inode to which the entry points. This speeds up directory iteration by removing the need to load every inode into memory. |===== *sb_bad_features2*:: This field mirrors +sb_features2+, due to past 64-bit alignment errors. *sb_features_compat*:: Read-write compatible feature flags. The kernel can still read and write this FS even if it doesn't understand the flag. Currently, there are no valid flags. *sb_features_ro_compat*:: Read-only compatible feature flags. The kernel can still read this FS even if it doesn't understand the flag. .Extended Version 5 Superblock Read-Only compatibility flags [options="header"] |===== | Flag | Description | +XFS_SB_FEAT_RO_COMPAT_FINOBT+ | Free inode B+tree. Each allocation group contains a B+tree to track inode chunks containing free inodes. This is a performance optimization to reduce the time required to allocate inodes. | +XFS_SB_FEAT_RO_COMPAT_RMAPBT+ | Reverse mapping B+tree. Each allocation group contains a B+tree containing records mapping AG blocks to their owners. See the section about xref:Reconstruction[reconstruction] for more details. | +XFS_SB_FEAT_RO_COMPAT_REFLINK+ | Reference count B+tree. Each allocation group contains a B+tree to track the reference counts of AG blocks. This enables files to share data blocks safely. See the section about xref:Reflink_Deduplication[reflink and deduplication] for more details. | +XFS_SB_FEAT_RO_COMPAT_INOBTCNT+ | Inode B+tree block counters. Each allocation group's inode (AGI) header tracks the number of blocks in each of the inode B+trees. This allows us to have a slightly higher level of redundancy over the shape of the inode btrees, and decreases the amount of time to compute the metadata B+tree preallocations at mount time. |===== *sb_features_incompat*:: Read-write incompatible feature flags. The kernel cannot read or write this FS if it doesn't understand the flag. .Extended Version 5 Superblock Read-Write incompatibility flags [options="header"] |===== | Flag | Description | +XFS_SB_FEAT_INCOMPAT_FTYPE+ | Directory file type. Each directory entry tracks the type of the inode to which the entry points. This is a performance optimization to remove the need to load every inode into memory to iterate a directory. | +XFS_SB_FEAT_INCOMPAT_SPINODES+ | Sparse inodes. This feature relaxes the requirement to allocate inodes in chunks of 64. When the free space is heavily fragmented, there might exist plenty of free space but not enough contiguous free space to allocate a new inode chunk. With this feature, the user can continue to create files until all free space is exhausted. Unused space in the inode B+tree records are used to track which parts of the inode chunk are not inodes. See the chapter on xref:Sparse_Inodes[Sparse Inodes] for more information. | +XFS_SB_FEAT_INCOMPAT_META_UUID+ | Metadata UUID. The UUID stamped into each metadata block must match the value in +sb_meta_uuid+. This enables the administrator to change +sb_uuid+ at will without having to rewrite the entire filesystem. | +XFS_SB_FEAT_INCOMPAT_BIGTIME+ | Large timestamps. Inode timestamps and quota expiration timers are extended to support times through the year 2486. See the section on xref:Timestamps[timestamps] for more information. | +XFS_SB_FEAT_INCOMPAT_NEEDSREPAIR+ | The filesystem is not in operable condition, and must be run through xfs_repair before it can be mounted. | +XFS_SB_FEAT_INCOMPAT_NREXT64+ | Large file fork extent counts. This greatly expands the maximum number of space mappings allowed in data and extended attribute file forks. | +XFS_SB_FEAT_INCOMPAT_EXCHRANGE+ | Atomic file mapping exchanges. The filesystem is capable of exchanging a range of mappings between two arbitrary ranges of a file's fork by using log intent items to track the progress of the high level exchange operation. In other words, the exchange operation can be restarted if the system goes down, which is necessary for userspace to commit of new file contents atomically. This flag has user-visible impacts, which is why it is a permanent incompat flag. See the section about xref:XMI_Log_Item[mapping exchange log intents] for more information. | +XFS_SB_FEAT_INCOMPAT_PARENT+ | Directory parent pointers. See the section about xref:Parent_Pointers[parent pointers] for more information. | +XFS_SB_FEAT_INCOMPAT_METADIR+ | Metadata directory tree. See the section about the xref:Metadata_Directories[ metadata directory tree] for more information. | +XFS_SB_FEAT_INCOMPAT_ZONED+ | Zoned RT device. See the section about the xref:Zoned[Zoned Real-time Devices] for more information. | +XFS_SB_FEAT_INCOMPAT_ZONE_GAPS+ | Each hardware zone has unusable space at the end of its LBA range, which is mirrored by unusable filesystem blocks at the end of the rtgroup. The +xfs_rtblock_t startblock+ in file mappings is linearly mapped to the hardware LBA space. |===== *sb_features_log_incompat*:: Read-write incompatible feature flags for the log. The kernel cannot recover the FS log if it doesn't understand the flag. .Extended Version 5 Superblock Log incompatibility flags [options="header"] |===== | Flag | Description | +XFS_SB_FEAT_INCOMPAT_LOG_XATTRS+ | Extended attribute updates have been committed to the ondisk log. |===== *sb_crc*:: Superblock checksum. *sb_spino_align*:: Sparse inode alignment, in fsblocks. Each chunk of inodes referenced by a sparse inode B+tree record must be aligned to this block granularity. *sb_pquotino*:: Project quota inode. *sb_lsn*:: Log sequence number of the last superblock update. *sb_meta_uuid*:: If the +XFS_SB_FEAT_INCOMPAT_META_UUID+ feature is set, then the UUID field in all metadata blocks must match this UUID. If not, the block header UUID field must match +sb_uuid+. *sb_metadirino*:: If the +XFS_SB_FEAT_RO_INCOMPAT_METADIR+ feature is set, this field points to the inode of the root directory of the metadata directory tree. This field is zero otherwise. *sb_rgcount*:: Count of realtime groups in the filesystem, if the +XFS_SB_FEAT_RO_INCOMPAT_METADIR+ feature is enabled. If no realtime subvolume exists, this value will be zero. *sb_rgextents*:: Maximum number of realtime extents that can be contained within a realtime group, if the +XFS_SB_FEAT_RO_INCOMPAT_METADIR+ feature is enabled. *sb_rgblklog*:: If the +XFS_SB_FEAT_RO_INCOMPAT_METADIR+ feature is enabled, this is the log~2~ value of +sb_rgextents+ * +sb_rextsize+ (rounded up). This value is used to generate absolute block numbers defined in extent maps from the segmented +xfs_rtblock_t+ values. *sb_pad[7]*:: Zeroes, if the +XFS_SB_FEAT_RO_INCOMPAT_METADIR+ feature is enabled. *sb_rtstart*:: If the +XFS_SB_FEAT_INCOMPAT_ZONED+ feature is enabled, this is the start of the internal RT section. That is the RT section is placed on the same device as the data device, and starts at this offset into the device. The value is in units of file system blocks. *sb_rtreserved*:: If the +XFS_SB_FEAT_INCOMPAT_ZONED+ feature is enabled, this is the amount of space in the realtime section that is reserved for internal use by garbage collection and reorganization algorithms. === xfs_db Superblock Example A filesystem is made on a single disk with the following command: ---- # mkfs.xfs -i attr=2 -n size=16384 -f /dev/sda7 meta-data=/dev/sda7 isize=256 agcount=16, agsize=3923122 blks = sectsz=512 attr=2 data = bsize=4096 blocks=62769952, imaxpct=25 = sunit=0 swidth=0 blks, unwritten=1 naming =version 2 bsize=16384 log =internal log bsize=4096 blocks=30649, version=1 = sectsz=512 sunit=0 blks realtime =none extsz=65536 blocks=0, rtextents=0 ---- And in xfs_db, inspecting the superblock: ---- xfs_db> sb xfs_db> p magicnum = 0x58465342 blocksize = 4096 dblocks = 62769952 rblocks = 0 rextents = 0 uuid = 32b24036-6931-45b4-b68c-cd5e7d9a1ca5 logstart = 33554436 rootino = 128 rbmino = 129 rsumino = 130 rextsize = 16 agblocks = 3923122 agcount = 16 rbmblocks = 0 logblocks = 30649 versionnum = 0xb084 sectsize = 512 inodesize = 256 inopblock = 16 fname = "\000\000\000\000\000\000\000\000\000\000\000\000" blocklog = 12 sectlog = 9 inodelog = 8 inopblog = 4 agblklog = 22 rextslog = 0 inprogress = 0 imax_pct = 25 icount = 64 ifree = 61 fdblocks = 62739235 frextents = 0 uquotino = 0 gquotino = 0 qflags = 0 flags = 0 shared_vn = 0 inoalignmt = 2 unit = 0 width = 0 dirblklog = 2 logsectlog = 0 logsectsize = 0 logsunit = 0 features2 = 8 ----