XFS超级块介绍
与其他 Unix 文件系统一样,XFS 的超级块在文件系统的第一个扇区,它帮助解码文件系统。超级块占用每个 XFS AG 的前 512 个字节。主超级块是位于文件系统前面的 AG 0 中的超级块,其他 AG 中的超级块用于冗余。目前仅使用超级块的前248个字节。以下是超级块的信息信息:
超级块的具体内容可以参考内核的xfs_sb结构体
struct xfs_sb {
[0] uint32_t sb_magicnum;
[4] uint32_t sb_blocksize;
[8] xfs_rfsblock_t sb_dblocks;
[16] xfs_rfsblock_t sb_rblocks;
[24] xfs_rtblock_t sb_rextents;
[32] uuid_t sb_uuid;
[48] xfs_fsblock_t sb_logstart;
[56] xfs_ino_t sb_rootino;
[64] xfs_ino_t sb_rbmino;
[72] xfs_ino_t sb_rsumino;
[80] xfs_agblock_t sb_rextsize;
[84] xfs_agblock_t sb_agblocks;
[88] xfs_agnumber_t sb_agcount;
[92] xfs_extlen_t sb_rbmblocks;
[96] xfs_extlen_t sb_logblocks;
[100] uint16_t sb_versionnum;
[102] uint16_t sb_sectsize;
[104] uint16_t sb_inodesize;
[106] uint16_t sb_inopblock;
[108] char sb_fname[12];
[120] uint8_t sb_blocklog;
[121] uint8_t sb_sectlog;
[122] uint8_t sb_inodelog;
[123] uint8_t sb_inopblog;
[124] uint8_t sb_agblklog;
[125] uint8_t sb_rextslog;
[126] uint8_t sb_inprogress;
[127] uint8_t sb_imax_pct;
[128] uint64_t sb_icount;
[136] uint64_t sb_ifree;
[144] uint64_t sb_fdblocks;
[152] uint64_t sb_frextents;
[160] xfs_ino_t sb_uquotino;
[168] xfs_ino_t sb_gquotino;
[176] uint16_t sb_qflags;
[178] uint8_t sb_flags;
[179] uint8_t sb_shared_vn;
[180] xfs_extlen_t sb_inoalignmt;
[184] uint32_t sb_unit;
[188] uint32_t sb_width;
[192] uint8_t sb_dirblklog;
[193] uint8_t sb_logsectlog;
[194] uint16_t sb_logsectsize;
[196] uint32_t sb_logsunit;
[200] uint32_t sb_features2;
[204] uint32_t sb_bad_features2;
[208] uint32_t sb_features_compat;
[212] uint32_t sb_features_ro_compat;
[216] uint32_t sb_features_incompat;
[220] uint32_t sb_features_log_incompat;
[224] uint32_t sb_crc;
[228] xfs_extlen_t sb_spino_align;
[232] xfs_ino_t sb_pquotino;
[240] xfs_lsn_t sb_lsn;
[248] uuid_t sb_meta_uuid;
}
本文中不会详细讨论这些字段,重点放在我们需要快速了解文件系统的字段上。
首先,我们需要基本的文件系统结构大小信息,如块大小(超级块的 4-7字节)和 inode 大小( 104-105字节)。XFS v5 默认为 4K 块和 512 字节 inode,这些内容保存在超级快中。
同时文件系统AG的数量(88-91)和每个AG块的大小(84-87)是很重的,XFS通过AG去索引数据在物理磁盘的位置,上面截图的文件系统有16(0x10)个AG每个AG的block的数量为163840(0x28000) 这样文件系统的大小就是AG数量*AG大小=10GB
根目录的 inode 编号在(56-63字节 0x50) 128,文件系统日志的起始块在(48-55字节0x200006),日志长度(96-99字节0x4000)
使用16进制进行查询是原始且酷酷的,同样的,另一种快速查看的方法是使用xfs_db ,用xfs_db可以自动化的将16进制的内容打印出来,“xfs_db -r” 允许对挂载的文件系统进行只读访问。“sb 0”命令从 AG 0 中选择超级块。“print”有一个内置模板,可以自动解析和显示超级块信息。这也是在没有开启XFSDEBUG系统中检查已经损坏文件系统出现问题是在内存还是磁盘中的一种方法(xfs_db始终读取磁盘)
[root@ip-172-31-35-68 ~]# xfs_db -r /dev/nvme1n1
xfs_db> sb 0
xfs_db> p
magicnum = 0x58465342
blocksize = 4096
dblocks = 2621440
rblocks = 0
rextents = 0
uuid = 76cef79a-56f3-49ba-ada8-ed01d066ebe6
logstart = 2097158
rootino = 128
rbmino = 129
rsumino = 130
rextsize = 1
agblocks = 163840
agcount = 16
rbmblocks = 0
logblocks = 16384
versionnum = 0xb5b5
sectsize = 512
inodesize = 512
inopblock = 8
fname = "\000\000\000\000\000\000\000\000\000\000\000\000"
blocklog = 12
sectlog = 9
inodelog = 9
inopblog = 3
agblklog = 18
rextslog = 0
inprogress = 0
imax_pct = 25
icount = 64
ifree = 59
fdblocks = 2604952
.....