mdadm does not seem to support growing an array from level 1 to level 10.

I have two disks in RAID 1. I want to add two new disks and convert the array to a four disk RAID 10 array.

My current strategy:

  1. Make good backup.
  2. Create a degraded 4 disk RAID 10 array with two missing disks.
  3. rsync the RAID 1 array with the RAID 10 array.
  4. fail and remove one disk from the RAID 1 array.
  5. Add the available disk to the RAID 10 array and wait for resynch to complete.
  6. Destroy the RAID 1 array and add the last disk to the RAID 10 array.

The problem is the lack of redundancy at step 5.

Is there a better way?

link|improve this question

75% accept rate
3  
Don't forget step 0. Make a good backup of everything. – Anthony Lewis Jul 21 '09 at 18:28
I believe your steps are correct. You lose the redundancy during the period you're copying the data from one set to another. – Kevin Kuphal Jul 21 '09 at 18:30
Is it possible to create a degraded 4disk RAID10? – pauska Jul 21 '09 at 19:03
Yes, you just use "/dev/hda missing /dev/hdb missing", because otherwise you lose one entire pair and it all falls apart. The "accepted answer" for this question, incidentally, is completely wrong and does not work. – womble Jul 25 '09 at 1:03
feedback

5 Answers

up vote -2 down vote accepted

With linux softraid you can make a RAID 10 array with only two disks.

0) Backup, Backup, Backup, Backup oh and BACKUP

1) Make the new array:

mdadm -v --create /dev/md1 --level=raid10 --raid-devices=2 /dev/sda1 /dev/sdb2

2) Mount the raid10 & rsync the RAID 1 with the new RAID 10. (this is only an example command, read the man pages)

rsync -arHx / /where/ever/you/mounted/the/RAID10

3) Fail the RAID, add the disk to the new RAID10

mdadm /dev/md0 --fail /dev/sda2 --remove /dev/sda2

4) Add the removed disk to the RAID10

mdadm /dev/md1 --add /dev/sda2

5) Install GRUB on the new Array (Assuming you're booting from it). Some Linux rescue/boot CD works best.

6) Boot on new array. IF IT WORKED CORRECTLY Destroy old array and add the remaining disk to the new array.

mdadm --stop /dev/md0
mdadm /dev/md0 --remove /dev/sdc1
mdadm /dev/md1 --add /dev/sdc1
link|improve this answer
Where do the four disks come into it? – womble Jul 21 '09 at 19:30
Eh? I clearly state to create the array with 2 disks, copy the data, fail the raid 1 by removing one disk, add that disk to the RAID10, then boot to the RAID10, if it worked, destroy the RAID1 and move that last disk to the new RAID.... – Mark Turner Jul 21 '09 at 19:33
1  
You edited your answer after my comment. Also, your procedure gives a two-disk RAID-10 with two spares... hardly a four-disk RAID-10. RAID-10 volumes can't be reshaped, either. – womble Jul 21 '09 at 22:32
1  
I ran the commands as you provided them, and I end up with a two-disk RAID-10 with two spares, as shown by /proc/mdstat. This is on kernel 2.6.30, with mdadm v2.6.7.2. – womble Jul 22 '09 at 3:55
1  
"mdadm: raid10 array /dev/md1 cannot be reshaped." This is also mentioned in the mdadm manpage. – womble Jul 22 '09 at 21:32
show 2 more comments
feedback

Follow the same procedure as Mark Turner but when you create the raid array, mention 2 missing disks

mdadm -v --create /dev/md1 --level=raid10 --raid-devices=4 /dev/sda1 /dev/sdb2 missing missing

And then proceed with other steps.

In short, create RAID10 with total 4 disks(out of which 2 are missing), resync, add other two disks after that.

link|improve this answer
feedback

I'm also looking for a good way to do this, and I think the method described in the question is the best I found so far.

Mark Turner's answer doesn't help because it creates a 2-device array that can't be reshaped to 4 devices (the other 2 can only be added as spares).

And Suresh Kumar's answer is the same as described in the question, except it won't work exactly like that; the missing devices have to be the 2nd and 4th, not the 3rd and 4th.

About the steps in the question: I think step 5 has full redundancy, and step 6 has redundancy for half the data. I actually see the steps were renumbered but the reference to step 5 wasn't updated. Also, with the backup step present, there is always full redundancy and step 6 can be done without waiting for the resynch at step 5.

link|improve this answer
feedback

Just finished going from LVM on two 2TB disk mdadm RAID 1 to LVM on a four disk RAID 10 (two original + two new disks).

As aditsu noted the drive order is important when creating the array.

mdadm -v --create /dev/md1 --level=raid10 --raid-devices=4 /dev/sda missing /dev/sdb missing

Code above gives a usable array with two missing disks (add partition numbers if you aren't using whole disks). As soon as the third disk is added it will begin to sync. I added the fourth disk before the third finished syncing. It showed as a spare until the third disk finished then it started syncing.

Steps for my situation:

  1. Make good backup.
  2. Create a degraded 4 disk RAID 10 array with two missing disks (we will call the missing disks #2 and 4).

  3. Tell wife not to change/add any files she cares about

  4. Fail and remove one disk from the RAID 1 array (disk 4).

  5. Move physical extents from the RAID 1 array to the RAID 10 array leaving disk 2 empty.

  6. Kill the active RAID 1 array, add that now empty disk (disk 2) to the RAID 10 array, and wait for resync to complete.

  7. Add the first disk removed from RAID 1 (disk 4) to the RAID 10 array.

  8. Give wife go ahead.

At step 7 I think drive 1, 2, OR 4 can fail (during resync of disk 4) without killing the array. If drive 3 fails the data on the array is toast.

link|improve this answer
feedback

I just migrated my raid1 to raid10 based on this answer and wrote up a very detailed step by step guide. For those that are interested you can read it here.

link|improve this answer
feedback

Your Answer

 
or
required, but never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.