mdadm recipes
=============

The following examples/recipes may help you with your mdadm experience. I'll
leave it as an exercise to use the correct device names and parameters in each
case. You can find pointers to additional documentation in the README.Debian
file.

Enjoy. Submissions welcome.

The latest version of this document is available here:
  http://git.debian.org/?p=pkg-mdadm/mdadm.git;a=blob;f=debian/README.recipes;hb=HEAD

The short options used here are:

    -l Set  RAID  level.
    -n Number of active devices in the array.
    -x Specify the number of spare (eXtra) devices in the initial array.

0. create a new array
~~~~~~~~~~~~~~~~~~~~~
    mdadm --create -l1 -n2 -x1 /dev/md0 /dev/sd[abc]1   # RAID 1, 1 spare
    mdadm --create -l5 -n3 -x1 /dev/md0 /dev/sd[abcd]1  # RAID 5, 1 spare
    mdadm --create -l6 -n4 -x1 /dev/md0 /dev/sd[abcde]1 # RAID 6, 1 spare

1. create a degraded array
~~~~~~~~~~~~~~~~~~~~~~~~~~
    mdadm --create -l5 -n3 /dev/md0 /dev/sda1 missing /dev/sdb1
    mdadm --create -l6 -n4 /dev/md0 /dev/sda1 missing /dev/sdb1 missing

2. assemble an existing array
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    mdadm --assemble --auto=yes /dev/md0 /dev/sd[abc]1

    # if the array is degraded, it won't be started. use --run:
    mdadm --assemble --auto=yes --run /dev/md0 /dev/sd[ab]1

    # or start it by hand:
    mdadm --run /dev/md0

3. assemble all arrays in /etc/mdadm/mdadm.conf
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    mdadm --assemble --auto=yes --scan

4. assemble a dirty degraded array
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    mdadm --assemble --auto=yes --force /dev/md0 /dev/sd[ab]1
    mdadm --run /dev/md0

4b. assemble a dirty degraded array at boot-time
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    If the array is started at boot time by the kernel (partition type 0xfd),
    you can force-assemble it by passing the kernel boot parameter

      md-mod.start_dirty_degraded=1

5. stop arrays
~~~~~~~~~~~~~~
    mdadm --stop /dev/md0

    # to stop all arrays in /etc/mdadm/mdadm.conf
    mdadm --stop --scan

6. hot-add components
~~~~~~~~~~~~~~~~~~~~~
    # on the running array:
    mdadm --add /dev/md0 /dev/sdc1

    # if you add more components than the array was setup with, additional
    # components will be spares

7. hot-remove components
~~~~~~~~~~~~~~~~~~~~~~~~
    # on the running array:
    mdadm --fail /dev/md0 /dev/sdb1

    # if you have configured spares, watch /proc/mdstat how it fills in
    mdadm --remove /dev/md0 /dev/sdb1

8. hot-grow a RAID1 by adding new components
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # on the running array, in either order:
    mdadm --grow -n3 /dev/md0
    mdadm --add /dev/md0 /dev/sdc1

    # note: without growing first, additional devices become spares and are
    # *not* synchronised after the add.

9. hot-shrink a RAID1 by removing components
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    mdadm --fail /dev/md0 /dev/sdc1
    mdadm --remove /dev/md0 /dev/sdc1
    mdadm --grow -n2 /dev/md0

10. convert existing filesystem to RAID 1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # The idea is to create a degraded RAID 1 on the second partition, move
    # data, then hot add the first. This seems safer to me than simply to
    # force-add a superblock to the existing filesystem.
    #
    # Assume /dev/sda1 holds the data (and let's assume it's mounted on
    # /home) and /dev/sdb1 is empty and of the same size...
    #
    mdadm --create /dev/md0 -l1 -n2 /dev/sdb1 missing

    mkfs -t <type> /dev/md0
    mount /dev/md0 /mnt

    tar -cf- -C /home . | tar -xf- -C /mnt -p

    # consider verifying the data
    umount /home
    umount /mnt
    mount /dev/md0 /home    # also change /etc/fstab

    mdadm --add /dev/md0 /dev/sda1

    Warren Togami has a document explaining how to convert a filesystem on
    a remote system via SSH: http://togami.com/~warren/guides/remoteraidcrazies/

10b. convert existing filesystem to RAID 1 in-place
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    In-place conversion of /dev/sda1 to /dev/md0 is effectively

      mdadm --create /dev/md0 -l1 -n2 /dev/sda1 missing

    however, do NOT do this, as you risk filesystem corruption.

    If you need to do this, first unmount and shrink the filesystem by
    a megabyte (if supported). Then run the above command, then (optionally)
    again grow the filesystem as much as possible.

    Do make sure you have backups. If you do not yet, consider method (10)
    instead (and make backups anyway!).

11. convert existing filesystem to RAID 5/6
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # See (10) for the basics.
    mdadm --create /dev/md0 -l5 -n3 /dev/sdb1 /dev/sdc1 missing

    #mdadm --create /dev/md0 -l6 -n4 /dev/sdb1 /dev/sdc1 /dev/sdd1 missing
    mkfs -t <type> /dev/md0
    mount /dev/md0 /mnt

    tar -cf- -C /home . | tar -xf- -C /mnt -p

    # consider verifying the data
    umount /home
    umount /mnt
    mount /dev/md0 /home    # also change /etc/fstab

    mdadm --add /dev/md0 /dev/sda1

12. change the preferred minor of an MD array (RAID)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # you need to manually assemble the array to change the preferred minor
    # if you manually assemble, the superblock will be updated to reflect
    # the preferred minor as you indicate with the assembly.
    # for example, to set the preferred minor to 4:
    mdadm --assemble /dev/md4 /dev/sd[abc]1

    # this only works on 2.6 kernels, and only for RAID levels of 1 and above.
    # for other MD arrays, you need to specify --update explicitly:
    mdadm --assemble --update=super-minor /dev/md4 /dev/sd[abc]1

    # see also item 12 in the FAQ contained with the Debian package.

 -- martin f. krafft <madduck@debian.org>  Fri, 06 Oct 2006 15:39:58 +0200
