软raid v0.9元数据存放区域计算

也许可以从函数load_super0查一查0.9从什么区域读取的超级块信息。

c 复制代码
|- get_dev_size(fd, devname, &dsize);	// 获取磁盘size
	|- ioctl(fd, BLKGETSIZE64, &ldsize);	// 发送一个ioctl给磁盘获取size。
|- offset = MD_NEW_SIZE_SECTORS(dsize>>9);	// 获取扇区偏移。
c 复制代码
// md_p.h
/*
 * RAID superblock.
 *
 * The RAID superblock maintains some statistics on each RAID configuration.
 * Each real device in the RAID set contains it near the end of the device.
 * Some of the ideas are copied from the ext2fs implementation.
 *
 * We currently use 4096 bytes as follows:
 *
 *	word offset	function
 *
 *	   0  -    31	Constant generic RAID device information.
 *    32  -    63   Generic state information.
 *	  64  -   127	Personality specific information.
 *	 128  -   511	12 32-words descriptors of the disks in the raid set.
 *	 512  -   911	Reserved.
 *	 912  -  1023	Disk specific descriptor.
 */

/*
 * If x is the real device size in bytes, we return an apparent size of:
 *
 *	y = (x & ~(MD_RESERVED_BYTES - 1)) - MD_RESERVED_BYTES
 *
 * and place the 4kB superblock at offset y.
 */
#define MD_RESERVED_BYTES		(64 * 1024)
#define MD_RESERVED_SECTORS		(MD_RESERVED_BYTES / 512)
#define MD_RESERVED_BLOCKS		(MD_RESERVED_BYTES / BLOCK_SIZE)

#define MD_NEW_SIZE_SECTORS(x)		((x & ~(MD_RESERVED_SECTORS - 1)) - MD_RESERVED_SECTORS)
#define MD_NEW_SIZE_BLOCKS(x)		((x & ~(MD_RESERVED_BLOCKS - 1)) - MD_RESERVED_BLOCKS)

所以需要研究下元数据存放位置的计算方式?

假设设备的磁盘大小为10G,换算成字节10 * 1024 * 1024 * 1024 = 10737418240Byte,用来被保存raid superblock的总大小为64KB。

宏MD_NEW_SIZE_SECTORS用来计算元数据存放的扇区位置,传参为磁盘的扇区数x,如果磁盘大小为10G,磁盘扇区数为20971520个扇区。

MD_RESERVED_SECTORS大小为128个sectors。

(20971520- & ~(127)) - 128 = 209713921010000000000000000000000 & 0000000 - 128 = 20971392,对于磁盘大小为10G的磁盘来讲,刚好保留了最后64K用来存放软raid元数据,当然也包括bitmap相关信息。

~127的目的是为了将20971520低七位清零,形成一种64K对齐的效果,对齐之后取最后一个64KB作为元数据的存放区域,对于磁盘非64K对齐的区域软raid不进行管理。

相关推荐
贝锐5 小时前
从国产化信创设备到商用安卓终端,向日葵如何帮助企业实现统一运维管理?
linux·运维·远程控制
Julien20046 小时前
调查和解决 SELinux 问题
linux·运维·服务器·网络·学习方法
小张同学a.9 小时前
Docker 容器实战 1—— docker 基础与镜像构建
linux·运维·docker·容器
Best-Wishes11 小时前
BurpSuite Pro教育版在linux系统中配置
linux·运维·服务器·网络安全·burpsuite
wuminyu11 小时前
深入剖析 Panama Off-heap 的性能损耗与开销
java·linux·c语言·jvm·c++
虎王物联11 小时前
RK3568嵌入式Linux跑Docker:内核配置排查到AIoT容器化的完整路径
linux·运维·docker·rk3568·aiot·嵌入式linux
GeW12 小时前
不只靠技术:RHCE考试的5个隐藏得分点
linux
老当益壮梁奶奶12 小时前
Linux软件编程学习笔记(八):进程间通信详解(1)
linux·c语言·笔记·学习·算法
祖力5513 小时前
进程间通信(IPC机制):消息队列与共享内存
linux·消息队列·共享内存·通信·进程间通信
Learn-Share_HY13 小时前
[IT Network]如何配置反向路徑過濾器(rp_filter),以解決路由不對稱問題?
linux·嵌入式硬件·物联网·网络协议·tcp/ip·http·iot