Meu objetivo é automatizar uma rotina de backup em um pequeno NAS OpenSolaris (executando OmniOS + napp-it em um HP Microserver N54L) em combinação com discos SATA.
Fundo:
Eu instalei uma daquelas bandejas de HDD sem portadora de 5,25" -> 3,5" que contêm um backplane SATA ou SAS/SATA simples com uma porta, um botão liga/desliga e alguns LEDs (energia e atividade do HDD). Para fazer backup de vários HDDs (um a cada semana em rotação, armazenado fora do local), escrevi um script que usa zfs send/recv
para despejar o pool principal completo, incluindo todos os instantâneos (atualizando apenas novos blocos). Este script funciona bem quando eu o inicio manualmente.
Eu gostaria de automatizar ainda mais esse processo, porque o NAS não tem VGA direto ou console serial conectado e é tedioso inserir o disco, voltar para o sistema de desktop, fazer login na interface da web ou SSH e iniciar o script manualmente . O início cronometrado via cron job não é uma opção, pois os dias de backup podem variar um pouco (esqueci o disco, feriados, etc.). Portanto, o backup deve começar logo após a inserção do disco.
Problema:
No script que uso cfgadm
para conectar + configurar e depois desconfigurar + desconectar os discos. Se eu apenas inserir o disco e ele girar, não tenho como saber que o disco está lá. Possíveis soluções que já considerei:
- Sondagem de um novo disco e zpool a cada x minutos continuamente usando
cfgadm -f -c connect
e verificando resultados de erro. Não muito elegante. - Verificando
/var/adm/messages
a cada x minutos e procurando o caminho do dispositivo ou AHCI. Não é possível, pois as mensagens só são gravadas se o dispositivo for conectado manualmente. - Usando
iostat -En
. Exibe os discos, mas preciso obter os números de série exatos, porque não lista as informações da porta. Também precisa ser feito a cada x minutos. - Usando
cfgadm
com a sintaxe SELECT para filtrar o status do receptáculo. Não funciona, porque a inserção não aciona nada (talvez o backplane seja muito barato para isso). - Reconhecendo o ligar/desligar do gabinete. Estaria tudo bem, mas eu não conseguia descobrir como fazer isso.
- Remapear o botão liga/desliga ou adicionar outro botão à máquina. Poderia funcionar, mas também não sei como fazer isso.
Acho que precisaria de duas coisas:
- uma maneira confiável de identificar o status do disco e da porta em combinação (para que apenas o disco correto no slot correto seja detectado)
- uma maneira de registrar essa detecção e acionar um evento (iniciar shell script)
Isso é possível? Se não, o que você sugeriria como alternativas?
Solução final (atualizada em 26/01/2015):
Para qualquer pessoa com problemas semelhantes no futuro:
- Habilite o hotswap AHCI no OmniOS conforme detalhado na resposta aceita por gea.
- Use
syseventadm
conforme detalhado em minha própria resposta para acionar o script de backup quando o disco ficar online. - Certifique-se de que seus cabos, controlador e discos estejam livres de falhas e funcionem bem juntos (tive problemas com os discos WD SE 4TB e o controlador AHCI SATA integrado, o que resultou em
WARNING: ahci0: ahci_port_reset port 5 the device hardware has been initialized and the power-up diagnostics failed
mensagens aleatórias nos logs do sistema).
Onboard Sata/AHCI é compatível com hotplug, mas está desativado no OmniOS por padrão: Para ativar, adicione a seguinte linha a /etc/system
definir sata:sata_auto_online=1
Pergunta interessante... um pouco como um experimento científico, já que provavelmente usaria apenas USB ou enviaria remotamente ou agendaria isso...
Mas, no seu caso, eu não tentaria "procurar" o disco de
cfgadm
maneira alguma ou de análise de log. Isso não é escalável.Eu simplesmente nomearia o disco removível com um nome de pool ZFS exclusivo e lógica de script em torno de um arquivo
zpool import
. No ZFS no Linux, o processo de importação do pool é um serviço/daemon do sistema. Mas não há custo para executá-lo periodicamente. Ele detectará a unidade e o pool associado.Espero que você esteja exportando o pool quando terminar o backup também. Isso cobriria situações em que a unidade permanece no servidor por vários ciclos de backup. Como deixar uma fita de backup em sua unidade.
Vou adicionar esta resposta para documentar o que descobri sobre o monitoramento de eventos (também pode ser útil em outros casos):
Ao tentar fazer a pergunta no unix/linux.SE, notei um tópico útil sobre o uso
udev
no Linux para monitorar eventos do kernel. Como uma ferramenta equivalente para o Solaris, me deparei com a sugestão de usar osyseventadm
which watchs for sysevens e acionar ações/scripts definidos.A princípio, não encontrei muito, exceto cópias da página do manual e algumas discussões sobre um problema com o Xen Hypervisor, mas os eventos suportados estão listados em
/usr/include/sys/sysevent/eventdefs.h
(ou online/usr/src/uts/common/sys/sysevent/eventdefs.h
em vários repositórios) e outros arquivos nesse diretório.Usando o primeiro exemplo da página de manual
syseventadm add -c EC_zfs -s ESC_ZFS_scrub_start /path/to/script.sh \$pool_name
, testei com sucesso um evento de amostra que é acionado toda vez que um scrub é iniciado e retorna o nome do pool como primeiro argumento.Depois de algumas tentativas e erros, encontrei a maneira correta de monitorar discos recém-adicionados:
Tudo depois
disk
é opcional e passado diretamente para o script como argumentos$1
para$5
.Agora, assim que o disco recém-adicionado ficar online, o script será acionado e o script poderá verificar se o ID do dispositivo está correto (opcional) e então importar o pool por nome.