CFTV com Zoneminder e Linux

Resolvi a algum tempo instalar um sistema de vigilância para minha casa.
Por acaso acabei encontrando no DealExtreme uma placa de captura para câmeras de vigilância que, pelos comentários, era facilmente configuravel no Linux.
Tomei então a iniciativa de pesquisar um pouco e montar meu próprio sistema de monitoramento e gravação utilizando o Zoneminder.

Uma das primeiras dúvidas foi qual sistema utilizar, qual *nix flawor, qual hardware, quanto de espaço para armazenamento, qual a necessidade real de processador, etc.
Muitas dessas perguntas ainda não possuo uma resposta ou regra básica para determinar, mas neste texto vou descrever os passos que tomei para deixar o sistema funcional.

HARDWARE:
Como motor do sistema, após ver diversos comentários do tipo "utilize seu velho pc", resolvi adotar uma motherboard de "baixo consumo".
Por não ser algo comum foi um pouco problemático escolher, mas acabei encontrando uma VIA PC1 da Phitronics na loja da JNE Informática da Av. Paulista.
A configuração é modesta, um processador VIA C7-M de 1.6Ghz com o básico encontrado onboard atualmente, USB 2.0, som, ethernet e adaptador VGA.
O modelo que encontrei foi o VIA PC3000E+.




Adicionei à motherboard 2GB de memória DDR2 e dois HDs, sendo um IDE de 40GB para o sistema e um SATA de 1.5TB para armazenamento das gravações.
É necessário que o equipamento possua bastante memória já que o Zoneminder faz uso de memória compartilhada entre seus processos para tratamento e detecção de movimento.
Já o armazenamento grande é obvio, pretendo manter as gravações por um período extenso e isso requer espaço.

A placa de captura que acabei encomendando da China não é uma Ferrari, mas tem um preço baixo e para meu sistema pareceu o bastante.
4-Channel DVR Video Capture PCI Card for 25/30 FPS Security Cameras


As câmeras, apenas duas até o momento, requisitei da loja Ribershop que encontrei no MercadoLivre, loja essa que se mostrou bastante rica em equipamentos para segurança.
Optei por duas câmeras CCD no padrão NTSC que é o mesmo operado pela placa de captura.

Tudo montado, vamos ao software.

SOFTWARE:
Enfrentei diversas dores de cabeça e perdi um tempo consideravel testando algumas opções de sistema operacional até chegar ao Debian como o mais indicado para meu projeto.
Dentre as tentativas, desisti do Ubuntu por ser extremamente integrado com o sistema gráfico e não pretendo utilizar um monitor ligado ao sistema, ficando muito complicado efetuar uma "limpeza" do sistema base instalado e o que mais pretendo é ter uma formula rápida para montar o mesmo.

Testei também o FreeBSD 8.2 e mesmo sabendo que o suporte do driver do sistema para a placa de captura poderia não ser eficiente o bastante, sequer consegui testar o mesmo pois a instalação do Zoneminder a partir do ports foi falha e também precisava de diversas configurações para deixar o mesmo funcional.



Ao chegar na minha terceira tentativa, o Debian 6, pela facilidade de instalar o ambiente acabei parando com os testes de escolha e decidi partir para produção.





Configurações:

Após ter o sistema básico instalado, pode-se instalar o Zoneminder com apenas um comando:


apt-get install zoneminder


O mesmo vai instalar todo o ecosistema de softwares necessários para a execução do ZM, a base de dados inicial no MySQL, os scripts de inicialização do sistema, Apache, PHP5 e as bibliotecas e programas necessários para manipulação de imagens/vídeo.

A única ação necessária para acessar o console do ZM foi informar ao Apache dos arquivos do mesmo:

ln -s /etc/zm/apache.conf /etc/apache2/sites-available/zm
a2ensite zm
apache2ctl restart


Após isso você pode acessar o console na url http://ipdoservidor/zm

Problemas:

Até aqui, tudo muito fácil, a parte complexa que vou resumir foi encontrar as configurações corretas para o ZM funcionar com o hardware descrito.

UDEV

O primeiro detalhe é a permissão de acesso ao dispositivo da placa de captura.
Após a instalação, sem qualquer configuração o Linux já havia detectado minha placa de captura e criado o device /dev/video0.
No entanto, as permissões do mesmo não deixavam o ZM acessar o dispositivo e mesmo mudando com chmod após a reinicialização as permissões padrão eram retornadas.
Para resolver isso foi necessário criar uma regra para o udev que determine quais permissões devem ser dadas ao dispositivo.

Criei então o arquivo /etc/udev/rules.d/70-persistent-bttv.rules com o seguinte conteúdo:

KERNEL=="video*", GROUP="video", MODE="0666", OPTIONS="last_rule"


Após o reboot, as permissões estavam corretas.

BTTV
Embora o kernel Linux reconheça o chipset de captura automaticamente, esta não fica 100% funcional sem informarmos qual "placa" o sistema deve utilizar.
Para isso foi necessário informar ao driver bttv qual o modelo da mesma com o seguinte código:

echo "options bttv card=77" >> /etc/modprobe.d/bttv.conf

 
Feito isso, na próxima carga do driver (reboot ou rmmode/modprobe) deverá ser encontrado nas mensagens do dmesg algo do tipo:


bttv0: using: GrandTec Multi Capture Card (Bt878) [card=77,insmod option]


E sua placa está pronta para utilização.

TWEAKS:

Neste ponto, o ZM já está instalado e funcional, e você pode brincar na interface do console adicionando monitores, item que não pretendo discutir no momento.
Apenas para nota de alguns outros detalhes interessantes e possívelmente necessários, vou deixar mais algumas notas.

SHMMAX
Como descrito anteriormente, o ZM utiliza espaço de memória compartilhada para processar as imagens que captura da placa.
A questão é que nem sempre o valor padrão do sistema é o bastante. Para aumentar esse valor, criamos uma regra de sysctl:

echo "kernel.shmmax = 134217728" >> /etc/sysctl.d/60-kernel-shm.conf


CAMBAZOLA
No console do ZM é possível acessar as imagens capturadas no monitor de câmeras (clique no nome do monitor). O detalhe é que o mesmo exibe por padrão uma imagem estática que é recarregada de tempos em tempos utilizando javascript.
Para visualizar um fluxo "contínuo" de imagens, podemos utilizar o applet Cambazola que faz esta carga de forma transparente.
Precisamos apenas efetuar o download do mesmo, copiar o arquivo cambazola.jar na pasta raiz do ZM e informar que o mesmo deve utiliza-lo.

wget http://www.charliemouse.com/code/cambozola/cambozola-latest.tar.gz
tar -zxvf cambazola-latest.tar.gz
cp cambazola-/dist/cambazola.jar /usr/share/zoneminder


Para configurar o Zoneminder, acesse o link opções do console e no painel Images utilizar as seguintes opções:

CAN_STREAM: auto
STREAM_METHOD: jpeg
OPT_CAMBOZOLA: sim (check)
PATH_CAMBOZOLA: cambazola.jar


ARMAZENAMENTO
Embora esta dica não seja diretamente ligada ao Zoneminder, a mesma me fez perder um tempinho para descobrir.
Como possuo um dois HDs, pretendo utilizar o maior apenas para armazenamento das gravações.
O procedimento no Debian é relativamente simples:

fdisk -l

Lista quais HDs estão plugados na placa mãe e suas patições.


cfdisk /dev/sd


Para editar as partições do seu segundo disco.


mkfs.ext3 /dev/sd


Para formatar o mesmo após editar as partições.

Após isso pode-se montar o disco aonde desejar e criar um link da pasta /usr/share/zoneminder/events para a pasta montada.
Meu problema ocorreu com o fato que durante o boot era atribuído um nome de device para o HD secundário e após a inicilização o mesmo era alterado, ou seja,
após incluir uma entrada no fstab para a montagem automática do mesmo, na inicialização do sistema o kernel montava o hd secundário no lugar do primário
e acabava efetuando um checkforced.

Para resolver isso precisamos utilizar os UUIDS dos HDs.

blkid


O comando blkid lista os UUIDS dos HDs e com o mesmo é possível criar um fstab que não depende da nomenclatura do device no /dev

Ficamos com uma entrada no fstab do tipo:

UUID=a5a06f7d-91d4-406f-8000-748b3ee444f2       /home/zm      ext3   defaults,noatime,nodiratime,errors=remount-ro    0      2


Note que utilizei também as opções noatime,nodiratime, as mesmas são um pequeno ajuste para reduzir o tempo de acesso ao disco já que não me importo, neste caso, com o registro de quando foi o último acesso aos arquivos/diretórios.

CRONTAB
Finalizando, embora tenha um espaço consideravel de armazenamento, o mesmo não é infinito.
Resolvi então limitar a 10 dias de gravação apenas.
Não pesquisei muito se existe uma forma de fazer isso a partir do próprio zoneminder mas, para início, uma simples linha no crontab resolveu meu problema:

0 0 * * * find /home/zm -name "*.jpg" -mtime +10 -exec rm -f {} \;


Isto vai apagar apenas as imagens que o zoneminder cria na pasta de eventos que tenham mais que 10 dias, mas isso não apaga a referência que o ZM faz aos mesmos.


Conclusão
Espero que, com um pouco mais de uso do Zoneminder, possa escrever mais detalhes sobre ajustes e melhorias neste setup, mas com esses passos é possível reproduzir o mesmo sistema que tenho como funcional no equipamento descrito.
Boa sorte a quem tentar o mesmo :)

Comentários

Carlo Pires disse…
O guia pareceu excelente, obrigado por postar! Vou tentar o mesmo para o sistema que pretendo colocar lá em casa.
Unknown disse…
Opa, show de bola, vc conseguiu gravar o audio através da camera tb?? Tenho uma camera ip da axis aqui e nao consigo exibir som com o zoneminder.
fico no aguardo
obrigado
Unknown disse…
Opa, show de bola, vc conseguiu gravar o audio através da camera tb?? Tenho uma camera ip da axis aqui e nao consigo exibir som com o zoneminder.
fico no aguardo
obrigado

Postagens mais visitadas deste blog

Take the blue pill.

O problema C10K