Восстановление аппаратно-софтового RAID в FreeBSD

На одном из удаленных серверов случилась довольно обычная ситуация, начал подтупливать и выдавать ошибки один из двух дисков зеркала (RAID-1). Сервер Supermicro 5037MC-H8TRF, IPMI присутствует и доступ к нему имеется, но захотелось понять как восстановить полную  рабоспособность сервера не прибегая к использованию утилит BIOS, а только из консоли операционной системы (FreeBSD 9.3)
 
Немного теории, большинство дешевых серверов Supermicro (да и многих других производителей) имеют на борту так называемый "недорейд" или софтовый рейд, который хранится в постоянной памяти (ROM), ицнициализируется при загрузке, после прохождения проверок BIOS и позволяет стартовать операционной системе уже с инициализированного RAID массива. То бишь получается аппаратная поддержка программного рейда, которая не зависит от типа операционной системы и функционал которого доступе еще до загрузки ОС. Возможные уровни RAID зависят от конкретного оборудования.
 
Итак, сначала смотрим состояние дисков, а точнее просматриваем их SMART, для этого используем утилиту smartctl. Если она отсутстувует в системе, то ставим из портов -
cd /usr/ports/sysutils/smartmontools 
make install clean
Проверям (читаем только данные смарта, именование дисков можно посмотреть в папке /dev/, у меня это ad4 и ad6)
smartctl -А /dev/ad4
SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   115   099   006    Pre-fail  Always       -       83988872
  3 Spin_Up_Time            0x0003   096   096   000    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   100   100   020    Old_age   Always       -       30
  5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000f   078   060   030    Pre-fail  Always       -       59970468
  9 Power_On_Hours          0x0032   082   082   000    Old_age   Always       -       15945
 10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   020    Old_age   Always       -       14
183 Runtime_Bad_Block       0x0032   099   099   000    Old_age   Always       -       1
184 End-to-End_Error        0x0032   100   100   099    Old_age   Always       -       0
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
188 Command_Timeout         0x0032   100   100   000    Old_age   Always       -       0 0 0
189 High_Fly_Writes         0x003a   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0022   075   068   045    Old_age   Always       -       25 (Min/Max 22/32)
191 G-Sense_Error_Rate      0x0032   100   100   000    Old_age   Always       -       0
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       10
193 Load_Cycle_Count        0x0032   001   001   000    Old_age   Always       -       503694
194 Temperature_Celsius     0x0022   025   040   000    Old_age   Always       -       25 (0 20 0 0 0)
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       -       0
240 Head_Flying_Hours       0x0000   100   253   000    Old_age   Offline      -       11952h+31m+11.444s
241 Total_LBAs_Written      0x0000   100   253   000    Old_age   Offline      -       13968719199
242 Total_LBAs_Read         0x0000   100   253
Этот диск еще будет жить.
Проверяем второй -
smartctl -А /dev/ad6
SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   118   099   006    Pre-fail  Always       -       193414840
  3 Spin_Up_Time            0x0003   094   094   000    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   100   100   020    Old_age   Always       -       30
  5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000f   030   029   030    Pre-fail  Always   FAILING_NOW 281470741881288
  9 Power_On_Hours          0x0032   082   082   000    Old_age   Always       -       15942
 10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   020    Old_age   Always       -       14
183 Runtime_Bad_Block       0x0032   099   099   000    Old_age   Always       -       1
184 End-to-End_Error        0x0032   099   099   099    Old_age   Always   FAILING_NOW 1
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
188 Command_Timeout         0x0032   100   100   000    Old_age   Always       -       0 0 0
189 High_Fly_Writes         0x003a   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0022   074   067   045    Old_age   Always       -       26 (Min/Max 22/33)
191 G-Sense_Error_Rate      0x0032   100   100   000    Old_age   Always       -       0
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       11
193 Load_Cycle_Count        0x0032   001   001   000    Old_age   Always       -       502622
194 Temperature_Celsius     0x0022   026   040   000    Old_age   Always       -       26 (0 20 0 0 0)
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       -       0
240 Head_Flying_Hours       0x0000   100   253   000    Old_age   Offline      -       11962h+53m+00.346s
241 Total_LBAs_Written      0x0000   100   253   000    Old_age   Offline      -       8160199857
242 Total_LBAs_Read         0x0000   100   253   000    Old_age   Offline      -       34647230851
С этим диском все несколько хуже и из-за него возникают ошибки, соответственно менять будем его. После замены диска он имеет статус - Non-Raid и естественно не входит в состав нашего рейда. Для работы с аппаратно-софтовыми рейдами в FreeBSD используется утилита graid, которая зависит от модуля ядра geom_raid.ko. Данный модуль включен в ядро по умолчанию (GENERIC) начиная с версии 9.1. Если необходимо, он может быть загружен вручную с помощью graid load.  
 
Итак смотрим состояние RAID после замены диска:
/usr/home/alex1812 # graid status
   Name    Status  Components
raid/r0  DEGRADED  ada1 (ACTIVE (ACTIVE))

Как я писал выше, второй диск в рейд не входит, поэтому добавляем новый (замененный) диск в состав рейда с дальнейшим зеркалированием данных на него - 

graid insert raid/r0 ada0

Проверяем статус рейда -

 graid status
   Name    Status  Components
raid/r0  DEGRADED  ada1 (ACTIVE (ACTIVE))
                   ada0 (ACTIVE (REBUILD 0%))

По прошествию нескольких часов, мы получаем полностью рабочих рейд -

graid status
   Name    Status  Components
raid/r0  DEGRADED  ada1 (ACTIVE (ACTIVE))
                   ada0 (ACTIVE (ACTIVE))

На этом задача по востановлению выполнена. Другие возможности утилиты graid, которая позволяет выполнять большинство необходимых операций с аппаратно-софтовыми рейдами вы можете посмотреть в официальной документации FreeBSD 

0
Голосов пока нет