Created: 2015-09-10 19:32 Updated: 2015-09-10 19:32

Uma surpresa que nenhum administrador de sistemas e mesmo o usuário final quer é se deparar com um disco rígido inoperante. Operações de backup e espelhamento de discos, entre outras, ajudam em muito, mas chegar num final de dia de trabalho e se deparar com um crash de disco é muito chato e dispendioso, porque normalmente a restauração (reinstalação de tudo) é um processo demorado.

No Linux, podemos usar as ferramentas contidas no pacote Smartmontools para ajuar a detectar possíveis problemas no disco rígido com alguma antecedência, de forma que a substituição possa ser planejada.

Observe que a ideia não é tornar o disco rígido infalível, já que isto é claramente impossível, a ideia é simplesmente poder planejar as substituições.

Instalação do Smartmontools

No Debian a instalação é trivial:

apt-get install smartmontools

Verificando a Saúde do Disco Rígido

A primeira coisa a saber é o nome do dispositivo associado ao disco rígido. Nas distribuições Linux, normalmente, os discos rígidos com interface IDE são chamados hdX, enquanto que os discos com interface SATA ou SCSI estão associados aos dispositivos sdX.

Nos exemplos a seguir, vamos considerar que o disco rígido em questão é /dev/sda.

Para obter informações sobre o disco rígido:

smartctl --info /dev/sda

Observe que nos comandos sempre são utilizados os nomes dos dispositivos sem o número da partição. Isto se deve ao fato de que estamos verificando o estado do disco rígido como um todo.

A saída do comando será similar à seguinte:

smartctl 5.40 2010-07-12 r3124 [i686-pc-linux-gnu] (local build)
Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF INFORMATION SECTION ===
Device Model:     SAMSUNG HD322GM
Serial Number:    S2SXJ50B805543
Firmware Version: 1AR10101
User Capacity:    320,072,933,376 bytes
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   8
ATA Standard is:  ATA-8-ACS revision 6
Local Time is:    Thu Aug 20 09:15:47 2015 BRT
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

As duas informações importantes para a nossa questão são as duas últimas do exemplo: se o suporte ao SMART está disponível e se ele está habilitado.

Para verificar a saúde do disco rígido, pode ser utilizado o seguinte comando:

smartctl -s on -a /dev/sda

O parâmetro "-s on" pode ser omitido se o suporta ao SMART já estiver habilitado.

A saída do comando é bastante longa, mas a parte que interessa agora é a seguinte:

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

O resultado pode ser tanto PASSED como FAILED, sneod que, para o último caso, a falha de hardware é iminente e a substituição do disco rígido deve ser realizada com urgência.

A próxima parte da saída do comando a ser avaliada é a que contém os atributos:

Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   100   100   051    Pre-fail  Always       -       19
  2 Throughput_Performance  0x0026   252   252   000    Old_age   Always       -       0
  3 Spin_Up_Time            0x0023   084   082   025    Pre-fail  Always       -       5042
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       1008
  5 Reallocated_Sector_Ct   0x0033   252   252   010    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x002e   252   252   051    Old_age   Always       -       0
  8 Seek_Time_Performance   0x0024   252   252   015    Old_age   Offline      -       0
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       8626
 10 Spin_Retry_Count        0x0032   252   252   051    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0032   252   252   000    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   099   099   000    Old_age   Always       -       1017
 13 Read_Soft_Error_Rate    0x003a   100   100   000    Old_age   Always       -       0
191 G-Sense_Error_Rate      0x0022   100   100   000    Old_age   Always       -       12
192 Power-Off_Retract_Count 0x0022   252   252   000    Old_age   Always       -       0
193 Load_Cycle_Count        0x0032   100   100   000    Old_age   Always       -       1018
194 Temperature_Celsius     0x0002   064   063   000    Old_age   Always       -       29 (Lifetime Min/Max 12/37)
195 Hardware_ECC_Recovered  0x003a   100   100   000    Old_age   Always       -       0
196 Reallocated_Event_Count 0x0032   252   252   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   252   252   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   252   252   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0036   200   200   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x002a   100   100   000    Old_age   Always       -       2
240 Head_Flying_Hours       0x0032   100   100   000    Old_age   Always       -       8626
241 Total_LBAs_Written      0x0032   098   094   000    Old_age   Always       -       3333525
242 Total_LBAs_Read         0x0032   096   093   000    Old_age   Always       -       6259400
254 Free_Fall_Sensor        0x0032   252   252   000    Old_age   Always       -       0

Basicamente, a tabela lista os valores para uma série de atributos definida pelo fabricante do dispositivo, bem como os respectivos valores de limiar de falha. Esta tabela é automaticamente atualizada pelo firmware do disco rígido.

As colunas são as seguintes:

Monitoração Contínua com Smartd

A melhor forma de manter as coisas sobre controle é monitorá-las constantemente e de forma automática. O Smartd pode fazer isto também da seguinte forma.

Primeiro, edite o arquivo /etc/default/smartmontools para informar ao sistema operacional que o smartd deve ser iniciado durante a inicialização do sistema e também para informar o intervalo entre verificações, em segundos. No exemplo a seguir o smartd foi habilitado e o intervalo foi ajustado para 2 horas (7200 = 26060):

start_smartd=yes
smartd_opts="--interval=7200"

Agira, edite o arquivo de configuração do smartd (/etc/smartd.conf), procure por uma linha que inicie com DEVICESCAN e comente-a. Depois, adicione as seguintes linhas:

/dev/sda -a -o on -S on -s (S/../.././02|L/../../6/03)
/dev/sda -m email@domínio.com.br -M exec /usr/share/smartmontools/smartd-runner
/dev/sda -m email@domínio.com.br -M test

Observe que estas linhas referem-se apenas a um disco rígido. Caso haja mais discos rígidos no sistema, repita as linhas alterando o nome do dispositivo.

Atenção: como veremos a seguir, a última linha será utilizada apenas como teste e deverá ser removida (ou comentada) logo após os testes.

Vejamos o que estas configurações fazem (para maiores informações, leia as páginas de manual):

/dev/sda -a -o on -S on -s (S/../.././02|L/../../6/03)

Esta linha diz ao smartd para efetuar as seguintes operações no dispositivo /dev/sda:

Qualquer parâmetro especificado com ponto (.) indica todos. No exemplo (S/../.././02|L/../../6/03) indica a execução do teste rápido (short) todos os dias às duas horas da manhã ou o teste longo a ser executado aos sábados às três horas da manhã).

A linha:

/dev/sda -m email@domínio.com.br -M exec /usr/share/smartmontools/smartd-runner

Indica que, em caso de problemas, deverá ser enviado um e-mail para o destinatário email@domínio.com.br e será executado o programa smartd-runner.

A linha:

/dev/sda -m email@domínio.com.br -M test

Indica que deve ser enviado um e-mail de teste para o destinatário email@domínio.com.br assim que o smartd for iniciado.

Observe que, para que o e-mail seja enviado, é necesário que o sistema operacional esteja corretamente configurado para envio de e-mails.

Para testar, reinicie o smartd:

invoke-rc.d smartd restart

Você deve receber um e-mail de teste do Smartd.

Uma vez que as configurações tenha funcionado, podemos remover ou comentar a linha de envio de e-mail de teste:

/dev/sda -m email@domínio.com.br -M test

Ou ainda, como eu sugiro fazer, altera a linha da seguinte forma:

/dev/sda -m email@domínio.com.br -M daily

Isto fará com que, no caso do smartd detectar algum problema, ele enviará um e-mail diariamente para o usuário enquanto o problema persistir. Isto pode parecer muito chato, mas garanto que é melhor do que chegar no trabalho e descobrir que há uma reinstalação de emergência a ser feita...

Exemplo de Configuração

A seguir são apresentados os arquivos de configuração de um servidor Linux com Smartd e SSMTP configurado para envio de e-mails. O servidor em questão conta com dois discos rígidos instalados (sda e sdb).

SSMTP

Arquivo /etc/ssmtp/ssmtp.conf:

root=postmaster
mailhub=mail
hostname=vctsrv001.vector
FromLineOverride=YES
AuthUser=USUARIO@DOMINIO.com.br
AuthPass=SENHA_DO_USUARIO
RewriteDomain=DOMINIO.com.br

Arquivo /etc/ssmtp/revaliases:

root:USUARIO@DOMINIO.com.br:smtp.DOMINIO.com.br:PORTA
www-data:USUARIO@DOMINIO.com.br:smtp.DOMINIO.com.br:PORTA

Smartmontools e Smartd

Arquivo /etc/default/smartmontools:

start_smartd=yes
smartd_opts="--interval=7200"

Arquivo /etc/smartd.conf:

/dev/sda -a -o on -S on -s (S/../.././02|L/../../6/03)
/dev/sda -m USUÁRIO@DOMÍNIO.com.br -M exec /usr/share/smartmontools/smartd-runner
/dev/sda -m USUÁRIO@DOMÍNIO.com.br -M daily

/dev/sdb -a -o on -S on -s (S/../.././02|L/../../6/03)
/dev/sdb -m USUÁRIO@DOMÍNIO.com.br -M exec /usr/share/smartmontools/smartd-runner
/dev/sdb -m USUÁRIO@DOMÍNIO.com.br -M daily