Possible mdadm RAID states?

7

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?

j-g-faustus

Posted 2010-07-11T19:56:04.170

Reputation: 1 139

Answers

8

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");

Paused until further notice.

Posted 2010-07-11T19:56:04.170

Reputation: 86 075

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. – Eric – 2014-09-19T02:45:46.687

Nice find. I would of never thought looking there – TheLQ – 2010-07-12T04:19:20.507

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. – picrap – 2012-10-03T21:46:16.660