Lm 84 ce

Page 1


Expediente editorial

“Much ado about nothing”

Diretor Geral Rafael Peregrino da Silva rperegrino@linuxmagazine.com.br

EDITORIAL

Editores Flávia Jobstraibizer fjobs@linuxmagazine.com.br Kemel Zaidan kzaidan@linuxmagazine.com.br Editora de Arte Larissa Lima Zanini llima@linuxmagazine.com.br Estagiário Felipe Brumatti Sentelhas fsentelhas@linuxmagazine.com.br Colaboradores Adriano Matos Meier, Alexandre Borges, Alexandre Santos, Augusto Campos, Charly Kühnast, Dario Bestetti, Erik Bärwaldt, Gavin W. Burris, Hans-Peter Merkel, Jon ‘maddog’ Hall, Klaus Knopper, Kurt Seifried, Michael Uelschen, Tim Schürmann, Zack Brown. Tradução Emersom Satomi, Raquel Lucas, Rodrigo Garcia. Revisão Cristiana Ferraz Coimbra Editores internacionais Uli Bantle, Andreas Bohle, Jens-Christoph Brendel, Hans-Georg Eßer, Markus Feilner, Oliver Frommel, Marcel Hilzinger, Mathias Huber, Anika Kehrer, Kristian Kißling, Jan Kleinert, Daniel Kottmair, Thomas Leichtenstern, Jörg Luther, Nils Magnus. Anúncios: Rafael Peregrino da Silva (Brasil) anuncios@linuxmagazine.com.br Tel.: +55 (0)11 3675-2600 Penny Wilby (Reino Unido e Irlanda) pwilby@linux-magazine.com Amy Phalen (América do Norte) aphalen@linuxpromagazine.com Hubert Wiest (Outros países) hwiest@linuxnewmedia.de Diretor de operações Claudio Bazzoli cbazzoli@linuxmagazine.com.br Na Internet: www.linuxmagazine.com.br – Brasil www.linux-magazin.de – Alemanha www.linux-magazine.com – Portal Mundial www.linuxmagazine.com.au – Austrália www.linux-magazine.es – Espanha www.linux-magazine.pl – Polônia www.linux-magazine.co.uk – Reino Unido www.linuxpromagazine.com – América do Norte Apesar de todos os cuidados possíveis terem sido tomados durante a produção desta revista, a editora não é responsável por eventuais imprecisões nela contidas ou por consequências que advenham de seu uso. A utilização de qualquer material da revista ocorre por conta e risco do leitor. Nenhum material pode ser reproduzido em qualquer meio, em parte ou no todo, sem permissão expressa da editora. Assume-se que qualquer correspondência recebida, tal como cartas, emails, faxes, fotografias, artigos e desenhos, sejam fornecidos para publicação ou licenciamento a terceiros de forma mundial não-exclusiva pela Linux New Media do Brasil, a menos que explicitamente indicado. Linux é uma marca registrada de Linus Torvalds. Linux Magazine é publicada mensalmente por: Linux New Media do Brasil Editora Ltda. Rua São Bento, 500 Conj. 802 – Sé 01010-001 – São Paulo – SP – Brasil Tel.: +55 (0)11 3675-2600 Direitos Autorais e Marcas Registradas © 2004 - 2011–: Linux New Media do Brasil Editora Ltda. Impressão e Acabamento: RR Donnelley Distribuída em todo o país pela Dinap S.A., Distribuidora Nacional de Publicações, São Paulo. Atendimento Assinante www.linuxnewmedia.com.br/atendimento São Paulo: +55 (0)11 3675-2600 Rio de Janeiro: +55 (0)21 3512 0888 Belo Horizonte: +55 (0)31 3516 1280 ISSN 1806-9428

Impresso no Brasil

“Muito barulho por nada”, em tradução literal, é o significado do tema do editorial desta edição, que também é título da comédia do Bardo de Avon, William Shakespeare (1564–1616). A mesma expressão poderia ser usada para descrever a nova celeuma criada em torno de um recurso que considero muito bem-vindo a qualquer sistema que tem a pretensão de manter um nível mínimo de segurança, e ao qual a Microsoft recentemente declarou suportar oficialmente a partir da próxima versão do Windows®. Resumo da ópera: os PCs e notebooks passariam a poder bloquear a inicialização do Linux ou de qualquer outro sistema operacional, caso o Windows 8 estivesse instalado nesse hardware anteriormente. O responsável pelo bloqueio seria o recurso Secure Boot do firmware UEFI (Unified Extensible Firmware Interface), doravante disponível por padrão em todos os computadores de arquitetura Intel. Assim, de acordo com a versão 2.3.1 da especificação UEFI, publicada em 06 de abril deste ano, caso o recurso Secure Boot esteja ativado, o firmware UEFI permitirá apenas a inicialização de sistemas operacionais que disponham de uma assinatura digital válida, seja ela proveniente do fabricante da placa-mãe ou do firmware UEFI, e que ficaria armazenada em um banco de dados especial. Que ninguém se engane: a ideia é boa para todo mundo, pois aumenta o nível de segurança dos sistemas e torna mais difícil contornar os mecanismos de proteção de qualquer sistema operacional. Mesmo que esses mecanismos estejam configurados do modo mais seguro possível, se um vírus infectar o setor de boot e carregar um aplicativo malicioso na memória, poderá tranquilamente desativar qualquer configuração de segurança implementada. Caso o computador só inicie gerenciadores de inicialização, sistemas operacionais ou hypervisors de fontes confiáveis, não é mais possível manipular esses sistemas e contornar suas configurações de segurança. Para iniciar o Linux em uma máquina equipada com esse tipo de mecanismo de segurança, tanto o gerenciador de boot quanto o kernel precisariam ser assinados com uma chave privada, e a chave pública deveria estar disponível no banco de dados do fabricante da placa-mãe, em um esquema mais ou menos semelhante ao que ocorre hoje com os navegadores de Internet. Esses fabricantes provavelmente não terão nenhum problema em armazenar as chaves públicas de sistemas Linux comerciais, como os da Red Hat, Oracle, SUSE ou Canonical. Para projetos comunitários, tais como Debian, Fedora etc, é improvável que os fabricantes de hardware disponibilizem as chaves públicas dessas distribuições. Para esses casos, entretanto, a especificação publicada pela UEFI prevê a solicitação de senha no item 5 do seu parágrafo 27.7.3.3 caso o firmware se depare com um sistema não assinado. Com isso, evita-se que um agressor manipule ocultamente o processo de boot, sem que seja necessário desativar totalmente o recurso Secure Boot. Desse modo, todos os sistemas operacionais modernos – e não apenas o Windows 8 – adentrariam o Nirvana do nível de segurança adequado à era da computação em nuvem. Demorou! Não se incomode com o ruído de fundo... ■ Rafael Peregrino da Silva Diretor de Redação

4

www.linuxmagazine.com.br


ÍNDICE ÍNDICE

CAPA Super máquinas

29

No revolucionário mundo das super máquinas, o consumo de informação é mais rápido do que corriam os carros no seriado dos anos 80. O que fazer para ganhar desempenho e agilidade?

Veloz desde o início

30

O systemd é um conjunto de soluções que promete revolucionar o processo de boot. Mas toda essa tecnologia realmente aumenta a velocidade?

Processamento em cluster

36

Como configurar um cluster de computação de alto desempenho com Kickstart, SSH, Son of Grid Engine e outras ferramentas livres.

Nas nuvens com XCP

46

O uso inteligente de soluções de virtualização, como cenário para o futuro.

6

www.linuxmagazine.com.br


Linux Magazine 84 | ÍNDICE

COLUNAS

PROGRAMAÇÃO

Klaus Knopper

10

Charly Kühnast

12

Zack Brown

14

Augusto Campos

16

Alexandre Borges

18

Kurt Seifried

19

Pequeno notável

49

NOTÍCIAS Geral

22

➧ Abertas as incrições para a LinuxCon 2011 ➧ Bada poderá ter seu código aberto

CORPORATE Notícias

22

Se você está procurando uma linguagem de script com interpretador leve e fácil de integrar com seus aplicativos, provavelmente chegará à linguagem Lua. No entanto, um concorrente bem confiável, chamado Squirrel, se esconde à sua sombra há muitos anos.

➧ Novos membros ingressam na Aliança para Virtualização Aberta

ANÁLISE

➧ Ameaças sobre dúbias patentes ➧ Google compra mais patentes da IBM

Soluções paralelas Coluna: Jon “maddog” Hall

26

Coluna: Alexandre Santos

28

TUTORIAL Olho mágico

54

Vandalismo, danos à propriedade e roubo são preocupações sérias para muitas pessoas, mas o Linux e o software livre de monitoramento de video lhe dão uma chance de pegar os culpados. Se não pode vencê-los...

66

A biblioteca da Intel, Threading Building Blocks (TBB), ajuda desenvolvedores a distribuir tarefas de processamento paralelo entre múltiplos processadores ou núcleos. Esse elegante conceito de tarefas substitui a irritante rotina de trabalhar com filas de processamento. Dança dos discos

73

Discos de alta capacidade usam a tabela de partição GUID ao invés do antigo master boot record, mas os aplicativos fdisk usuais do Linux não conseguem trabalhar com o novo esquema de particionamento. Veja como contornar isso usando as ferramentas certas.

60

REDES Um passo além do Nagios OSS

62

A OpService é uma empresa brasileira que mostra como é possível criar um negócio a partir de um conhecido software de código aberto, através da prestação de serviços, personalização e desenvolvimento de software.

SERVIÇOS Editorial Para a maioria das empresas, o comunicador instantâneo é inimigo da produtividade, mas podemos torná-lo um aliado.

Linux Magazine #84 | Novembro de 2011

03

Emails

06

Linux.local

78

Preview

82

7



Coluna do Alexandre Borges

COLUNA

Udev: últimos exemplos Nosso colunista, Alexandre Borges, encerra sua saga épica pelo sistema UDEV com alguns exemplos e chave de ouro.

C

omo havia prometido, neste mês mostrarei ao leitor alguns conceitos e formas de como utilizar o framework do Udev eficientemente. Esses exemplos, como será facilmente entendido, não são mais difíceis ou complicados, mas apenas foram deixados para o final por questão da evolução lógica do assunto. Vamos modificar nosso arquivo de regras /etc/udev/ rules.d/99-usb-linuxmagazine.rules (criado para fins de teste nas últimas colunas) e inserir a seguinte linha: ACTION=="add", SUBSYSTEM=="block", ENV{ID_SERIAL_ SHORT}=="5B671A000C6A", RUN+="/bin/mkdir -p /media/teste", RUN+="/bin/sh -c '/bin/mount -t vfat /dev/sdb1 /media/teste'"

Essa linha diz o seguinte: ao inserir (ACTION==”add”) o dispositivo de bloco (neste caso, um pendrive) com número de série 5B671A000C6A (lembrando que esta variável pertence ao ambiente do Udev e pode ser obtida com udevadm info --query=all –name=/dev/sdb), crie o diretório /media/teste (tarefa realizada pela diretiva RUN) e, em seguida, monte o mesmo no diretório /media/teste (comando executado pela segunda ocorrência da diretiva RUN). Após essa modificação, é necessário fazer uma releitura das regras através do comando /etc/init.d/udev restart. Se tudo correu bem, o pen drive será montado em /media/teste como descrito acima (em vez de ser montado em /media/E83D-65C0, refletindo assim o rótulo interno do dispositivo). A mesma linha acima poderia ser substituída por: SUBSYSTEM=="block", ENV{ID_SERIAL_SHORT}=="5B671A000C6A", ENV{MY_MOUNT_POINT}="/media/teste" ACTION=="add", SUBSYSTEM=="block", ENV{ID_SERIAL_SHORT}=="5B671A000C6A", RUN+="/bin/mkdir -p $env{MY_MOUNT_POINT}", RUN+="/bi n/mount -t vfat $env{DEVNAME} $env{MY_MOUNT_POINT}"

É interessante comparar e perceber que, no fundo, essas duas novas linhas são iguais às do exemplo anterior. A úni-

18

ca diferença é que estamos criando a variável de ambiente MY_MOUNT_POINT no framework do Udev e depois usando a mesma na linha de configuração seguinte. Aliás, além da variável MY_MOUNT_POINT, também foi utilizada a variável DEVNAME, que aponta para o dispositivo inserido /dev/sdb1. É claro que é possível impor esta mesma dinâmica para remover dispositivos. Observe a nova linha de configuração: ACTION=="remove", SUBSYSTEM=="block", ENV{ID_SERIAL_SHORT}=="5B671A000C6A", RUN+="/bin/umount" $env{MY_MOUNT_POINT}" , RUN+= "/bin/rmdir $env{MY_MOUNT_POINT}"

Neste caso, as alterações feitas são que o valor da diretiva ACTION é remove, o dispositivo é desmontado (na primeira diretiva RUN) e o ponto de montagem é apagado em seguida (segunda diretiva RUN). O leitor pode fazer o exercício: se o pen drive for literalmente removido, o sistema de arquivos será desmontado e o diretório /media/teste também será excluído, desde que não exista nenhum processo utilizando tal dispositivo. O que foi feito acima pode ser repetido para o Galaxy Tab da Samsung, prestando apenas atenção no detalhe de que existem, em geral, dois dispositivos de armazenamento dentro dele (um interno e outro externo – um SD card), necessitando o leitor coletar todas as variáveis dos dispositivos de armazenamento (através dos comandos udevadm info --attribute-walk --name=/dev/sdb | more ou udevadm info --query=all --name=/dev/sdb, por exemplo) e criando regras para que eles sejam identificados unicamente (no meu caso, aparecem como /dev/sdb e /dev/sdc). Espero que o leitor tenha gostado desta série de colunas a respeito do framework do Udev e que isso o inspire a procurar e pesquisar mais sobre este assunto tão facinante que acompanha o fantástico mundo Linux. ■ Alexandre Borges (alex_sun@terra.com.br) é instrutor independente e ministra regularmente treinamentos de tecnologia Oracle, Symantec e EC-Council (CEH e CHFI), além de estar sempre envolvido com assuntos relacionados ao kernel Linux.

www.linuxmagazine.com.br


Matéria | SEÇÃO

Otimização de desempenho

CAPA

Super máquinas No revolucionário mundo das super máquinas, o consumo de informação é mais rápido do que corriam os carros no seriado dos anos 80. O que fazer para ganhar desempenho e agilidade? por Flávia Jobstraibizer

E

mbora o título deste artigo nos remonte à época do seriado “A Super Máquina” criado em 1982, onde um poderoso carro era dotado de super recursos (para a época e até a frente de seu tempo), na era da informação, falamos de computadores otimizados, desempenho de máquinas, tempos de resposta e tudo o mais que agilize o armazenamento, a troca de informações e até mesmo o uso do que serão os computadores do futuro: cada vez mais conectados, velozes e acessíveis. Quando falamos de virtualização, clusteres, nuvem, e todos esses jargões da moda, sempre pensamos em duas coisas: desempenho e segurança, nesta ordem.

Em se tratando do segundo item, nós da Linux Magazine já abordamos e incansavelmente trazemos novidades sobre o assunto. Mas a questão nesta edição é como criar máquinas com excelente desempenho, pensando também em questões como consumo de energia, aquecimento (afinal máquinas que superaquecem tendem a ser mais lentas), dimensionamento de hardware versus necessidade e muitas outras questões que abordam os aspectos da otimização e desempenho de computadores e parques computacionais. Nesta edição da Linux Magazine, você irá conhecer a computação HPC, sigla em inglês para Computação de Alto Desempenho e vai aprender como criar máquinas

em cluster, dimensionar hardware e otimizar o ambiente. Conheça também o systemd, um grupo de ferramentas que juntas são uma solução revolucionária para otimização do processo de boot de computadores. Esta edição também vem recheada de novidades. Conheça o Zoneminder, solução de videomonitoramento que você pode criar facilmente com recursos domésticos. Programadores vão se surpreender com a facilidade de programação da linguagem Squirrel, utilizada em grande parte para a criação de jogos, mas que provavelmente, sua mente criativa irá inventar para ela diversos usos. Aproveite esta edição e boa leitura! ■

Matérias de capa Veloz desde o início

30

Processamento em cluster

36

Nas nuvens com XCP

46

Linux Magazine #XX | M Mês Mê ês de 200X 00X 0X X

2 29


Squirrel: Linguagem de script | PROGRAMAÇÃO

Introdução à linguagem de script Squirrel

PROGRAMAÇÃO

Pequeno notável Se você está procurando uma linguagem de script com interpretador leve e fácil de integrar com seus aplicativos, provavelmente chegará à linguagem Lua. No entanto, um concorrente bem confiável, chamado Squirrel, se esconde à sua sombra há muitos anos. por Tim Schürmann

H

á mais de oito anos, Alberto Demichelis estava trabalhando na famosa empresa de jogos Crytek, tendo que lidar com seu primeiro game, o Far Cry, cuja lógica de programação seria feita com a linguagem de script Lua. Quando tentou integrar os resultados, Demichelis teve um problema com a automação do gerenciamento de memória (no coletor de lixo, ou garbage collec-

Listagem 1: Máximo denominador comum 01 // máximo denominador comum entre a e b 02 function mdc(a, b=10) 03 { 04 if (b == 0) return a; 05 else { 06 if (a > b) return mdc(a-b, b); 07 else return mdc(a, b-a); 08 } 09 } 10 11 // calcula alguns MDCs 12 local x=1; 13 while(x < 10) 14 { 15 print (mdc(x, 27)+”\n”); 16 x = x+1; 17 }

Linux Magazine #84 | Novembro de 2011

tor). Após se frustrar com algumas soluções alternativas, decidiu dar um temido passo e criou sua própria linguagem de script. Ele queria que seu interpretador fosse como o do Lua – pequeno, leve e fácil de integrar com qualquer outro aplicativo. O resultado foi o Squirrel [1], cujo interpretador atualmente possui apenas 442KB.

Velhos amigos O Squirrel é uma linguagem de script imperativa e orientada a objetos, cuja sintaxe parece uma mistura de C, C++, Java, JavaScript e Python. Ele copia as tabelas da linguagem Lua, usando uma estrutura de dados flexível em quase tudo, e tem um recurso de coleta de lixo que automatiza o gerenciamento de memória. O ponto central é que o Squirrel combina uma sintaxe simples e familiar com os benefícios da linguagem Lua. A implementação dos interpretadores foi colocada sob a licença MIT 3.0. O código-fonte, então, é não apenas aberto, mas também pode ser usado sem custos em projetos comerciais.

Atualmente o Squirrel é usado principalmente em jogos de computador, os mais conhecidos sendo Left 4 Dead 2, Final Fantasy Crystal Chronicles: My Life as a King e Portal 2 [2]. Os desenvolvedores do clone do Transport Tycoon Deluxe, o OpenTTD, também escreveram o código de inteligência artificial dos jogadores automatizados com o Squirrel (figura 1). Se você usa o IDE Code::Blocks, também já se deparou com o Squirrel, que é usado para expandir os recursos [3] (figura 2) do programa. Assim, a linguagem é recomendada também para outros aplicativos além de jogos, como prova o Squirrel Shell, que pode ser usado até como substituto do Bash [4].

Instalação manual Infelizmente, o Squirrel não está nos repositórios das distribuições mais populares. Isso geralmente só dá ao usuário uma alternativa: pegar a referência de implementação no site do Squirrel e compilar o interpretador [1]. O código-fonte está disponível em duas versões: uma versão standalone, que executa os scripts diretamente na linha

49


PROGRAMAÇÃO | Squirrel: Linguagem de script

de comando, e uma biblioteca estática, que você pode incluir em seus programas C++. Como bônus, há ainda a Squirrel Standard Library, com um conjunto de funções úteis, programas-exemplo e um PDF de referência para a linguagem. Para compilar o interpretador, você precisa de um compilador C++. Assim você pode executar o comando make no diretório criado com a descompactação do pacote. Isso coloca o interpretador standalone sq no diretório bin. Você pode então, indicar qual script Squirrel quer executar em conjunto com o interpretador: sq meuscript.nut

Para acelerar a execução do script, o interpretador primeiro o converte para bytecode. Você pode pedir isso explicitamente através do comando: sq -c meuscript.nut -o meuscript.cnut

Em seguida, execute o meuscript. cnut resultante. sq meuscript.cnut

Se você executar o sq sem nenhum parâmetro, isso inicia o interpretador em modo interativo, no qual você pode digitar comandos Squirrel diretamente (figura 3). Para sair do prompt, digite [Ctrl]+[C].

Olá mundo! O tradicional “Olá mundo!”, no Squirrel, tem uma única linha: print("Olá mundo!");

A tipagem dinâmica facilita o uso de variáveis que você pode preencher com conteúdo arbitrário: local a = 3.14; local a = "Tux ama Agnes\n"; local a = null;

As cadeias de caracteres podem usar os caracteres de escape que você talvez já conheça do C. A palavra-chave null esvazia a variável, sendo assim semelhante a, por exemplo,

50

Figura 1 Oponentes automatizados no OpenTTD usam inteligência artificial codificada com scripts Squirrel.

o apontador NULL no C, ou nil em Lua. Um ponto-e-vírgula completa cada expressão. Se uma expressão for a única coisa em uma linha, como no exemplo anterior, você pode deixar de lado o ponto-e-vírgula. O Squirrel é sensível a maiúsculas. Os comentários ficam entre /* e */, ou você pode usar // para comentários de uma única linha.

Controle As estruturas de controle, if, while e for funcionam como em C ou C++. A listagem 1 usa-os para calcular o máximo denominador comum de dois números. Além disso, o Squirrel tem um foreach prático: local a=[1,2,3,4,5,6] foreach(numero in a) print("número="+numero+"\n");

A listagem 1 também mostra como os programadores definem uma função no Squirrel: a palavra-chave function é seguida pelo nome da função e os parâmetros entre parênteses; return retorna os resultados do processamento. Na listagem 1, b está definido como 10. O interpretador vai usar isso se o segundo argumento de uma chamada estiver ausente. O Squirrel permite inclusive um número variável de parâmetros: function foo(x, ...) { local a = x+1; local b = vargv[0]; /* ... */ }

Listagem 2: Delegação 01 02 03 04 05 06 07 08 09 10 11 12 13 14

Mixer <- { } Mixer.Content <- function() { ::print(_nomecor); } local cor = { _nomecor="vermelho" } Cor.setdelegate(Mixer) Cor.Content();

Listagem 3: Herança 01 class Ponto { 02 x = 0; 03 y = 0; 04 05 function construtor(x1,y1) 06 { 07 this.x=x1; this.y=y1; 08 } 09 } 10 11 12 class Retangulo extends Ponto { 13 altura = 0; 14 largura = 0; 15 16 function construtor (x,y, h,b) 17 { 18 this.altura=h; this.largura=b; 19 base.construtor(x,y); 20 } 21 function Saida() 22 { 23 ::print( x+","+y+", "+altura+","+largura+" \n"); 24 } 25 }

www.linuxmagazine.com.br


Squirrel: Linguagem de script | PROGRAMAÇÃO

local cores = ["vermelho", "verde", "azul"];

Em outras linguagens, essa estrutura de dados é chamada de dicionário ou campo de dados associativo. Como uma agenda de telefones, ela armazena qualquer dado que você passar com uma chave única. Você pode armazenar, por exemplo, o valor Paulo sob a palavra-chave Nome. No Squirrel, os programadores podem gravar números e funções completas como dados payload (não apenas texto) e é possível misturar as coisas conforme a necessidade: Figura 2 O ambiente de desenvolvimento Code::Blocks pode ser expandido com scripts Squirrel.

Listagem 4: Classe alternativa 01 Ponto <- class { 02 x = 0; 03 y = 0; 04 05 function construtor(x1,y1) 06 { 07 this.x=x1; this.y=y1; 08 } 09 }

Listagem 5: Atributos 01 class Teste </ teste = “Atributo da classe” /> { 02 </ teste = “Atributo da função” /> function PrintTeste() 03 { 04 ... 05 } 06 }

Listagem 6: Meta 01 class Ponto 02 { 03 ... 04 function _somar(outroponto) 05 { 06 return ::Ponto(x+ outroponto.x,y+outroponto.y); 07 } 08 }

Linux Magazine #84 | Novembro de 2011

Você pode passar o número que quiser de argumentos para essa função e usar a matriz vargv para acessá-los na função principal. As funções são objetos de primeira classe no Squirrel: você pode usá-las em variáveis ou passá-las como argumentos em outras funções. Para economizar digitação, as versões 3.0 e posteriores usam expressões lambda, ou seja, funções anônimas. Elas são muito úteis no caso de ordenação e busca: local numeros = [9,3,2,4,7]; numeros.sort(@(a,b) a <=> b);

local teste= { cor="vermelho" b=function(x) { return x*x; } }

O Squirrel refere-se a cada par chave/valor como um slot. O acesso aos dados armazenados é possível através da notação com pontos: print(teste.cor); print(teste.b(2));

É possível alterar um slot existente com uma simples designação: teste.b = 20;

Para acrescentar um novo slot, use o operador <-: teste.c <- 20;

Uma outra alternativa seria fazer assim:

A partir da versão 3.0, as tabelas também podem usar notação JSON:

numeros.sort(function(a,b){ return a <=> b; } );

local cor = { "nome": "azul", "cor_numero": 173, "variacoes": ["metalico","matt"] }

O operador comparativo <=> também foi introduzido na versão 3.0. Ele retorna 0 se dois valores forem iguais. sort() é uma função de qualquer matriz, o que realmente ajuda na ordenação.

Tabelas Além de matrizes no estilo C ou C++, mostradas no código a seguir, o Squirrel também permite tabelas.

O Squirrel armazena variáveis, funções e tabelas globais em uma tabela global (ou root). No final da listagem 1, os slots para a função 2mdc() e a variável x são adicionados à tabela. O sinal de dois pontos antes permite que você acesse um desses slots na tabela-root.

51


PROGRAMAÇÃO | Squirrel: Linguagem de script

::mdc(1,2);

Na prática, os programadores sempre precisam navegar por listas. No Squirrel, você pode usar geradores para ajudar nisso. Essas funções especiais trabalham como uma máquina de bolas de chiclete, que solta a próxima bola sempre que você a aciona.

Dê-me uma! Para criar um gerador, você só precisa marcar o valor de retorno de uma função normal com yield: function fornecedor(n) { for(local i=0; i<n; i=i+1) yield i; return null; }

Quando você chama a função a seguir, ela retorna o gerador interrompido (ou seja, a máquina de chicletes em seu estado original): local entrada=fornecedor(10);

O comando resume dispara o gerador: local x=resume entrada;

A função fornecedor() agora é executada exatamente até o comando yield, que retorna o resultado da expressão que o precede – nesse exemplo, o conteúdo de i, ou seja, 1. Depois disso, a função fornecedor() para de novo. Se você despertá-la com resume, ela vai executar até o próximo yield, que retornaria 2 nesse exemplo. Usando essa abordagem, o loop while((x=resume entrada)!=null) print(x+"\n");

pegaria todos os números do gerador de 1 até n.

Parar e continuar Além dos geradores, o Squirrel tem threads chamadas de thread functions, que param no meio e podem ser retomados mais tarde. Diferentemente de um gerador,

52

Figura 3 O @ em frente da string mantém todos os caracteres entre aspas.

uma thread function tem sua própria pilha, tabela-root e seu próprio gerenciador de erros. Para converter uma função em thread function, usa-se suspend() para definir os pontos em que ela deve dormir: function digadois() { ::print("Primeiro\n"); ::suspend(); ::print("Segundo\n"); }

A seguir, newthread() cria um um objeto thread a partir da função digadois(): local meuthread = ::newthread(digadois);

Objetos Diferentemente da linguagem Lua, o Squirrel tem alguma orientação a objetos, como você pode ver na listagem 3. Começamos definindo a classe Ponto, de quem a classe Retangulo é então derivada. Retangulo sobrescreve a função Construtor() nesse processo. A palavra-chave base permite o acesso à função de classe básica. this garante que as variáveis nessa classe sejam usadas, em vez de o interpretador criar variáveis locais novas. Você agora pode criar um objeto dentro da classe finalizada: local umponto = Ponto(1,2);

Ele fica executando até o primeiro suspend(). Para acordá-lo, use:

O Squirrel automaticamente passa esses dois argumentos à função constructor() da classe Ponto e então retorna um objeto finalizado. Você pode usar a notação com ponto para acessar suas variáveis e funções:

meuthread.wakeup();

umponto.saida();

Você pode designar uma tabela-mãe para qualquer tabela. Então, se procurar uma chave não existente na tabela, o interpretador Squirrel automaticamente delega a requisição para a tabela-mãe. Na listagem 2, você pode ver um exemplo simples disso: como _nomecor não existe na tabela Mixer, o interpretador automaticamente consulta a tabela-mãe, Cor, que gentilmente retorna o valor de _nomecor.

Internamente, o Squirrel gerencia classes como tabelas. A classe Ponto também poderia ser escrita como na listagem 4. Há um efeito colateral engraçado aí: você pode usar retrospectivamente a notação com seta para acrescentar funções e variáveis a uma classe:

e inicia o thread com call(): meuthread.call();

Ponto.add <- function(c,d) { this.x=this.x+c; this.y=this.y+d; }

www.linuxmagazine.com.br


Squirrel: Linguagem de script | PROGRAMAÇÃO

Os programadores C++ estão acostumados com uma abreviação mais comum para isso:

5) podem então ser lidos e usados

function Nova::add(c,d) { this.x=this.x+c; this.y=this.y+d; }

Métodos meta

O preço de se usar as tabelas é que todas as funções e variáveis ficam públicas, mas é possível armazenar classes em variáveis, assim como funções, ou passá-las para uma função como parâmetros. Como no Java 5, o Squirrel permite anotações; os programadores podem, assim, anexar metadados a classes e funções. Esses dados, que o Squirrel chama de atributos (listagem

por um sistema de documentação ou ambiente de desenvolvimento.

O código seguinte é uma opção de abordagem elegante para acrescentar dois Pontos rapidamente: local p1 = Ponto(1,2); local p2 = Ponto(4,7); local p3 = p1 + p2;

Para poder fazer isso, bastaria implementar a função _somar() à classe Ponto (listagem 6). A função _somar() pertence ao grupo de métodos meta. Se sobrescrevê-los ou implementá-los por si só, você muda o comportamento de

Mais informações [1] Squirrel: http://squirrel-lang.org/ [2] Programas que usam o Squirrel: http://wiki.squirrel-lang. org/default.aspx/SquirrelWiki/ProjectsUsingSquirrel.html [3] Squirrel no Code::Blocks: http://wiki.codeblocks. org/index.php?title=Scripting_Code::Blocks

alguma função interna do Squirrel ou, neste caso, de um operador. Neste exemplo, o Squirrel aprende como aplicar o sinal de + aos Pontos.

Conclusão O Squirrel não merece viver como um patinho feio à sombra da linguagem Lua. Trata-se de uma linguagem testada e aprovada, sendo muito mais fácil de aprender no caso de desenvolvedores acostumados à orientação a objetos. O fato de ser usada principalmente em jogos de computador não deveria desestimular ninguém; pelo contrário, os jogos geralmente exigem interpretadores muito rápidos e leves. O ponto negativo é que a documentação é bem sucinta – na verdade, trata-se mais de uma referência, embora inclua, sim, muitos exemplos curtos, sendo fácil de ler e bem abrangente. Para mais informações, você pode conferir o wiki (de aparência meio caótica) [5] do Squirrel, ou visitar o fórum caso tenha questões em aberto [6]. ■

[4] Squirrel Shell: http://squirrelsh.sourceforge.net/

Gostou do artigo?

[5] Wiki Squirrel: http://wiki.squirrel-lang.org/default. aspx/SquirrelWiki/SquirrelWiki.html [6] Fórum Squirrel: http://forum.squirrel-lang.org/

Queremos ouvir sua opinião. Fale conosco em cartas@linuxmagazine.com.br gazine.co br

[7] Listagens deste artigo: http://www.lnm.com.br/ issues/84/squirrel_listagens.zip

Este artigo no nosso noss site: te: http://lnm.com.br/article/5998 m.br/a e/599

Linux Magazine #84 | Novembro de 2011

53


TUTORIAL | Videomonitoramento

Monitoramento de video com ZoneMinder

TUTORIAL

Olho mágico Vandalismo, danos à propriedade e roubo são preocupações sérias para muitas pessoas, mas o Linux e o software livre de monitoramento de video lhe dão uma chance de pegar os culpados. por Erik Bärwaldt

B

icicletas roubadas, carros riscados, pichação nas paredes – tudo na porta da sua casa. Quando uma investigação policial desse tipo de crime falha por falta de provas conclusivas, um sistema de monitoramento de video pode fazer milagres. Um monitoramento efetivo de pontos estratégicos não precisa custar o olho da cara. Apenas com um PC Linux, o software livre ZoneMinder [1] e algumas câmeras padrão, você pode mitigar o gasto de centenas de reais.

Preparação O valor utilitário de um sistema de monitoramento de video depende da qualidade das câmeras utilizadas. Para que as imagens do video tenham alguma chance de ser aceitas como

evidência um em processo, precisam ter alta resolução para que a imagem seja nítida quando for necessário fazer um zoom para ver detalhes importantes. Como você pode imaginar, nem toda câmera é adequada pra monitoramento de vídeo. Além disso, deve-se levar em consideração o local. Se quiser monitorar áreas ao ar livre, a câmera deve ser projetada para uso externo: não existe vantagem se a chuva estragar o equipamento. Se ocasionalmente houver necessidade de mudar a área observada, será necessário usar uma câmera pan/tilt com motor que movimente a lente em dois eixos para monitorar áreas diferentes. As câmeras Pan/Tilt/Zoom (PTZ) suportam um uso ainda mais flexível. Se necessário, elas lhe permitem aproximar a imagem da área monitorada.

Se as áreas de monitoramento estiverem em locais escuros, ou se precisar monitorar à noite, também será necessária uma fonte de luz infravermelha. Caras, as câmeras profissionais de vigilância frequentemente incluem diversos leds (diodos emissores de luz) que têm um alcance de até 10 metros em condições climáticas ruins. Se estiver usando as webcams mais baratas e normalmente menores para monitorar um ambiente interno, ou se sua câmera de vigilância não tiver led, podem ser encontradas luzes infravermelhas especiais como componentes avulsos.

Suporte Linux Embora as câmeras especiais pan/tilt pareçam todas iguais por fora, elas têm grandes diferenças técnicas. As lentes são praticamente idênticas em todos

Figura 1 A interface web simplista depois de iniciar o ZoneMinder.

54

www.linuxmagazine.com.br


Videomonitoramento | TUTORIAL

Figura 2 A interface do ZoneMinder permite que as configurações necessárias sejam feitas rapidamente.

os modelos disponíveis hoje, exceto pela quantidade de pixels, mas muitas câmeras não suportam outros sistemas operacionais e não funcionam no Linux. As que contam com uma placa de interface para TV (TV tuner) e as câmeras S Video analógicas podem frequentemente ser usadas em combinação com o ZoneMinder, supondo que se tenha os drivers Linux para a TV ou a placa de captura. De qualquer forma, deve-se primeiramente checar a lista de compatibilidade do programa [2], especialmente se a intenção for dispôr várias câmeras diferentes em paralelo, tanto internas quanto externas. A falta de drivers para Linux (ainda) pode causar problemas com as câmeras populares USB. Em particular, você deve ficar longe de câmeras antigas com baixa resolução. As câmeras desse tipo normalmente não conseguem produzir evidências úteis. Graças a vários projetos, o suporte de webcams para Linux têm melhorado significativamente nos últimos anos. Se for usar uma câmera USB, sua primeira tentativa deve ser a GSPCA

Linux Magazine #84 | Novembro de 2011

Figura 3 Descubra a configuração correta para a câmera.

[3] e a UVC Video [4], onde se pode

descobrir se a câmera escolhida realmente trabalha com Linux. Como o kernel incluiu ambos os drivers desde a versão 2.6.27, as câmeras classificadas como compatíveis pelos projetos funcionarão no Linux sem necessidade de intervenção manual. Finalmente, você deve se assegurar de que o PC de monitoramento tem capacidade suficiente no disco rígido. Os vídeos gravados em alta resolução, com altas taxas de frames e muito coloridos, consomem uma enorme quantidade de espaço.

Instalação do software O ZoneMinder é um aplicativo altamente modular com interface de controle via web. Consequentemente, é preciso preencher várias condições antes de usar o programa. Além do Video4Linux para suportar as câmeras e placas de video, o servidor web Apache com MySQL, e do Perl, também é preciso instalar o FFmpeg e os pacotes libjpeg para gravar imagens estáticas e em movimento.

Felizmente, os distribuidores Linux mais populares e seus derivados agora incluem pacotes para o ZoneMinder que permitem a instalação do programa diretamente do repositório usando o Synaptic, MCC ou YaST, o que geralmente resolve qualquer dependência. Testei o sistema em uma variação especial Live CD do ZoneMinder, mas não a testei exaustivamente porque ela é baseada no Xubuntu 8.10, que está descontinuado e não tem drivers para muitas das webcams e das placas de video por avançadas causa da sua idade. Para simplificar a instalação e a configuração do sistema de vigilância de video, que de certa maneira é complexo por conta de todos os pacotes e codecs que requer, o ZoneMinder oferece um script [5] que automatiza com segurança essa tarefa e modifica a memória de configuração. Para começar, copie o script e salve-o com um editor de textos. Para torná-lo executável, logue-se como root (ou use sudo -s) e aplique chmod +x no script. Depois execute-o.

55


TUTORIAL | Videomonitoramento

Figura 4 A tela de configuração do ZoneMinder.

O script vai fazer todas as alterações necessárias de uma vez só. Daqui em diante, toda vez que você inicializar o seu sistema, o Apache vai subir automaticamente. Você poderá ver a interface do ZoneMinder acessando http://127.0.0.1/zm do seu navegador.

Início Quando aberto pela primeira vez, o programa aparece com uma interface simples que ainda precisa ser configurada (figura 1). Preste atenção ao valor mostrado no campo Disk:. Ele indica o espaço ocupado no disco como porcentagem. Se você pensa em operar várias câmeras, esse valor precisa ser o mais baixo possível para evitar que as gravações em alta resolução ocupem toda a memória do disco, mesmo a taxas de frame aceitáveis. Se tiver anexado algumas câmeras ao sistema, agora você precisa integrá-las com o ZoneMinder. Testei o

sistema com três webcams USB diferentes da Logitech e da Chicony. Para adicionar as câmeras ao ZoneMinder, clique no botão New Monitor na janela principal. O programa agora abre outra tela com quatro colunas horizontais no topo. A coluna Source (figura 2) tem os parâmetros do disco rígido que precisa ser modificado. O ZoneMinder facilita o processo graças a uma ferramenta que lê os dados técnicos da câmera. Para fazer isso entre com o seguinte comando no terminal (figura 3): $ zmu -d nome_do_equipamento -V 1 -q -v

O nome do equipamento normalmente é /dev/videoX, no qual X é um número que começa com zero. O programa agora mostra uma lista de especificações do equipamento. Para descobrir os parâmetros necessários, vá até Window Attributes e preste atenção

Figura 6 Visão geral da atividade das câmeras.

56

Figura 5 Pré-configurações facilitam o ajuste das câmeras PTZ e IP.

aos valores nas linhas Width e Height para resolução em pixels. Na seção Picture Attributes, veja a linha Palette e preste atenção na tabela de cores. Finalmente, no final do processo do programa, irá encontrar a entrada Format que lista os padrões de TV (NTSC, PAL, SECAM). De posse dessas informações, você pode completar as lacunas necessárias na janela de configuração Source do ZoneMinder. Assegure-se de que a entrada do campo Capture Method seja Video For Linux version 2; ele suporta mais ou menos todas as câmeras recentes. Depois de completar as entradas, clique no botão Save.

Modo de operação

Em seguida, vá até a aba General (figura 4), onde, na caixa de texto Name, você pode informar um nome intuitivo para a localização da câmera antes de definir o modo de operação do aparelho. Normalmente não é necessário modificar a entrada Source Type para Local para câmeras conectadas diretamente na máquina. No caso das câmeras IP que você conecta à sua intranet, porém, deve-se selecionar Remote. A opção Monitor do menu Function mostra

www.linuxmagazine.com.br


Videomonitoramento | TUTORIAL

o sinal de vídeo, mas não grava nada. Escolher o Modect habilita a detecção de movimentação e gera um evento quando o ZoneMinder registrar um movimento. Neste caso a gravação inicia automaticamente, e não para até que o ZoneMinder decida que os movimentos cessaram. O próximo movimento na frente da câmera gera outro evento e começa a gravar novamente. A terceira opção, Record, inicia uma gravação permanente e independente da movimentação. Se você não restringir manualmente a duração da gravação, o programa gravará todos os sinais de video dessa câmera, criando, portanto, uma enorme quantidade de dados. A opção Mocord combina Record e Modect. O ZoneMinder, então,

Quadro 1: Câmeras de vigilância: dicas e truques Para usar o ZoneMinder eficazmente, é preciso escolher as câmeras e os seus locais cuidadosamente. Como uma capacidade limitada de armazenamento não permite guardar toda a informação do monitoramento, a maioria das câmeras de vigilância não começa a gravar até que se detecte algum movimento. Por isso, o ideal é instalá-las para monitorar locais calmos. Em caso de uso em área externa, é preciso evitar árvores ou arbustos cobrindo a maior parte da área de vigilância. Ambos irão se mover com o vento e disparar a filmagem o tempo todo. Se não for possível deixar objetos móveis não importantes fora do alcance da câmera de vigilância, será preciso definir as suas próprias zonas no ZoneMinder (veja a seção “Zonas de alarme”). As câmeras de vigilância nunca devem monitorar uma área com um ângulo muito fechado, de cima. Identificar as pessoas que estão nessa área num piscar de olhos será muito difícil. Ao invés disso, a câmera deve monitorar de uma posição lateral elevada. Se usar câmeras de tomada, assegure-se que os fios não estão visíveis e de fácil alcance por pessoas não autorizadas. Cortar o fio desabilitará a câmera de vigilância, deixando o ZoneMinder no escuro.

Linux Magazine #84 | Novembro de 2011

grava permanentemente e gera um evento sempre que começa a gravar; porém, se detectar algum movimento na frente da câmera, ele o lista em maiúsculas na lista de eventos. A opção final, Nodect suporta o uso de detectores de movimentos externos que muitas câmeras incluem por padrão. Neste caso é a câmera, e não o ZoneMinder, que aciona os eventos. Após selecionar o modo de operação, verifique a caixa de texto Enabled para ligar a câmera. Para definir o número de imagens por segundo que o ZoneMinder deve criar, é necessário acrescentar entradas nos campos Maximum FPS e Alarm Maximum FPS. A primeira entrada se refere à operação normal e a segunda a um caso de alerta. O nível máximo de quadros por segundo para uma situação de alerta deve ser mais alto do que para as operações normais; assim, você pode acompanhar a ação mais de perto no caso de haver um evento, além de gravar com mais detalhes. Se seu computador for robusto e você tiver espaço de disco suficiente, faz sentido usar valores de até 30 fps aqui. Depois de preencher todos esses detalhes, clique em Save. Agora a câmera está pronta para funcionar. O ZoneMinder tem um grande número de dispositivos que tem boas opções para câmeras profissionais IP ou PTZ e placas de video suportadas por ele. Clique em Presets no canto direito no alto da janela de configuração para encontrá-las. No menu em cascata Preset (figura 5), selecione o modelo da câmera e as opções básicas e clique em Save. O ZoneMinder usará essas configurações, porém é preciso especificar o endereço IP para a câmera e o modo de operação no campo Function. Normalmente, não há outras mudanças a serem feitas.

Figura 7 O ZoneMinder fornece uma lista de eventos com cenas capturadas pela câmera.

Fontes e alvos Na janela do navegador, o ZoneMinder mostra as fontes das imagens em uma lista. Note as entradas na coluna Source (figura 6): os dispositivos em verde estão funcionando corretamente. Se vir uma câmera vermelha, há um problema – normalmente um erro de configuração. Nesse caso, clique em Name para este campo e a imagem da câmera deve aparecer na janela do monitor. Se a janela estiver preta, ou se aparecer apenas um frame vazio, é preciso reconfigurar a câmera. Para modelos menos potentes, em geral funciona fazer testes de resolução e velocidade de frame. O janela do monitor (figura 7) mostra tanto a imagem da câmera atual como a lista de eventos com duração e número de frames. Quando você clica em um evento na coluna Name, ele começa de novo. A seção acima na janela (figura 8) fornece informações gerais para a sequência específica de imagens e um menu no qual se processam as imagens se necessário. Uma vez que o ZoneMinder, inicialmente, armazena os eventos como

Figura 8 Janela de menu de execução.

57


TUTORIAL | Videomonitoramento

Figura 9 Diálogo criado a partir da sequência de imagens do vídeo.

uma sequência de imagens em diretório temporário, é preciso executar um segundo passo se você quiser gerar um video com eles. Para fazê-lo, clique em Video no menu. Na janela que aparece (figura 9), escolha as opções de que precisa. O ZoneMinder suporta diversas extensões populares de video e permite que se escolha o tamanho do video (no campo Video Size) e a velocidade do frame. Para propósitos documentais, escolha a opção Real para o campo Frame Rate, que corresponde à gravação em tempo real. Depois de fazer as mudanças necessárias, clique em Generate Video. Depois de criar o vídeo, será aberta uma tabela com as informações da sequência. Na coluna da direita selecione Action para definir o que acontece na sequência de vídeo. O video foi criado, mas não salvo: é preciso selecionar o comando Download no campo Action. O ZoneMinder nomeia e guarda o video na pasta de downloads do usuário no disco rígido.

Zonas de alarme Para evitar disparar eventos no limite da área de vigilância – por exemplo, uma rua vizinha com tráfego intenso em uma área de vigilância em larga escala – pode-se definir zonas de alarme baseadas na imagem da câmera. Para fazê-lo, clique na coluna Zones para a câmera na janela principal do ZoneMinder. Isso mostra

58

Figura 10 Zonas de alarme permitem definir as áreas de monitoramento.

uma janela com uma tabela que informa as coordenadas nos eixos X e Y abaixo da imagem atual da câmera. O ZoneMinder sobrepõe uma faixa verde na imagem da câmera definida pelas coordenadas na tabela. Para modificar a área na qual os alarmes estão ativados, apenas arraste os pontos, e para modificar o formato da imagem, adicione mais pontos (figura 10). A tabela à esquerda da câmera serve para várias outras configurações relacionadas à programação de eventos ou alarmes. Ajustar a sensibilidade do software impede qualquer movimento insignificante de disparar um evento. O ZoneMinder mostra alertas em sequência na lista de eventos para que se possa identificar os eventos críticos num relance. Novamente, é preciso clicar em Save para manter as alterações.

Conclusão O ZoneMinder permite que se faça uma configuração profissional de sistema de monitoramento de video que é difícil superar nos quesitos suporte amplo e opções de configuração flexíveis. O programa oferece um desempenho bastante útil em projetos grandes com várias câmeras. Ele funciona em discos rígidos antigos graças ao seus recursos de fontes econômicas, apesar de todos os requisitos típicos de processamento de vídeo.

O único lado ruim do software ZoneMinder é a falta de tradução para aqueles que precisam de uma língua estrangeira e de configurações para algumas câmeras USB menos desenvolvidas. Mas pelo fato de o ZoneMinder ser um software livre e em constante desenvolvimento, pode-se esperar dos mantenedores que as fraquezas do produto sejam melhoradas para uma versão futura. ■

Mais informações: [1] ZoneMinder: http:// www.zoneminder.com/ [2] Lista de compatibilidade ZoneMinder: http://www. zoneminder.com/wiki/ index.php/Hardware_ Compatibility_List [3] Lista de Compatibilidade GSPCA: http://lwn. net/Articles/291036/ [4] Lista de Compatibilidade de video Linux UVC: http://www.ideasonboard. org/uvc/#devices [5] Script de Configuração: http://www.zoneminder. com/forums/viewtopic. php?t=16628

Gostou do artigo? go? Queremos ouvir sua opinião. inião. Fale conosco em cartas@linuxmagazine.com.br ine.com.b Este artigo no nosso so site: sit http://lnm.com.br/article/6024 article 024

www.linuxmagazine.com.br


Videomonitoramento | TUTORIAL

Linux Magazine #84 | Novembro de 2011

59


TUTORIAL | Comunicador instantâneo profissional

Comunicador instantâneo para uso profissional

TUTORIAL

Se não pode vencê-los... Para a maioria das empresas, o comunicador instantâneo é inimigo da produtividade, mas podemos torná-lo um aliado. por Adriano Matos Meier

D

entre as diferentes formas de se comunicar na Internet, passamos por aplicativos que marcaram gerações, como o IRC (Internet Relay Chat) e o ICQ (acrônimo de I Seek You, em português “eu te procuro”). Na atualidade, os programas MSN Messenger, Google Talk e Skype estão entre os mais utilizados (além, é claro, das páginas de redes sociais). Normalmente as empresas e instituições de ensino não permitem a utilização desses programas. De um lado estão os administradores da rede, configurando firewalls e proxies (e outras ferramentas do seu arsenal) para bloquear as tentativas de utilização. De outro estão os incansáveis usuários, em busca de formas de burlar os bloqueios da rede para bater um papo com os amigos em pleno expediente. Porém há um terceiro grupo, que vê no IM uma oportunidade de aumentar a flexibilidade e o dinamismo, e ainda reduzir custos operacionais.

O protocolo XMPP Em 1998, Jeremie Miller iniciou o projeto Jabber, um protocolo aberto para troca de mensagens instantâneas baseado em XML. O principal fruto do projeto foi o servidor Jabberd. Em 2002 o projeto foi formalizado pelo IETF com o nome de XMPP [1]. Atualmente outros serviços utilizam o protocolo XMPP, como o Google Talk e o Facebook, e essa

60

adesão só tende a crescer, visto que a comunidade continua a definir várias extensões para o protocolo.

O ejabberd O ejabberd [2] é um servidor de IM baseado no protocolo XMPP. É escrito em Erlang/OTP, distribuído sob a licença GPLv2. Possui versões para os sistemas GNU/Linux, *BSD, Mac OS X e Microsoft Windows. Possui ainda uma interface web para a administração, o que também pode ser feito via linha de comando. Tem suporte ao balanceamento de carga e armazenamento de dados distribuído (tolerância a falhas), criptografia dos dados trafegados (SSL/ TLS), suporte a chat multiusuário e suporte ao IPv6, além de outros recursos.

apt-get install ejabberd. Existe

também um dispositivo virtual que fornece um servidor ejabberd, disponível no site TurnKey Linux [3]. Primeiro deve-se editar o seu principal arquivo de configuração com vi /etc/ejabberd/ejabberd.cfg. É preciso informar o nome do servidor (no caso de domínios adicionais, deve-se separá-los por vírgula): {hosts, ["ejabberd.empresa.com.br"]}.

Nativamente o ejabberd utiliza uma base de dados Mnesia, mas também tem suporte ao MySQL e ao PostgreSQL. Se for utilizar o PostgreSQL, é necessário instalar o pacote odbc-postgresql. Para que o ejabberd utilize uma base MySQL, a configuração seria:

Instalação e configuração

{auth_method, odbc}. {odbc_server, {mysql, "server", "porta", "database", "username", "password"}}.

Os binários do ejabberd podem ser obtidos na página oficial do projeto [2], mas também são encontrados nos repositórios das principais distribuições. Para uma instalação no Debian (e derivados) basta um

A base de dados pode ser utilizada, por exemplo, para registrar os diálogos e para armazenar as contas dos usuários (autenticação); porém, configuraremos o ejabberd para autenticar os usuários em uma base LDAP.

Figura 1 Interface do servidor de IM.

www.linuxmagazine.com.br


Comunicador instantâneo profissional | TUTORIAL

Primeiro, é preciso desativar o modo de autenticação interno (padrão), adicionando dois sinais de porcentagem para comentar a linha, que deve ficar da seguinte forma: %%{auth_method, internal}.

Posteriormente, deve-se retirar o comentário das linhas referentes à autenticação no LDAP, além de informar os parâmetros de acesso a ele: {auth_method, ldap}. {ldap_servers, ["ldap.empresa.com.br"]}. {ldap_encrypt, none}. {ldap_port, 389}. {ldap_rootdn, "cn=jabber, dc=empresa,dc=com,dc=br"}. {ldap_password, "senha123"}. {ldap_base, "ou=users,dc=empresa, dc=com,dc=br"}. {ldap_filter, "(Services=jabber)"}.

Deve-se definir pelo menos um usuário administrador do servidor. Este usuário terá acesso à interface web de administração. Deve-se também informar o login do usuário (no LDAP) e o servidor: {acl, admin, {user, "administrador", "ejabberd. empresa.com.br"}}.

Agora o serviço deve ser reinicializado para que as configurações entrem em vigor, com /etc/init.d/ ejabberd restart. Para acessar a interface de administração basta acessar a URL http://ejabberd.empresa. com.br:5280/admin em seu navegador, informar o login e senha do administrador, que neste caso será administrador@ejabberd.empresa.com. br e a senha desse usuário. Através

da interface (figura 1) é possível configurar e verificar o funcionamento do servidor, como os usuários que estão online e demais estatísticas.

Comandos de console Para verificar os comandos de administração disponíveis, digite ejabberdctl. Por exemplo, se você não for utilizar uma base LDAP para

Linux Magazine #84 | Novembro de 2011

autenticar os usuários, será preciso registrá-los. Para cadastrar um usuário o comando é: ejabberdctl register usuário ejabberd.empresa.com.br senha

Para verificar o status do servidor: ejabberdctl status

Para verificar os usuários conectados: ejabberdctl connected-users

Para alterar a senha de um usuário: ejabberdctl set-password usuário ejabberd.empresa.com.br senha

As portas padrão utilizadas pelo servidor ejabberd são a 5222/tcp (cliente-servidor), 5269/tcp (servidor-servidor) e a 5280/tcp (interface web). Na ocorrência de problemas, os logs do serviço são registrados em /var/ log/ejabberd/ejabberd.log.

Figura 2 O cliente Pidgin é uma das opções para redes XMPP

Mais informações

Cliente

[1] XMPP: http://xmpp.org/

Com o servidor pronto é preciso instalar e configurar os clientes. Muitas são as possibilidades de clientes que suportam o protocolo XMPP. Dentre os mais utilizados está o Pidgin [4], disponível também para o Microsoft Windows e com suporte a outras redes, como MSN, Google Talk, Yahoo, ICQ, IRC, entre outras. Por isso o Pidgin é considerado um comunicador universal. A sua interface é extremamente amigável (figura 2) e possui uma série de recursos interessantes, como uso de temas, suporte a múltiplas contas de acesso e diversas conversas em uma única janela, conversação com áudio e vídeo, entre outros.

[2] ejabberd: http://www. ejabberd.im/

Considerações finais Aos que quiserem se aprofundar no protocolo XMPP, no site oficial sobre o protocolo encontram-se bons livros sobre o assunto [5]. Existem outros projetos de servidores de mensagem instantânea baseados no protocolo XMPP, como o OpenFire [6] e o Prosody [7], são dois bons exemplos. ■

[3] Appliance ejabberd: http://www.turnkeylinux. org/ejabberd/ [4] Pidgin: http://pidgin.im/ [5] Livros sobre o protocolo XMPP: http://xmpp.org/ about/books.shtml [6] OpenFire: http://www. igniterealtime.org/ projects/openfire/ [7] Prosody: http://prosody.im/

O autor Adriano Matos Meier (matos@sc.senai.br) é Tecnólogo em Redes de Computadores e Pós-Graduando em Gestão de Segurança da Informação. Atualmente é analista de redes no SENAI de Santa Catarina. Também atua como instrutor de treinamento GNU/Linux.

Gostou do artigo? igo? Queremos ouvir sua opinião. o nião. Fale conosco em m cartas@linuxmagazine.com.br ne.com Este artigo no nosso osso site: s http://lnm.com.br/article/5960 r/arti 596

61


REDES | Personalização de software

Nagios profissional

REDES

Um passo além do Nagios OSS A OpService é uma empresa brasileira que mostra como é possível criar um negócio a partir de um conhecido software de código aberto, através da prestação de serviços, personalização e desenvolvimento de software. por Dario Bestetti

Q

ue o Nagios é a plataforma de monitoramento de redes e sistemas mais popular do mundo open source, todo mundo já sabe. Mesmo com o surgimento de várias outras soluções, tão completas quanto ou mais ele, ainda assim o Nagios possui mais de 50% do mercado de instalações desse tipo de plataforma nas infraestruturas de TI. A OpServices [1] trabalha com o fornecimento de serviços baseados na plataforma Nagios [2] desde 2003 e, desde então, temos percebido uma série de áreas onde o Nagios OSS (a versão em código aberto) não atende plenamente às necessidades dos clientes. Não que isso seja um grande problema para a plataforma – pois essa nunca foi a proposta do Nagios. Seu foco principal está no desenvolvimento de um núcleo (core) de monitoramento de alto desempenho, flexível e escalonável. Ainda que o software em sua versão padrão seja funcional para a grande maioria dos ambientes de TI, e que suas necessidades básicas de monito-

62

ramento (quando ele é aplicado a um ambiente comercial onde exista um maior nível de maturidade na questão de governança de TI), o Nagios deixa a desejar. Percebe-se isso especialmente em algumas áreas, como: • falta de aderência às melhores práticas de gestão de TI, como o ITIL; • falta de relatórios mais complexos sobre disponibilidade, planejamento de capacidades e SLAs; • interface gráfica bastante técnica e simplificada; • falta de uma ferramenta gráfica para configuração da plataforma; • falta de suporte à interface multilinguagem. Depois de vários anos instalando o Nagios OSS em clientes, muitos dos clientes da OpServices passaram a demandar recursos mais avançados na plataforma, às quais a comunidade de software livre não poderia atender na velocidade necessária. Dessa forma, iniciamos um projeto de customização da plataforma básica que resultou no OpMon, uma plataforma de gerenciamento de redes e sistemas basea-

da no core do Nagios OSS, mas que endereçava as demandas dos clientes nas áreas não atendidas. Uma das primeiras questões que abordamos foi a da multilinguagem. Porém, como não bastava apenas traduzir o Nagios para o português (o que fizemos na primeira implantação do OpMon), seria importante também criar uma nova interface gráfica para ele, baseada no PHP e não mais em CGIs. Para isso, contratamos uma consultoria para trabalharmos a usabilidade do software. O objetivo seria não somente ter uma interface menos “técnica”, mas também torná-la mais intuitiva no seu uso e conferir-lhe suporte a múltiplas linguagens. Assim, o OpMon criou uma camada de interface absolutamente independente e agregou diversos recursos modernos de usabilidade, como a capacidade de criação de filtros de pesquisa, favoritos, atalhos e simplificação da navegação (figura 1). Outro ponto muito importante foi a criação de módulos de relatórios avançados e de gerenciamento de níveis de serviços (SLA/SLM). Um dos itens

www.linuxmagazine.com.br


Personalização de software | REDES

mais importantes endereçados nessa fase foi a criação de cortes de tempo na geração de relatórios. Por exemplo, se você desejar um relatório sobre a taxa de utilização da sua Internet no último mês, talvez se surpreenda ao saber que esta esteja em torno de 60%, pois o Nagios contabiliza o tempo em períodos de 24 horas, ou seja: durante a madrugada e nos finais de semana a taxa de utilização de sua rede possivelmente seja muito menor, podendo assim apresentar, na média mensal, um número que não traduz a realidade de uso em horário comercial. Na hora de justificar um investimento para o upgrade de seu link de Internet, talvez lhe faltem dados para justificá-lo. Pode ser, porém, que durante o horário comercial a utilização esteja sempre perto de 100%. Assim, o OpMon estabeleceu a possibilidade da criação de cortes de tempo customizados, permitindo que o usuário, ao emitir um relatório, estabeleça qual o corte de tempo que deseja, por exemplo, apenas durante o horário comercial (das 8h às 18h, de segunda a sexta-feira), facilitando a justificativa de investimentos de acordo com a realidade de sua empresa (figura 2). Com o armazenamento de informações de desempenho dos itens coletados em uma base dados MySQL, o OpMon permite a geração de relatórios de capacidades complexas, incluindo a geração da previsão futura do esgotamento de recursos (future projection), o monitoramento de linhas de tendências (trend lines) e a capacidade de prover a geração do monitoramento através de linhas de base (baseline). Este modelo permite que o monitoramento seja feito de forma adaptável e não somente baseado em thresholds fixos. Explico: em um monitoramento tradicional, o envio de alarmes é baseado em limites estabelecidos de forma estática. Por exemplo, ao se chegar a uma utilização de 80% de CPU, um alarme é gerado automaticamente; no monitoramento adaptável, porém, podem-se utilizar dados

Linux Magazine #84 | Novembro de 2011

Figura 1 A interface do Nagios foi toda recriada, e pode ser iutilizada mesmo sem o OpMon.

históricos para estabelecer o limite de forma dinâmica. Pode ser que todas as sextas-feiras, das 18h às 22h, a utilização de CPU esteja realmente acima de 80% em função de algum processamento habitual e absolutamente normal. No monitoramento tradicional, portanto, os alarmes seriam gerados todas as sextas-feiras, entre 18h e 22h. Já no monitoramento adaptável, baseada nos dados históricos, esse comportamento seria considerado normal e nenhum falso alarme seria gerado. É claro que nenhuma das abordagens é perfeita, mas ambas podem ser combinadas com o objetivo de reduzir drasticamente a geração de falsos positivos. Ainda no terreno do monitoramento “inteligente”, o OpMon possui um módulo auxiliar para a correlação de

eventos. Este é um tópico até mais avançado do que o monitoramento adaptável, pois permite a criação de regras complexas para correlacionar os eventos que são centralizados na plataforma e gerar alarmes para eles. Partindo do pressuposto que o OpMon é um grande repositório de eventos, o EventGuard permite a criação de regras complexas para a correlação de eventos através de uma interface gráfica intuitiva. Talvez uma de suas maiores aplicações seja na correlação de eventos de segurança, nos quais acessos aparentemente desconexos podem na verdade ser correlacionados com um ataque externo de hackers em sua rede (figura 3). Talvez o módulo mais interessante do OpMon visualmente seja o editor

Figura 2 O OpMon exibe análises segundo cortes de tempo.

63


REDES

REDES | Personalização de software

Figura 3 O EventGuard permite criar novas regras avançadas de maneira fácil.

de dashboards (painéis de controle), o OpServices DaVINCI. Este foi criado com o intuito de permitir ao usuário da plataforma OpMon criar, de forma gráfica e interativa, dashboards (painéis) representativos dos itens monitorados. Com a ferramenta de edição do DaVINCI é possível elaborar dashboards complexos que exibem em tempo real o status de seus elementos de infraestrutura e, principalmente, de processos de negócios, o que representa um passo além do monitoramento de itens básicos de infraestrutura de TI. O DaVINCI é perfeito para dar visibilidade a seu ambiente de TI e de negócios em grandes monitores de LCD. Ele

permite criar estes dashboards sem a necessidade de escrever nenhuma linha de código, apenas utilizando sua interface gráfica avançada. Esse aplicativo pode ainda ser baixado, adquirido e utilizado em qualquer ambiente Nagios, sem a necessidade de se possuir o OpMon (figura 4). Um dos pontos fracos do Nagios é sua configuração complexa, toda ela baseada em diversos arquivos de texto. Ainda que bastante abrangente, o Nagios requer um profundo conhecimento de seus arquivos de configuração. Existem vários projetos de software livre que abordam, de uma forma ou outra, essa fraqueza da plataforma. A OpServices desenvol-

Figura 4 A interface DaVINCI pode ser baixada e usada sem o uso do OpMon.

64

veu uma ferramenta de configuração 100% web para viabilizar a configuração do OpMon sem a necessidade de se conhecer os vários arquivos de configuração do Nagios, além de armazenar estas configurações em bases de dados, o que confere maior facilidade ao armazenamento e recuperação das configurações (figura 5). Outro ponto importante do OpMon em relação ao Nagios é sua aderência às melhores práticas de gestão especificadas pela ITIL (Information Technology Infrastructure Library). Ele possui ferramentas que permitem criar Catálogos de Serviço, além da geração e monitoramento de acordos de níveis de serviço (SLA/SLM) de forma nativa, representáveis no DaVINCI, exibindo o impacto em um determinado Serviço de TI quando da falha de um dos elementos que compõem aquele serviço no catálogo. O OpMon possui ainda uma forte integração com plataformas de Service Desk e CMDB, agregando melhores práticas de gerências de do ITIL, tais como Cumprimento de Requisição de Serviço, Gerenciamento de Problemas, Gerenciamento de Incidentes, Gerenciamento de Configuração e Ativos, Gerenciamento de Mudanças e Gerenciamento do Conhecimento. Um servidor de rede descoberto pelos métodos de discovery do OpMon, por exemplo, pode ser importado para o monitoramento, tornando-se um item de configuração gerenciado e incluído no CMDB, e mantendo um vínculo de integração entre os dados coletados no monitoramento, as informações de hardware e software provindas do processo ativo de inventário e as ações efetuadas no Service Desk durante todo o ciclo de vida dos itens de configurações e serviços do OpMon. A qualquer momento é possível consultar no CMDB o histórico de versões deste e de outros itens de configuração que estão ou foram gerenciados pelo OpMon, obtendo conhecimento de informações vinculadas, tais como:

www.linuxmagazine.com.br


Personalização de software | REDES

Figura 5 A interface gráfica permite alterar as configurações do Nagios sem lidar com arquivos de texto.

dependências entre os próprios itens de configuração e serviços, requisições atendidas, resolução de incidentes, mudanças efetuadas, resolução de problemas, entre outras informações disponíveis na base de conhecimento. Isto é possível porque todos esses insumos continuam registrados no CMDB mesmo que os itens de configuração tenham sido removidos do OpMon, provendo informações importantes que auxiliarão o desenho de novos serviços. O OpMon implementou, ao longo dos anos, diversas melhorias na questão da escalonabilidade e desempenho do Nagios, sendo que várias delas foram enviadas como contribuições para a equipe que mantém o core do Nagios. Algumas dessas melhorias foram incorporadas ao código final do Nagios OSS; outras ficaram restritas à plataforma OpMon. Talvez a maior delas, em termos de escalonabilidade e desempenho do OpMon, resida na utilização do Gearman [3] como plataforma de distribuição do processamento do Nagios. Com a incorporação do Gearman na plataforma OpMon foi possível obter ganhos de até 73% na capacidade de gerenciamento de itens de configuração da plataforma, além de garantir uma escalonabilidade muito além do que seria possível com a utilização da plataforma padrão.

Linux Magazine #84 | Novembro de 2011

Resumindo, o Nagios OSS é uma excelente plataforma para gerenciar redes e sistemas, mas como todo software, não é a panacéia para todas as necessidades das empresas, mesmo com uma imensa variedade de projetos aderentes ao Nagios. Com as estruturas de TI cada vez mais enxutas, a necessidade de facilitar as tarefas dos CIOs e administradores de redes fez com que o OpMon evoluísse no sentido de oferecer facilidades de uso, implementação e recursos avançados e integrados, ainda assim mantendo a compatibilidade com o core do Nagios e sendo 100% compatível com a imensa biblioteca de plugins disponíveis livremente no Nagios Exchange. ■

Mais informações [1] OpServices: http:// www.opservices.org/ [2] Nagios: http://www. nagios.org/

PROTEJA SUA REDE CONTRA ATAQUES INTERNOS, EXTERNOS E OUTRAS AMEAÇAS QUE COLOCAM EM RISCO OS SEUS DADOS.

[3] Gearman: http:// gearman.org/

Gostou do artigo? igo? Queremos ouvir sua opinião. Fale conosco em m cartas@linuxmagazine.com.br zine.com r Este artigo no nosso osso site: s : http://lnm.com.br/article/5973 r/artic 597

ADQUIRA O SEU NAS MELHORES BANCAS OU EM NOSSA LOJA VIRTUAL LNM.COM.BR/SHOPPING 65


Partições GUID | ANÁLISE

Substituição do MBR pela tabela de partição GUID

ANÁLISE

Dança dos discos Discos de alta capacidade usam a tabela de partição GUID ao invés do antigo master boot record, mas os aplicativos fdisk usuais do Linux não conseguem trabalhar com o novo esquema de particionamento. Veja como contornar isso usando as ferramentas certas. por Hans-Peter Merkel

E

sbarrar em um limite. Esse é um tema constante na história dos discos rígidos. Primeiro foi a BIOS, depois as controladoras [1] e até os sistemas operacionais. Número máximo de setores e cabeças, limites no particionamento e no número de partições, áreas de boot... a lista não tem fim. Nos anos 1980, o MS DOS 3.2 forçou os usuários a dividir seus caros discos em partições de 32 MB. Naquela época, um disco rígido de 85 MB precisaria de pelo menos três partições (figura 1). Dois discos modernos Seagate ST 33000651 AS, gentilmente cedidos à Linux Magazine pelo fornecedor para os testes deste artigo, contam com 3 TB cada, o que ultrapassa o atual limite da tabela de partição do tipo master boot record (MBR) para PCs (figura 2) [2]. O antigo esquema usado no particionamento MBR – CHS (cilindros, cabeças e setores; na sigla em inglês) – chegou ao fim da estrada há muitas primaveras, aos 8 GB (máximo de 1.024

Linux Magazine #84 | Novembro de 2011

cilindros x 255 cabeças x 63 setores). Desde então, a BIOS e o sistema operacional têm usado o padrão de 254 cabeças, 63 setores e 1.023 cilindros, usando 4 bytes na tabela de partição para definir posição e tamanho dos setores (endereçamento de bloco lógico, ou LBA, na sigla em inglês). O mundo dos PCs vinha seguindo tranquilo com esse truque, mas os tempos estão mudando (ou já mudaram), pois um tamanho de (232-1 setores) X 512 bytes resulta em um máximo de 2,2 TB para uma partição e 4 TB para um disco [3] [4]. Em outras palavras, se você quiser usar todo o espaço de um disco de última geração com 3 TB, precisará realizar algumas mudanças grandes. Bem-vindo ao mundo da tabela de partição GUID! A tabela de partição GUID (GPT, na sigla em inglês) é a sucessora da tabela MBR, sendo parte da EFI (Extensible Firmware Interface) [5]. A especificação EFI – a versão independente de fornecedores é conhecida como Unified EFI (UEFI) – substitui e padroniza as partes

da BIOS responsáveis por inicializar e processar programas pré-boot. A GPT usa tabelas MBR do tipo LBA, mas com valores de 64-bits, permitindo assim até 8 ZB (1 zettabyte = 1 bilhão de terabytes) para um disco com setores de 512 bytes. Além disso, a GPT pode gerenciar até 128 partições (figura 3) [6].

Quadro 1: Inicialização a partir de discos GPT Os servidores-padrão, mainframes e computadores Apple mais recentes cumprem a especificação EFI e inicializam a partir de um disco particionado com GPT. Diferentemente disso, as placas-mãe de desktops para CPUs Intel ou AMD atualmente inicializam quase que exclusivamente através das rotinas MBR da BIOS. Felizmente, os usuários Linux contam com uma solução no GRUB 2 para resolver esse problema. O carregador de boot fornece um ambiente EFI para o computador, e o Linux pode assim inicializar a partir de um disco GPT sem problemas. Mas tenha cuidado: versões anteriores do GRUB não contam com esse recurso.

73


ANÁLISE | Partições GUID

Mão na massa O kernel Linux é compatível com a atual geração de discos de alta capacidade e GPTs a partir da versão 2.6.25, embora Linus Torvalds tenha depreciado a EFI como sendo uma “lesão cerebral da Intel” [7]. Nosso sistema de testes endereça o disco Seagate como /dev/sdh; a listagem 1 mostra a saída do comando dmesg. Se tentar particionar uma GPT com as populares ferramentas fdisk ou cfdisk, você não chegará muito longe, mas o aplicativo gráfico GParted trabalha com GPTs (figura 4). Aqui, usarei esse aplicativo para criar uma única grande partição no primeiro disco. No GParted, você primeiro seleciona Dispositivo / Criar Tabela de Partição. Isso leva a uma janela com um grande aviso de que todos os dados serão perdidos. Na mesma janela, clique no triângulo ao lado de Advançado, e no menu drop-down ao lado de Selecione o tipo da nova tabela de partição, e escolha GPT. A opção Partição / Nova abre caminho para a criação de uma partição primária com sistema de arquivos ext4. Depois de clicar em Adicionar, uma mensagem avisa que isso pode

levar algum tempo, dependendo do número e do tamanho das operações. Em nosso laboratório, isso foi uma pausa para o café de 10 minutos. No final, fiquei com 3 TB de espaço, menos um overhead de gerenciamento significativo, de 44,05 GB (listagem 2). A listagem 3 mostra o MBR 512-bytes, que a GPT usa e corretamente preenche por questões de compatibilidade. O 0x55AA na linha 5 indica o fim do MBR. O segundo setor da GPT contém os dados de cabeçalho para o particionamento GUID (linhas 7 a 12). As entradas de partição aparecem na posição 0x400, contendo: • Tipo de partição (16 bytes) • Partição GUID (16 bytes) • Início da partição (8 bytes) • Fim da partição (8 bytes) • Atributos (8 bytes) • Nome da partição (72 bytes) O GUID (Globally Unique Identifier) cuida dos nomes na GPT, sendo uma codificação 16-bytes, de tipo único, do tipo de partição. O sistema de testes agora tem uma partição de dados graças ao GParted. O GUID correspondente é EBD0A0A2-B9E5-4433-87C0-68B6B72699C7. A implementação na linha 14 alterna alguns itens no ID (isso lembra um pouco a arquitetura do tipo Big Endian-

Figura 1 Velho e novo lado a lado: um disco rígido grande no tamanho mas com apenas 85 MB, e um HD SATA 3 TB de última geração da Seagate.

Little Endian). Consequentemente, a EFI armazena uma cópia da GPT no final da mídia de dados como backup. Assim, você pode restaurar uma GPT primária danificada a partir dessa cópia. Se você precisar converter um disco de GPT para MBR, também precisará apagar a GPT secundária, senão o sistema vai continuar a identificar o disco como uma partição GPT.

Figura 2 Estrutura do master boot record. A tabela de partição com quatro entradas tem apenas 4 bytes por número de setor.

74

www.linuxmagazine.com.br


Partições GUID | ANÁLISE

Listagem 1: O kernel detecta discos de 3 TB

Outras ferramentas

01 [782663.410960] ata6: SATA link up 6.0 Gbps (SStatus 133 SControl 300) 02 [782663.445923] ata6.00: ATA-8: ST33000651AS, CC44, max UDMA/133 03 [782663.445931] ata6.00: 5860533168 sectors, multi 0: LBA48 NCQ (depth 31/32) 04 [782663.446811] ata6.00: configured for UDMA/133 05 [782663.446830] ata6: EH complete 06 [782663.447076] scsi 7:0:0:0: Direct-AccessATAST33000651ASCC44 PQ: 0 ANSI: 5 07 [782663.447507] sd 7:0:0:0: Attached scsi generic sg9 type 0 08 [782663.447585] sd 7:0:0:0: [sdh] 5860533168 512-byte logical blocks: (3.00 TB/2.72 TiB) 09 [782663.447780] sd 7:0:0:0: [sdh] Write Protect is off 10 [782663.447788] sd 7:0:0:0: [sdh] Mode Sense: 00 3a 00 00 11 [782663.447928] sd 7:0:0:0: [sdh] Write cache: enabled, read cache: enabled, doesn’t support DPO or FUA 12 [782663.448846] sdh: unknown partition table 13 [782663.474623] sd 7:0:0:0: [sdh] Attached SCSI disk

Os administradores de servidores que dependem da linha de comando não acharão o GParted muito útil. Atualmente há poucos substitutos do fdisk que aceitam GPT. O mais interessante é o GPT fdisk project [8], que depende dos programas gdisk, sgdisk e fixparts. A versão atual do Ubuntu tem apenas o gdisk em seu repositório, então faz mais sentido pegar todos os pacotes diretamente do openSUSE Build Service [9]. Depois de instalar esse conjunto de ferramentas, você pode verificar e modificar o disco. O comando

Listagem 2: fdisk -lu depois do particionamento 01 02 03 04 05 06 07

Disk /dev/sdh: 3000 GB, 3000590369280 bytes 255 heads, 63 sectors/track, 364801 cylinders, total 5860528065 sectors Units = sectors of 1 * 512 = 512 bytes Device Boot Start End Blocks Id System /dev/sdh1 2048 5860532223 2930272033 83 Linux Warning: Partition 1 does not end on cylinder boundary.

Listagem 3: dd if=/dev/sdh | xxd (trecho) 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16

[...] 00001c0: 00001d0: 00001e0: 00001f0: [...] 0000200: 0000210: 0000220: 0000230: 0000240: 0000250: [...] 0000400: 0000410: 0000420:

0100 0000 0000 0000

eefe 0000 0000 0000

ffff 0000 0000 0000

0100 0000 0000 0000

0000 0000 0000 0000

ffff 0000 0000 0000

ffff 0000 0000 0000

0000 0000 0000 55aa

................ ................ ................ ..............U.

4546 0e0f afa3 8ea3 a7c2 8000

4920 49ee 505d 505d 70a1 0000

5041 0000 0100 0100 3db8 8000

5254 0000 0000 0000 25c4 0000

0000 0100 2200 cbb9 0200 6afb

0100 0000 0000 6e3f 0000 3a17

5c00 0000 0000 0765 0000 0000

0000 0000 0000 a746 0000 0000

EFI PART....\... ..I............. ..P]....”....... ..P]......n?.e.F ..p.=.%......... ........j.:.....

a2a0 d0eb e5b9 3344 87c0 68b6 b726 99c7 ......3D..h..&.. 6903 b666 b91c 7646 a8dd e9d1 d7c6 bc5a i..f..vF.......Z 0008 0000 0000 0000 ff9f 505d 0100 0000 ..........P]....

Listagem 4: Informações de partições do gdisk 01 02 03 04 05 06 07 08

Disk /dev/sdh: 5860533168 sectors, 2.7 TiB Logical sector size: 512 bytes Disk identifier (GUID): 0AE667A2-818F-4670-A328-500021C76A73 Partition table holds up to 128 entries First usable sector is 34, last usable sector is 5860533134 Partitions will be aligned on 2048-sector boundaries Use ‘l’ on the experts’ menu to adjust alignment Last sector (2048-5860533134, default =5860533134) or {+-}size{KMGTP}: 09 Current type is ‘Linux/Windows data’ 10 Hex code or GUID (L to show codes, Enter =0700):

Linux Magazine #84 | Novembro de 2011

gdisk /dev/sdh

retorna o seguinte em relação a um novo disco: Partition table scan: MBR: not present BSD: not present APM: not present GPT: not present

No menu de texto, a opção p retorna a tabela de partição (listagem 4), enquanto a opção o primeiro exibe um alerta de segurança, depois cria uma tabela GPT. A opção n permite que você crie uma nova partição do tamanho do disco, como fiz com o GParted antes. O Gdisk também dá acesso a algumas opções GUID que o GParted não tem. Usei o valor-padrão de 0700 para dados Linux/Windows e teclei w ("Write table to disk and exit"). No nosso laboratório, usei o mkfs.ext4 para formatar a partição. Na linha de comando, todo o processo levou três minutos menos do que com o GParted. A GPT criada ficou idêntica à do GParted, como revelou um teste com dd e xxd.

MBR para GPT O Gdisk pode converter discos particionados com MBR para GPT, o que acaba com a necessidade de copiar e restaurar o conteúdo. A opção r leva ao menu de recuperação e conversão. Neste teste, usei um disco antigo de 200 GB com uma partição MBR.

75


ANÁLISE | Partições GUID

Depois da conversão, o comando gdisk /dev/sde retornou o seguinte: Partition table scan: [...] Found valid GPT with protective MBR; using GPT.

A listagem 5 mostra a saída da ferramenta forense mmls do pacote sleuthkit [10]. A linha 2 confirma que a conversão foi bem sucedida. A entrada de partição da listagem 6 é interessante: o tipo de dados está disponível tanto no GUID quanto em entrada de texto, entre as linhas 4 e 6.

GPT para MBR O Gdisk também pode converter de GPT para MBR. Como, em alguns casos, isso não vai funcionar, é bom ser cuidadoso. Após reconverter o disco que tinha transformado em GPT, o gdisk retornou a saída da listagem 7. Neste ponto, o programa sgdisk do pacote GPT fdisk é útil para reparos de baixo nível.

Clusters Os discos rígidos convencionais armazenam dados em setores de 512 bytes. Os sistemas operacionais e seus sistemas de arquivos agrupam múltipos setores para formar um cluster. Normalmente, serão agrupados oito setores, resultando em 4.096 bytes. Para um desempenho melhor, os discos de alta capacidade agora usam setores de cluster de 4.096 bytes internamente (os fornecedores geralmente se referem a eles como discos "4k"). Os discos Seagate usados em nossos testes eram desse tipo. Para manter a compatibilidade externa com a BIOS, a lógica interna do disco converte os clusters de volta para setores de 512-bytes. Para evitar lentidão devido a essa adaptação de unidades de medida – entre o sistema operacional e o disco – os clusters de 4 KB do disco e do sistema de arquivos precisam coincidir perfeitamente, tanto para partições MBR quanto para GPT.

76

Se esse não for o caso, os resultados podem ser desastrosos: se você tiver uma porção de 2.048 bytes e o sistema operacional quiser gravar um cluster no disco, o disco precisa gravar dois clusters pela metade fisicamente, ocupando assim dois clusters inteiros. Os discos SSD são mais afetados por esse problema de alinhamento, pois os ciclos de gravação sobrepostos vão disparar um ciclo de leitura-modificação-gravação no drive flash.

Início da partição Esse problema de desalinhamento de unidades de medida entre disco e sistema operacional é mais uma exceção do que a regra. A Microsoft é a responsável por essa situação, já que as ferramentas de particionamento desde o MS DOS até o Windows XP começam o particionamento imediatamente depois do MBR, no setor 63. Os discos particionados com esse método estarão sempre desalinhados. Se a primeira partição começar no setor 64, será possível obter grupos completos de 4.096 blocos. Assim, o Fdisk no Linux imita esse comportamento por questões de compatibilidade. A Microsoft finalmente colocou um fim no problema com o Windows Vista e agora permite que a primeira partição comece no setor 2.048 em vez do 63. Dependendo da versão do fdisk que você usa no Linux, será

Figura 3 Estrutura GPT. Um cabeçalho de 100 bytes segue o padrão MBR para compatibilidade com sistemas operacionais anteriores. A tabela de partição usa 32 blocos para armazenar os dados de um máximo de 128 partições de 128 bytes.

preciso desabilitar a compatibilidade DOS através de uma opção de linha de comando. Felizmente, as ferramentas que podem criar uma GPT usam todas o padrão de 2.048 como setor inicial. Esse comportamento é exatamente o que percebi durante os testes para este artigo: a linha 6 da listagem 2 mostra 2048 como setor inicial, o

Figura 4 O GParted detecta um disco não particionado de 3 TB sem problemas.

www.linuxmagazine.com.br


Partições GUID | ANÁLISE

que indica que o alinhamento está perfeito para o primeiro disco de 3 TB. Mas é preciso ter cuidado com discos que tenham sido usados antes. A linha 10 da listagem 5 revela que uma GPT também pode começar no setor 63 em vez de 2.048. Deve-se ter em mente que converti o segundo disco a partir de um esquema MBR para GPT; isso não alterou os limites da partição no setor 63. Há muita discussão sobre se esse problema é tão ruim na prática quanto parece em teoria, já que os discos modernos usam técnicas de mapeamento secretas e específicas e também porque os sistemas operacionais e seus sistemas de arquivos usam diversos buffers e otimizações. Dito isso, definir setores de 4 KB na partição é uma coisa boa. Os administradores devem habilitar o recurso.

Conclusão A era da GPT definitivamente começou. Os discos modernos precisam dessas novas tabelas para ir além dos 2,2 TB. Assim, os administradores devem manter distância do fdisk por ora, enquanto ferramentas como o GParted ajudam a tapar o buraco. As placas-mãe de desktops não têm problema para inicializar o Linux a partir de um disco GPT, com o carregador de boot GRUB 2. Em termos de desempenho, é preciso manter os olhos abertos: a maioria dos discos de última geração usa clusters de 4 KB internamente em vez de setores de 512 bytes, sendo algo que você não vai notar com o esquema LBA; contudo, isso pode afetar a velocidade da partição no pior das hipóteses. ■

Listagem 5: mmls /e3v/sde 01 02 03 04 05 06 07 08 09 10 11

GUID Partition Table (EFI) Offset Sector: 0 Units are in 512-byte sectors 00: 01: 02: 03: 04: 05:

Slot Meta –-Meta Meta 00 –--

Start 0000000000 0000000000 0000000001 0000000002 0000000063 0390716865

End Length 0000000000 0000000001 0000000062 0000000063 0000000001 0000000001 0000000033 0000000032 0390716864 0390716802 0390721967 0000005103

Listagem 6: dd if=/dev/sde | xxd (trecho) 01 02 03 04 05 06

0000400: 0000410: 0000420: 0000430: 0000440: 0000450:

a2a0 42c4 3f00 0000 7800 7300

d0eb 6d88 0000 0000 2f00 2000

e5b9 c9f9 0000 0000 5700 6400

3344 c84c 0000 0000 6900 6100

87c0 a33d c0dd 4c00 6e00 7400

68b6 a0a6 4917 6900 6400 6100

b726 ceb3 0000 6e00 6f00 0000

99c7 2bf3 0000 7500 7700 0000

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16

GPT fdisk (gdisk) version 0.7.1 Partition table scan: MBR: MBR only BSD: not present APM: not present GPT: not present ************************************************************ Found invalid GPT and valid MBR; converting MBR to GPT format. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by typing ‘q’ if you don’t want to convert your MBR partitions to GPT format! ************************************************************ Exact type match not found for type code A400; assigning type code for ‘Linux/Windows data’

Mais informações: [1] Interface ST506 de 1982: http://en.wikipedia.org/wiki/ST506 [2] MBR: http://en.wikipedia.org/wiki/Master_Boot_Record [3] Tabela de partição MBR: http://en.wikipedia. org/wiki/Partition_table [4] FAQ: Drive Partition Limits: http://www.uefi.org/ learning_center/UEFI_MBR_Limits_v2.pdf [5] EFI e UEFI: http://developer.intel.com/technology/ efi/; http://www.uefi.org/home/ [6] GPT: http://en.wikipedia.org/wiki/GUID_Partition_Table

Gostou do artigo? o? Queremos ouvir sua a opinião. Fale conosco em cartas@linuxmagazine.com.br zine.com.

[8] GPT fdisk: http://www.rodsbooks.com/gdisk/

Linux Magazine #84 | Novembro de 2011

......3D..h..&.. B.m....L.=....+. ?.........I..... ........L.i.n.u. x./.W.i.n.d.o.w. s. .d.a.t.a.....

Listagem 7: gdisk /dev/sde

[7] Linus e o Extensible Firmware Interface: http:// kerneltrap.org/node/6884

Este artigo no nosso o site: sit http://lnm.com.br/article/5992 article 992

Description Safety Table Unallocated GPT Header Partition Table Linux/Windows data Unallocated

[9] GPT fdisk do openSUSE Build Service: https://build.opensuse. org/package/show?package=gptfdisk&project=home%3Asrs5694 [10] Sleuthkit: http://sleuthkit.org/

77



Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.