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 ни у найденной мною онлайн-документации нет списка.

Кто-нибудь знает, где найти список возможных состояний?

1 ответ1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .