Conhecendo algumas facilidades do FreeBSD

Sempre digo por aí que é muito fácil fazer certas coisas no FreeBSD. Algumas pessoas (as que conhecem FreeBSD só de longe) dizem que FreeBSD é só para “Heavy Users” de UNIX, mas isso não é verdade, por ser um sistema muito simples as pessoas acabam tendo uma falsa impressão sobre ele. É claro que para trabalhar com ele você deve ter um certo conhecimento de ambientes UNIX.

Por isso resolvi escrever esse artigo. Vou tentar, de maneira sucinta, demonstrar algumas operações que nós normalmente precisamos executar em nossos servidores, seja no momento da implementação, manutenção ou uso cotidiano. O artigo irá abordar coisas como: RAID, Firewall, configuração de rede, compilação de kernel, gerenciamento de pacotes, Jails, módulos do kernel, atualização do sistema, ZFS, monitoramento de recursos do sistema e como colocar serviços para iniciar automaticamente.

Não pretendo me aprofundar muito em nenhum tópico, mas ao final de cada um estarão algumas referências para você ir além.

RAID

Uma das coisas mais fáceis de se fazer no FreeBSD, em relação à outros sistemas operacionais, é configurar um RAID por software. O FreeBSD possui um subsistema chamado GEOM, ele provê facilidades para se desenvolver ferramentas que trabalham com I/O em discos, e é com ele que a configuração super-facilitada de  RAID é feita no sistema. O GEOM vai trabalhar como um intermediário entre os discos e o sistema. Vejamos um exemplo de configuração de RAID 1 em um sistema já em funcionamento, considerando que você tem dois discos, ad0 e ad1 com o sistema instalado em ad0:

sysctl kern.geom.debugflags=16
gmirror label -b round-robin gm0 ad0

Explicação: a primeira linha dá permissão para o GEOM gravar suas informações no disco e a segunda cria um RAID 1 chamado gm0 com o disco ad0, por enquanto, usando um algoritmo do tipo round-robin para leitura nos discos.

Até o momento, marcamos o disco “master” como membro de um RAID 1 do GEOM chamado gm0. Agora altere o seu /etc/fstab para que fique parecido com o fragmento abaixo:

/dev/mirror/gm0s1b none swap sw 0 0
/dev/mirror/gm0s1a / ufs rw 1 1
/dev/mirror/gm0s1h /home ufs rw 2 2

Apenas substituímos /dev/ad0 por /dev/mirror/gm0, que é o dispositivo que representa o RAID. Agora adicione a linha:

geom_mirror_load=”YES”

no arquivo /boot/loader.conf, para que o módulo do GEOM mirror carregue automaticamente com o sistema, e reinicie a máquina. Quando o sistema voltar ele estará montado em cima do RAID e você já pode inserir o segundo disco com o comando:

gmirror insert gm0 ad1

O GEOM imediatamente irá começar a sincronizar os discos.

Mais informações sobre o GEOM podem ser encontradas AQUI e em geom(4) e geom(8) (man 4 geom ou man 8 geom).

Firewall

O FreeBSD possui 3 opções de firewall, o IPF, o IPFW e o PF. Os mais usados são o IPFW e o PF, sendo o IPFW nativo do FreeBSD e o PF portado do OpenBSD. Vou demonstrar alguns exemplo de redirecionamento de portas e filtragem de pacotes com o PF aqui, para maiores informações sobre o IPFW consulte esse artigo e ipfw(8).

O PF (Packet Filter), como já dito, foi originalmente desenvolvido para o OpenBSD, sendo mais tarde portado para o FreeBSD e depois para o NetBSD. Todas as regras do PF encontram-se em /etc/pf.conf e podem ser recarregadas com o comando pfctl -f /etc/pf.conf, mas antes disso, vejamos como o PF pode ser habilitado no FreeBSD. Para isso carregue o módulo de kernel do PF com o comando kldload pf (falarei mais sobre módulos mais tarde) e rode pfctl -e -f /etc/pf.conf. Para que o PF sempre inicie automaticamente adicione a linha abaixo no arquivo /boot/loader.conf:

pf_load=”YES”

E a linha abaixo no arquivo /etc/rc.conf:

pf_enable=”YES”

Vamos assumir que você tenha uma placa de rede Intel Fast Ethernet, que use o driver fxp.ko, vejamos algumas regras que podem ser adicionadas no arquivo de configuração do PF:

# Para redirecionar o tráfego que chega
# na porta 80 para a porta local 3128 (squid)
rdr on fxp0 proto tcp from any to port 80 -> 127.0.0.1 port 3128

# Para bloquear todo o tráfego que
# entra no servidor através da placa
fxp0
block in on fxp0

#Para permitir que pacotes ICMP de
# qualquer tipo sejam recebidos pelo sistema
pass in on fxp0 proto icmp

# Para permitir acesso em um servidor
# Web rodando na máquina
pass in on fxp0 proto tcp from any to port 80 keep state

# Para permitir que a máquina 10.10.1.2
# acesse um sistema rodando na porta 8080
pass in on fxp0 proto tcp from 10.10.1.2 to port 8080 keep state

O PF tem uma organização bem definida em seu arquivo de configuração e ela deve ser respeitada. É possível definir variáveis dentro do arquivo de configuração do PF para facilitar o uso das interfaces de rede, de regras, de listas de portas e listas de IPs.

Percebe a simplicidade disso? A regra “block in on fxp0” poderia ser escrita como “iptables -A INPUT -i eth0 -j DROP” em um sistema baseado em Linux. A sintaxe das regras do PF deixam claro o que estão fazendo. Para informações completas sobre o PF, acesse o FAQ no site do OpenBSD e pf.conf(5).

Configuração de Rede

As configurações referentes à rede, exceto DNS, podem ser inseridas no arquivo /etc/rc.conf. Assumindo que você tenha uma placa de rede identificada como fxp0, vejamos um exemplo de como você poderia configurá-la para receber um endereço IP automaticamente:

ifconfig_fxp0=”DHCP”
hostname=”demonio.dominio.local”

Para atribuir IP manualmente, juntamente com um gateway padrão:

ifconfig_fxp0=”192.168.0.100/24″
hostname=”demonio.dominio.local”
defaultrouter=”192.168.0.254″

Os servidores DNS são colocados no /etc/resolv.conf:

nameserver 8.8.8.8
nameserver 8.8.4.4

Após alterar as configurações você pode querer que elas entrem um funcionamento imediatamente, para isso rode os scripts:

/etc/rc.d/netif restart
/etc/rc.d/routing restart

Para informações completas sobre configuração de rede acesse o handbook.

Compilação do Kernel

Compilar o kernel do FreeBSD é uma tarefa muito simples. É necessário recompilar o kernel quando você precisa de um recurso do sistema que só pode ser habilitado como built-in, como por exemplo o ALTQ (sistema de enfileiramento e priorização de pacotes). Todos os fontes do sistema (de todo o sistema, incluindo as ferramentas de usuário) ficam em /usr/src, os arquivos de configuração do kernel ficam em /usr/src/sys/<arch>/conf onde <arch> é a arquitetura do seu sistema. Por exemplo, eu uso uma versão 64 bits do FreeBSD em meu desktop, as configurações do meu kernel ficam em /usr/src/sys/amd64/conf. O arquivo de configuração padrão do sistema é o GENERIC, caso você queria customizá-lo faça uma cópia com um nome sujestivo, algo como:

cp GENERIC SERVIDOR

Agora você pode alterar o arquivo SERVIDOR da maneira como achar necessário, por exemplo, para incluir suporte ao ALTQ e seus algoritmos, adicione as seguintes linhas no arquivo SERVIDOR:

options ALTQ
options ALTQ_RED
options ALTQ_RIO
options ALTQ_CBQ
options ALTQ_PRIQ
options ALTQ_HFSC

Agora, para facilitar, adicione a linha abaixo no arquivo /etc/make.conf para identificar seu arquivo de configuração novo:

KERNCONF=SERVIDOR

E finalmente compile o kernel com os comandos:

cd /usr/src
make kernel

Ao final do processo, o kernel atual (/boot/kernel) será movido para /boot/kernel.old e o novo kernel irá substituí-lo, depois é só reiniciar o sistema. Para informações completas sobre configuração do kernel, acesse o handbook.

Gerenciamento de Pacotes

O sistema de gerenciamento de pacotes do FreeBSD é o Ports. O Ports é uma infraestrutura de scripts que facilita o download, a configuração, a compilação e instalação de software no sistema. O Ports é organizado hierarquicamente por gêneros, por exemplo (o Ports fica em /usr/ports), os programas relacionados com DNS estão dentro de /usr/ports/dns, os relacionados com rede estão em /usr/ports/net. Nenhum software propriamente dito está armazenado no Ports, apenas scripts.

Para instalar o Ports no seu sistema, use o comando:

portsnap fetch extract

Depois de instalado, com o passar do tempo, você precisará mantê-lo atualizado. Antes de instalar algum Port tenha certeza de que você possui a versão mais recente do Ports com o comando:

portsnap fetch update

Para instalar algum Port, acesse o diretório dele no Ports e rode um make, exemplo:

cd /usr/ports/www/apache22
make install clean

Provavelmente uma tela de configuração do Port do Apache 2.2 irá aparecer, nela você pode selecionar quais recursos do Apache 2.2 você irá querer usar. Para remover o Port você pode usar o comando:

cd /usr/ports/www/apache22
make deinstall

Ou ainda verificar com qual nome o pacote foi registrado no sistema com o comando pkg_info | grep apache e removê-lo com o comando pkg_delete <nome do pacote>.

Além do Ports, o projeto FreeBSD mantém uma variedade de pacotes já compilados, para instalar um pacote desses use o comando pkg_add -r, por exemplo, para instalar o firefox:

pkg_add -r firefox

Para informações completas sobre gerenciamento de pacotes no FreeBSD acesse o handbook.

Jails

Uma Jail é um ambiente virtual isolado dentro de um sistema FreeBSD, uma versão melhorada do chroot eu diria. Uma vez que alguém se conecte ao servidor e caia direto dentro da Jail, ele estará isolado do sistema base, se a Jail for comprometida (rm -rf / por exemplo), somente ela será danificada.

Uma Jail pode ser criada à partir de um buildworld, mas para evitar todo o trabalho pesado vamos utilizar uma ferramenta chamada ezjail. O ezjail pode ser instalado pelo Ports com os comandos:

cd /usr/ports/sysutils/ezjail
make install clean

Agora podemos criar nossa Jail, vamos chamá-la de “teste” e atribuir o IP 172.16.1.234 para ela, mas antes precisamos criar o ambiente que servirá de base para todas as futuras Jails:

ezjail-admin install
ifconfig fxp0 alias 172.16.1.234
ezjail-admin create teste 172.16.1.234

Adicione a linha abaixo no seu rc.conf:

ezjail_enable=”YES”

Agora rode os seguintes comandos para iniciar e acessar a Jail:

ezjail-admin start teste
ezjail-admin console teste

Agora você pode usar o Ports e configurar serviços como o squid, apache, lighttpd, mysql e etc. Uma documentação muito bacana sobre o ezjail pode ser encontrada aqui.

Módulos do Kernel

Em alguns momentos você poderá precisar adicionar suporte a algum hardware ou ainda precisar de algum recurso como o PF e o IPFW habilitados em seu sistema. Não é necessário compilar o kernel para fazer a maioria das coisas. Para isso servem os módulos do kernel, eles podem ser carregados e descarregados a qualquer momento. No FreeBSD, os módulos do Kernel estão localizados em /boot/kernel e módulos de terceiros podem ser armazenados em /boot/modules. Vejamos um exemplo, você precisa carregar o módulo snd_hda.ko para que sua placa de som (compatível com o módulo snd_hda.ko) possa funcionar. Para isso rode o comando:

kldload snd_hda

Da mesma maneira, ele pode ser descarregado com o comando:

kldunload snd_hda

Você pode consultar quais módulos estão carregados com o comando:

kldstat

Para fazer com que esse módulo seja carregado automaticamente com o sistema, adicione a linha abaixo no arquivo /boot/loader.conf:

snd_hda_load=”YES”

Para mais informações consulte aqui e kldload(8), kldstat(8) e kldunload(8).

Atualização do Sistema

Existem algumas maneiras de atualizar o FreeBSD, você pode fazer isso manualmente ou usar um utilitário do sistema que facilita o processo. Antes precisamos definir algumas diferenças entre as versões do FreeBSD, que podem ser descritas como RELEASE, STABLE e CURRENT.

Uma versão definida como RELEASE, por exemplo o FreeBSD 8.1-RELEASE, é o sistema que é lançado após vários meses de desenvolvimento e testes. A versão recomendada para uso em produção é essa. Ela recebe apenas atualizações de segurança, novos recursos não serão adicionados nela.

Uma versão definida como STABLE, é o sistema com desenvolvimento continuado da versão RELEASE, nela aparecerão coisas novas. Futuramente à partir de uma versão STABLE será criada uma RELEASE, por exemplo: FreeBSD 8.1-RELEASE -> FreeBSD 8.1-STABLE -> FreeBSD 8.2-RELEASE.

A versão CURRENT é a raíz da árvore de desenvolvimento do FreeBSD, é nela que todas as coisas novas aparecem e são testadas, essa árvore não é recomendada para uso em produção.

O processo de atualização pode ser realizado através da compilação de todo o sistema (ou apenas o kernel, dependendo do que está sendo atualizado) ou através da atualização binária. Irei demonstrar aqui apenas a atualização binária.

Dito isso, irei assumir que você roda uma versão RELEASE do FreeBSD, a 7.1-RELEASE por exemplo. Supondo que você queria levar o seu FreeBSD 7.1-RELEASE para a versão mais recente dele, o comando abaixo pode ser usado:

freebsd-update fetch install

O freebsd-update irá analizar todo o seu sistema em busca de arquivos que necessitam de atualizações e atualizá-los.

O processo de upgrade (levar seu sistema 7.1 para o 7.3 por exemplo) é um pouco mais extenso, acesse o handbook para maiores informações.

ZFS

O sistema de arquivos ZFS, criando pela Sun, foi portado para o FreeBSD e a versão 14 está disponível para uso em produção no FreeBSD 8.1, neste momento a versão 28 está sendo colocada na árvore CURRENT.

Características como compactação, capacidade de criar novos sistemas de arquivos a qualquer momento, capacidade de alterar o tamanho dos sistemas de arquivos a qualquer momento, adicionar novos discos e incrementar o espaço sem interrupção dos serviços, criação de RAID e fácil administração, fazem do ZFS uma ótima escolha para sistemas de storages, banco de dados, sistemas de cache e etc.

Antes de mais nada, carregue o módulo zfs.ko para que o sistema possa trabalhar com esse tipo de sistema de arquivos:

kldload zfs

Assumindo que você possui um sistema instalado convencionalmente em um disco e mais 3 discos (ad1, ad2 e ad3) em sua máquina, veja como um pool de discos pode ser criado:

zpool create dados ad1 ad2 ad3

Seu pool chamado “dados” já foi criado, montado e está disponível para ser usado em /dados.

Você pode querer criar alguns sistemas de arquivos dentro do seu pool, para isso use o comando:

zfs create dados/administracao

Um sistema de arquivo chamado administracao será criado dentro de /dados e imediatamente estará pronto para uso. Veja como é possível habilitar a compactação neste sistema de arquivos:

zfs set compression=on  dados/administracao

Alterar seu tamanho para 1GB:

zfs set quota=1G dados/administracao

Você pode criar quantos sistemas de arquivos precisar e alterar opções de cada um deles. Não é necessário alterar seu /etc/fstab para manter o ZFS funcionando, apenas adicione a linha abaixo no seu arquivo /etc/rc.conf, isso garante que o ZFS será iniciado automaticamente:

zfs_enable=”YES”

E para garantir, adicione a linha abaixo no arquivo /boot/loader.conf:

zfs_load=”YES”

Caso queira destruir a sistema de arquivos administracao use o comando:

zfs destroy dados/administracao

Para destruir o pool de discos use o comando:

zpool destroy dados

Mais informações sobre o ZFS podem ser encontradas aqui e sobre ZFS no FreeBSD aqui. Informações sobre como instalar o FreeBSD sobre o ZFS podem ser encontradas aqui.

Monitoramento de recursos do sistema

Saber monitorar os recursos do sistema é muito importante, essa é a maneira mais fácil de descobrir onde está um possível problema. Se um aplicativo está destruindo seu HD, você provavelmente gostaria de saber qual é e qual o motivo, ou se um programa esta consumindo muita memória, gerando muito tráfego em sua rede, se algum driver está gerando problemas com algum dispositivo e etc.

O FreeBSD trás consigo uma variedade de ferramentas que ajudam a monitorar praticamente qualquer parte do sistema, algumas delas são: systat(1), vmstat(8), gstat(8), netstat(1), top(1), ps(1), iostat(8) e procstat(1). Vamos analisar, de maneira breve, algumas delas (na esperança de provocar a curiosidade do leitor para ir atrás das outras):

systat: Com essa ferramenta é possível monitorar várias atividade no sistema, como por exemplo I/O em dispositivos de armazenamento conectados na máquina, uso de páginas de memória, interrupções geradas pelos dispositivos de hardware, estatísticas sobre protocolos de rede entre outras coisas. Rode aí um man systat e verifique a quantidade de coisas que essa pequena ferramenta faz.

vmstat: Com o vmstat é possível acompanhar as estatísticas sobre memória virtual entre outras coisas, é possível ver quanto de memória um determinado módulo de kernel está usando, quanta memória todo o kernel está usando, quantas interrupções foram geradas até o momento pelos dispositivos de hardware, quantas chamadas de sistema fork, vfork e rfork foram executadas e quantas páginas de memória foram envolvidas e etc.

gstat: O gstat é usado para monitorar I/O em dispositivos usados pelo geom. É uma boa meneira de saber quanto I/O está sendo gerado em cada disco, slice ou label do seu sistema.

netstat: Usado para exibir as estatísticas de rede do sistema, é possível ver informações detalhadas por protocolo (pacotes transmitidos, recebidos, com erro, fragmentos e etc), quantidade de pacotes que passam pela máquina no momento (por interface de rede), estatísticas sobre os buffers usados pelo sistema, rotas e etc.

top e ps: Usadas para verificar os processos em execução no sistema, é possível ver o consumo das CPUs, de memória, I/O gerado por cada processo (top) entre outras coisas, essas são bem parecidas com as ferramentas do Linux.

iostat: Usado para verificar I/O em dispositivos de armazenamento e caracteres lidos e escritos no console.

procstat: Exibe informações detalhadas sobre um determinado processo, é possível verificar quais arquivos estão sendo manipulados, quais foram os argumentos de linha de comando passados, informações sobre threads criadas, mapa de memória virtual e etc.

Existem várias outras ferramentas para a monitoração de outras partes do sistema, como o DTrace por exemplo. Fica para o você a tarefa de saber mais sobre esses programas.

Iniciando serviços automaticamente

Serviços, como o squid, apache, samba e mysql podem ser colocados para inicializar de maneira automática no sistema. Mas antes é preciso saber outra coisa. O Port de uma aplicação que necessite estar rodando todo o tempo provavelmente irá instalar um script de inicialização dentro do diretório /usr/local/etc/rc.d, (também existe o /etc/rc.d, nele ficam os scripts de inicialização dos aplicativos que vem com o FreeBSD), é esse script que você vai usar para iniciar, reiniciar, parar e recarregar um determinado serviço.

Para que, por exemplo, o mysql inicie junto com o sistema devemos colocar um linha referente a ele no arquivo /etc/rc.conf, algo parecido com:

<nome do serviço>_enable=”YES”

Para saber o que exatamente colocar no arquivo, verifique a linha PROVIDE no cabeçalho do script (no caso do mysql é o /usr/local/etc/rc.d/mysql-server), você vai encontrar algo como:

# PROVIDE: mysql

Isso significa que devemos colocar a linha abaixo no nosso rc.conf para o MySQL iniciar automaticamente:

mysql_enable=”YES”

Outras opções podem ser usadas, no caso do MySQL:

#
# Add the following line to /etc/rc.conf to enable mysql:
# mysql_enable (bool):  Set to “NO” by default.
#                       Set it to “YES” to enable MySQL.
# mysql_limits (bool):  Set to “NO” by default.
#                       Set it to yes to run `limits -e -U mysql`
#                       just before mysql starts.
# mysql_dbdir (str):    Default to “/var/db/mysql”
#                       Base database directory.
# mysql_socket (str):   Default to “/tmp/mysql.sock”
#                       Unix socket file.
# mysql_args (str):     Custom additional arguments to be passed
#                       to mysqld_safe (default empty).
#

Para mais informações sobre os scripts rc consulte o handbook.

Conclusão

O FreeBSD é um sistema operacional conhecido por sua estabilidade, robustez e segurança. Mas infelizmente não é tão conhecido quanto outros sistemas operacionais, tanto que ele é chamado de “O Gigante Desconhecido” por alguns. Empresas como o Yahoo!, iXsystems e Juniper usam e investem recursos no projeto, pois conhecem o potencial do sistema.

Tentei fazer uma pequena demonstração de como é fácil usar FreeBSD, talvez algo tenha ficado um pouco vago, então ficam alguns links para consulta:

Tenho dedicado algum tempo para o FreeBSD, apresentando palestras introdutórias sobre o sistema, escrevendo artigos como esse, mantendo esse blog (que tem foco principal em FreeBSD), participando de listas de discussão e principalmente usando-o em todos os projetos que ajudo a realizar na empresa onde trabalho. Acho que vale a pena tudo isso, talvez seja o mínimo que eu possa fazer por esse sistema que já me fez aprender tanto sobre UNIX e me ajudou a ganhar algum dinheiro no final do mês. E você? O que faz pelos sistemas de código aberto que usa pra ganhar a vida?

Fonte: Danilo’s Blog


2 Comentários

Cleiton
2

Olá,
excelente artigo.
Realmente o pessoal acha que o FreeBSD é um bixo de sete cabeças, mas não é (são só cinco..rsrs).
Onde trabalho usamos o FreeBSD em vários servidores e eu, desenvolvo em Django/Python sobre essa maravilhosa plataforma.
Tenho alguns problemas as vezes sim, principalmente com a parte de configurações e permissões (o que é bom, já que sua segurança é muito grande), mas dicas simples como essas podem deixar muito simples o uso.
Abraços

Deixe seu comentário

Seu endereço de e-mail não será publicado. Campos com * são obrigatórios!