Можливі стану RAID mdadm?


6

Я пишу плагін моніторингу для домашнього сервера RAID, mdadm на Ubuntu 10.4.

Використовуючи, sudo mdadm --detail /dev/md0 я отримую такий результат:

/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

...

Я шукаю можливі значення "стану", але не можу знайти його ніде, manані онлайн-документація, яку я знайшов, не має списку.

Хтось знає, де знайти список можливих станів?

Відповіді:


7

Виходячи з вихідного коду , ("чистий" або "активний") і ("деградований" або "") і ("" або "відновлення" або "відновлення") і ("" або "не розпочато").

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

Ви не питали про це disk.state, але ось відповідний вихідний код:

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

Приємна знахідка. Я б ніколи не думав шукати там
TheLQ

Як не дивно, моє встановлена ​​на сьогодні версія mdadm показала мені статус "чистий, НЕПРАВНИЙ", де масив насправді мертвий. Це дивно, тому що я не зміг його знайти у вихідному коді.
пікрап

Я прийшов сюди, базуючись на пошуку того самого. Мій стан "брудний", але його не бачимо у прийнятій відповіді. Хоча це і старше ядро ​​Linux. Kernel v2.6.10 та mdadm - v1.8.0 - 01 листопада 2004 р.
Ерік,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.