Possible mdadm RAID states?

7,151

Based on the source code, ("clean" or "active") and ("degraded" or "") and ("" or "resyncing" or "recovering") and ("" or "Not Started").

if (array.raid_disks)
                  printf("          State : %s%s%s%s\n",
                         (array.state&(1<<MD_SB_CLEAN))?"clean":"active",
                         array.active_disks < array.raid_disks? ", degraded":"",
                         (!e || e->percent < 0) ? "" :
                         (e->resync) ? ", resyncing": ", recovering",
                         larray_size ? "": ", Not Started");

You didn't ask about disk.state, but here is the relevant source code:

if (disk.state & (1<<MD_DISK_FAULTY)) {
                        printf(" faulty");
                        if (disk.raid_disk < array.raid_disks &&
                            disk.raid_disk >= 0)
                              failed++;
                  }
                  if (disk.state & (1<<MD_DISK_ACTIVE)) printf(" active");
                  if (disk.state & (1<<MD_DISK_SYNC)) printf(" sync");
                  if (disk.state & (1<<MD_DISK_REMOVED)) printf(" removed");
                  if (disk.state & (1<<MD_DISK_WRITEMOSTLY)) printf(" writemostly");
                  if ((disk.state &
                       ((1<<MD_DISK_ACTIVE)|(1<<MD_DISK_SYNC)|(1<<MD_DISK_REMOVED)))
                      == 0) {
                        printf(" spare");
                        if (is_26) {
                              if (disk.raid_disk < array.raid_disks && disk.raid_disk >= 0)
                                    printf(" rebuilding");
                        } else if (is_rebuilding && failed) {
                              /* Taking a bit of a risk here, we remove the
                               * device from the array, and then put it back.
                               * If this fails, we are rebuilding
                               */
                              int err = ioctl(fd, HOT_REMOVE_DISK, makedev(disk.major, disk.minor));
                              if (err == 0) ioctl(fd, HOT_ADD_DISK, makedev(disk.major, disk.minor));
                              if (err && errno ==  EBUSY)
                                    printf(" rebuilding");
Share:
7,151

Related videos on Youtube

j-g-faustus
Author by

j-g-faustus

Updated on September 17, 2022

Comments

  • j-g-faustus
    j-g-faustus over 1 year

    I'm writing a monitoring plugin for a home server RAID, mdadm on Ubuntu 10.4.

    Using sudo mdadm --detail /dev/md0 I get output like this:

    /dev/md0:
            Version : 00.90
      Creation Time : Thu Dec 17 14:31:49 2009
         Raid Level : raid5
         Array Size : 4395407808 (4191.79 GiB 4500.90 GB)
      Used Dev Size : 1465135936 (1397.26 GiB 1500.30 GB)
       Raid Devices : 4
      Total Devices : 4
    Preferred Minor : 0
        Persistence : Superblock is persistent
    
        Update Time : Sun Jul 11 06:57:28 2010
              State : clean
     Active Devices : 4
    Working Devices : 4
     Failed Devices : 0
      Spare Devices : 0
    
    ...
    

    I'm looking for the possible values of "state" but can't seem to find it anywhere, neither man nor the online documentation I have found seem to have a list.

    Does anyone know where to find a list of possible states?

  • HiFi
    HiFi almost 14 years
    Nice find. I would of never thought looking there
  • picrap
    picrap over 11 years
    Oddly enough, my currently installed version of mdadm showed me a status as "clean, FAILED", where the array was actually dead. This is odd, because I couldn't find it in the source code.
  • Eric
    Eric over 9 years
    I came here based on search of same thing. My state is "Dirty" but not seeing it in the accepted answer. It's an older Linux kernel though too. Kernel v2.6.10 and mdadm - v1.8.0 - 01 November 2004.