我们先来看看如何使用raid的reshape功能,在网上查资料说必须在有spare备用磁盘且必须指定backup备份文件的条件下,才可以进行磁盘扩展reshape,下面是我的使用记录:
1、如果磁盘没有spare备用磁盘则提示如下错误:
2、未指定backup备份文件,在superblock1.2版本下,可以正确扩展磁盘:
从上面的使用可以看出,在superblock的版本号为1.2时,必须存在spare备用磁盘,但是可以不用指定备份文件。具体原因不知道,难道是superblock版本的问题??
当然,在reshape后必须重新修改/etc/mdadm.conf文件,主要是修改就是修改成员磁盘的数量;
修改完后,执行如下:
从上面的使用,得出如下结论:linux软raid只支持最多一块磁盘数量的增加,并且必须存在spare备用磁盘的情况下才可以。
接下来,开始分析linux内核中软raid的实现:
下面我们进入reshape_request()函数(函数开始的注释应该重点看一下,说明了reshape具体是怎么操作的):
static sector_t reshape_request(mddev_t *mddev, sector_t sector_nr, int *skipped)
{
/* reshaping is quite different to recovery/resync so it is
* handled quite separately ... here.
* reshape操作和recovery/resync完全不同,因此,它需要在这里进行单独处理
* On each call to sync_request, we gather one chunk worth of
* destination stripes and flag them as expanding.
* Then we find all the source stripes and request reads.
* As the reads complete, handle_stripe will copy the data
* into the destination stripe and release that stripe.
* 每次调用sync_request()时,我们搜集一个chunk大小的目的stipes并且标记它们为需要扩展
* 然后我们找到所有的源stripes以及读这些stripes的请求,当读请求完成时,handle_stripe()
* 将会拷贝这些数据到目的stripes,并释放掉源stripes
*/
raid5_conf_t *conf = (raid5_conf_t