Chinaunix首页 | 论坛 | 博客
  • 博客访问: 122057
  • 博文数量: 25
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 251
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-29 14:18
个人简介

不以物喜,勿以己悲;乐观向上,持之以恒。

文章分类

全部博文(25)

文章存档

2015年(25)

我的朋友

分类: LINUX

2015-07-21 23:43:39


bitmap
的工作原理就是使用一个位图,每个位对应md设备的一个数据块,在md设备有数据写入时,设置该数据块对应的位,等待写入完成后,再清除该数据块对应的位。
当需要进行数据同步/恢复时,参照bitmap的位图,只有设置了位对应的数据块才需要进行同步/恢复操作。


数据结构设计


bitmap_info结构


此结构定义在mddev结构中,其核心部分为:

核心成员

描述

struct file *file

描述bitmap file,当指定为md自身时,为NULL

loff_t offset

可以为负,不能为0,描述bitmap文件存放在超级块之前还是之后,为负,就在超级块前

struct default_offset

md设备创建后,再指定bitmapfile时会使用

unsigned long chunksize

存放bitmap chunksize

int external

创建MD设备时指定internal时,值为0


bitmap_page结构


核心成员

描述

void *map

指向一个page的指针起始位置,一个page中每2B的大小保存一个16位的bimtap_counter描述一个chunk的状态

unsigned in hijacked:1

map申请失败时会被使用

unsigned int count:31

描述在这个page中有dirty位的bit个数


bitmap结构


以下列出bitmap结构的核心部分:

核心成员

描述

struct bitmap_page *bp

申请为一个数组,每个元素对应一个bitmap内存页

unsigned long pages

描述bp数组元素的个数

unsigned long chunkshift

通过bitmap-chunk计算出来的shift

unsigned long chunks

底层磁盘大小计算出来的chunk个数

spinlock_t lock

Bitmap的自旋锁,保护filemap page

struct page *sb_page

存放mdbitmapsuperblock的信息

struct page **filemap

描述整个bitmap file的信息,以页的形式保存

unsigned long *filemap_attr

4bit对应filemap的一页

unsigned long file_pages

描述bitmap filefilemap中用了多少个page

unsigned long flags

描述bitmap的状态



bitmap_super_t结构


此结构描述超级块的信息,详细信息如下:

成员

描述

__le32 magic

0 - 4  BITMAP_MAGIC,定义成0x6d746962

__le32 version

4 - 8 the bitmap major for now, could change...

__u8   uuid[16]

8 - 24 128 bit uuid - must match md device uuid

__le64 events

24 - 32 event counter for the bitmap (1)

__le64 events_cleared

32 - 40 event counter when last bit cleared (2)

__le64 sync_size

40 - 48 the size of the md device's sync range(3)

__le32 state

48 - 52 bitmap state information

__le32 chunksize

52 - 56 the bitmap chunk size in bytes

__le32 daemon_sleep

56 - 60 seconds between disk flushes

__le32 write_behind

60 - 64 number of outstanding write-behind writes

__le8  pad[256 - 64]

set to zero

 

上述结构是在md设备创建时,由应用层程序mdadm进行初始化赋值。在kernel中,是直接通过读取bitmap file对应位置的信息保存在sb_page中,然后通过内存映射,将这些值读出来的。

值得关注的是,event记录md设备的最后一个事件,这个事件被记录在md的超级块的events和mddev结构中events中,在MD中某个成员盘加载时,可以比较这两个结构中的events确定bitmap文件是否已经过期。

bitmap保存


Bitmap信息可以存在在md设备之外,单独指定一个磁盘/文件,此时mddev结构中的bitmap_file表示这个bitmap文件。

Bitmap信息也可以存放在md设备自身,bitmap文件相对于md超级块的位置由bitmap_offset指定,当这个值为负值时,表示bitmap文件存放在超级块之前。这里假设bitmap_offset大于0,则表示bitmap磁盘文件在超级块之后。

Bitmap文件状态如下,记录在bitmap->flagsbitmap->sb->state中:
1. BITMAP_STALE  = 0x002:此状态被设置,表示bitmap file已经过期;
2. 
BITMAP_WRITE_ERROR = 0x004:此状态在发生写错误时,被设置;
3. 
BITMAP_HOSTENDIAN = 0x8000bitmap->sb.version == BITMAP_MAJOR_HOSTENDIAN(3)时被设置


下面以bitmap信息存放在MD设备自身为例,此时bitmap_file=NULL

MD设备的整个元数据信息部分由超级块和位图组成,超级块大小为256(见前面结构bitmap_super_t),随后紧跟位图。
位图中,一个位对应MD设备中一段条带段,这个大小由超级块sb->chunksize字段确定。
其中:
1. 位被设置,表示对应的chunk需要同步;
2. 位被清除,表示对应chunk状态一致,无需同步。

未完 -- 待续。


阅读(2620) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~