linux-raid (四) raid0
源文件
linux/src/drivers/md/raid0.h
linux/src/drivers/md/raid0.c
linux/src/drivers/md/md.h
linux/src/drivers/md/md.c
RAID 0 是将数据分散存放到不同磁盘上,比如有 8 个数据块大小的数据,同时有 2 块同样大小的磁盘,这 8 块数据会将 1,3,5,7 存放到第 1 块盘上,其他数据块存放到第 2 块磁盘上。如果两块盘大小不一样,则每块盘会使用最小磁盘大小的空间;最后单独使用余下盘上的空间。RAID 0 没有冗余,1 块盘坏掉,数据也就丢失了。
mdadm --create /dev/mdX --level=stripe --raid-devices=N ...
RAID 0 的容量计量为所有磁盘的容量(chunk 大小的整数倍)总和。
linear/raid0 不支持 spare disks,也不使用 bitmap。
static struct md_personality raid0_personality = { .name = "raid0", .level = 0, .owner = THIS_MODULE, .make_request = raid0_make_request, 必要时(超出 chunk 大小)将 bio 分解到不同的 rdev 上 .run = raid0_run, .stop = raid0_stop, .status = raid0_status, 显示 chunk 大小 .size = raid0_size, raid0 阵列中 rdev 的容量总和,以 sector 计 .takeover = raid0_takeover, raid0 可以 takeover: * raid4 - if all data disks are active. * raid5 - providing it is Raid4 layout and one disk is faulty * raid10 - assuming we have all necessary active disks * raid1 - with (N -1) mirror drives faulty .quiesce = raid0_quiesce; raid0 中只提供了空函数体 };
RAID 0 对不同大小磁盘的支持:
首先确定最小磁盘的大小,将所有磁盘中这块大小的空间看作属于 zone[0];
再扫描出次大的磁盘大小,将剩余盘中这块大小的空间看作属于 zone[1];
以此类推
如果构成阵列的所有磁盘大小都一样(近似),则 conf->nr_strip_zones 设置为 1;如果有不同尺寸,则为不同尺寸的数量,比如有 8GB/10GB/9GB 的盘,则 conf->nr_strip_zones 取值为 3。详情见 create_strip_zones 和 map_sector。
raid0 不支持磁盘的动态添加和删除:没有实现 hot add/remove 方法
* 尚未弄明白的问题
* 什么时候会出现 takeover?
* 整个 takeover 的过程是怎样的,数据会如何移动,谁来移动数据?
这里的 takeover 主要是重新构建 conf
* takeover 过程中,对可支持的 mode,有什么样的要求,如何理解这些条件?