Você está na página 1de 146

Sumário

1 introdução...................................................................................................................... 7
1.1 Uma Breve História do FreeBSD e do UNIX ........................................................... 7
1.2 BSD ........................................................................................................................ 8
1.3 FreeBSD ................................................................................................................. 8
1.4 Algumas características principais do FreeBSD ..................................................... 9
1.4.1 Portabilidade .................................................................................................... 9
1.4.2 Capacidade de Trabalho .................................................................................. 9
1.4.3 Gerenciamento de software simplificado .......................................................... 9
1.4.4 Sofisticado sistema de arquivos ....................................................................... 9
1.4.5 Código fonte aberto .......................................................................................... 9
1.4.6 Ampla documentação....................................................................................... 9
1.5 O mascote do FreeBSD ........................................................................................ 10
2. Instalação do FreeBSD .............................................................................................. 11
2.1 Conhecimentos preliminares ................................................................................ 11
2.2 Iniciando a instalação ........................................................................................... 12
2.3 O utilitário sysinstall .............................................................................................. 16
2.4 Passo a passo do processo de instalação ............................................................ 18
3. Unix Básico ................................................................................................................ 31
3.1 Introdução ............................................................................................................. 31
3.2 Efetuando o login no sistema................................................................................ 31
3.3 O interpretador de comandos - shell ........................................................................ 32
3.4 Arquivos de configuração da Shell ....................................................................... 32
3.5 Permissão de arquivos/diretórios ............................................................................. 34
3.5.1 Alterando permissões ........................................................................................ 35
3.5.2 Alterando a propriedade .................................................................................... 35
3.6 Estrutura de Diretórios.............................................................................................. 36
3.7 Comandos diversos .................................................................................................. 38
3.8 Os arquivo /etc/passwd e /etc/master.passwd ......................................................... 39
3.9 O arquivo /etc/group ................................................................................................. 40
3.10 Comandos para manipulação de contas de usuários ............................................. 40
3.10.1 Criando usuários com adduser ........................................................................ 40
3.10.2 Removendo usuários com rmuser ................................................................... 41
3.10.3 Consultando informações com o comando finger ............................................ 42

3
3.10.4 Alterando informações de conta com o comando chpass ................................ 42
3.10.5 Alterando a senha com passwd ....................................................................... 42
3.10.6 Bloqueando usuários ....................................................................................... 43
3.10.7 Utilizando vipw ................................................................................................. 43
3.11 Os arquivos /etc/rc.conf e /etc/defaults/rc.conf ....................................................... 44
3.12 Montando e desmontando sistemas de arquivos ................................................... 45
3.12.1 O arquivo fstab.............................................................................................. 46
3.12.2 O comando mount........................................................................................... 46
3.12.3 O comando umount ........................................................................................ 48
3.13 Manipulação de Processos .................................................................................... 48
3.14 Daemons, sinais e controle de processos .............................................................. 51
3.14.1 Sinais ............................................................................................................... 52
3.14.2 Enviando sinais a processos ........................................................................... 52
3.15 Documentação do sistema ..................................................................................... 53
3.15.1 Páginas de Manuais ........................................................................................ 54
3.15.2 GNU Info .......................................................................................................... 55
3.15.3 FAQ FreeBSD .................................................................................................. 55
4. Instalação de aplicativos ............................................................................................ 57
4.1 O sistema de Ports e Packages ............................................................................... 58
4.1.1 Conteúdo da árvore do ports.......................................................................... 60
4.2 Encontrando o software............................................................................................ 63
4.2.1 Whereis .......................................................................................................... 64
4.2.2 Make search ................................................................................................... 64
4.3 Usando packages ................................................................................................. 65
4.3.1 Adicionando aplicativos .................................................................................. 65
4.3.2 Obtendo informações ..................................................................................... 66
4.3.3 Removendo aplicativos .................................................................................. 67
4.4 Usando Ports ........................................................................................................ 68
4.4.1 Customizações integradas ............................................................................. 70
4.4.2 Inicializando o port instalado no boot do sistema. .......................................... 72
4.4.3 Desinstalando e reinstalando ......................................................................... 72
4.4.4 Mantendo a árvore limpa................................................................................ 72
5 Kernel .......................................................................................................................... 75
5.1 O que é o kernel? ................................................................................................. 75
5.2 Sysctl .................................................................................................................... 75

4
5.2.1 Sysctl MIBs .................................................................................................... 75
5.2.2 Manipulando Sysctls ...................................................................................... 76
5.3 Módulos de kernel ................................................................................................ 77
5.3.1 Visualizando os módulos carregados ............................................................. 77
5.3.2 Carregando e descarregando módulos .......................................................... 77
5.4 Construindo seu próprio Kernel ............................................................................ 78
5.4.1 Arquivo de configuração................................................................................. 79
6. Atualização do FreeBSD ............................................................................................ 93
6.1 Versoes do FreeBSD ............................................................................................ 93
6.1.1 Releases ........................................................................................................ 93
6.1.2 Errata Branches ............................................................................................. 93
6.1.3 FreeBSD-current ............................................................................................ 93
6.1.4 FreeBSD-stable .............................................................................................. 93
6.2 Métodos de atualização. ....................................................................................... 94
6.3 Atualização Binária ............................................................................................... 94
6.3.1 Utilizando o freebsd-update ........................................................................... 94
6.4 Atualização por código fonte ................................................................................. 95
6.4.1 Stable-supfile ................................................................................................. 96
6.4.2 Construção do FreeBSD a partir do fonte. ..................................................... 99
6.4.3 Compilando e instalando um novo kernel .................................................... 100
6.4.4 Preparação para a instalação do mundo ...................................................... 100
6.5 Instalação do mundo........................................................................................... 102
7. Atualizando a árvore do ports................................................................................... 105
7.1 Portsnap ............................................................................................................. 105
7.1.2 Configurando o portsnap .............................................................................. 105
7.1.3 Utilizando o portsnap.................................................................................... 106
7.2 Atualizando os ports instalados .......................................................................... 106
7.2.1 Identificando softwares desnecessários ....................................................... 109
7.2.2 Identificando e atualizando softwares .......................................................... 109
7.2.3 Reconstruindo programas dependentes. ..................................................... 110
7.2.4 Ignorando Ports ............................................................................................ 111
7.2.5 Reduzindo o tamanho da árvore do ports. ................................................... 111
8. Apache, PHP e MySQL ............................................................................................ 113
8.1 Introdução ........................................................................................................... 113
8.2 Instalação do apache .......................................................................................... 113
8.3 Configuração do Apache .................................................................................... 122
5
8.4 Instalação PHP ................................................................................................... 131
8.5 Integrando Apache e PHP .................................................................................. 133
8.6 Instalação do MySQL.......................................................................................... 134
9. DNS Bind.................................................................................................................. 137
9.1 Introdução .............................................................................................................. 137
9.2 O BIND – Berkeley Internet Name Domain......................................................... 137
9.2.1 named.root ................................................................................................... 138
9.2.2 named.conf .................................................................................................. 138
9.3 Arquivos de configuração de zona ...................................................................... 138
9.4 Resource Records (RRs) .................................................................................... 138
9.5 Configurando o named ....................................................................................... 139
9.6 Configurando DNS server secundário (SLAVE) ................................................. 143
9.7 Testando nosso servidor dns .............................................................................. 145

6
1 introdução
1.1 Uma Breve História do FreeBSD e do UNIX
O Sistema Operacional UNIX foi desenvolvido a partir de um consórcio formado por um
conglomerado de companhias que pretendia implementar um sistema em que um
computador de grande porte disponibilizasse recursos para diferentes usuários remotos
acessando o sistema simultaneamente. Esse sistema foi denominado MULTICS que,
apesar de apresentar inovações e criado a base para o que hoje se conhece como
plataforma operacional multiusuário, não atingiu impacto comercial considerável e o
projeto foi deixado de lado pelas grandes companhias.
O projeto foi continuado por Ken Thompson e Dennis Ritchie que buscaram escrever
um novo sistema operacional menos arrojado que o projeto anterior.

Dennis Ritchie, Ken Thompson

Retirado de http://penguin.dcs.bbk.ac.uk/academic/unix/linux/slides/dennis-ken2.jpg

7
Kenneth Thompson e Dennis Ritche
Retirado de http://iarmar.com/blog/wp-content/uploads/2009/09/unix.jpg
Eles objetivavam desenvolver um sistema a ser executado em minicomputador em vez
de caríssimos computadores de grande porte. O novo sistema foi chamado de UNIX
(originalmente Unics, é uma brincadeira com o Multics feita por Brian Kernighan),
escrito em uma nova linguagem de programação desenvolvida também por Thompson
e Richie chamada C. O UNIX e o C são considerados como os dois marcos da história
do computador, uma vez que o C, por ser portável, permitia que aplicações fossem
migradas com o mínimo de esforço para outros tipos de plataforma de computadores.
Sendo escrito em sua maior parte em C, a portabilidade da linguagem foi garantida ao
UNIX, executado com facilidade em diversas arquiteturas de computadores. Essa
característica sem precedentes fez com que o UNIX, em muito pouco tempo, se
tornasse um sistema operacional popular e fortaleceu a indústria de desenvolvimento
de software.

1.2 BSD

BSD tem suas origens a partir dos trabalhos do CSRG, sigla em inglês para o Computer
Systems Research Group da Universidade da Califórnia em Berkeley, que adquiriu o
código fonte do UNIX a partir dos laboratórios AT&T Bell. Dentre as várias contribuições
deste grupo ao código do UNIX destacaram-se o sistema de arquivos UFS e a adição
da camada de rede do protocolo TCP/IP. CSRG modificou o código do UNIX de uma tal
maneira que o grupo resolveu lançar a sua própria versão do sistema operacional,
conhecida como Berkeley Software Distribution (BSD).

1.3 FreeBSD
O FreeBSD foi desenvolvido a partir de um de dois grupos dissidentes do projeto BSD
original. O principal foco desse grupo foi tornar essa nova concepção do BSD, o
FreeBSD, em um sistema fácil de ser usado por usuários não técnicos e direcionado
principalmente para a arquitetura x86 da Intel. O segundo grupo foi responsável pelo
desenvolvido do NetBSD que trabalhava no intuito de fazer com que o BSD fosse
8
compatível com qualquer arquitetura de hardware possível. Um terceiro grupo,
dissociado do projeto NetBSD, dedicou-se em disponibilizar um sistema BSD seguro,
denominado OpenBSD. Dentre os sistemas operacionais baseados nas variantes do
sistema UNIX e no projeto BSD, o FreeBSD é seguramente o mais popular por ser,
principalmente, um ambiente de múltiplas aplicabilidades nas tarefas cotidianas dos
usuários.

Atualmente, o FreeBSD é um sistema operacional largamente utilizado e adequado


tanto para servidores que demandam alto desempenho e alto nível de segurança como
para a aplicações de usuários que utilizam recursos gráficos intensos em máquinas
desktop. A partir da versão 5.4 do FreeBSD em 2005, novamente o projeto FreeBSD
foi dividido e dessa divisão originou o PC-BSD, especialmente desenvolvido para
aplicações de computadores de mesa.

1.4 Algumas características principais do FreeBSD


1.4.1 Portabilidade
O FreeBSD foi desenvolvido para ser suportado de forma estável e segura por
arquiteturas de hardware populares. Essas arquiteturas são representadas atualmente
pelos atuais processadores da Intel, AMD, assim como para arquiteturas desenvolvidas
especialmente para servidores.

1.4.2 Capacidade de Trabalho


Uma vez que o FreeBSD pode ser executado adequamente na plataforma 386, o seu
desempenho em computadores modernos é altamente eficiente. O sistema está
preparado para atender as necessidades dos usuários tanto nas aplicações que não
requerem alto desempenho do sistema como as atividades que requerem um alto
desempenho em suas atividades.

1.4.3 Gerenciamento de software simplificado


O FreeBSD simplificou consideravelmente o gerenciamento dos softwares através da
coleção do Ports. Através dele o processo de instalação, desinstalação, atualização de
softwares passou a ser uma tarefa simples.

1.4.4 Sofisticado sistema de arquivos


O FreeBSD, através do UFS, implementa um gerenciamento de sistema de arquivos
otimizado. A resistência a falhas e seu desempenho na leitura e gravação das
informações do disco são características importantes deste sistema de arquivos.

1.4.5 Código fonte aberto


A disponibilização do código fonte garante transparência e controle absoluto dos
processos do sistema operacional, permitindo inclusive a customização do sistema para
se adequar as necessidades do usuário.

1.4.6 Ampla documentação


Podemos encontrar milhares de documentos e páginas de manuais disponíveis no
próprio sistema operacional. Além disso, contamos com diversas fontes de

9
documentação disponíveis na internet (FAQ, Handbook, listas de discussão
especializadas, entre outros).

1.5 O mascote do FreeBSD


O FreeBSD tem como mascote um diabinho vermelho chamado Daemon que significa
demônio em grego, mas na realidade se refere a programas que rodam na memória
autonomamente para servir requisições.
Até 2005, o Beastie era o logotipo do FreeBSD. Devido a um desconforto de alguns
usuários que consideram o logotipo uma afronta religiosa, foi aberta uma competição
para escolher um novo símbolo para o projeto. Em 8 de outubro, ganhou o desenho
feito por Anton K. Gural para ser o novo símbolo do FreeBSD.

Beastie – O mascote FreeBSD

Submissão de Anton K. Gural que ganhou a competição

10
2. Instalação do FreeBSD

2.1 Conhecimentos preliminares


Antes de abordarmos os detalhes do processo de instalação do sistema existem alguns
conceitos que são fundamentais.
Diferentemente de outros sistemas operacionais, o FreeBSD possui uma forma peculiar
de nomear seus dispositivos.
Vejamos abaixo alguns exemplos:
/dev/fdX Drive de disco flexível
/dev/acdX Drive de CD/DVD IDE
/dev/adX Disco rígido IDE/SATA
/dev/daX Disco rígido SCSI

Nos exemplos acima, X é um número que, iniciado em zero, indica a ordem de


detecção do dispositivo (possui relação com a conexão física).
Agora que sabemos como o FreeBSD nomeia seus discos, vamos conhecer sobre os
slices. Um slice é uma área de disco reservada para instalação do sistema.
Fisicamente o slice é que uma partição primária que abriga outras partições do tipo bsd
em seu interior. Podemos ter diversos slices em um mesmo disco. Cada slice é
identificado por um número iniciado em 1.
Cada slice contém uma ou mais partições do sistema nomeadas com uma letra
variando de a até h. Há uma conveção que atribui a cada letra um significado especial
para o sistema.
a Partição raiz (root)
b Partição de swap
c Referencia o disco como um todo
d – h Partições definidas pelo usuário

Para entendermos melhor esse conceito, tomaremos como exemplo uma partição
/dev/ad1s1a. Desmembrando as nomenclaturas temos:
/dev/ Diretório onde estão os arquivos especiais utilizados para
acesso de dispositivos (devices).
ad1 Segundo disco IDE
s1 Slice 1 do disco
a Primeira partição do slice (possivelmente a partição raiz)

11
2.2 Iniciando a instalação

A instalação do sistema operacional FreeBSD exige conhecimento prévio do hardware


a ser instalado. Para evitarmos surpresas desagradáveis, é fundamental consultarmos
o hardware notes, disponível em http://www.freebsd.org/releases/8.0R/hardware.html
(para a versão 8.0), e verificarmos se o hardware é compatível com o sistema.
Para nossa felicidade, o FreeBSD mantém uma grande compatibilidade com diversas
marcas de equipamentos disponíveis no mercado.
Para iniciarmos o processo de instalação, devemos decidir por qual método
realizaremos a instalação. Neste curso abordaremos o método de instalação mais
comum no qual utilizaremos uma mídia ótica (CD). O FreeBSD pode ser instalado
utilizando uma mídia ótica, entretanto, outros métodos estão disponíveis como FTP,
HTTP, NFS, CDROM, DVD.
Podemos obter a imagem do CD em
ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/ISO-IMAGES/8.0/ (versão 8.0 e
plataforma i386).
Tendo o CD em mãos, basta inicializar a máquina pelo CDROM e o processo de
instalação começará.
Veremos abaixo as informações da inicialização do bootloader pelo CD.
Booting from CD-Rom...
CD Loader 1.2

Building the boot loader arguments


Looking up /BOOT/LOADER... Found
Relocating the loader and the BTX
Starting the BTX loader

BTX loader 1.00 BTX version is 1.01


Console: internal video/keyboard
BIOS CD is cd0
BIOS drive C: is disk0
BIOS drive D: is disk1
BIOS 639kB/261120kB available memory

FreeBSD/i386 bootstrap loader, Revision 1.1

Loading /boot/defaults/loader.conf
/boot/kernel/kernel text=0x64daa0 data=0xa4e80+0xa9e40
syms=[0x4+0x6cac0+0x4+0x88e9d]

A primeira tela que veremos é a do gerenciador de boot. Podemos aguardar alguns


segundos ou pressionar qualquer tecla para o iniciar o processo de instalação.

Segue breve descrição das opções do menu bootloader


Boot FreeBSD [default]
Inicia o FreeBSD normalmente sem qualquer tipo de alteração no seu processo de
inicialização. Na maioria dos casos essa opção funciona corretamente.

Boot FreeBSD with ACPI disable


Inicia o FreeBSD desabilitando suporte ACPI. Caso tenha problemas na inicialização
normal essa opção é recomendada.
12
Boot FreeBSD in Safe Mode
Inicia o FreeBSD em modo seguro para acesso a hardware, isto é, desabilita algumas
funções no acesso ao hardware que podem trazer problemas de inicialização.

Boot FreeBSD in single user mode


Inicia o sistema em modo monousuário. Esta opção é semelhante ao modo de
segurança do Windows que inicia o sistema com configurações básicas para efetuar
alguma manutenção emergencial no sistema.

Boot FreeBSD with verbose logging


Inicia o sistema exibindo detalhamento de informações principalmente sobre o
hardware. É uma boa opção caso algum dispositivo tenha falhado ou não iniciado
corretamente.

Escape to loader prompt


Permite a manipulação direta de variáveis que são utilizadas pelo loader, através de um
terminal de comandos. Podemos também iniciar em modo monousuário manualmente
(boot –s), carregar módulos do kernel, inicializar versões anteriores do kernel, dentre
outros recursos.

Reboot
Reinicia o sistema.

Veremos como é feita a detecção dos dispositivos físicos presentes pelo kernel.
Podemos verificar como o kernel detectou o hardware encontrado no equipamento
através das informações exibidas.
real memory = 134152192 (127 MB)
13
avail memory = 116432896 (111 MB)
kbd1 at kbdmux0
...
ata0: <ATA channel 0> on atapci0
ata0: [ITHREAD]
ata1: <ATA channel 1> on atapci0
ata1: [ITHREAD]
vgapci0: <VGA-compatible display> mem 0xe0000000-0xe07fffff at device
2.0 on pci0
em0: <Intel(R) PRO/1000 Network Connection 6.9.14> port 0xd010-0xd017
mem 0xf0000000-0xf001ffff irq 11 at device 3.0 on pci0
em0: [FILTER]
em0: Ethernet address: 08:00:27:64:9f:74
...
fdc0: <floppy drive controller> port 0x3f0-0x3f5,0x3f7 irq 6 drq 2 on
acpi0
device_attach: fdc0 attach returned 6
psm0: <PS/2 Mouse> irq 12 on atkbdc0
psm0: [GIANT-LOCKED]
psm0: [ITHREAD]
psm0: model IntelliMouse Explorer, device ID 4
...
ad0: 11234MB <VBOX HARDDISK 1.0> at ata0-master UDMA33
ugen0.1: <Apple> at usbus0
uhub0: <Apple OHCI root HUB, class 9/0, rev 1.00/1.00, addr 1> on usbus0
ugen1.1: <Intel> at usbus1
uhub1: <Intel EHCI root HUB, class 9/0, rev 2.00/1.00, addr 1> on usbus1
acd0: DVDROM <VBOX CD-ROM/1.0> at ata1-master UDMA33
Root mount waiting for: usbus1 usbus0
uhub0: 8 ports with 8 removable, self powered
Root mount waiting for: usbus1
Root mount waiting for: usbus1
Root mount waiting for: usbus1
uhub1: 8 ports with 8 removable, self powered
Trying to mount root from ufs:/dev/ad0s1a

Concluído o processo de boot da instalação, a primeira do programa sysinstall nos é


apresentada. O sysinstall é um utilitário oferecido pelo FreeBSD para nos auxiliar no
processo de instalação do sistema.
Na tela de seleção do país (Country Selection) selecionaremos a opção correspondente
ao Brasil

14
Em seguida, podemos escolheremos o mapa correspondente ao teclado ABNT2
selecionando a opção “Brazil ISO (accent)”.

15
2.3 O utilitário sysinstall

Ao finalizar o processo de boot, o aplicativo sysinstall entra em execução. O sysinstall


auxilia o processo de instalação/administração de sistemas FreeBSD. Este utilitário
apresenta interface simples, organizado através de menus de fácil utilização.
A navegação é feita através do teclado com as seguintes teclas:

Tecla Ação
Espaço Seleciona ou alterna o item corrente
ENTER Finaliza o menu atual avançando para a próxima tela
Setas de movimentação Movimenta o cursor na direção desejada
TAB Movimenta o cursor para o próximo item
SHIFT + TAB Movimenta o cursor para o item anterior
PAGE UP Movimenta uma tela para cima
PAGE DOWN Movimenta uma tela para baixo
F1 Exibe informações de ajuda para o item associado

O sysinstall pode ser executado também em sistemas já instalados, bastando para isso
executar /stand/sysinstall. Pela sua simplicidade e poucos recursos disponíveis, é
pouco frequente seu uso como ferramenta de administração do sistema por usuários
mais experientes.

Trataremos brevemente a seguir as diversas opções do menu principal (Main Menu)


para melhor familiaridade com o sysinstall.

Usage – Quick Start – How to use this menu system


Oferece um guia detalhado sobre a utilização do sysinstall, explanando sobre a
paginação das telas, movimentação das opções do menu e apresenta breves
introduções sobre cada uma das opções disponíveis. Sua leitura é recomendada aos
usuários em seu primeiro contato com o sistema.

Standard – Begin a standard installation (recommended)


16
O modo de instalação padrão é recomendado devido à clareza com que conduz o
usuário no processo de instalação, exibindo diversas informações para cada opção
disponível em uma ordem de fácil compreensão.
Com exceção das informações exibidas e da ordenação automática entre as etapas,
todos os modos de instalação são semelhantes ao Standard.

Express – Begin a Quick Installation (for experts)


Semelhante à opção standard, esta opção faz uso da ordenação automática das etapas
indispensáveis à instalação do sistema, porém não exibindo as dicas das etapas de
instalação presentes no modo stardard. As configurações opcionais ficam por conta do
usuário através da navegação das opções do menu.
É importante observar que, diferentemente das versões anteriores do FreeBSD, o modo
de instalação Express não significa uma instalação mínima

Custom – Begin a custom installation (for experts)


Este é o modo de instalação personalizado e é indicado aos usuários que já tenham
experiência com o sistema.
Nesse modo, as dicas de instalação foram suprimidas e as etapas de instalação não
foram ordenadas, oferecendo flexibilidade ao usuário no processo de instalação. É
exibido um menu com as etapas e essas opções podem ser acessadas e revisadas em
qualquer ordem e momento da instalação.

Configure – Do post-install configuration of FreeBSD


Destinada à administração do sistema e pode ser acessada a qualquer momento após
a instalação. Por meio desta opção pode-se: instalar novos aplicativos, mudar a senha
do usuário root, criar/editar usuários no sistema, configurar recursos de rede, etc.
Embora ofereça interface amigável para as diversas rotinas de configuração do sistema,
suas operações são muito limitadas e, por essa razão, não é frequentemente utilizada
como ferramenta de administração pelos usuários mais experientes.

Doc – Installation instructions, README, etc.


Concentra várias documentações altamente recomendadas a usuários iniciantes como:
guia passo a passo de instalação, guia de compatibilidade de hardware, guia geral do
FreeBSD, guia de novos adeptos, errata, notas de direitos autorais, menu de
documentação HTML, etc.

Keymap – Select keyboard type


Necessária para ajustar o idioma de seu teclado na instalação do sistema. Na maioria
dos casos, encontraremos teclados padrão ABNT, ABNT2 ou US Acentos.

Options – View/Set various installation options


O menu de opções permite alterar determinadas variáveis afim de se obter
comportamentos diferentes do sysinstall. Através desta opção, podemos alterar a
forma como o sysinstall utiliza NFS, o editor padrão, o programa para ver paginas
HTML, usuário/senha para conexão FTP, etc.

Fixit – Repair mode with CDROM/Floppy or start Shell

17
A opção Fixit é um modo de segurança utilizado para reparar sistemas com problema
de inicialização. Através dela, podemos iniciar um disco de recuperação através de
CD/floppy ou iniciar um shell independente de disco de recuperação.

Upgrade a existing system


Através dessa opção podemos atualizar um sistema previamente instalado. Apesar da
opção de Upgrade do sistema ser um procedimento seguro, ela não é recomendada
pois permite o acumulo de diversos arquivos desnecessários para a execução do novo
sistema.
O procedimento recomendado é uma nova instalação, se possível em outra máquina, e
a restauração posterior dos arquivos de configuração.

Load Config – Load default install configurations


O sysinstall permite que seja executada uma instalação em lote, possibilitando mínima
intervenção do usuário através da leitura de um arquivo de configuração contendo as
definições desejadas para instalação. É uma opção muito útil quando necessitamos
instalar o sistema da mesma forma em diversas máquinas.

Index – Glossary of functions


Índice descritivo das operações que podem ser realizadas pelo sysinstall. É uma ótima
fonte de documentação para usuários que não possuem muita experiência com o
FreeBSD

2.4 Passo a passo do processo de instalação


Agora que já conhecemos com mais detalhes as opções do sysinstall, selecionaremos a
opção de instalação padrão (Standard).

Como escolhemos anteriormente a instalação Standard, o sistema deverá nos informar


constantemente sobre as operações a serem realizadas através de janelas de
mensagens.

18
Caso a instalação tenha detectado mais de um disco rígido, o sistema vai pedir para
selecionar o disco a ser particionado.

Neste momento, utilizaremos o editor de partições Fdisk para criação da partição


primaria onde o sistema será instalado.

19
O Fdisk dispõe de diversos comandos para manipulação das partições ou slices.
Veremos a seguir uma descrição de cada comando

Tecla Ação
Setas Movem o cursor pela tabela de partições
direcionais
Cria um único slice ocupando todo o disco. Caso exista outras partições
o Fdisk irá sobrepor as partições existentes.
A
Esta opção é muito utilizada quando estamos instalando o sistema em
servidores
D Exclui a partição selecionada
Altera o tipo de partição selecionada. O tipo de cada partição é definido
T
por um número. A partição do tipo BSD é definida pelo número 165.
Define as configurações da geometria do disco. É utilizada quando o
G
kernel não detecta corretamente essas configurações.
Alterna a unidade de medida do tamanho do slice entre ST (Setores),
Z
KB (Kbytes), MB (Megabytes),GB (Gigabytes)
U Desfaz todas as ações efetuadas no disco
Cria um slice no disco. É preciso informar o tipo de partição e o
C
tamanho
S Define a partição selecionada como inicializavel
Q Sai do Fdisk e grava a tabela de partições
Entra no modo expert. Este modo possibilita a manipulação das
| (pipe) partições por meio de comandos digitados diretamente no prompt da
aplicação.

Como nosso objetivo é a instalação de um servidor, utilizaremos a opção A para criar


apenas um slice englobando todo o espaço disponível no disco e depois Q para salvar

20
O processo de instalação apresenta 3 opções para o gerenciador de inicialização
(bootloader). São elas:
Standard – Instala o bootloader padrão na MBR (Master Boot Record) para a
inicialização apenas do FreeBSD. Essa opção normalmente é utilizada nas instalações
em que apenas o FreeBSD estará presente na máquina.
BootMgr – Instala o bootloader com suporte para inicialização de outros sistemas
operacionais. Essa opção é utilizada nas instalação do FreeBSD juntamente com
outros sistemas operacionais (Windows, Linux, etc)
None – Não instala o bootloader preservando o setor de inicialização em sua forma
original
Selecionaremos a opção Standard uma vez que o FreeBSD será o único sistema
operacional presente nesta máquina.

Abaixo a mensagem explicando o processo de criação das partições bsd que deverão
estar contidas dentro do slice criado anteriormente

21
Através da ferramenta Disklabel editor, deveremos criar as partições bsd.
Semelhante ao fdsik, o disklabel possui uma gama de comandos para a manipulação
das partições. Veremos abaixo descrição dos comandos

Tecla Ação

Setas Movem o cursor pela tabela de partições


direcionais

Cria uma partição no disco. Será solicitado o tamanho da nova partição, o


tipo (partição de sistema de arquivo ou de swap) e o ponto de montagem.
C O tamanho da nova partição pode ser definido em diversas unidades
(blocos, megabytes, gigabytes ou cilindros)

N Adiciona parâmetros ao comando newfs

Alterna a flag newfs. Quando a flag está definida como Y a partição


T
selecionada será apagada e reconstruída novamente

D Exclui a partição selecionada

Q Salva as alterações e sai do disklabel editor

U Desfaz todas as ações efetuadas no disco

M Define o ponto de montagem da partição selecionada

S Alterna a flag de SoftUpdate

A Define o esquema de particionamento automático

Z Pesquisar

R Pesquisar

22
Ao pressionarmos a tecla C para criarmos uma nova partição do tipo bsd, será exibida
uma caixa de dialogo para informarmos o tamanho da nova partição.

Quando criamos uma nova partição, devemos escolher se ela será uma partição
comum do sistema de arquivos ou será uma partição utilizada para swap.

Devemos também informar qual o ponto de montagem para a nova partição que
estamos criando.

Abaixo veremos um exemplo de esquema de alocação automática das partições (obtido


através da tecla A). Notem que o sistema reservou 512MB para a raiz (/) e alocou os
outros diretórios em partições separadas. Por questões de segurança é altamente
23
recomendável que a raiz do sistema de arquivos fique separada do restante para evitar
que danos nas partições possam impedir a execução do sistema.
O particionamento é uma etapa muito importante e deve ser analisada com muito
cuidado. Devemos escolher um esquema de particionamento que condiz com o
trabalho que a máquina irá desenvolver, sendo assim, o esquema de particionamento
utilizado varia bastante de acordo com as necessidades de cada servidor.

O FreeBSD disponibiliza várias mídas para executar a instalação. Existem opções


locais (CD/DVD, partição DOS, drive USB, etc) e remotas (NFS, FTP, HTTP).
Selecionaremos a opção Install from a FreeBSD CD/DVD

24
Até o momento nenhuma alteração foi efetuada no disco. Todas as configurações
estão armazenadas em memória e prontas para serem definitivamente efetivadas.
Caso não esteja certo de alguma ação definida anteriormente, essa é a sua ultima
chance de desistir.

A partir deste momento, o sistema base será instalado de acordo com as configurações
previamente estabelecidas. Poremos ver o andamento do processo de instalação
através das barras progressivas.
Um recurso muito interessante é a exibição dos terminais durante a instalação.
Combinando as teclas ALT + F2 veremos um log do processo de instalação.
Pressionando ALT + F4, teremos um shell para a execução de comandos. Para
voltarmos a tela de instalação do sysinstall basta que se pressione ALT + F1

A mensagem a seguir avisa que o sistema base foi instalado com sucesso. A partir
desse momento, podemos instalar softwares adicionais à nossa instalação e configurar
diversos itens no sistema instalado.

25
A caixa de diálogo abaixo questiona se o usuário deseja ou não configurar as interfaces
de rede detectadas no processo de instalação.

Podemos ainda configurar as interfaces disponíveis com endereços IPv6. Caso não
exista essa necessidade responda No.

A configuração da interface de rede pode ser dinâmica (obtendo configurações de rede


através de um servidor DHCP) ou estática (com as configurações de rede definidas pelo
usuário). Em nossa instalação definiremos estaticamente as configurações IP, sendo
assim responderemos No a esse questionamento.

Chegamos agora ao momento de configuração da interface de rede. Devemos


configurar o nome da maquina (host), o domínio (domain), o endereço de gateway, o
endereço do servidor DNS, o endereço IP da máquina e a máscara de sub-rede.

26
Após as configurações necessárias para a interface de rede, o sistema pergunta se
deseja iniciar a interface de rede com as configurações definidas anteriormente.
Responderemos Yes para esse questionamento.

Podemos configurar a máquina para atuar como um gateway de rede. Respondendo


Yes o sistema se encarregará de configurar a inicialização de programas para esse fim.
Como nossa máquina não será um gateway responderemos No.

O sistema está preparado para iniciar vários tipos de serviços distintos. Alguns deles
funcionam de modo standalone (o próprio programa gerencia suas conexões) e outros
funcionam sob a tutela do inetd, que gerencia todas as conexões e as encaminha para
o programa responsável pela conexão.
Responderemos No, pois não pretendemos iniciar nenhum programa que funcione sob
o inetd.

A maioria dos servidores são administrados remotamente através do SSH que permite
login através da rede utilizando criptografia dos dados trafegados durante a sessão. No

27
caso de necessitar deste recurso de administração, remota responda Yes para que o
sistema se encarregue de iniciar o serviço SSH.

Podemos configurar nossa máquina para ser um servidor FTP anônimo (não requer
autenticação válida). Responderemos No, pois a maquina não será um servidor FTP.

Se desejarmos que a maquina atue como um servidor de arquivos NFS, basta


responder Yes. Em nosso caso, responderemos No.

Semelhante ao questionamento anterior, só que desta vez para que a máquina utilize
os serviços de um servidor NFS. Para nossa instalação, responderemos No.

O sistema, por padrão, é configurado com uma série de definições relativas ao console
(fonte, mapa de teclado, screensaver, etc). Para alterar essas configurações, responda
Yes. Para a nossa instalação responderemos No.

Definiremos a seguir as configurações de fuso horário para o sistema.

O sistema pode ser configurado para utilizar definições de horário local ou UTC (Tempo
Universal Coordenado é também conhecido como Tempo Médio de Greenwich -- GMT).
Selecionaremos No para utilizar as definições de horário local

Escolheremos a seguir nossa região para a configuração do horário local.


Selecionaremos a opção “2 – America – North and South”
28
Podemos definir a configuração do mouse no console. O recurso do mouse nos ajuda
a selecionar/copiar/colar partes de textos agilizando assim a digitação de comandos no
console. Caso tenha um mouse instalado, basta responder Yes e configurar o seu
funcionamento.

O sistema disponibiliza diversos aplicativos pré-compilados chamados pacotes


(packages). Podemos selecionar a instalação de aplicativos através do menu dividido
em categorias. Veremos adiante mais detalhes sobre esse tipo de instalação. Por ora,
responderemos No.

Caso tenha respondido Yes ao questionamento anterior, o sistema irá exibir o menu de
categorias para a escolha dos aplicativos a serem instalados no sistema.

29
Definiremos a seguir a senha para o administrador do sistema – root.

Podemos voltar ao menu principal para alterar as configurações efetuadas.


Selecionaremos No para finalizar nossa instalação.

Ao final do processo de instalação, o sistema solicita a reinicialização do sistema que


acabou de ser configurado.

Os itens configurados acima podem ser alterados manualmente a qualquer momento


com o sistema em execução. Para isso, é de fundamental importância o conhecimento
mais aprofundado do ambiente FreeBSD visando aprimorar e adequar a administração
do sistema às suas necessidades.

30
3. Unix Básico
3.1 Introdução
Agora que aprendemos como instalar o FreeBSD instalamos o sistema FreeBSD,
veremos algumas rotinas básicas de administração do sistema.

3.2 Efetuando o login no sistema


A primeira tela que nos é apresentada é a tela de login. Ela representa a porta de
entrada para o poderoso mundo UNIX.
Após fornecermos o nome do usuário e a senha (por questões de segurança, a
digitação da senha não exibirá nada na tela) serão as informações: mensagem de
direitos de cópia (copyright), versão do FreeBSD, nome do arquivo do kernel , número
de compilações, data de instalação do sistema, etc.

login as: usuario


Password:
Last login: Wed Jan 6 13:43:01 2010 from 192.168.0.10
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
The Regents of the University of California. All rights reserved.

FreeBSD 8.0-STABLE (WWW) #1: Mon Dec 14 15:55:35 BRST 2009

Welcome to FreeBSD!

Before seeking technical support, please use the following resources:

o Security advisories and updated errata information for all releases


are at http://www.FreeBSD.org/releases/ - always consult the ERRATA
section for your release first as it's updated frequently.

o The Handbook and FAQ documents are at http://www.FreeBSD.org/ and,


along with the mailing lists, can be searched by going to
http://www.FreeBSD.org/search/. If the doc distribution has
been installed, they're also available formatted in /usr/share/doc.

If you still have a question or problem, please take the output of


`uname -a', along with any relevant error messages, and email it
as a question to the questions@FreeBSD.org mailing list. If you are
unfamiliar with FreeBSD's directory layout, please refer to the hier(7)
manual page. If you are not familiar with manual pages, type `man man'.

You may also use sysinstall(8) to re-enter the installation and


configuration utility. Edit /etc/motd to change this login
announcement.

31
3.3 O interpretador de comandos - shell
Uma parte significativa do trabalho de um administrador do sistema FreeBSD é
executar diversos comandos através da interface de linha de comando, ou como é
comumente conhecido, shell.
O prompt do interpretador de comandos é exibido assim que a autenticação for
efetuada com sucesso. O símbolo utilizado pelo prompt nos diz qual o privilégio que o
usuário possui.
O prompt representado por “$” indica que se trata de um usuário comum, ou seja, sem
poderes de administrador, enquanto o “#” representa um usuário com poderes de
administrador (root).

O FreeBSD nos possibilita trabalhar com diversas opções de shells. Alguns exemplos
de shell são: csh, sh, tcsh, bash, ksh, entre outros.
Por padrão, o sistema define o shell do root como csh e para os demais usuários o sh,
mas podemos alterar o shell com os comandos apropriados que veremos
posteriormente.

3.4 Arquivos de configuração da Shell


Através da edição de arquivos de configuração podemos personalizar as configurações
da shell que utilizamos. As configurações podem ser globais ou para algum usuário
específico. Cada ambiente Shell tem o seu arquivo de configuração, no nosso exemplo
estamos tratando da shel sh.
Exemplo de um arquivo .shrc que define diversas configurações que são válidas
apenas para um usuário específico.

# $FreeBSD: src/share/skel/dot.shrc,v 1.3.36.1.2.1 2009/10/25


01:10:29 kensmith Exp $
#
# .shrc - bourne shell startup file
#
# This file will be used if the shell is invoked for interactive
use and
# the environment variable ENV is set to this file.
#
# see also sh(1), environ(7).
#

# file permissions: rwxr-xr-x


#
# umask 022

# Enable the builtin emacs(1) command line editor in sh(1),


# e.g. C-a -> beginning-of-line.
set -o emacs

32
# Uncomment this and comment the above to enable the builtin
vi(1) command
# line editor in sh(1), e.g. ESC to go into visual mode.
# set -o vi

# some useful aliases


alias h='fc -l'
alias j=jobs
alias m=$PAGER
alias ll='ls -laFo'
alias l='ls -l'
alias g='egrep -i'

# # be paranoid
# alias cp='cp -ip'
# alias mv='mv -i'
# alias rm='rm -i'

# # set prompt: ``username@hostname$ ''


PS1="`whoami`@`hostname | sed 's/\..*//'`"
case `id -u` in
0) PS1="${PS1}# ";;
*) PS1="${PS1}$ ";;
esac

# search path for cd(1)


# CDPATH=.:$HOME

As configurações globais estão concentradas no arquivo /etc/profile enquanto as


configurações que são especificas para algum usuário estão no arquivo .shrc
localizado no home do usuário em questão.
Por exemplo, se desejarmos criar um alias para o comando tail –f /var/log/messages
com o nome de tlm, podemos inserir a linha abaixo em um dos 2 arquivos de
configuração.
alias tlm='tail –f /var/log/messages'

Se nos editarmos o arquivo global, todos os usuários do sistema poderão digitar o


comando tlm e o sistema executará o comando tail –f /var/log/messages.
Por outro lado, caso desejamos que esse comando esteja disponível apenas para o
usuário chamado admin, devemos editar o arquivo /home/admin/.shrc (supondo que o
diretório home do usuário admin seja /home/admin).

33
3.5 Permissão de arquivos/diretórios
O FreeBSD é um sistema operacional multiusuário, ou seja, ele está preparado para
gerenciar vários usuários trabalhando simultaneamente em diferentes tarefas.
Para que esse sistema de gerenciamento funcione adequadamente é fundamental
definir um conjunto de permissões que especifica quem pode ler (r - read), escrever (w -
write), e executar (x - execute) recursos. Estas permissões são organizadas em 3
grupos: um para o dono do arquivo, um para o grupo à que o arquivo pertence, e um
para todos os outros usuários. Sua representação numérica funciona assim:

Valor Permissão Representação

0 Nenhuma permissão ---

1 Apenas permissão de execução --x

2 Apenas permissão de escrita -w-

3 Permissão de escrita e execução -wx

4 Apenas permissão de leitura r--

5 Permissão de leitura e execução r-x

6 Permissão de leitura e escrita rw-

7 Todas as permissões (leitura, escrita e rwx


execução)

Utilizando o comando ls –l podemos visualiza o conjunto de permissões de


determinado arquivo ou diretório. Por exemplo, a saída do comando ls -l em um
diretório qualquer, exibirá:
% ls –l

-rw-r--r-- 1 root wheel 59 Jan 13 20:11 arq1.txt


lrwxr-xr-x 1 root wheel 8 Jan 13 20:14 arq2.txt -> arq1.txt
drwxr-xr-x 2 root wheel 512 Jan 13 20:13 dir1
...
Para entendermos melhor as permissões, analisaremos a permissão do arquivo
arq1.txt:
-rw-r--r--

34
O primeiro caractere (o mais à esquerda) indica o tipo do arquivo. Podemos encontrar
os seguintes tipos representados:
Caractere Representação

- Arquivo regular

d Diretório

l Link simbólico

c Dispositivo orientado a caractere

b Dispositivo orientado a bloco

s Socket

Os próximos três caracteres, rw- neste exemplo, indicam as permissões de acesso para
o dono do arquivo.
Os próximos três caracteres, r--, indicam as permissões para o grupo ao qual o arquivo
pertence.
Os três caracteres finais, r--, indicam as permissões para todos os outros usuários.
Um hífen indica que a permissão está desligada.
Analisando novamente a permissão fornecida como exemplo (-rw-r--r--), o dono pode
ler e escrever neste arquivo, o grupo pode ler o arquivo e os outros usuários podem
também apenas ler o arquivo.
A permissão numérica para o arquivo é 644, onde cada dígito representa as três partes
das permissões do arquivo.
Quando a permissão de execução de um diretório está ativada significa que usuários
podem entrar nele utilizando o comando cd. A permissão de leitura significa usuários
podem listar o conteúdo do diretório com o comando ls. Já a permissão de escrita
estabelece que usuários podem apagar arquivos dentro do diretório.

3.5.1 Alterando permissões


Para alterar as permissões de algum arquivo ou diretório utilizaremos o comando
chmod (change file mode). O comando pode ser utilizado pelo usuário root ou pelo
usuário ao qual o arquivo pertence.
Para exemplificar o comando, considere a listagem do arquivo abaixo:
-rw-r--r-- 1 root wheel 59 Jan 13 20:11 arq1.txt

Se desejarmos alterar as permissões do arquivo arq1.txt de forma que apenas o


usuário proprietário (root) possa ler e gravar, devemos utilizar o comando abaixo:
# chmod 600 arq1.txt
# ls –l
-rw------- 1 root wheel 59 Jan 13 20:11 arq1.txt

3.5.2 Alterando a propriedade


Podemos também alterar a propriedade (dono e grupo) do arquivo ou diretório. Para
essa tarefa utilizaremos o comando chown (change owner). Essa alteração exige
privilérios de root por razões de segurança.
35
Para exemplificar o comando, considere a listagem do arquivo anteriormente utilizado.
-rw-r--r-- 1 root wheel 59 Jan 13 20:11 arq1.txt

Se desejarmos alterar o dono do arquivo e/ou o grupo ao qual ele pertence, devemos
utilizar o comando abaixo:
# chown afpu arq1.txt
# ls –l
-rw-r--r-- 1 afpu wheel 59 Jan 13 20:11 arq1.txt

# chown :nobody arq1.txt


# ls -l
-rw-r--r-- 1 afpu nobody 59 Jan 13 20:11 arq1.txt

# chown root:wheel
-rw-r--r-- 1 root wheel 59 Jan 13 20:11 arq1.txt

3.6 Estrutura de Diretórios


Conhecer a hierarquia de diretórios do FreeBSD é fundamental para se obter
entendimento total do sistema. O conceito mais importante para se assimilar é o
conceito do diretório raíz, o /. Esse diretório é montado inicialmente no momento em
que o sistema é carregado, e ele contém o sistema base necessário para preparar a
entrada em modo de operação multiusuário do sistema operacional. O diretório raiz
contém ainda pontos de montagem para cada outro sistema de arquivos que você
queira montar.
Um ponto de montagem é um diretório onde sistemas de arquivos adicionais podem ser
acoplados ao sistema de arquivos raíz. Pontos de montagem padrão incluem /usr,
/var, /mnt, e /cdrom. Esses diretórios normalmente são encontrados como entradas
dispostas no arquivo /etc/fstab. O /etc/fstab é uma tabela com vários sistemas de
arquivos e pontos de montagem que o sistema usa como referência. A maioria dos
sistemas de arquivos no /etc/fstab são montados automaticamente no momento da
inicialização, à partir do script rc (Resource Configuration) a não ser que eles
contenham a opção noauto definida.
Uma descrição completa da hierarquia do sistema de arquivos está disponível na
página de manual hier (man 7 hier). Por hora, uma breve descrição dos diretórios mais
comuns será abordada:
Diretório Descrição
/ Diretório raíz do sistema de arquivo
/bin
Utilitários do usuário, fundamentais para os ambientes de
multiusuário e monousuário
/boot
Arquivos que são usados durante o processo de inicialização
do sistema operacional
/dev Arquivos de controle de dispositivos
/etc Arquivos e scripts de configuração do sistema
/etc/defaults Arquivos de configuração padrão do sistema

/etc/mail
Arquivos de configuração para os agentes de transferência de
correio, como sendmail
36
Diretório Descrição
/etc/namedb Arquivos de configuração do servidor DNS named
/etc/periodic
Scripts que são executados periodicamente (diariamente,
semanalmente e mensalmente) através cron
/mnt Diretório utilizado como ponto de montagem
/proc Sistema de arquivos de processos
/root Diretório home do usuário root
/sbin
Utilitários de programas e administração, fundamentais para os
ambientes de multiusuário e monousuário.
/stand Programas usados no ambiente independente.
/tmp
Arquivos temporários. Não é garantido a preservação do
conteúdo após a reinicialização do sistema.
/usr A maioria dos utilitários e aplicações de usuários.
/usr/bin Utilitários comuns, ferramentas de programação e aplicações.
/usr/include Arquivos C padrão de inclusão.
/usr/lib/ Bibliotecas.
/usr/libdata/ Arquivos de dados de utilitários variados.

/usr/libexec/
Daemons & utilitários do sistema (executados por outros
programas).
Executáveis locais, bibliotecas, etc. Também utilizado como
destino padrão para o sistema de Ports. Dentro de /usr/local,
a disposição hierárquica geral é definida como /usr. Exceto o
/usr/local/ diretório de páginas de manuais que são diretamente dispostas
sob /usr/local ao invés de serem sobre /usr/local/share, e
a documentação das aplicações de terceiros, que ficam sob
share/doc/port.

/usr/obj/
Arquivo de destino dos objetos binários específicos para cada
arquitetura, constribuídos à partir da árvore /usr/src.
/usr/ports A Coleção de Ports do FreeBSD (opcional).
/usr/sbin/ Daemons & utilitários do sistema (executados por usuários).
/usr/share/ Arquivos independentes de arquitetura.
/usr/src/ Arquivos de fontes locais e/ou BSD.
/usr/X11R6/
Executáveis da distribuição do X11R6, bibliotecas, etc
(opcional).
/var/
Arquivos de log de múltiplos propósitos, arquivos temporários,
de transição, e arquivos de bobina (spool).
/var/log/ Arquivos de logs variados do sistema.
/var/mail/ Arquivos de caixa de correio dos usuários.
/var/spool/ Diretórios de spool de impressão e de correio.
/var/tmp/
Arquivos temporários que são mantidos entre reinicializações
do sistema.
/var/yp Mapas NIS.

37
3.7 Comandos diversos
Diversas tarefas do dia a dia de um administrador do sistema são realizadas utilizando
uma grande variedade de comandos. Para criar uma familiaridade com esses
comandos, segue abaixo uma coletânea dos principais comandos.

ls Lista o conteúdo dos diretórios ls /tmp


ls –la /
especificados
cd Muda para o diretório especificado cd /
cd ..
cp Copia arquivos ou diretórios da origem cp –R /etc /tmp
cp arq1.txt arq1.bkp
para o destino
rm Apaga arquivos e diretórios. Funciona de rm –r dir1
forma recursiva se utilizado com o
parâmetro -r
mv Move arquivos ou diretórios da origem mv arq1.txt /tmp
para o destino. Pode ser utilizado para mv arq1.txt arq2.txt
alterar o nome de um arquivo ou diretório
cat Exibe o conteúdo de um arquivo cat teste.txt
mkdir Cria o diretório especificado mkdir dir1 dir2
mkdir –p dir1/dir2
ln Cria uma ligação (link) com o arquivo ln –s /usr/home /home
ln a1.txt mesmo_a1.txt
especificado. Essa ligação pode ser um
soft link ou um hardlink dependendo dos
argumentos especificados
head Exibe as linhas iniciais do arquivo head arq1.txt
head -25 arq2.txt
especificado
tail Exibe as linhas finais do arquivo tail –f /var/log/messages
tail -30 arq1.txt
especificado
clear Limpa a tela clear
uname Exibe informações (hostname, versão, uname –na
data de compilação, plataforma, entre
outras) sobre o sistema
shutdown Desliga ou reinicia o computador shutdown –r now
imediatamente ou após determinado shutdown –p +3
tempo programado.
dmesg Exibe o conteúdo do buffer de dmesg –a
mensagens do kernel. Normalmente são
exibidas as mensagens presentes na
inicialização do sistema

Cada um dos comandos abordados acima possui um conjunto de opções que alteram o
comportamento do programa. Consulte a página de manual referente ao comando para
maiores informações.

38
3.8 Os arquivo /etc/passwd e /etc/master.passwd
A base de dados contendo os usuários do sistema são mantidas através de dois
arquivos, o /etc/passwd e o /etc/master.passwd. Esses arquivos representam um
banco de dados de texto simples, contendo uma linha para cada usuário, com campos
delimitados por dois pontos (:).
A diferença primordial entre os dois arquivos é que o /etc/passwd armazena todas as
informações do usuário exceto o campo correspondente a senha criptografada (hash
baseado no algoritmo md5), enquanto o /etc/master.passwd armazena todas as
informações (inclusive a senha criptografada).
Eles se diferem também quanto a permissão. O /etc/passwd possui permissão 644
enquanto o /etc/master.passwd possui permissão 600 (obviamente devido ao fato
desse arquivo possuir o hash de senha). Ambos os arquivos pertencem ao usuário root
e ao grupo wheel.
Vejamos uma listagem dos arquivos:
-rw------- 1 root wheel 1565 Jan 7 22:40 /etc/master.passwd
-rw-r--r-- 1 root wheel 1389 Jan 7 22:40 /etc/passwd
Para entendermos melhor o que cada campo representa, segue um exemplo de
entrada no arquivo /etc/master.passwd:
fulano:$1$jNJ0/dba$Z9jWxmLUPhoMkOSo9BP.S/:1002:1002::0:0:Fulano de
Tal:/home/fulano:/bin/sh

Os campos representam respectivamente:


Login do usuário (fulano);
A senha criptografada ($1$jNJ0/dba$Z9jWxmLUPhoMkOSo9BP.S/);
O numero identificador do usuário (1002);
O grupo primário ao qual o usuário pertence (1002);
A classe de login do usuário (nulo);
O tempo em segundos UTC para que a senha seja alterada (0);
O tempo em segundos UTC de expiração da conta (0);
O campo de informações gerais (gecos) sobre o usuário (Fulano de Tal);
O diretório home do usuário (/home/fulano);
O interpretador de comandos (shell) do usuário (/bin/sh) .

Esses dois arquivos simples são razoavelmente bons para um pequeno número de
usuários, mas como a base de usuários tende a crescer, existe a necessidade de um
banco de dados que tenha mais desempenho nas consultas. É por isso que o FreeBSD
também tem o /etc/pwd.db e /etc/spwd.db .
Esses arquivos são tabelas hash em formato db (gerados pelo programa pwd_mkdb)
correspondente ao /etc/passwd e ao /etc/master.passwd, respectivamente. Eles
fornecem um mecanismo de pesquisa rápida para grandes bases de dados do usuário.
Essa organização dos arquivos de base de dados de usuários é um ponto favorável,
pois facilita a migração de contas de um sistema a outro.

39
Vamos supor que necessitamos migrar todas as contas de um servidor para o outro. O
primeiro passo é copiar o arquivo /etc/master.passwd para o servidor que irá receber
as contas e executar o comando pwd_mkdb . Supondo que o arquivo foi copiado com o
nome de master.passwd.new no diretório /etc, o comando seria:
# pwd_mkdb –p /etc/master.passwd.new

3.9 O arquivo /etc/group

Semelhante aos usuários, os grupos também são armazenados em um arquivo texto


chamado /etc/group. Um exemplo de entrada válida no arquivo de grupos seria:
fulano:*:1002:siclano,beltrano

Note que há apenas quatro campos:


O nome do grupo (fulano);
A senha do grupo, que é um campo opcional, apresentado como um “*” quando
não é utilizado (*);
O número identificador do grupo (1002);
Os usuários que participam secundariamente do grupo (siclano,beltrano).

3.10 Comandos para manipulação de contas de usuários


Agora que já conhecemos como o sistema armazena a base de dados dos usuários,
podemos aprender os comandos necessários para a criação, remoção e alteração das
contas de usuários.
O sistema nos oferece alguns scripts que facilitam a tarefa de manutenção dos
usuários.

3.10.1 Criando usuários com adduser


O utilitário adduser é um script em shell que implementa os comandos pw necessários
para a criação dos usuários utilizando os parâmetros fornecidos ao script. Ele pode ser
facilmente personalizado através do arquivo /etc/adduser.conf (caso o arquivo não
exista, o script utilizará um padrão pré-determinados para a sugestão dos campos).
Vejamos abaixo uma sessão de criação do usuário afpu
# adduser
Username: afpu
Full name: AFPU – Unicamp
Uid (Leave empty for default):
Login group [afpu]:
Login group is afpu. Invite afpu into other groups? []:
Login class [default]:
Shell (sh csh tcsh nologin) [sh]:
Home directory [/home/afpu]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password:
Enter password again:

40
Lock out the account after creation? [no]:
Username : afpu
Password : *****
Full Name : AFPU – Unicamp
Uid : 1003
Class :
Groups : afpu
Home : /home/afpu
Home Mode :
Shell : /bin/sh
Locked : no
OK? (yes/no): yes
adduser: INFO: Successfully added (afpu) to the user database.
Add another user? (yes/no): no
Goodbye!

Após a confirmação dos dados digitados, o script irá criar o registro do usuário nos
arquivos /etc/passwd e /etc/master.passwd, criar o grupo no /etc/group, criar o
diretório home com os arquivos de configuração padrão (dot files) do usuário.

Listagem do diretório home que foi criado.


# ls –l ~afpu
drwxr-xr-x 2 apfu apfu 512 Jan 15 11:15 .
drwxr-xr-x 5 root wheel 512 Jan 15 11:15 ..
-rw-r--r-- 1 apfu apfu 759 Jan 15 11:15 .cshrc
-rw-r--r-- 1 apfu apfu 257 Jan 15 11:15 .login
-rw-r--r-- 1 apfu apfu 167 Jan 15 11:15 .login_conf
-rw------- 1 apfu apfu 379 Jan 15 11:15 .mail_aliases
-rw-r--r-- 1 apfu apfu 339 Jan 15 11:15 .mailrc
-rw-r--r-- 1 apfu apfu 785 Jan 15 11:15 .profile
-rw------- 1 apfu apfu 284 Jan 15 11:15 .rhosts
-rw-r--r-- 1 apfu apfu 980 Jan 15 11:15 .shrc

3.10.2 Removendo usuários com rmuser


O rmuser exclui uma ou mais contas de usuários fornecidos na linha de comando. A
remoção do usuário envolve:
1. Remove tarefas agendadas pelo crontab.
2. Remove tarefas agendadas pelo at.
3. Finaliza todos os processos do usuário que está em execução.
4. Remove a entrada do usuário da base de dados local de contas.
5. Remove o diretório home do usuário.
6. Remove mailbox do usuário presente em /var/mail.
7. Remove todos os arquivos pertencentes ao usuário do diretório /tmp, /var/tmp e
/var/tmp/vi.recover.
8. Remove o usuário de todos os grupos ao qual ele pertence.
9. Remove mensagens da filas de mensagens que pertençam ao usuário.

Como vimos, há uma série de tarefas a serem executadas ao excluir usuários do


sistema.
Vejamos abaixo um exemplo da execução do rmuser.

41
# rmuser afpu
Matching password entry:
afpu:*:1004:1004::0:0:AFPU - UNICAMP:/home/afpu:/bin/sh
Is this the entry you wish to remove? Yes
Remove user's home directory (/home/afpu)? Yes
Removing user (afpu): mailspool home passwd.

3.10.3 Consultando informações com o comando finger


O finger é um utilitário utilizado para exibir informações sobre os usuários do sistema.
Através dele podemos facilmente consultar diversas informações sobre o usuário
fornecendo um argumento como critério de pesquisa. Todos os registros que coincidem
com o critério de pesquisa fornecido será exibido.
Vejamos abaixo um exemplo de utilização do finger. Notem que foi utilizada a palavra
afpu como argumento de pesquisa e os resultado obtidos foram afpu1 e afpu2.
Login: afpu1 Name: Usuario 1 – AFPU
Directory: /home/afpu1 Shell: /bin/sh
Last login Fri Jan 15 14:38 (BRST) on pts/1 from 143.106.115.118
No Mail.
No Plan.
Login: afpu2 Name: Usuario 2 – AFPU
Directory: /home/afpu2 Shell: /bin/sh
Never logged in.
No Mail.
No Plan.

3.10.4 Alterando informações de conta com o comando chpass


O chpass permite a alteração das informações da conta de usuário fornecida como
argumento, ou do usuário corrente caso não seja fornecido nenhum parâmetro.
Ao ser executado, o chpass abre um editor de texto (por padrão o vi) e possibilita a
alteração das informações. Ao salvar as informações e sair do editor o chpass atualiza
as informações na base de dados.
Segue abaixo um exemplo de utilização do chpass.
# chpass afpu1
#Changing user information for afpu1.
Login: afpu1
Password: $1$g/Y02lhr$/LP5znLbWtOx3LU/IS3jl1
Uid [#]: 1004
Gid [# or name]: 1004
Change [month day year]:
Expire [month day year]: 01 30 2011
Class:
Home directory: /home/afpu1
Shell: /bin/sh
Full Name: AFPU – UNICAMP
Office Location:
Office Phone:
Home Phone:
Other information:

chpass: user information updated

3.10.5 Alterando a senha com passwd


42
O passwd permite que o usuário altere sua senha local. Caso o usuário não tenha
poderes administrativos (root) o aplicativo solicitará a senha atual antes da alteração.
Apenas o root pode alterar a senha de outras contas.
Veja abaixo dois exemplos (um de root e outro de usuário normal) de alteração de
senha com passwd.
#passwd afpu1
Changing local password for afpu1

New Password:

Retype New Password:

$ passwd
Changing local password for afpu1
Old Password:
New Password:
Retype New Password:

3.10.6 Bloqueando usuários


Agora que já sabemos criar, excluir e alterar informações da base de dados de usuário
é o momento de aprendermos a bloquear um usuário. Para tal ação utilizaremos o
poderoso aplicativo pw, que possibilita a completa manutenção dos usuários da base
local. O pw é muito utilizado nos scripts que nos auxiliam na manutenção dos usuários.
O argumentos que nos possibilitam bloquear e desbloquear um usuário são lock e
unlock respectivamente. Sendo assim, para bloquearmos um usuário o usuário afpu,
devemos utilizar o seguinte comando:
# pw lock afpu

Para entendermos melhor como é feito o bloqueio, consultaremos como ficou o registro
do usuário afpu no arquivo /etc/master.passwd.

# cat /etc/master.passwd | grep afpu


afpu:*LOCKED*$1$fv4GS9.r$Wh2KewOKZ1fxXB.L1TinZ1:1004:1004::0:0:AFPU -
UNICAMP:/home/afpu1:/bin/sh

Notem que o campo destinado a senha criptografada agora inicia com *LOCKED* e o
usuário estará impossibilitado de autenticar na máquina.
Para desbloquear a conta do usuário afpu basta utilizarmos o comando abaixo.
# pw unlock afpu

3.10.7 Utilizando vipw


Uma ferramenta muito utilizada por usuários experientes em FreeBSD para alteração
de contas é o vipw. Ao ser executado, ele inicia o seu editor de textos favorito
(normalmente o vi) e possibilita a alteração direta das informações do
/etc/master.passwd. Após a alteração do arquivo a base de dados é atualizada
automaticamente.
Exemplo de utilização:

# vipw

43
3.11 Os arquivos /etc/rc.conf e /etc/defaults/rc.conf
A inicialização e configuração de vários serviços são feitos no momento do boot,
através dos scripts rc. Dois arquivos são muito importantes nesse processo: o
/etc/rc.conf e o /etc/defaults/rc.conf.
O /etc/defaults/rc.conf mantém especificações padrão para todas as opções
disponíveis. Não é recomendada qualquer alteração nesse arquivo.
O arquivo /etc/rc.conf contém diversas configurações locais do computador como:
nome do host, configurações de rede, serviços a serem iniciados no boot, etc. As
opções declaradas aqui sobrescrevem as do /etc/defaults/rc.conf e qualquer
configuração diferente da padrão deverá ser feita nesse arquivo.
Vejamos um exemplo do /etc/rc.conf.
# -- sysinstall generated deltas -- # Thu Dec 10 08:19:36 2009
# Created: Thu Dec 10 08:19:36 2009
# Enable network daemons for user convenience.
# Please make all changes to this file, not to
/etc/defaults/rc.conf.
# This file now contains just the overrides from
/etc/defaults/rc.conf.
defaultrouter="192.168.0.1"
hostname="free.iqm.unicamp.br"
ifconfig_em0="inet 192.168.0.10 netmask 255.255.255.0"
keymap="br275.iso.acc"
sshd_enable="YES"
ntpd_enable="YES"
apache22_enable="YES"

Algumas diretivas são utilizadas para a configuração da máquina ( defaultrouter,


hostname, keymap, ifconfig_em0) enquanto outras são utilizadas para a inicialização
de serviços (sshd_enable, ntpd_enable e apache22_enable). As diretivas utilizadas
para a inicialização de serviços seguem um padrão de nomeação definido pelo nome
do daemon seguido de _enable e podem contem o valor “YES” (para serem iniciados no
boot) ou “NO” para não serem iniciados no boot.
Uma vez que o daemon esteja registrado no rc.conf, podemos utilizar os scripts do
diretório rc.d para manipular a execução dos daemons.

Quando utilizamos o nome do script sem nenhum parâmetro adicional é exibida uma
mensagem de utilização.

# /etc/rc.d/ntpd
Usage: /etc/rc.d/ntpd
[fast|force|one](start|stop|restart|rcvar|status|poll)

Para verificar se o ntpd está em funcionamento, podemos utilizar o parâmetro status.


# /etc/rc.d/ntpd status

44
ntpd is running as pid 627.

Para finalizar o ntpd, utilizaremos o parâmetro stop.


# /etc/rc.d/ntpd stop
Stopping ntpd.

# /etc/rc.d/ntpd status
ntpd is not running.

Para inicializar o ntpd, utilizaremos o parâmetro start.


# /etc/rc.d/ntpd start
Starting ntpd.

# /etc/rc.d/ntpd status
ntpd is running as pid 48782.

Para se certificar que o ntpd está devidamente cadastrado no rc.conf, basta verificar o
valor da variável de ambiente rc através do parâmetro rcvar
# /etc/rc.d/ntpd rcvar
# ntpd
ntpd_enable=YES

3.12 Montando e desmontando sistemas de arquivos


Para facilitar o entendimento do sistema de arquivos do FreeBSD utilizaremos uma
comparação análoga a uma arvore. Podemos considerar o inicio (/) como a raiz. Os
outros diretórios são ramos da arvores, que podem ainda ter seus próprios ramos, como
/usr/sbin ou /usr/local/bin.

Figura retirada de
http://www.rwc.uc.edu/thomas/Intro_Unix_Text/Images/Unix_file_system.png

45
É fortemente recomendado que alguns diretórios fiquem em sistemas de arquivos
diferentes. A divisão de alguns diretórios em partições separadas impede que o
sistema venha a falhar caso a única partição apresente algum problema, seja falta de
espaço ou corrupção dos dados.

3.12.1 O arquivo fstab


O arquivo /etc/fstab contém as informações sobre os sistemas de arquivos
utilizados. Ele é lido durante o processo de boot e o seu conteúdo é montado ou não,
dependendo da configuração.
Segue abaixo um exemplo:
#Device Mountpoint FStype Options Dump Pass#
/dev/da0s1b none swap sw 0 0
/dev/da0s1a / ufs rw 1 1
/dev/da0s1d /tmp ufs rw 2 2
/dev/da0s1e /usr ufs rw 2 2
/dev/da0s1f /var ufs rw 2 2
/dev/da0s1g /work ufs rw 2 2
/dev/acd0 /cdrom cd9660 ro,noauto 0 0
server:/dados /home nfs rw,userquota 0 0

O arquivo /etc/fstab é um arquivo texto comum composto com as seguintes linhas:


Dispositivo: Nome do dispositivo a ser utilizado. Ex: /dev/da0s1d
Ponto de montagem: Diretório onde o dispositivo será montado. Ex: /tmp
Tipo: Indica o tipo de sistemas de arquivos utilizado. Ex: ufs
Opções: Descreve quais opções de montagem serão utilizadas. Seguem abaixo
alguns exemplos de opções de montagem.
o noauto: Estabelece que esse sistema de arquivo não será iniciado
automaticamente.
o noexec: Não permite execução de no sistema de arquivos.
o nosuid: Não permite arquivos com o suid bit ativado.
o ro: Monta o sistema de arquivo apenas para leitura (read only)
o userquota: Utiliza quota de usuário
o groupquota: Utiliza quota de grupo
Dump: Indica quais sistemas de arquivos o aplicativo de backup dump deverá
efetuar backup
Pass: Esse campo determina a ordem que os sistemas deverão ser verificados
pelo aplicativo fsck. O valor 0 desabilita a checagem.

3.12.2 O comando mount


O comando mount é a ferramenta usada para montar sistemas de arquivos.
Se for utilizada sem nenhum argumento, exibe uma lista dos sistemas de arquivos
montados atualmente.
/dev/da0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/da0s1d on /tmp (ufs, local, soft-updates)

46
/dev/da0s1e on /usr (ufs, local, soft-updates)
/dev/da0s1f on /var (ufs, local, soft-updates)
/dev/da0s1g on /work (ufs, local, soft-updates)
server:/work4/pcv on /home (nfs)

A utilização do comando mount pode ser feita da seguinte forma:


# mount <opções> <dispositivo> <ponto de montagem>

O comando pode ser utilizado com diversas opções que podem ser estudadas em
detalhes através da consulta da página de manual. Veremos algumas opções mais
comuns:
-a Monta todos os sistemas de arquivos listados no /etc/fstab. Exceto
aqueles assinalados com a opção noauto.
-f Força a montagem de um sistema de arquivos que não foi considerado
limpo pelo fsck (problemas de integridade). Essa opção não é segura, sendo
assim, seu uso não é recomendado.
-r Monta o sistema de arquivos como somente leitura.
-t <tipofs> Monta o sistema de arquivos com o tipo especificado. Ufs é o tipo
padrão de sistema de arquivos FreeBSD. Vejamos abaixo outros tipos:
o msdosfs Padrão MSDOS
o ntfs Padrão de sistemas de arquivos utilizado no Windows NT em
diante
o cd9660 Padrão ISO9660 utilizado em CD
o nfs Padrão de sistema de arquivos de rede (Network File
System)
-v Habita o modo detalhado.
-w Monta o sistema de arquivos como leitura e escrita.
-o Define as opções de montagem do sistema de arquivos. Pode ser
utilizada com nodev, noexec, nosuid, async, entre outras.

Exemplos de utilização:
Montar uma partição NTFS:
# mount –t ntfs /dev/ad0s1 /mnt

Montar uma mídia de CDROM


# mount –t cd9660 /dev/acd0 /cdrom
Montar o diretório /tmp com opção noexec,nosuid
# mount /dev/da0s1d /tmp –o noexec,nosuid
Montar todos os sistemas de arquivos definidos no /etc/fstab que possuem o
tipo nfs
# mount –at nfs

47
3.12.3 O comando umount

O comando umount é utilizado para desmontar o sistema de arquivo especificado.


Pode receber como parâmetro o ponto de montagem, o dispositivo, e algumas opções.
Dentre as possíveis opções destacam-se:

-t <tipofs> Desmonta o sistema de arquivos com o tipo especificado.


-f Força a desmontagem de um sistema de arquivos.
-a Desmonta todos os sistemas de arquivos listados no /etc/fstab.
-v Habita o modo detalhado.

Exemplos de utilização:
Desmontar todas as partições tipo NTFS:
# mount –at ntfs

Desmontar um sistema de arquivos previamente montado em /mnt


# mount /mnt

3.13 Manipulação de Processos


A definição de um processo nada mais é que um programa em execução. Sendo
assim, qualquer comando executado iniciará ao menos um processo. Alguns processos
encontram-se constantemente em execução mantendo vários recursos do sistema em
funcionamento.
Cada processo em execução possui características peculiares que veremos abaixo:
PID Process ID, ou seja, identificação do processo. É um numero único
atribuído sequencialmente no intervalo de 1 a 99999 (reiniciam quando
ultrapassam o valor máximo)
PPID Um processo pode iniciar outro processo mantendo uma relação entre
eles de pai (processo criador) e filho. O PID do processo criador corresponde ao
PPID. O processo init tem ID 1 e é o único que não possui nenhum processo
pai.
UID É a identificação do usuário que criou o processo. A execução do
processo tem as mesmas permissões do usuário.
GID É a identificação do grupo do processo e também estabelece relações de
permissão para o grupo.

Existem duas ferramentas essenciais que nos auxiliam no monitoramento de processos,


o ps e o top.
O comando ps (process status) permite verificar o status dos processos em execução
no sistema apresentando uma listagem estática.
Se utilizado sem nenhum argumento será exibido apenas os processos que pertencem
ao usuário.
$ ps
PID TT STAT TIME COMMAND

48
8120 p0 R+ 0:00.00 ps
22493 p0 Ss 0:00.01 -sh (sh)

Para obtermos uma listagem mais detalhada dos processos e incluir os todos os
processos em execução, utilizaremos o comando com os argumentos aux.
$ ps -aux
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
root 11 200.0 0.0 0 32 ?? RL 14Dec09 108558:47.62 [idle]
root 0 0.0 0.0 0 112 ?? DLs 14Dec09 0:59.84 [kernel]
root 1 0.0 0.0 3204 568 ?? ILs 14Dec09 0:00.79 /sbin/init --
root 2 0.0 0.0 0 16 ?? DL 14Dec09 1:19.94 [g_event]
root 3 0.0 0.0 0 16 ?? DL 14Dec09 0:20.70 [g_up]
root 4 0.0 0.0 0 16 ?? DL 14Dec09 0:15.04 [g_down]
root 5 0.0 0.0 0 16 ?? DL 14Dec09 0:00.00 [xpt_thrd]
root 6 0.0 0.0 0 16 ?? DL 14Dec09 0:08.22 [fdc0]
root 7 0.0 0.0 0 16 ?? DL 14Dec09 0:02.17 [pagedaemon]
root 8 0.0 0.0 0 16 ?? DL 14Dec09 0:00.00 [vmdaemon]
root 9 0.0 0.0 0 16 ?? DL 14Dec09 0:00.04 [pagezero]
root 10 0.0 0.0 0 16 ?? DL 14Dec09 0:00.00 [audit]
root 12 0.0 0.0 0 288 ?? WL 14Dec09 28:23.47 [intr]
root 13 0.0 0.0 0 16 ?? DL 14Dec09 1:18.54 [yarrow]
root 14 0.0 0.0 0 192 ?? DL 14Dec09 0:21.87 [usb]
root 15 0.0 0.0 0 16 ?? DL 14Dec09 0:10.00 [bufdaemon]
root 16 0.0 0.0 0 16 ?? DL 14Dec09 92:37.86 [syncer]
root 17 0.0 0.0 0 16 ?? DL 14Dec09 0:09.59 [vnlru]
root 18 0.0 0.0 0 16 ?? DL 14Dec09 0:16.82 [softdepflush]
root 19 0.0 0.0 0 16 ?? DL 14Dec09 0:03.12 [flowcleaner]
root 130 0.0 0.1 2740 1064 ?? Is 14Dec09 0:00.00 adjkerntz -i
root 333 0.0 0.0 3204 656 ?? Is 14Dec09 0:00.00 /sbin/devd
root 425 0.0 0.1 7020 1560 ?? Ss 14Dec09 0:05.62 /usr/sbin/syslogd -s
root 627 0.0 0.1 11852 2568 ?? Ss 14Dec09 1:14.85 /usr/sbin/ntpd -c
/etc/ntp.conf -p /var/run/ntpd.pid -f /var/db/ntpd.drift
root 664 0.0 0.2 26136 4480 ?? Is 14Dec09 0:00.01 /usr/sbin/sshd
root 671 0.0 0.2 12072 4032 ?? Ss 14Dec09 0:36.89 sendmail: accepting
connections (sendmail)
smmsp 675 0.0 0.2 12072 3864 ?? Is 14Dec09 0:01.07 sendmail: Queue
runner@00:30:00 for /var/spool/clientmqueue (sendmail)
root 681 0.0 0.1 7948 1612 ?? Is 14Dec09 0:10.53 /usr/sbin/cron -s
root 4357 0.0 0.2 38068 5144 ?? Is 8Jan10 0:00.04 sshd: rensousa [priv]
(sshd)
rensousa 4360 0.0 0.2 38068 5208 ?? S 8Jan10 0:00.55 sshd: rensousa@pts/0
(sshd)
root 731 0.0 0.1 6888 1284 v0 Is+ 14Dec09 0:00.00 /usr/libexec/getty Pc
ttyv0
root 732 0.0 0.1 6888 1284 v1 Is+ 14Dec09 0:00.00 /usr/libexec/getty Pc
ttyv1
root 733 0.0 0.1 6888 1284 v2 Is+ 14Dec09 0:00.00 /usr/libexec/getty Pc
ttyv2
root 734 0.0 0.1 6888 1284 v3 Is+ 14Dec09 0:00.00 /usr/libexec/getty Pc
ttyv3
root 735 0.0 0.1 6888 1284 v4 Is+ 14Dec09 0:00.00 /usr/libexec/getty Pc
ttyv4
root 736 0.0 0.1 6888 1284 v5 Is+ 14Dec09 0:00.00 /usr/libexec/getty Pc
ttyv5
root 737 0.0 0.1 6888 1284 v6 Is+ 14Dec09 0:00.00 /usr/libexec/getty Pc
ttyv6
root 738 0.0 0.1 6888 1284 v7 Is+ 14Dec09 0:00.00 /usr/libexec/getty Pc
ttyv7
rensousa 4361 0.0 0.1 8260 1880 0 Ss 8Jan10 0:00.01 -sh (sh)
rensousa 23233 0.0 0.1 8004 1400 0 R+ 11:02AM 0:00.00 ps -aux

49
Como podemos analisar, a listagem exibe vários campos organizados em colunas
conforme tabela abaixo.
Campo Descrição
USER Usuário proprietário
PID ID do processo
%CPU Percentual de uso da CPU por este processo
%MEM Percentual de uso da memória por este processo
VSZ Tamanho (kbytes) virtual do processo
RSS Tamanho configurado residente em paginas de 1k na memória
TT Abreviação do nome do terminal
STAT Estado atual do processo
STARTED Data ou horário que o processo foi iniciado
TIME Tempo acumulado de uso de CPU
COMMAND Comando executado e seus argumentos

Podemos ainda personalizar a saída do comando ps com utilizando o argumento -o,


conforme abaixo:
$ ps -ax -o pid,user,%cpu,command
PID USER %CPU COMMAND
0 root 0.0 [kernel]
1 root 0.0 /sbin/init --
2 root 0.0 [g_event]
3 root 0.0 [g_up]
4 root 0.0 [g_down]
5 root 0.0 [xpt_thrd]
6 root 0.0 [fdc0]
7 root 0.0 [pagedaemon]
8 root 0.0 [vmdaemon]
9 root 0.0 [pagezero]
10 root 0.0 [audit]
11 root 200.0 [idle]
12 root 0.0 [intr]
13 root 0.0 [yarrow]
14 root 0.0 [usb]
15 root 0.0 [bufdaemon]
16 root 0.0 [syncer]
17 root 0.0 [vnlru]
18 root 0.0 [softdepflush]
19 root 0.0 [flowcleaner]
130 root 0.0 adjkerntz -i
333 root 0.0 /sbin/devd
425 root 0.0 /usr/sbin/syslogd -s
627 root 0.0 /usr/sbin/ntpd -c /etc/ntp.conf -p /var/run/ntpd.pid
-f /var/db/ntpd.drift
664 root 0.0 /usr/sbin/sshd
671 root 0.0 sendmail: accepting connections (sendmail)
50
675 smmsp 0.0 sendmail: Queue runner@00:30:00 for
/var/spool/clientmqueue (sendmail)
681 root 0.0 /usr/sbin/cron -s
4357 root 0.0 sshd: rensousa [priv] (sshd)
4360 rensousa 0.0 sshd: rensousa@pts/0 (sshd)
731 root 0.0 /usr/libexec/getty Pc ttyv0
732 root 0.0 /usr/libexec/getty Pc ttyv1
733 root 0.0 /usr/libexec/getty Pc ttyv2
734 root 0.0 /usr/libexec/getty Pc ttyv3
735 root 0.0 /usr/libexec/getty Pc ttyv4
736 root 0.0 /usr/libexec/getty Pc ttyv5
737 root 0.0 /usr/libexec/getty Pc ttyv6
738 root 0.0 /usr/libexec/getty Pc ttyv7
4361 rensousa 0.0 -sh (sh)
23372 rensousa 0.0 ps -ax -o pid,user,%cpu,command

Outro importante aplicativo para o monitoramento de processos do sistema é o top.


Semelhante ao ps, também exibe uma listagem contendo diversas informações sobre
os processos em execução. A principal diferença entre eles é que no top as
informações são atualizadas periodicamente, nos fornecendo um cenário bem próximo
à realidade.
Outra diferença é que o top exibe outras informações gerais sobre o sistema (média de
carga, uptime, uso de memória, uso de swap, entre outras).
Essas características fazem do top uma ferramenta indispensável ao administrador do
sistema.
Abaixo temos um exemplo da saída do comando top.
$ top
last pid: 24650; load averages: 0.00, 0.00, 0.00 up 38+07:48:29
00:20:32
23 processes: 1 running, 22 sleeping

Mem: 14M Active, 757M Inact, 317M Wired, 213M Buf, 885M Free
Swap: 4060M Total, 4060M Free

PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND
627 root 1 44 0 11852K 2568K select 0 1:16 0.00% ntpd
671 root 1 44 0 12072K 4032K select 0 0:37 0.00% sendmail
681 root 1 44 0 7948K 1612K nanslp 0 0:11 0.00% cron
425 root 1 44 0 7020K 1560K select 0 0:06 0.00% syslogd
675 smmsp 1 44 0 12072K 3864K pause 0 0:01 0.00% sendmail
4360 rensousa 1 44 0 38068K 5208K select 1 0:01 0.00% sshd
24605 rensousa 1 44 0 38068K 5208K select 1 0:00 0.00% sshd
4357 root 1 46 0 38068K 5144K sbwait 0 0:00 0.00% sshd
24602 root 1 46 0 38068K 5144K sbwait 0 0:00 0.00% sshd
4361 rensousa 1 44 0 8260K 1884K ttyin 0 0:00 0.00% sh
664 root 1 44 0 26136K 4480K select 0 0:00 0.00% sshd
24606 rensousa 1 44 0 8260K 1876K wait 1 0:00 0.00% sh
731 root 1 44 0 6888K 1284K ttyin 0 0:00 0.00% getty
733 root 1 76 0 6888K 1284K ttyin 0 0:00 0.00% getty
732 root 1 76 0 6888K 1284K ttyin 0 0:00 0.00% getty
735 root 1 76 0 6888K 1284K ttyin 1 0:00 0.00% getty
738 root 1 76 0 6888K 1284K ttyin 1 0:00 0.00% getty
736 root 1 76 0 6888K 1284K ttyin 0 0:00 0.00% getty

3.14 Daemons, sinais e controle de processos


51
Os programas podem ser caracterizados pela sua ligação com o terminal. Existem
programas que são diretamente ligados com o terminal e o usuário interage diretamente
com ele, obtendo assim maior controle sob sua execução. Um exemplo desse tipo de
programa seria um usuário utilizando um editor de textos ou algum cliente de email.
Quando o usuário decidir que o programa deve terminar basta fechar o programa e ele
terminará sua execução.
Existem alguns programas que funcionam em background oferecendo diversas
funcionalidades ao sistema. Esses programas não estão ligados a nenhum terminal e
sua execução não interage com diretamente com usuário. Essa classe de programas
recebe o nome de daemons.
Por convenção, a maioria dos daemons são batizados com a terminação “d” em seu
nome. Exemplos de alguns daemons do sistema são: syslogd (controla mensagens de
log), sshd (servidor de autenticação remota ssh), ntpd (servidor de sincronia de tempo),
entre outros.

3.14.1 Sinais
Um sinal é uma mensagem de comunicação que pode ser enviada a um processo em
execução. Os sinais podem ser iniciados por programas, usuários, ou administradores.
Usuários podem enviar sinais apenas para os processos que estão executando com o
seu UID. Só o root pode enviar sinais a qualquer processo em execução.
Existe uma lista de tipos específicos de sinais, da qual veremos os mais
frequentemente utilizados
Numero Nome Descrição
1 SIGHUP Reinicialização do processo. Na maioria dos daemons
causa a releitura dos arquivos de configuração
2 SIGINT A maioria dos programas utiliza esse sinal para indicar
uma interrupção do programa.
3 SIGQUIT Fechamento
6 SIGABRT Abortar
9 SIGKILL Finalização forçada pelo kernel
15 SIGTERM Finalização normal

Para obter a lista completa dos sinais disponíveis utilize o comando man 3 signal.

3.14.2 Enviando sinais a processos


Quando temos um processo diretamente ligado ao terminal podemos enviar sinais
através da combinação de teclas especificas. Um exemplo seria se pressionarmos
CTRL + C na exibição de uma pagina de manual com o comando man. Isso causaria a
interrupção do comando com o sinal 2 (SIGINT).
Para os processos que não são controlados por um terminal, devemos utilizar o
programa kill para a comunicação. O kill envia por padrão um sinal do tipo SIGTERM
para o processo identificado pelo PID.
Para utilizar o kill devemos conhecer o PID do processo. Utilizaremos o ps para
descobrir.
# ps aux | grep ntpd

52
root 627 0.0 0.1 11852 2568 ?? Ss 14Dec09 1:22.88
/usr/sbin/ntpd -c /etc/ntp.conf -p /var/run/ntpd.pid -f
/var/db/ntpd.drift

Agora que já temos o PID, devemos utilizar o kill para fechar o aplicativo em questão.
# kill 627

No exemplo exibido acima, o kill enviará um sinal tipo SIGTERM para o processo do
ntpd (PID 627). O sinal SIGTERM é uma maneira formal de parar a execução de um
processo. Ao receber esse sinal o processo fecha quaisquer arquivos de logs que ele
tenha aberto, e geralmente termina a tarefa que ele está realizando no momento, antes
de parar a execução.

Outra sinal para interromper um processo é o SIGKILL. Esse tipo de sinal não pode ser
ignorado pelo aplicativo e sua interrupção é imediata, não levando em conta a
importância do aplicativo para o sistema. Seu uso só é recomendado quando o
processo encontra-se travado e outras tentativas com SIGTERM não surtiram efeito.
Para utilizarmos o SIGKILL no exemplo acima basta informar o numero do sinal,
conforme exemplo abaixo.

# kill -9 627

Podemos também utilizar o nome do sinal.

# kill –s KILL 627

Outro sinal muito utilizado é o SIGHUP que envia uma mensagem para o processo
reiniciar. Normalmente o aplicativo faz uma releitura dos seus arquivos de
configuração. Esse sinal é muito utilizado quando mudamos os arquivos de
configuração de algum aplicativo e desejamos aplicar as novas configurações.
Para o exemplo anterior, caso desejamos que o servidor ntpd releia os arquivos de
configuração, basta enviar o sinal SIGHUP conforme abaixo.
# kill –s HUP 627

Ou ainda
# kill –1 627

Um comando alternativo ao kill é o killall, que seleciona os processos pelo nome e


não pelo PID como o kill.
Para terminarmos todos os processos com o nome vim (editor de textos), basta utilizar o
comando conforme abaixo.
# killall vim

3.15 Documentação do sistema


O FreeBSD nos oferece uma considerável variedade de fontes de documentação.
Essa característica é muito importante e tem ajudado muitos usuários a solucionar os
mais variados problemas.

53
Saber onde encontrar e como consultar as documentações do sistema não é uma boa
prática e sim um dever de todo usuário FreeBSD.
3.15.1 Páginas de Manuais
As páginas de manuais, mais conhecidas como man pages, são uma excelente fonte
de documentação pois oferecem um acesso rápido a informação desejada. Quase todo
programa no sistema é acompanhado com um breve manual que explica a operação
básica e os vários argumentos do programa, oferecendo inclusive alguns exemplos de
funcionamento.
Para visualizar os manuais utilizamos o comando man. Para exemplificar melhor o uso
do man, suponhamos que desejamos saber informações sobre o módulo de kernel bce
que controla adaptadores de rede Broadcom. Para obter as informações desejadas
basta digitar o comando abaixo:
# man bce
BCE(4) FreeBSD Kernel Interfaces Manual
BCE(4)

NAME
bce -- Broadcom NetXtreme II (BCM5706/5708/5709/5716) PCI/PCIe
Gigabit Ethernet adapter driver

SYNOPSIS
To compile this driver into the kernel, place the following lines
in your kernel configuration file:

device miibus
device bce

Alternatively, to load the driver as a module at boot time, place


the following line in loader.conf(5):

if_bce_load="YES"

DESCRIPTION
The bce driver supports Broadcom's NetXtreme II product family,
including the BCM5706, BCM5708, BCM5709 and BCM5716 Ethernet
controllers.
The NetXtreme II product family is composed of various Converged
NIC (or CNIC) Ethernet controllers which support a TCP Offload Engine
(TOE, Remote DMA (RDMA), and iSCSI acceleration, in addition to standard
L2 Ethernet traffic, all on the same controller.

As páginas de manual são organizadas nas seguintes seções numeradas:


1. Comandos de usuário.
2. Chamadas de sistema e número de erros.
3. Funções de bibliotecas C.
4. Controladores de dispositivos.
5. Formato de arquivos.
6. Jogos e outras diversões.
7. Informações gerais.
8. Comandos de manutenção e operação do sistema.
9. Desenvolvedores do kernel.
54
Em alguns casos, o mesmo tópico pode aparecer em mais de uma seção do manual
online. Nesses casos, devemos informar qual seção a consulta se refere.
Por exemplo, caso desejamos receber informações sobre o arquivo /etc/passwd,
intuitivamente digitaremos o comando man passwd. O resultado obtido será uma página
do comando passwd. Para obtermos a página correta, devemos informar que a consulta
deverá ser efetuada na seção 5 do manual, conforme abaixo:
% man 5 passwd

É bem fácil utilizar essa ferramenta, quando você sabe o nome do comando sobre o
qual quer obter mais informações, mas e se você não puder lembrar o nome do
comando? Pode usar o man para procurar por palavras chaves nas descrições do
comando, usando opção -k:
% man -k mail

Com esse comando, uma lista de programas será apresentada, contendo em sua
descrição a expressão ``mail''. Na verdade esse comando tem a mesma funcionalidade
de se utilizar o comando apropos.

3.15.2 GNU Info


Como método complementar, podemos utilizar o comando info para exibir páginas de
documentação. O GNU info é mantido pela Fundação do Software Livre (FSF).
Para visualizar a documentação do comando ls através do info, simplesmente digite:
% info ls

3.15.3 FAQ FreeBSD


FAQ (Frequently Asked Questions) é um documento de perguntas e respostas
frequentes sobre o FreeBSD. Podemos encontrar essa documentação em:
http://www.freebsd.org/doc/en_US.ISO8859-1/books/faq/index.html
Podemos também encontrar um FAQ em nossa língua no diretório
/usr/share/doc/pt_BR.ISO8859-1/books/faq

55
56
4. Instalação de aplicativos
Diferente dos outros sistemas operacionais (Microsoft Windows e algumas distribuições
Linux) uma instalação básica do FreeBSD contém apenas os aplicativos necessários
para o funcionamento do SO. Qualquer outro aplicativo desejado que não faça parte da
base do sistema deve ser instalado.
Em sistemas Unix / Unix-Like a instalação de aplicativos pelo método tradicional é uma
tarefa árdua, uma vez que se faz necessário a execução de vários procedimentos antes
da instalação propriamente dita do aplicativo escolhido.
Vamos elucidar abaixo todas as etapas da compilação de um aplicativo pelo código
fonte:
1. Baixar o source do programa
2. Extrair o source do programa
3. Rodar o comando ./configure
a. O sistema irá informar se alguma dependência está faltando
b. Baixar as dependências requeridas
c. Instalar todas as dependências
4. Rodar o comando make para compilar o programa
5. Instalar o programa via make install
6. Configurar o programa

Para exemplificar, vamos tomar como exemplo a instalação do webserver Apache.


Para uma instalação tradicional, seria necessário baixar e compilar as seguintes
dependências:
autoconf-2.62
autoconf-wrapper-20071109
expat-2.0.1_1
libiconv-1.13.1
libtool-2.2.6b
m4-1.4.13,1
perl-5.8.9_3
pkg-config-0.23_1

Algumas das dependências acima, como o autoconf, possui outras dependências que
devem ser previamente instaladas, tornando o processo de instalação demorado.
Após a instalação de todas as dependências no sistema o apache pode ser compilado
com os seguintes comandos:
#./configure
#make
#make install

Durante esse processo geralmente é necessário que o administrador do sistema passar


o diretório onde o aplicativo deverá ser instalado. No exemplo do apache, a falta de
qualquer informação fará com que o servidor seja instalado na pasta /usr/apache.

57
Se tudo correr bem o apache é compilado e instalado no equipamento. Algumas vezes
o administrador de sistemas se depara com erros, onde se faz necessária a edição dos
arquivos Makefile do aplicativo a ser instalado.
Para facilitar o processo de instalação para seus usuários, o FreeBSD possui a coleção
de Ports.

4.1 O sistema de Ports e Packages


Ports são instruções para a compilação de softwares no FreeBSD, já os packages são
ports pré compilados.
A instalação de um software via packages é mais rápida e fácil, já pelo ports é um
pouco mais demorada, mas pode ser customizada para o seu ambiente.
A idéia básica da coleção de ports do FreeBSD é fornecer aos seus usuários uma
maneira simples e rápida de instalar aplicativos portados para o FreeBSD, sejam eles
pré-compilados ou em código fonte. Esse é um dos principais diferenciais do FreeBSD
com relação aos demais sistemas.
Atualmente a árvore do ports contém mais de 21.000 aplicativos portados para o
FreeBSD. O crescimento da árvore do ports pode ser observado pelo gráfico na Figura
1

Figura 1 - crescimento do ports (retirado de www.freebsd.org/ports)

Toda a estrutura do ports está armazenada em /usr/ports. Caso não exista nada dentro
dessa pasta significa que a coleção do ports não foi instalada junto com o sistema.
A instalação pode ser feita pelo cdrom, utilizando o script install.sh encontrado dentro
da pasta ports, para isso os seguintes comandos devem ser seguidos:
58
#mount /cdrom
#cd /cdrom/8.0-RELEASE/ports
#./install.sh

Este processo irá descompactar a árvore do ports gravada no cdrom de instalação do


FreeBSD no diretório /usr/ports.
Desaconselhamos a utilização deste processo, pois a árvore do ports instalada estará
em uma versão desatualizada.
A melhor forma de se realizar a instalação do ports é através do comando portsnap(8).
O portsnap busca um mirror para arquivos portsnap, verifica através de uma conexão
criptografada a integridade dos arquivos no servidor portsnap, faz o download do
arquivo e novamente verifica a integridade do arquivo baixado. Todas essas operações
são executadas pelo comando portansp fetch:
# portsnap fetch
Looking up portsnap.FreeBSD.org mirrors... 2 mirrors found.
Fetching snapshot tag from portsnap1.freebsd.org... done.
Fetching snapshot metadata... done.
Fetching snapshot generated at Wed Jan 6 22:54:14 BRST 2010:
79652bbf56abf77df0284104b71e502d93f4c63a77357b100% of 61 MB 298 kBps
00m00s
Extracting snapshot... done.
Verifying snapshot integrity... done.
Fetching snapshot tag from portsnap1.freebsd.org... done.
Fetching snapshot metadata... done.
Updating from Wed Jan 6 22:54:14 BRST 2010 to Thu Jan 7 08:44:57 BRST
2010.
Fetching 4 metadata patches... done.
Applying metadata patches... done.
Fetching 0 metadata files... done.
Fetching 29 patches.....10....20.... done.
Applying patches... done.
Fetching 4 new ports or files... done.

Como é possível observar, atualmente o arquivo compactado contendo a árvore do


ports possui 61MB. O tempo de download vai variar conforme a conexão, mas
aproximadamente esse passo irá levar de 7 a 15 minutos.
Após o download é necessário extrair o arquivo, para isso basta executar o comando
# portsnap extract
/usr/ports/.cvsignore
/usr/ports/CHANGES
/usr/ports/COPYRIGHT
/usr/ports/GIDs
/usr/ports/KNOBS
/usr/ports/LEGAL
/usr/ports/MOVED
/usr/ports/Makefile
/usr/ports/Mk/bsd.apache.mk
/usr/ports/Mk/bsd.autotools.mk
/usr/ports/Mk/bsd.cmake.mk
/usr/ports/Mk/bsd.commands.mk
...
/usr/ports/x11/xzoom/
/usr/ports/x11/yakuake-kde4/
59
/usr/ports/x11/yakuake/
/usr/ports/x11/yalias/
/usr/ports/x11/yeahconsole/
/usr/ports/x11/yelp/
/usr/ports/x11/zenity/
Building new INDEX files... done.

Ao final dos dois comandos, você terá uma versão atual da árvore do ports.

NOTA Para ter uma melhor precisão do tempo na execução dos comandos citados, tente executar
desta forma:

#date > time_ports && portsnap fetch && portsnap extract && date >>
time_ports

Este comando cria no diretório corrente o arquivo time_ports, coloca como primeira linha a data
corrente do sistema, executa as operações de fetch e extract e ao final, insere a segunda linha
com a data corrente do sistema. Basta verificar a diferença entre elas para se ter o tempo
decorrido.
Utilizaremos esse artifício para outras operações adiante.

4.1.1 Conteúdo da árvore do ports


Com o ports atualizado, podemos agora explorar sua árvore de diretórios.
# ls /usr/ports
.cvsignore arabic emulators mbone shells
CHANGES archivers finance misc sysutils
COPYRIGHT astro french multimedia textproc
GIDs audio ftp net ukrainian
INDEX-8 benchmarks games net-im vietnamese
KNOBS biology german net-mgmt www
LEGAL cad graphics net-p2p x11
MOVED chinese hebrew news x11-clocks
Makefile comms hungarian palm x11-drivers
Mk converters irc polish x11-fm
README databases japanese ports-mgmt x11-fonts
Templates deskutils java portuguese x11-servers
Tools devel korean print x11-themes
UIDs distfiles lang russian x11-toolkits
UPDATING dns mail science x11-wm
Accessibility editors math security

A estrutura de arquivos da pasta /usr/ports é basicamente dividida entre arquivos e


pastas de informações/configurações e as pastas separando os ports por categorias.
Dentre as pastas e arquivos de informações/configurações, temos:
CHANGES: Este arquivo contém as principais mudanças do ports e de sua
infraestrutura.
COPYRIGHT: Contém as informações de licença da coleção do ports como um todo.
Enquanto cada software distribuído pelo ports possui sua própria forma de
licenciamento, a coleção do ports é licenciada sobre a licença BSD.
GIDs: Contém uma lista de todos os IDs de grupos utilizados pelos softwares na
coleção do ports. Muitos softwares utilizam usuários desprivilegiados e a coleção do

60
ports necessita de GID para estes usuários. Este arquivo ajuda a evitar conflitos, já que
cada port tem seu próprio GID atribuído.
KNOBS: Contém uma lista de todos os atributos tunáveis encontrados na coleção do
ports. Estes atributos podem ser setados manualmente no arquivo /etc/make.conf
LEGAL: Este arquivo mostra quais ports possuem restrições de uso e direitos de cópia.
MOVED: Contém uma lista dos ports que foram movidos de categorias ou removidos da
árvore.
Makefile: Contém instruções de auto nível para toda a coleção do ports.
Mk: Neste subdiretório estão definidas todas as funções existentes no ports. É o
diretório mais importante da coleção do ports. Caso queira se aprofundar mais na
coleção do ports, este é um bom diretório para se olhar.
README: o arquivo readme contém instruções de auto nível para a utilização do ports.
Templates: Diretório de templates.
Tools: Diretório que contém programas, scripts e ferramentas de automação. Muito
utilizado pelos mantenedores do ports.
UIDs: Assim como o arquivo GIDs este arquivo ajuda os desenvolvedores do ports a
evitar conflitos de usuários desprivilegiados.
UPDATING: De grande importância para qualquer usuário do FreeBSD, este arquivo
documenta em ordem na ordem cronológica reversa, ou seja, começando pela data
mais recente, todos os ports que necessitam de interação manual no momento de sua
atualização. É recomendável adotar como prática a verificação deste arquivo no
momento da atualização de qualquer port.
Distfiles: Neste diretório são armazenados os códigos fontes originais de todos os
softwares portados. Toda vez que o ports realiza o download de código fonte, é neste
diretório que ele é armazenado.

Os demais diretórios são para categorização dos ports:


Acessibility - Ports de ajuda a acessibilidade.
Arabic - Softwares portados para o mercado árabe.
Archivers - Utilitários para compactação e descompactação de dados.
Astro - Aplicações relacionadas a astronomia.
Audio - Utilitários de áudio - A maioria requer placa de som.
Benchmarks - Utilitários para mensurar desempenho do sistema.
Biologia - Softwares relacionados à biologia.
Cad - Utilitários de design de computador Aided.
Chinese - Softwares portados para o mercado chinês.
Comms - Utilitários de comunicação.
Converters - Utilitários de conversão de formatos.
Database - Software de banco de dados.
Deskutils - Utilitários desktop variados.
Devel - Utilitários de desenvolvimento de software bibliotecas.
Dns - Utilitários de DNS cliente e servidor.
Editors - Editores de texto comuns.
Emulators - Utilitários para emular outros tipos Sos.
Finance - Aplicações relacionadas a dinheiro, finanças, etc.
61
French - Softwares portados para Francês.
Ftp - Utilitários FTP cliente e servidor.
Games - Jogos variados.
German - Softwares portados para alemão.
Graphics - Bibliotecas e utilitários gráficos.
Hebrew - Softwares portados para a língua Hebréia.
Hungarian - Softwares portas para o mercado húngaro.
Irc - Softwares de bate papo.
Japanese - Softwares portados para o mercado japonês.
Java - Suporte a linguagem Java.
Korean - Softwares portados para o mercado Coreano.
Lang - Linguagem de computador (compiladores).
Mail - Utilitários de e pacotes de correio eletrônico.
Math - Software de matemática computacional.
Mbone - Aplicações e utilitários para o MBONE.
Misc - Utilitários variados.
Multimedia - Utilitários multimídia.
Net - Utilitários de rede.
Net-im - Software de mensagens instantaneas.
Net-mgmt - Utilitários para gerenciarnento de rede.
Net-p2p - Softwares peer to peer.
News - Software de News USENET.
Palm - Software para palmtops.
Polish - Softwares portados para o mercado polonês.
Ports-mgmt - Softwares para gerenciamento dos ports
Portuguese - Softwares portados para o mercado português.
print - Utilitários para trabalhar com impressão.
Russian - Softwares portados para o mercado Russo.
Scheme - Software relacionado para a linguagem de schemas.
Science - Software científico.
Security - Software de sistemas de segurança.
Shells - Várias shells (tcsh, bash, etc).
Sysutils - Vários utilitários de sistema.
Textproc - Utilitários de processamento/procura de textos.
Ukrainian - Softwares portados para o mercado Ucraniano.
Vietnamese - Softwares portados para o mercado Vietnamese.
www - Utilitários WEB (navegadores, servidores HTTP, etc).
X11 - Utilitários do sistema de janelas X.
X11-clocks - Relógios para o sistema de janelas X.
X11-drivers - drivers para o sistema de janelas X.
62
X11-fm - Gerenciadores de arquivo para o sistema de janelas X.
X11-fontes - Utilitários de fonte e fontes para o sistema de janelas X.
X11-Servers - Servidores do sistema de janelas X.
X11-Themes - Temas para o sistema de janelas X.
X11-toolkits - Toolkits de desenvolvimento do sistema de janelas X.
X11-wm - Gerenciadores de janelas para o sistema de janelas X.

4.2 Encontrando o software


Muitas das categorias citadas contêm centenas de ports, veja alguns exemplos:
#ls devel/ | wc -l
3065
#ls www/ | wc -l
1895
#ls databases/ | wc -l
700

Como encontrar algum software nesta infinidade de pastas?


Existem várias formas a começar pela Internet. Se você estiver em um micro com modo
gráfico, basta acessar www.freebsd.org/ports e realizar sua busca.
No ambiente do curso não estamos utilizando modo gráfico, portanto precisamos de
outras formas para realizar tal operação.
Primeiramente podemos utilizar o arquivo de índice, ele está localizado em
/usr/ports/INDEX-8, ele contém a lista de todos os ports em ordem alfabética. Cada port
é descrito em uma linha, com os campos separados pelo simbolo |. Enquanto esta
divisão é conveniente para ferramentas do sistema, não é particularmente inteligível.
Para melhorar esta exibição basta digitar o comando #make print-index no diretório
/usr/ports. A saída deste comando é a exibição na tela, para criar um arquivo para
consultas futuras, basta digitar:
#cd /usr/ports
#make print-index > indice_ports

Observe que o arquivo índice_ports foi criado.


Ao ser examinado, várias linhas como esta serão encontradas:
Port: apache-2.0.63_3
Path: /usr/ports/www/apache20
Info: Version 2.0.x of Apache web server with prefork MPM.
Maint: apache@FreeBSD.org
Index: www ipv6
B-deps: autoconf-2.62 autoconf-wrapper-20071109 expat-2.0.1_1 libiconv-
1.13.1 li
btool-2.2.6b m4-1.4.13,1 perl-5.8.9_3
R-deps: expat-2.0.1_1 libiconv-1.13.1 perl-5.8.9_3
E-deps: perl-5.8.9_3
P-deps: perl-5.8.9_3
F-deps:
WWW: http://httpd.apache.org/

63
O índice é iniciado com a descrição do software seguido pelo seu caminho. Logo abaixo
temos algumas informações sobre o software. O campo Maint lista o(s) mantenedor(es)
do software, podendo este ser uma ou mais pessoas ou mesmo uma organização. O
campo índex lista quais as categorias de que este software pode fazer parte. B-deps
mostra todas as dependências que precisam ser instaladas antes do software. O campo
R-deps informa as dependências que necessitam ser instaladas para o software rodar.
O campo E-deps informa se o software necessita de um descompactador específico, já
o campo P-deps informa se o software necessita de algum patch especial. Similarmente
o campo F-deps informa se o software necessita de um software especial para realizar
o seu download. Finalmente o campo WWW informa a home page do software.
NOTA Repare que as dependências de compilação B-deps e de execução R-deps do apache são as
mesmas mostradas no início do capítulo.

4.2.1 Whereis
Outra forma de pesquisa é pelo comando whereis, onde você deve fornecer um nome
como parâmetro:
#whereis mysql50-server
mysql50-server: /usr/ports/databases/mysql50-server

4.2.2 Make search


O comando make serch pode ser utilizado para realizar pesquisas dentro do diretório
/usr/ports. Ele pode ser invocado com os seguintes argumentos de pesquisa:
key: procura pelo nome do port, comentário e dependências;
name: procura apenas pelo nome do port;
path: procura pelo caminho do port;
info: procura por informações do port;
maint: procura pelo mantenedor do port;
cat: procura pela categoria do port;
bdeps: procura por dependências em tempo de construção do port;
rdeps: procura por dependências em tempo de execução do port;
xname: faz exclusão de nome na procura de algum port;
xkey: faz exclusão de alguma palavra na procura de um port;

Alguns exemplos de utilização do comando make search:


Procurando ports com o nome apache
#make search name=apache

Procurando ports com a descrição “multithread”


#make search info=multithread

Procurando ports dentro da pasta WWW com o nome apache


#make search name=apache path=WWW
NOTA O comando make search retorna as mesmas informações contidas no arquivo de índice. Para
uma exibição mais limpa na tela poderá ser utilizado o comando make quicksearch que irá
retornar apenas três campos: port, path e info

64
4.3 Usando packages

A instalação de aplicativos pré-compilados (packages) será abordada primeiro, pois é


uma maneira mais rápida e fácil de se instalar os aplicativos. Os packages nada mais
são do que arquivos binários distribuídos pelo FreeBSD para suas diversas
arquiteturas.
Os aplicativos pré compilados podem ser encontrados dentro do diretório /packages do
cdrom de instalação do FreeBSD ou diretamente pelo FTP do projeto:
ftp://ftp.freebsd.org/pub/FreeBSD/ports/arquitetura/package-version, onde a arquitetura
corresponde à arquitetura do seu sistema operacional, no nosso caso, i386 e package-
version à versão do sistema operacional, no nosso caso 8.0-release. Neste caso o link
para acessarmos os packages diretamente do servdidor FTP é:
ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-8.0-release

4.3.1 Adicionando aplicativos


Para exemplificar a utilização desta forma de instalação, vamos instalar o aplicativo
gnuls, um substituto ao comando ls tradicional.
A instalação será feita diretamente do FTP do projeto FreeBSD, portanto utilizaremos o
seguinte comando:

#pkg_add -r gnuls

Após a execução do comando é feito um registro da instalação do aplicativo em


/var/db/pkg.
Confira se o aplicativo gnuls foi instalado corretamente:
#ls /var/db/pkg
gnuls-7.5

As principais opções do pkg_add são:


-R não faz o registro da instalação do aplicativo, portanto ele não poderá ser
desinstalado via pkg_delete;
-r Faz a instalação remota do aplicativo. Esta opção irá determinar qual é a
release mais apropriada, baixar e instalar o pacote.
-v habilita o verbose
-n não instala um package, apenas mostra os passos que seriam feitos se este
fosse instalado.
-f força a instalação sem alguma dependência necessária.

Por default, o comando pkg_add ao ser executado com o parâmetro -r realiza todos os
downloads de ftp://ftp.freebsd.org. Este provavelmente não é o melhor FTP para ser
acessado, já que o FTP principal do FreeBSD é muito utilizado e pode estar
congestionado.
Fazendo uma rápida busca no handbook ou no site
http://mirrorlist.freebsd.org/FBSDsites.php podemos obter uma lista dos servidores FTP
localizados no Brasil:
ftp.br.freebsd.org

65
ftp2.br.freebsd.org
ftp3.br.freebsd.org
ftp4.br.freebsd.org
ftp5.br.freebsd.org
ftp6.br.freebsd.org
ftp7.br.freebsd.org

Para utilizar um servidor desta lista, basta alterar a variável de ambiente


PACKGEROOT com o seguinte comando:
#setenv PACKGEROOT ftp://ftp.br.freebsd.org

Com isso o pkg_add irá realizar os downloads a partir de um servidor mais próximo.

4.3.2 Obtendo informações


É comum um administrador de sistemas necessitar de informações sobre os aplicativos
instalados. Esta tarefa pode ser realizada de duas formas, a primeira é acessar o
diretótio /var/db/pkg e a segunda é utilizar o comando pkg_info.
Uma boa forma de se utilizar o pkg_info é:
#pkg_info -I -a | more

Que irá resultar em uma lista contendo apenas os nomes dos aplicativos instalados e
uma breve descrição da sua função.
Para obter maiores informações sobre determinado aplicativo, utilzar:
# pkg_info lynis-1.2.9
Information for lynis-1.2.9:

Comment:
Security and system auditing tool

Description:
Lynis is an auditing tool for Unix (specialists). It scans the
system and available software, to detect security issues. Beside
security related information it will also scan for general system
information, installed packages and configuration mistakes.

This software aims in assisting automated auditing, software patch


management, vulnerability and malware scanning of Unix based systems.
It can be run without prior installation, so inclusion on read only
storage is no problem (USB stick, cd/dvd).

WWW: http://www.rootkit.nl/projects/lynis.html
Author: Michael Boelen

Principais opções do pkg_info:


-a mostra todos os packages atualmente instalados;
-v habilita o verbose;
-p mostra o diretório onde foi instalado cada package;

66
-q habilita o modo silencioso, mostrando o mínimo de informação possível;
-c mostra apenas uma linha de comentário para cada package;
-d mostra um longo comentário para cada package;
-D mostra o arquivo install-message de cada package;
-f mostra a lista de instruções de empacotamento de cada package;
-g mostra os arquivos para os quais os arquivos de checksum gravados não
coincidem;
-i mostra o script de instalação, se existir, de cada package;
-I mostra apenas uma linha de índice para cada package;
-j mostra o script de requerimento, se existir, de cada package;
-k mostra o script de desinstalação, se existir, de cada package;
-r mostra a lista de todos os packages e suas respectivas dependências;
-R mostra a lista de packages instalados requeridos por cada package;
-s mostra o espaço total ocupado por cada package instalado;
-x pesquisa pelo nome do package como instrução regular.

Ao se utilizar o comando pkg_info –as para mostrar o tamanho de cada package


instalado no sistema teremos o seguinte resultado:
#pkg_info -as
Information for apache-2.2.9:

Package Size:
13493 (1K-blocks)

Information for autoconf-2.61_2:

Package Size:
2256 (1K-blocks)

Information for autoconf-2.62:

Package Size:
2450 (1K-blocks)

A informação referente ao tamanho de blocos está em uma variável de ambiente


chamada BLOCKSIZE. Para alterar esta exibição para megabytes, basta executar:
#setenv BLOCKSIZE M

4.3.3 Removendo aplicativos


A remoção de aplicativos é muito fácil, basta digitar o comando pkg_delete seguido do
nome e versão do aplicativo, seguindo o exemplo anterior:
#pkg_delete lynis-1.2.9

NOTA: A falta de atenção ao se utilizar o comando pkg_delete pode fazer com que aplicativos
dependentes do aplicativo desinstalado parem de funcionar.

67
As principais opções do pkg_delete são:
-a remove incondicionalmente todos os packages instalados no sistema;
-i pede confirmação antes de remover cada package;
-v habilita o modo verbose;
-n não remove o package, apenas mostra os passos que seriam feitos caso a
desinstalação fosse concluída;
-p indica o diretório onde o package deve ser desinstalado.
-f força a remoção do package mesmo havendo dependências.

4.4 Usando Ports


A árvore do ports contém todos os softwares portados para o FreeBSD, mas nenhum
código fonte para compilação. Existem patches para serem aplicados no código fonte e
scripts para rodarem no código fonte, mas nenhum código adicional. Quando um port é
ativado, o FreeBSD automaticamente baixa o código fonte de um site confiável. O port
checa então o código para prever erros de integridade, extrai o código para um diretório
de trabalho temporário, aplica os patches (se existirem), constrói, instala tudo e grava a
instalação no diretório /var/db/pkg. Caso o port tenha alguma dependência que não foi
instalada, ele interrompe a construção do port atual e constrói as dependências através
do código fonte. O gatilho para iniciar este processo é entrar no diretório do port
desejado e digitar:

#make install

Se muitas letras começarem a rolar pela tela, a instalação iniciou.


Com o tempo você perceberá que alguns ports dependem de uma interação especial. A
árvore do ports permite que esse tipo de interação seja feita, mas para isso é
necessário conhecer todas as etapas da instalação de um port.
1. make config – Configura as opções do port (caso exista) através de um menu em
dialog. Essas configurações serão salvas para uso futuro no ports.
2. make fetch – Uma vez configurado o port, o sistema procura uma lista pré-
configurada de sites da Internet para download do fonte. Geralmente o primeiro
site a ser vasculhado é o armazenado no Makefile do próprio port, caso não seja
encontrado, o sistema checa uma lista de backup provida pela árvore do ports.
Os downloads são armazenados em /usr/ports/distfile.
3. make checksum – Como uma medida de segurança o sistema confere se o
checksum criptográfico do código baixado confere com o checksum armazenado
no arquivo distinfo localizado na mesma pasta do port. Caso exista alguma
inconsistência nesta etapa a instalação do port é imediatamente interrompida.

Nota Ignorando o Checksum:


Muito raramente algum autor descomprometido pode fazer uma alteração mínima em seu
software e não atualizar a versão dos hashes. Uma vez detectado essa inconsistência o
FreeBSD irá interromper a instalação, mas se você tiver ABSOLUTA CERTEZA do que está

68
realizando, ou se conhecer o autor do software, pode utilizar o comando #make NO
CHECKSUM=YES install
4. make extract – Nesta etapa o FreeBSD extrai o conteúdo baixado na pasta work
dentro da pasta do port em questão. Confira em algum port já instalado a
existência da pasta work como uma subpasta.
5. make patch – Os patches são aplicados no conteúdo extraído dentro da pasta
work.
6. make dependes – neste estágio são checadas se as dependências exigidas pelo
port estão instaladas, caso não, elas são baixadas e instaladas. Neste momento
o FreeBSD age recursivamente, buscando todas as dependências e executando
todos os passos citados.
7. make configure – Apesar de se assemelhar ao segundo passo, esta etapa roda,
caso exista, o script de configuração do próprio port. Algumas vezes a instalação
do port é interrompida neste momento esperando que alguma ação seja tomada
pelo administrador de sistemas, mas geralmente ela roda silenciosamente.
8. make build – Aqui ocorre a compilação do port.
9. make install – Finalmente o port é instalado e registrado em /var/db/pkg. Esta
opção, caso seja digitada chama todas as opções acima.

Existem outras opções que não são executadas no momento da instalação de um ports,
mas não são menos importantes. Todos os comandos listados a seguir devem ser
executados dentro da pasta de um port específico:
make showconfig: mostra as opções de configuração de um port;
make rmconfig: remove as opções configuradas para este port através do
parâmetro make config visto anteriormente;
make fetch-list: mostra a lista de todos os arquivos necessários que devem
ser puxados para a construção do port;
make clean: remove o código fonte que foi descompactado;
make distclean: remove o port distfile (arquivo .tgz que fica em
/usr/ports/distfiles) e depois executa a opção clean;
make reinstall: usado para restaurar um port depois de ter usado o
pkg_delete ou a opção deinstall;
make deinstall: remove o port instalado do sistema. Similar ao comando
pkg_delete.
make readmes: cria um README.html do port com várias informações sobre
o aplicativo e pode ser visualizado através de um navegador;
make package: esta opção cria um package binário do port em questão;

Outros comandos que devem ser executados na raiz do ports (/usr/ports):


make Index: cria o /usr/ports/INDEX com as informações que são utilizadas
para fazer pesquisas com o parâmetro search;
make fetchindex: puxa o INDEX do cluster do projeto FreeBSD;
Também o comando make search explicado anteriormente.
69
NOTA Existe uma grande diferença entre os comandos make index e make fetchindex.
O comando make index irá criar o arquivo de índice pela árvore do ports instalada no sistema,
para isso terá que entrar dentro de cada pasta, recolhendo as informações necessárias para a
montagem do arquivo. Este processo pode ser muito demorado dependendo do hardware
utilizado.
O comando make fetchindex baixa do site do FreeBSD o arquivo de índice atual. Esta é a
melhor opção para verificar se os ports estão atualizados com o comando pkg_info –vI.

4.4.1 Customizações integradas


Customizar a instalação de aplicativos não é uma tarefa fácil, especialmente quando
esta se dá através da compilação e instalação de um aplicativo pelo seu código fonte. A
coleção de ports do FreeBSD tenta amenizar a dificuldade desta tarefa para seus
usuários, oferecendo duas opções de customização para instalação de aplicativos.
A mais nova é suportada pelo comando make config. Este comando ao ser executado
mostra ao usuário uma tela chamada dialog box, semelhante a utilizada no processo de
instalação do FreeBSD. Por esta tela é possível marcar e desmarcar opções utilizando
as teclas de navegação do teclado e a barra de espaço.
Como exemplo são mostradas as opções de configuração do PHP5, localizado em
/usr/ports/Lang/php5.

Após a seleção das opções, basta utilizar a tecla TAB para navegar até o botão ok e
pressionar enter. O sistema irá voltar para o terminal caso o comando digitado foi make
config ou irá continuar a instalação caso o comando digitado tenha sido o make install.
Todas as opções marcadas ou não são gravadas dentro de um arquivo de configuração
localizado em /var/db/ports/<nome_do_port>/options, assim caso esse aplicativo tenha

70
que ser reinstalado, o sistema busca automaticamente essas configurações no
momento da execução de um make install.
Caso deseje reinstalar o aplicativo com configurações diferentes, basta rodar
novamente o comando make config, apagar o arquivo options ou então utilizar o
comando make rmconfig antes de utilizar o make install.

Esta forma torna a instalação de aplicativos mais fácil, mas nem todo port dentro da
árvore possui uma interface de configuração. Alguns mostram suas opções de
configuração após a execução do make install.
Tomando como base o servidor de banco de dados mysql, podemos exemplificar como
isso acontece.
Ao entrar em seu diretório, /usr/ports/databases/mysql50-server e executar o comando
make config, nos deparamos com o seguinte resultado:
# make config
===> No options to configure

Mas ao se executar o comando make install, uma lista de opções irá aparecer antes do
download do código fonte se iniciar. Neste momento é necessário pressionar crtl+c para
abortar a operação e realizar alguma configuração adicional, caso necessário.

# make install

You may use the following build options:

WITH_CHARSET=charset Define the primary built-in charset (latin1).


WITH_XCHARSET=list Define other built-in charsets (may be 'all').
WITH_COLLATION=collate Define default collation (latin1_swedish_ci).
WITH_OPENSSL=yes Enable secure connections.
WITH_LINUXTHREADS=yes Use the linuxthreads pthread library.
WITH_PROC_SCOPE_PTH=yes Use process scope threads
(try it if you use libpthread).
BUILD_OPTIMIZED=yes Enable compiler optimizations
(use it if you need speed).
BUILD_STATIC=yes Build a static version of mysqld.
(use it if you need even more speed).
WITHOUT_THR_ALARM=yes Disable signals (this reduces kernel lock
contention on SMP, but has the side effect that you can't kill clients
that are sleeping).
WITHOUT_INNODB=yes Disable support for InnoDB table handler.
WITH_ARCHIVE=yes Enable support for Archive Storage Engine.
WITH_CSV=yes Enable support for CSV Storage Engine.
WITH_FEDERATED=yes Enable support for Federated Storage Engine.
WITH_NDB=yes Enable support for NDB Cluster.
=> mysql-5.0.86.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch from
ftp://ftp.fi.muni.cz/pub/mysql/Downloads/MySQL-5.0/.
^C
Se desejar alterar alguma opção, deverá novamente rodar o comando make install com
mais um argumento:
#make WITH_FEDERATED=no install

Para desabilitar o suporte de Engines de Storages Federados.


71
Caso deseje mais informações sobre cada opção que os aplicativos permitem que
sejam configuradas, basta ler o Makefile contido em cada pasta de aplicativo e buscar
por entradas do tipo “.if defined”.

NOTA Os caminhos para a configuração dos aplicativos foram dados, agora para uma correta
configuração de cada aplicativo ou uma melhor configuração para o seu cenário em específico,
será necessária uma boa leitura dos manuais de instalação e configuração do aplicativo em
seu site de origem.

4.4.2 Inicializando o port instalado no boot do sistema.

A partir da séria 5.X do FreeBSD foram incorporados os scripts de inicialização RC-NG


(nova geração) e com isso uma série de modificações foram impostas. Uma dessas
modificações foi o processo de inicialização de um aplicativo. Ao ser instalado é criado
dentro de /usr/local/etc/rc.d um script de inicialização com o nome do aplicativo
instalado e a extensão .sh. Isso bastava para que o aplicativo fosse inicializado. Depois
das mudanças se fez necessário adicionar uma entrada no arquivo /etc/rc.conf com a
seguinte sintaxe: nome_do_aplicativo_enable=”YES”.
Sem essa entrada o aplicativo não é inicializado.
Alguns aplicativos possuem flags especiais que podem ser configuradas no momento
da execução, para isso é sempre bom verificar o script de inicialização deste aplicativo
para encontrar essas flags que também são adicionadas no arquivo /etc/rc.conf.

4.4.3 Desinstalando e reinstalando

Uma característica sobre a instalação de ports é que após sua instalação, o port é
tratado pelo sistema como um package, dessa forma ele pode ser desinstalado pelo
comando pkg_delete e informações sobre ele podem ser obtidas através do comando
pkg_info e os arquivos instalados podem ser pesquisados dentro de /var/db/pkg.
A coleção do ports também disponibiliza uma ferramenta para a remoção de seus ports
instalados, para isso basta acessar, dentro da árvore do ports, a pasta do port em
questão e utilizar o comando make deinstall.
Após a desinstalação do port, o programa compilado e também seus códigos continuam
dentro do subdiretório work no port. Rodando o comando make reinstall irá reinstalar o
programa desinstalado do sistema.

4.4.4 Mantendo a árvore limpa

Após a instalação de vários aplicativos a árvore do ports ocupará cada vez mais
espaço, pois a cada aplicativo instalado são baixados para a árvore seu código fonte e
criados no subdiretório work de cada port arquivos intermediários utilizados no processo
de instalação e configuração.
Para limpar esses arquivos basta acessar o diretório do port e executar make clean que
irá apagar o subdiretório work do port em questão e de todas as suas dependências. Se
preferir executar esta limpeza logo após a instalação do port, basta executar o comando
make install clean.
Também é possível limpar os arquivos compactados que são armazenados dentro de
/usr/ports/distfiles utilizando o comando make distclean. Este comando remove este
arquivo compactado e também o diretório work.
72
Agora se preferir fazer uma limpeza geral na árvore, basta digitar, dentro de /usr/ports/
o comando make clean –DNOCLEANDEPENDS. Esta ação irá levar algum tempo para
ser executada.

73
74
5 Kernel
5.1 O que é o kernel?
Sendo o principal componente de um sistema operacional Unix like, o kernel do
FreeBSD tem como função principal ser uma interface entre hardware e software.
O Kernel permite que o software escreva dados nos discos rígidos e também na rede.
Quando um programa necessita de memória, é o kernel que realiza a manipulação de
baixo nível para acessar a memória e alocar recursos para a tarefa. Também quando
um programa requisita tempo de CPU, o kernel agenda um slot de tempo para esta
tarefa. Dessa forma pode-se dizer que o kernel provê toda a interface de software que
os programas necessitam para acessar os recursos de hardware.
Enquanto que, de uma maneira simplista, o trabalho do kernel é fácil de ser definido,
este, na verdade, é um trabalho árduo. Diferentes programas exigem do kernel
diferentes interfaces para o hardware e diferentes tipos de hardware. Por exemplo, o
FreeBSD suporta algumas dúzias de placas de rede, cada qual com suas
especificações particulares para o kernel. Diferentes programas fazem diferentes
requisições de memória para serem executados, obrigando o kernel a interpretar e
realizar da melhor forma possível, garantindo sempre a integridade do sistema.
O kernel e seus módulos ficam no diretório /boot/kernel. Os demais arquivos do sistema
que não ficam no kernel são chamados de userland.
Quando o sistema é instalado, este utiliza um kernel genérico, ou seja, padrão,
possuindo suporte a uma grande variedade de dispositivos de hardware.
Saber como customizar o kernel é uma das primeiras tarefas que um administrador de
sistemas deve saber. Este processo é normalmente simples de ser executado e pode
trazer um grande ganho ao sistema. A forma mais simples de alterar o kernel sem exigir
sua recompilação é a utilização da interface sysctl.

5.2 Sysctl
O programa Sysctl (8) faz uso da função sysctl para retornar ou setar valores para o
kernel. Os valores retornados ou setados para o kernel são descritos através de uma
variável especial, chamada de Management Information Base (MIB), descrita como
conjuntos de strings separados por pontos.
Sysctl é uma ferramenta muito poderosa, pois em muitas vezes permite que
administradores de sistemas resolvam problemas de performance sem a necessidade
de recompilar o kernel. Por outro lado, todo este poder permite ao administrador causar
danos a programas que estão em memória.
Para exibir todas as sysctl do sistema, basta utilizar o comando:
#sysctl –A

Caso queira uma descrição ao invés da exibição dos valores, utilize o comando:
#sysctl –d –A

5.2.1 Sysctl MIBs

75
Como foi dito anteriormente, a sysctl é organizada na forma de uma MIB, possuindo
categorias distintas. A tabela x mostra as categorias raízes da MIB das sysctl.
Sysctl Função
Kern Funções e características do kernel
Vm Sistema de memória virtual
Vfs Sistema de arquivos
Net Rede
Debug Debug
Hw Hardware
machdep Dependências do micro
User Informações de interface da Userland
P1003_1b Comportamento POSIX
Security Atributos de segurança do kernel
Dev Informações de drivers
Tabela 1 - sysctl MIBs

Cada uma das categorias mencionadas possui outras subdivisões. Para exibir todas as
sysctl de uma única categoria, basta utilizar o comando #sysctl <categoria>, por
exemplo:
#sysctl user

Ou pode-se passar o nome completo da sysctl, neste caso:


#sysctl kern.bootfile
kern.bootfile: /boot/kernel/kernel

5.2.2 Manipulando Sysctls

Algumas sysctls são do tipo somente leitura, geralmente as relacionadas ao hardware,


como por exemplo:
#sysctl hw.model
hw.model: Intel(R) Core(TM)2 Duo CPU T7100 @ 1.80GHz

Caso tente mudar alguma sysctl relacionada ao tipo de equipamento, vai se deparar
com esta mensagem:
# sysctl hw.model=AMD
sysctl: oid 'hw.model' is read only

As que não são marcadas com o atributo de somente leitura podem ser alteradas
através do comando sysctl seguida do nome completo da sysctl o sinal de igual e o
valor desejado.
#sysctl kern.securelevel=1

Toda e qualquer modificação através do comando sysctl será mantida até o momento
da reinicialização do sistema. Para manter a modificação permanente, é necessário
adicionar a sysctl e seu valor no arquivo /etc/sysctl.conf
Para maiores informações sobre sysctl, verifique sua manpage.
76
5.3 Módulos de kernel
Tradicionalmente o FreeBSD teve o chamado kernel monolítico, o que significa que
este kernel era um grande programa provedor de suporte a uma lista fixa de
dispositivos. Caso surgisse a necessidade de alteração desta lista, sendo ela por
inclusão ou exclusão de algum item, uma nova compilação do kernel deveria ser
executada e o sistema reiniciado.
Hoje em dia o FreeBSD está mudando rapidamente para um modelo onde muitas
funcionalidades do kernel estão contidas em módulos, que podem ser dinamicamente
carregados e descarregados. Esta nova característica permite que o kernel se adapte
rapidamente a um novo hardware que passa a ser reconhecido instantaneamente,
como por exemplo, um cartão PCMCIA em um laptop, ou que uma nova funcionalidade
que não era necessária no momento da compilação seja trazida para dentro do kernel.
Esta característica é conhecida como kernel modular.
Assim como o kernel default fica no diretório /boot/kernel/kernel os módulos do kernel
ficam em /boot/kernel. Cada módulo de kernel termina com a extensão .ko (no momento
em que esta apostila foi escrita a pasta continha 608 módulos).

5.3.1 Visualizando os módulos carregados


A visualização dos módulos de kernel carregados é feita através do comando kldstat (8)
#kldstat
Id Refs Address Size Name
1 4 0xc0400000 b6dfe0 kernel

Cada módulo carregado possui diversos submódulos, que podem ser exibidos através
do comando kldstat –v. O kernel por si só carrega diversos submódulos, portanto utilizar
o comando kldstat –v trará uma saída extensa.

5.3.2 Carregando e descarregando módulos


As tarefas de carregar e descarregar um módulo de kernel podem ser executadas com
os comandos kldload (8) e kldunload (8)
Em sua versão 7.0 o FreeBSD não vinha por default com o módulo de criptografia wep
habilitado, neste caso se você deseja-se utilizar esta opção teria que carregar
dinamicamente o módulo de kernel responsável por esta funcionalidade, neste caso o
wlan_wep.ko com o seguinte comando:
#kldload wlan_wep

O FreeBSD 8 já vem com esta opção carregada no kernel, portanto se tentar executar
este comando, receberá o seguinte erro:
#kldload wlan_wep
kldload: can't load wlan_wep: File exists

Este erro ocorre porque o módulo referente ao WEP já está carregado no kernel, basta
observar os submódulos carregados com a opção kdlstat –v.

77
Para descarregar um módulo já carregado, basta utilizar o comando kldunload e o
nome do módulo.
No caso do exemplo acima, se estivesse na versão 7 do FreeBSD, bastaria digitar:
#kldunload wlan_wep

Para descarregar o módulo referente ao WEP.


Vale lembrar que módulos carregados via kldload só ficaram na memória até a próxima
reinicialização do equipamento, caso deseje que um módulo seja carregado no
momento do boot, deve adicioná-lo no arquivo /boot/loader.conf
Uma lista completa de toas as opções e módulos que podem ser carregados via
loader.conf estão em /boot/defaults/loader.conf

A parte mais complicada ao se trabalhar com módulos de kernel é saber qual módulo a
ser carregado. Geralmente este recurso será utilizado quando um novo dispositivo,
como uma placa de rede, for instalada e esta não estiver com suporte habilitado no
kernel.
Nota Mesmo tendo o recurso de carregamento de módulos, sempre que for necessário carregar um
módulo que irá funcionar por um período de tempo razoavelmente longo, como a substituição
de uma placa de rede queimada, é interessante recompilar o kernel para habilitar o suporte
diretamente nele, isso pode melhorar a performance

5.4 Construindo seu próprio Kernel

Eventualmente você verá que algumas otimizações não podem ser feitas somente via
sysctl e módulos. Algumas vezes será necessário retirar o suporte para dispositivos que
não estão presentes no seu equipamento, como por exemplo, o suporte para diversas
controladoras SCSI em um equipamento que possui apenas interfaces IDE. Neste caso
uma nova compilação do kernel precisará ser feita.
O kernel entregue no processo de instalação é chamado GENERIC, o arquivo de
configuração fica armazenado em /usr/src/sys/i386/conf/GENERIC. Este kernel é
configurado para rodar em uma grande variedade de hardware, desde os micros mais
velhos até os mais atuais.

NOTA O hardware mais novo pode suportar otimizações não implementadas no kernel GENERIC,
para habilitar essas otimizações é necessário a sua inclusão e após, a compilação do novo
kernel.

O processo de compilação de um novo kernel é extremamente simples, mas deve ser


executado com muita atenção e cautela para que tudo funcione novamente após o
boot.
Antes de iniciarmos o processo de configuração de um kernel, é necessário saber
algumas informações em relação ao hardware, como por exemplo:
Tipo/família do processador
Quantidade de memória RAM
Dispositivos instalados

Para isso o FreeBSD fornece algumas ferramentas, como o dmesg, sysctl, uname e
pciconf.
78
5.4.1 Arquivo de configuração
Todo arquivo de configuração do kernel possui cinco tipos de entradas: CPU, ident,
makeoptions, options e devices. A presença ou ausência dessas entradas dita a forma
com que o kernel irá suportar as funções associadas ou o hardware.
cpu: este label indica o tipo de CPU que o kernel suporta, que pode ser desde
os antigos 486 até os mais novos processadores.
ident: Todo kernel possui esta única linha de identificação, é no campo ident que
setamos o nome do kernel.
makeoptions: Esta opção dá instruções para o software que irá montar o kernel.
A opção mais usual é DEBUG=-g que compila um kernel com a função debug
habilitada. A função debug é muito utilizada por desenvolvedores para encontrar
problemas de software.
options: São opções que podem ser habilitadas no kernel sem a necessidade de
um hardware específico, como por exemplo o tipo do sistema de arquivos ou os
protocolos de rede suportados.
devices: Também conhecido como device drivers, esta opção provê ao kernel
instruções para a comunicação com os dispositivos instalados. Se desejar que o
kernel tenha suporte ao hardware instalado, por via de regra, o hardware deve
estar listado aqui. Alguns dispositivos chamados pseudodevices não estão
ligados a um hardware em particular, mas suportam uma categoria inteira de
hardware, como a interface de loopback.

NOTA Antes de prosseguirmos é necessário que tenha ficado clara a diferença entre options e
pseudodevices. Ambos são independentes de hardware, mas a grande diferença entre eles é
que o pseudodevice irá aparecer no sistema como um device, como por exemplo a interface de
loopback da rede, que é apresentada como lo0.

Com o conhecimento de todas as opções de configuração de um arquivo de kernel,


podemos explorar seu diretório, que fica em /sys/<arch>/conf onde arch indica a
arquitetura utilizada, neste caso, /sys/i386/conf. Este diretório possui vários arquivos,
mas os principais são DEFAULTS, GENERIC, GENERIC.hints, NOTES e PAE
DEFAULTS: É uma lista de opções e dispositivos que são habilitados para uma
determinada arquitetura. É um ponto de partida para um kernel realmente
mínimo.
GENERIC: É a configuração de um kernel padrão. Ele contém todas as
configurações para o reconhecimento do hardware de determinada arquitetura. É
o kernel distribuído pelo sistema.
GENERIC.hints: Possui informações de configuração de hardware mais antigo.
NOTES: Possui todas as opções de configuração de determinada plataforma.

79
PAE: Exemplo de arquivo de configuração do kernel para equipamentos com
mais de 4GB de memória RAM.

NOTA O arquivo NOTES deve ser utilizado apenas para encontrar configurações específicas da
plataforma escolhida, não deve ser compilado, pois várias opções existentes são conflitantes
entre sim.
Existe também um arquivo NOTES que independe da plataforma, este fica localizado em
/usr/src/sys/conf/NOTES

Agora veremos todo o arquivo de configuração:

#
# GENERIC -- Generic kernel configuration file for FreeBSD/i386
#
# For more information on this file, please read the config(5)
manual page,
# and/or the handbook section on Kernel Configuration Files:
#
#http://www.FreeBSD.org/doc/en_US.ISO8859-
1/books/handbook/kernelconfig-config.html
#
# The handbook is also available locally in
/usr/share/doc/handbook
# if you've installed the doc distribution, otherwise always see
the
# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
# latest information.
#
# An exhaustive list of options and more detailed explanations of
the
# device lines is also present in the ../../conf/NOTES and NOTES
files.
# If you are in doubt as to the purpose or necessity of a line,
check first
# in NOTES.
#
# $FreeBSD: src/sys/i386/conf/GENERIC,v 1.519.2.7 2010/01/12
06:00:56 brooks Exp $

cpu I486_CPU
cpu I586_CPU
cpu I686_CPU

As primeiras linhas são comentários sobre o kernel, onde encontrar mais informações e
a versão do arquivo. Logo abaixo encontramos a identificação da CPU suportada pelo
kernel. O interessante é manter somente a CPU referente ao equipamento, para isso,
podemos utilizar o dmesg:
#dmesg | grep CPU
80
CPU: Intel(R) Pentium(R) 4 CPU 1.80GHz (1799.80-MHz 686-class CPU)
cpu0: <ACPI CPU> on acpi0
p4tcc0: <CPU Frequency Thermal Control> on cpu0

Repare que a saída do comando informa o tipo de CPU “686-class CPU”, dessa forma,
podemos manter no arquivo de configuração, apenas a linha referente ao tipo 686.

Logo abaixo da CPU, encontramos a linha que identifica o kernel:


ident GENERIC
A palavra GENERIC precisa ser substituída pelo nome que está utilizando no seu
kernel.

Abaixo encontramos mais alguns comentários e também a linha referente ao debug


makeoptions DEBUG=-g # Build kernel with gdb(1) debug
symbols

Logo abaixo encontramos todas as opções que são suportadas pelo kernel GENERIC.

NOTA Todas as opções listadas vão depender da sua necessidade. Você durante o momento da
configuração do kernel pode retirar ou acrescentar opções, conforme sua necessidade.

options SCHED_ULE # ULE scheduler


options PREEMPTION # Enable kernel thread preemption

Estas opções controlam como o FreeBSD irá realizar seu escalonamento interno e qual
será a forma de tratamento das threads.

options INET # InterNETworking


options INET6 # IPv6 communications protocols
options SCTP # Stream Control Transmission Protocol
Informam os protocolos de rede suportados pelo kernel. INET habilita os protocolos da
pilha TCP/IP em sua versão 4, INET6 habilita a versão 6 dos protocolos de
comunicação, a linha referente ao SCTP dá ao kernel a capacidade de utilizar este
novo protocolo definido pela RFC 2960 para fazer o transporte das mensagens ao invés
de utilizar TPC ou UDP1.

options FFS # Berkeley Fast Filesystem


options SOFTUPDATES # Enable FFS soft updates support
options UFS_ACL # Support for access control lists
options UFS_DIRHASH # Improve performance on big directories
options UFS_GJOURNAL # Enable gjournal-based UFS journaling

Estas linhas indicam os sistemas de arquivos e suas respectivas opções. O FFS é o


sistema padrão do FreeBSD.

O próximo bloco de opções indicam as funcionalidades que o kernel pode suportar

1
Mais informações sobre a utilização do SCTP e seus ganhos como um protocolo de transporte podem
ser obtidas através da RFC 3286.
81
options MD_ROOT # MD is a potential root device
options NFSCLIENT # Network Filesystem Client
options NFSSERVER # Network Filesystem Server
options NFSLOCKD # Network Lock Manager
options NFS_ROOT # NFS usable as /, requires NFSCLIENT
options MSDOSFS # MSDOS Filesystem
options CD9660 # ISO 9660 Filesystem
options PROCFS # Process filesystem (requires PSEUDOFS)
options PSEUDOFS # Pseudo-filesystem framework
options GEOM_PART_GPT # GUID Partition Tables.
options GEOM_LABEL # Provides labelization
options COMPAT_43TTY # BSD 4.3 TTY compat (sgtty)
options COMPAT_FREEBSD4 # Compatible with FreeBSD4
options COMPAT_FREEBSD5 # Compatible with FreeBSD5
options COMPAT_FREEBSD6 # Compatible with FreeBSD6
options COMPAT_FREEBSD7 # Compatible with FreeBSD7
options SCSI_DELAY=5000 # Delay (in ms) before probing SCSI
options KTRACE # ktrace(1) support
options STACK # stack(9) support
options SYSVSHM # SYSV-style shared memory
options SYSVMSG # SYSV-style message queues
options SYSVSEM # SYSV-style semaphores
options P1003_1B_SEMAPHORES # POSIX-style semaphores
options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time
extensions
options PRINTF_BUFR_SIZE=128 # Prevent printf output being
interspersed.
options KBD_INSTALL_CDEV # install a CDEV entry in /dev
options HWPMC_HOOKS # Necessary kernel hooks for
hwpmc(4)
options AUDIT # Security event auditing
options MAC # TrustedBSD MAC Framework
options FLOWTABLE # per-cpu routing cache
#options KDTRACE_HOOKS # Kernel DTrace hooks

Abaixo temos as opções que habilitam o funcionamento do SMP no kernel


# To make an SMP kernel, the next two lines are needed
options SMP # Symmetric MultiProcessor Kernel
device apic # I/O APIC

O FreeBSD oferece nativamente três sistemas de filtragem de pacotes, o ipfw, ipfilter e


o PF. Ambos possuem suas vantagens e desvantagens.
Para habilitar o ipfw basta adicionar as seguintes linhas:

options IPFIREWALL #firewall

O parâmetro acima é suficiente para ativar o suporte ao uso do IPFW. Mas para seu
bom funcionamento é necessário adicionar mais algumas linhas:

82
options IPFIREWALL_VERBOSE #habilita o log de eventos no
syslog
options IPFIREWALL_FORWARD #suporte a Proxy transparente
options IPFIREWALL_VERBOSE_LIMIT=100 #limita a verbosidade

O ipfw também fornece a possibilidade da realização de controle de banda para


determinado serviço ou usuário, para habilitar esta opção o seguinte parâmetro deve
ser adicionado

options DUMMYNET

Se for necessário utilizar o servidor para a realizaçãod e NAT (Network Address


Translation), é preciso habilitar o suporte ao ipdivert através da adição do parêmetro

options IPDIVERT #divert sockets

Para habilitar suporte ao ipfilter, os parâmetros são um pouco diferentes. O suporte


básico é adicionado através dos parâmetros

options IPFILTER #ipfilter-suport


options IPFILTER_LOG #habilita o log
options IPFILTER_DEFAULT_BLOCK #block all packets by default

Diferente do ipfw, o ipfilter permite tudo por default, então é necessário acrescentar a
última linha acima para não termos um firewall completamente aberto.

Para habilitar o suporte ao PF (packet filter) basta adicionar as seguintes linhas:


device pf #habilita o packet filter
device pflog #habilita logs do pf

Sempre que um servidor faz um forward de um pacote de dados, o TTL deste pacote é
alterado. Se quisermos ocultar de um observador externo, um traceroute por exemplo,
que temos um gateway ou um firewall alocado em determinado seguimento da rede, o
FreeBSD possui uma função no kernel que faz com que ele não altere o TTL de
pacotes dos quais ele tenha feito forward, para ativar este recurso, basta ativar o
parâmetro:

options IPSTEALTH

Se seu servidor for executar algum tipo de serviço web, o FreeBSD dispõe de alguns
parâmetros com o objetivo de instruir o kernel a pré-processar as conexões entrantes
em seu sistema, reduzindo assim em alguns milisegundos o tempo necessário para o
estabelecimento de cada conexão. Estas opções funcionam muito bem em conjunto
com o servidor Apache.

options ACCEPT_FILTER_DATA
options ACCEPT_FILTER_HTTP

83
Se o servidor for utilizado como um gateway e possuir diversas interfaces de rede,
pode-se fazer um ajuste simples no kernel fazendo com que o processador dedique a
mesma atenção a cada uma delas, otimizando o tráfego em todas as interfaces e
garantindo um floxo de dados mais uniforme. Este recurso pode ser habilitado através
da opção:

options DEVICE_POLLING

NOTA As opções de device polling são suportadas somente pelas seguintes interfaces de rede:
bge, dc, em, fwe, fwip, fxp, ixgb, nfe, nge, re, rl, sf, sis, ste, stge, vge, vr e xl

O FreeBSD possui um parâmetro que permite ajustar os ciclos de operação do seu


sistema, este parâmetro é interessante para usuários de dummynet e device polling e é
habilitado pela opção:

options HZ=100

O valor padrão deste parêmatro é 100, o que representa uma granularidade de 10md
(1s/Hz), valores próximos a 1000 ou 1ms vão significar um desempenho melhor do
sistema, porém vão ocasionar algum overhead, de forma que deve-se ir ajustando o
parâmetro e medindo as mudanças, para cada processador pode-se chegar a um valor
diferente.

O FreeBSD também possui condições de ser utilizado como uma bridge entre duas
interfaces de rede, a principal característica de uma bridge é que ela mão pussui IP em
suas interfaces, as vantagens de sua utilização, são por exemplo, na construção de
firewalls, visto que pode-se configurar uma bridge para atuar como filtro de pacotes e
alocá-la em qualquer ponto da rede sem que seja necessário nenhum tipo de
configuração da mesma. Para habilitar este suporte basta habilitar o parâmetro:

options BRIDGE

Após as opções, temos os devices, todos eles comentados no próprio arquivo de


configuração.

# CPU frequency control


device cpufreq

# Bus support.
device acpi
device eisa
device pci

# Floppy drives
device fdc

# ATA and ATAPI devices


device ata
device atadisk # ATA disk drives
84
device ataraid # ATA RAID drives
device atapicd # ATAPI CDROM drives
device atapifd # ATAPI floppy drives
device atapist # ATAPI tape drives
options ATA_STATIC_ID # Static device numbering

# SCSI Controllers
device ahb # EISA AHA1742 family
device ahc # AHA2940 and onboard AIC7xxx devices
options AHC_REG_PRETTY_PRINT # Print register bitfields in
debug
# output. Adds ~128k to driver.
device ahd # AHA39320/29320 and onboard AIC79xx
devices
options AHD_REG_PRETTY_PRINT # Print register bitfields in
debug
# output. Adds ~215k to driver.
device amd # AMD 53C974 (Tekram DC-390(T))
device hptiop # Highpoint RocketRaid 3xxx series
device isp # Qlogic family
#device ispfw # Firmware for QLogic HBAs- normally a
module
device mpt # LSI-Logic MPT-Fusion
#device ncr # NCR/Symbios Logic
device sym # NCR/Symbios Logic (newer chipsets +
those of `ncr')
device trm # Tekram DC395U/UW/F DC315U adapters

device adv # Advansys SCSI adapters


device adw # Advansys wide SCSI adapters
device aha # Adaptec 154x SCSI adapters
device aic # Adaptec 15[012]x SCSI adapters, AIC-
6[23]60.
device bt # Buslogic/Mylex MultiMaster SCSI
adapters

device ncv # NCR 53C500


device nsp # Workbit Ninja SCSI-3
device stg # TMC 18C30/18C50

# SCSI peripherals
device scbus # SCSI bus (required for SCSI)
device ch # SCSI media changers
device da # Direct Access (disks)
device sa # Sequential Access (tape etc)
device cd # CD
device pass # Passthrough device (direct SCSI
access)

85
device ses # SCSI Environmental Services (and SAF-
TE)

# RAID controllers interfaced to the SCSI subsystem


device amr # AMI MegaRAID
device arcmsr # Areca SATA II RAID
device asr # DPT SmartRAID V, VI and Adaptec SCSI
RAID
device ciss # Compaq Smart RAID 5*
device dpt # DPT Smartcache III, IV - See NOTES for
options
device hptmv # Highpoint RocketRAID 182x
device hptrr # Highpoint RocketRAID 17xx, 22xx, 23xx,
25xx
device iir # Intel Integrated RAID
device ips # IBM (Adaptec) ServeRAID
device mly # Mylex AcceleRAID/eXtremeRAID
device twa # 3ware 9000 series PATA/SATA RAID

# RAID controllers
device aac # Adaptec FSA RAID
device aacp # SCSI passthrough for aac (requires
CAM)
device ida # Compaq Smart RAID
device mfi # LSI MegaRAID SAS
device mlx # Mylex DAC960 family
device pst # Promise Supertrak SX6000
device twe # 3ware ATA RAID

# atkbdc0 controls both the keyboard and the PS/2 mouse


device atkbdc # AT keyboard controller
device atkbd # AT keyboard
device psm # PS/2 mouse

device kbdmux # keyboard multiplexer

device vga # VGA video card driver

device splash # Splash screen and screen saver support

# syscons is the default console driver, resembling an SCO


console
device sc

device agp # support several AGP chipsets

# Power management support (see NOTES for more options)


#device apm
# Add suspend/resume support for the i8254.
86
device pmtimer

# PCCARD (PCMCIA) support


# PCMCIA and cardbus bridge support
device cbb # cardbus (yenta) bridge
device pccard # PC Card (16-bit) bus
device cardbus # CardBus (32-bit) bus

# Serial (COM) ports


device uart # Generic UART driver

# Parallel port
device ppc
device ppbus # Parallel port bus (required)
device lpt # Printer
device plip # TCP/IP over parallel
device ppi # Parallel port interface device
#device vpo # Requires scbus and da

# If you've got a "dumb" serial or parallel PCI card that is


# supported by the puc(4) glue driver, uncomment the following
# line to enable it (connects to sio, uart and/or ppc drivers):
#device puc

# PCI Ethernet NICs.


device de # DEC/Intel DC21x4x (``Tulip'')
device em # Intel PRO/1000 Gigabit Ethernet Family
device igb # Intel PRO/1000 PCIE Server Gigabit
Family
device ixgb # Intel PRO/10GbE Ethernet Card
device le # AMD Am7900 LANCE and Am79C9xx PCnet
device ti # Alteon Networks Tigon I/II gigabit
Ethernet
device txp # 3Com 3cR990 (``Typhoon'')
device vx # 3Com 3c590, 3c595 (``Vortex'')

# PCI Ethernet NICs that use the common MII bus controller code.
# NOTE: Be sure to keep the 'device miibus' line in order to use
these NICs!
device miibus # MII bus support
device ae # Attansic/Atheros L2 FastEthernet
device age # Attansic/Atheros L1 Gigabit Ethernet
device alc # Atheros AR8131/AR8132 Ethernet
device ale # Atheros AR8121/AR8113/AR8114 Ethernet
device bce # Broadcom BCM5706/BCM5708 Gigabit
Ethernet
device bfe # Broadcom BCM440x 10/100 Ethernet
device bge # Broadcom BCM570xx Gigabit Ethernet
device dc # DEC/Intel 21143 and various workalikes
87
device et # Agere ET1310 10/100/Gigabit Ethernet
device fxp # Intel EtherExpress PRO/100B (82557,
82558)
device jme # JMicron JMC250 Gigabit/JMC260 Fast
Ethernet
device lge # Level 1 LXT1001 gigabit Ethernet
device msk # Marvell/SysKonnect Yukon II Gigabit
Ethernet
device nfe # nVidia nForce MCP on-board Ethernet
device nge # NatSemi DP83820 gigabit Ethernet
#device nve # nVidia nForce MCP on-board Ethernet
Networking
device pcn # AMD Am79C97x PCI 10/100 (precedence
over 'le')
device re # RealTek 8139C+/8169/8169S/8110S
device rl # RealTek 8129/8139
device sf # Adaptec AIC-6915 (``Starfire'')
device sis # Silicon Integrated Systems SiS 900/SiS
7016
device sk # SysKonnect SK-984x & SK-982x gigabit
Ethernet
device ste # Sundance ST201 (D-Link DFE-550TX)
device stge # Sundance/Tamarack TC9021 gigabit
Ethernet
device tl # Texas Instruments ThunderLAN
device tx # SMC EtherPower II (83c170 ``EPIC'')
device vge # VIA VT612x gigabit Ethernet
device vr # VIA Rhine, Rhine II
device wb # Winbond W89C840F
device xl # 3Com 3c90x (``Boomerang'',
``Cyclone'')

# ISA Ethernet NICs. pccard NICs included.


device cs # Crystal Semiconductor CS89x0 NIC
# 'device ed' requires 'device miibus'
device ed # NE[12]000, SMC Ultra, 3c503, DS8390
cards
device ex # Intel EtherExpress Pro/10 and Pro/10+
device ep # Etherlink III based cards
device fe # Fujitsu MB8696x based cards
device ie # EtherExpress 8/16, 3C507, StarLAN 10
etc.
device sn # SMC's 9000 series of Ethernet chips
device xe # Xircom pccard Ethernet

# Wireless NIC cards


device wlan # 802.11 support
options IEEE80211_DEBUG # enable debug msgs
options IEEE80211_AMPDU_AGE # age frames in AMPDU reorder q's
88
options IEEE80211_SUPPORT_MESH # enable 802.11s draft support
device wlan_wep # 802.11 WEP support
device wlan_ccmp # 802.11 CCMP support
device wlan_tkip # 802.11 TKIP support
device wlan_amrr # AMRR transmit rate control algorithm
device an # Aironet 4500/4800 802.11 wireless
NICs.
device ath # Atheros pci/cardbus NIC's
device ath_hal # pci/cardbus chip support
options AH_SUPPORT_AR5416 # enable AR5416 tx/rx descriptors
device ath_rate_sample # SampleRate tx rate control
for ath
device ral # Ralink Technology RT2500 wireless
NICs.
device wi # WaveLAN/Intersil/Symbol 802.11
wireless NICs.
#device wl # Older non 802.11 Wavelan wireless NIC.

# Pseudo devices.
device loop # Network loopback
device random # Entropy device
device ether # Ethernet support
device vlan # 802.1Q VLAN support
device tun # Packet tunnel.
device pty # BSD-style compatibility pseudo ttys
device md # Memory "disks"
device gif # IPv6 and IPv4 tunneling
device faith # IPv6-to-IPv4 relaying (translation)
device firmware # firmware assist module

# The `bpf' device enables the Berkeley Packet Filter.


# Be aware of the administrative consequences of enabling this!
# Note that 'bpf' is required for DHCP.
device bpf # Berkeley packet filter

# USB support
device uhci # UHCI PCI->USB interface
device ohci # OHCI PCI->USB interface
device ehci # EHCI PCI->USB interface (USB 2.0)
device usb # USB Bus (required)
#device udbp # USB Double Bulk Pipe devices
device uhid # "Human Interface Devices"
device ukbd # Keyboard
device ulpt # Printer
device umass # Disks/Mass storage - Requires
scbus and da
device ums # Mouse
device urio # Diamond Rio 500 MP3 player

89
# USB Serial devices
device u3g # USB-based 3G modems (Option, Huawei,
Sierra)
device uark # Technologies ARK3116 based serial
adapters
device ubsa # Belkin F5U103 and compatible serial
adapters
device uftdi # For FTDI usb serial adapters
device uipaq # Some WinCE based devices
device uplcom # Prolific PL-2303 serial adapters
device uslcom # SI Labs CP2101/CP2102 serial adapters
device uvisor # Visor and Palm devices
device uvscom # USB serial support for DDI pocket's
PHS

# USB Ethernet, requires miibus


device aue # ADMtek USB Ethernet
device axe # ASIX Electronics USB Ethernet
device cdce # Generic USB over Ethernet
device cue # CATC USB Ethernet
device kue # Kawasaki LSI USB Ethernet
device rue # RealTek RTL8150 USB Ethernet
device udav # Davicom DM9601E USB

# USB Wireless
device rum # Ralink Technology RT2501USB wireless
NICs
device uath # Atheros AR5523 wireless NICs
device ural # Ralink Technology RT2500USB wireless
NICs
device zyd # ZyDAS zb1211/zb1211b wireless NICs

# FireWire support
device firewire # FireWire bus code
#device sbp # SCSI over FireWire (Requires scbus and
da)
device fwe # Ethernet over FireWire (non-standard!)
device fwip # IP over FireWire (RFC 2734,3146)
device dcons # Dumb console driver
device dcons_crom # Configuration ROM for dcons

5.4.2 Construindo o kernel


Após ver os exemplos de configuração você será capaz de customizar o seu próprio
kernel. É altamente recomendado que antes de qualquer compilação de kernel, uma
cópia de segurança do kernel atual deve ser feita. Para isso pode-se utilizar o comando:
#cp -Rp /boot/kernel /boot/kernel.generic

90
Após, copie o arquivo GENERIC para o nome do seu servidor e faça as alterações que
forem necessárias

#cp GENERIC nome_do_kernel

E finalmente, dê início a compilação do novo kernel. Para isso você deve chamar o
comando make, informando o nome do seu novo kernel, utilizando a seguinte sintaxe
#cd /usr/src
#make buildkernel KERNCONF=NOME_DO_KERNEL

Se tudo correr bem, uma mensagem será exibida na tela:


make buildkernel KERNCONF=GENERIC

--------------------------------------------------------------
>>> Kernel build for GENERIC started on Sun Feb 28 20:13:04 BRT 2010
--------------------------------------------------------------
===> GENERIC
mkdir -p /usr/obj/usr/src/sys

--------------------------------------------------------------
>>> stage 1: configuring the kernel
--------------------------------------------------------------
cd /usr/src/sys/i386/conf;
PATH=/usr/obj/usr/src/tmp/legacy/usr/sbin:/usr/obj/usr/src/tmp/legacy/us
r/bin:/usr/obj/usr/src/tmp/legacy/usr/games:/usr/obj/usr/src/tmp/usr/sbi
n:/usr/obj/usr/src/tmp/usr/bin:/usr/obj/usr/src/tmp/usr/games:/sbin:/bin
:/usr/sbin:/usr/bin config -d /usr/obj/usr/src/sys/GENERIC
/usr/src/sys/i386/conf/GENERIC
Kernel build directory is /usr/obj/usr/src/sys/GENERIC
Don't forget to do ``make cleandepend && make depend''

--------------------------------------------------------------
>>> stage 2.1: cleaning up the object tree
--------------------------------------------------------------
cd /usr/obj/usr/src/sys/GENERIC; MAKEOBJDIRPREFIX=/usr/obj
MACHINE_ARCH=i386 MACHINE=i386 CPUTYPE=
GROFF_BIN_PATH=/usr/obj/usr/src/tmp/legacy/usr/bin
GROFF_FONT_PATH=/usr/obj/usr/src/tmp/legacy/usr/share/groff_font
GROFF_TMAC_PATH=/usr/obj/usr/src/tmp/legacy/usr/share/tmac
_SHLIBDIRPREFIX=/usr/obj/usr/src/tmp VERSION="FreeBSD 8.0-RELEASE i386
800107" INSTALL="sh /usr/src/tools/install.sh"
PATH=/usr/obj/usr/src/tmp/legacy/usr/sbin:/usr/obj/usr/src/tmp/legacy/us
r/bin:/usr/obj/usr/src/tmp/legacy/usr/games:/usr/obj/usr/src/tmp/usr/sbi
n:/usr/obj/usr/src/tmp/usr/bin:/usr/obj/usr/src/tmp/usr/games:/sbin:/bin
:/usr/sbin:/usr/bin NO_CTF=1 make KERNEL=kernel cleandir
.
.
.
.

awk -f /usr/src/sys/conf/kmod_syms.awk zlib.kld export_syms | xargs -J%


objcopy % zlib.kld
ld -Bshareable -d -warn-common -o zlib.ko.debug zlib.kld
objcopy --only-keep-debug zlib.ko.debug zlib.ko.symbols
objcopy --strip-debug --add-gnu-debuglink=zlib.ko.symbols zlib.ko.debug
zlib.ko

91
--------------------------------------------------------------
>>> Kernel build for GENERIC completed on Sun Feb 28 20:53:57 BRT 2010
--------------------------------------------------------------
Caso ocorra algum erro de compilação, uma mensagem semelhante a esta será
exibida:
make buildkernel KERNCONF=BSDAFPU

--------------------------------------------------------------
>>> Kernel build for BSDAFPU started on Mon Mar 1 12:04:02 BRT 2010
--------------------------------------------------------------
===> BSDAFPU
mkdir -p /usr/obj/usr/src/sys

--------------------------------------------------------------
>>> stage 1: configuring the kernel
--------------------------------------------------------------
cd /usr/src/sys/amd64/conf;
PATH=/usr/obj/usr/src/tmp/legacy/usr/sbin:/usr/obj/usr/src/tmp/legacy/us
r/bin:/usr/obj/usr/src/tmp/legacy/usr/games:/usr/obj/usr/src/tmp/usr/sbi
n:/usr/obj/usr/src/tmp/usr/bin:/usr/obj/usr/src/tmp/usr/games:/sbin:/bin
:/usr/sbin:/usr/bin config -d /usr/obj/usr/src/sys/BSDAFPU
/usr/src/sys/amd64/conf/BSDAFPU
/usr/src/sys/amd64/conf/BSDAFPU: unknown option "tetse123"
*** Error code 1

Stop in /usr/src.
*** Error code 1

Stop in /usr/src.

Repare na mensagem unknow option “tetse123”, esta foi uma opção adicionada ao
arquivo de configuração do kernel que não é suportada por ele. Basta remover a opção
do arquivo de configuração e recompilar o kernel.

Ao receber a mensagem de sucesso, podemos partir para a instalação do kernel, que é


feita pelo comando:
#make installkernel KERNCONF=NOME_DO_KERNEL

Ao final da execução desses passos seu novo kernel está pronto para ser utilizado,
basta reiniciar o servidor para que ele entre em execução.

92
6. Atualização do FreeBSD
Vital para a manutenção da estabilidade e confiança do FreeBSD, sua atualização, por
incrível que pareça, é uma tarefa comum e simples. Mas antes de começarmos a
atualizar o sistema, é necessário conhecermos o funcionamento das versões do
FreeBSD.

6.1 Versoes do FreeBSD


O método de desenvolvimento do FreeBSD é a chave para sua atualização ser
relativamente simples. O desenvolvimento do FreeBSD é dado de forma contíunua, isso
significa que se você fizer o download da versão corrente do dia atual, ela será um
pouco diferente da versão do dia anterior. Desenvolvedores ao redor do mundo realizão
modificações e melhoramentos continuamente, fazendo com que a forma tradicional de
numeração de releases de alguns softwares de código livre se tornem impraticáveis no
projeto. Em um dado momento é possível obter diferentes versões do FreeBSD:
releases, errata branches, -stable e -current.

6.1.1 Releases
Uma release é simplesmente uma cópia da versão mais estável do FreeBSD em um
momento particular do tempo. Possui um número convencional, como 5.5, 6.3, 7.0 entre
outros. De três a quatro vezes no ano, o Release Engineering team solicita aos
desenvolvedores focarem nos problemas de maior importância ao invés de realizarem
outras mudanças. Durante este período várias Releases Candidates são liberadas para
testes, tanto da comunidade quanto da equipe do FreeBSD. Quando a equipe do
FreeBSD está satisfeita com seus próprios testes e da comunidade, dão um número
para esta release e ela é liberada. Após a equipe de desenvolvimento volta aos
trabalhos regulares do projeto.

6.1.2 Errata Branches


Uma errata branch é uma release específica do FreeBSD contendo alguns patches de
segurança e estabilidade para aquela release.

6.1.3 FreeBSD-current
FreeBSD-current ou apenas -current é o nome da árvore de desenvolvimento do
FreeBSD. Esta versão é recomendável apenas para desenvolvedores e usuários
interessados em testar suas novas funcionalidades. É altamente recomendável não
utilizar versões –current em servidores de produção.

6.1.4 FreeBSD-stable
FreeBSD-stable ou apenas –stable é a versão mais estável do FreeBSD. Trata-se de
uma versão –current que foi arduamente testada pelos seus desenvolvedores e vários
usuários ao redor do mundo. Esta versão é a recomendada para a maioria dos
servidores em produção.

93
6.2 Métodos de atualização.

O FreeBSD dispõe de três métodos diferentes de atualização: sysinstall, atualização


binária e atualização a partir do código fonte. Dentre essas três abordaremos apenas as
atualizações binárias e pelo código fonte.

6.3 Atualização Binária


A partir de sua versão 6.2 foi incorporado na base do FreeBSD um utilitário que
possibilita a atualização binária do sistema, o freebsd-update.
O freebsd-update permite que usuários atualizem o sistema para a mais nova errata
branch. Ele não permite que uma atualização para –stable ou –current. Este utilitário só
fornece atualizações para o kernel Generic, caso utilize um kernel customizado, será
necessária a aplicação manual dos patches de correção logo após realizar a
atualização do sistema.
O arquivo de configuração do freebsd-update está localizado em /etc/freebsd-
update.conf. O arquivo de configuração em sua forma padrão atende todas as
necessidades para o processo de atualização, mas é interessante conhecermos as
principais opções do seu arquivo de configuração:

KeyPrint 8006.........
KeyPrint é uma assinatura criptográfica do servidor de atualização para garantir
sua integridade.

ServerName update.FreeBSD.org
Esta linha indica ao freebsd-update onde buscar as atualizações.

Components src world kernel


Indica os componentes a serem atualizados. Neste caso a atualização será em
todo o código fonte, na userland (world) e no kernel Generic.

UpdateIfUnmodified /etc/ /var/


O FreeBSD update irá atualizar os arquivos dentro de /etc. Caso esta opção
esteja ativa no arquivo de configuração, o processo de atualização irá alterar apenas os
arquivos que não foram modificados, garantindo dessa forma que não ocorra nenhuma
surpresa desagradável após a atualização.

Mailto root
Se o processo de atualização foi agendado, como será descrito posteriormente,
esta linha faz com que o utilitário freebsd-update envie uma mensagem de e-mail ao
destinatário escolhido em caso de sucesso ou fracasso na atualização.

KeepModifiedMetadata yes
Não deixa que o freebsd-update faça alterações nas permissões que porventura
foram alteradas em alguns arquivos.

6.3.1 Utilizando o freebsd-update

94
O processo de atualização binária é dividido em duas etapas, download das
atualizações e aplicação delas.
Para a atualização da versão mais recente da errata branch, basta digitar:
#freebsd-update fetch

Será então o programa buscando uma fonte para os patches, comparando as chaves
criptográficas e eventualmente, o download dos patches. Após será mostrado os
patches que foram baixados.
O freebsd-update armazena os patches em /var/db/freebsd-update. Para instalar os
patches, basta digitar:
#freebsd-update install

Isto é tudo, basta reiniciar o sistema para ter a mais nova versão errata branch.
Caso ocorra algum problema após a instalação das atualizações, basta utilizar:

#freebsd-update rollback

Esta opção irá desinstalar a ultima atualização realizada.

Para automatizar o processo de atualização binária é necessário criar uma entrada em


/etc/crontab com o comando freebsd-update cron, que aguarda aleatoriamente um
intervalo de tempo entre 1 e 3600 segundos para realizar a atualização.
Este comando é particularmente usual quando se possui alguns servidores na mesma
rede e todos são programados para se atualizarem às 5 da manhã, por exemplo, assim
utilizando o comando freebsd-update cron, o risco de dois ou mais servidores iniciarem
o processo de atualização ao mesmo tempo é mínimo, evitando assim gargalos no link
de comunicação.
Após o download dos patches, um e-mail será enviado para o administrador daqueles
servidores que poderá agendar um reboot em um horário mais conveniente.

6.4 Atualização por código fonte


Outra forma de atualizar o sistema é construí-lo diretamente do código fonte, sendo
assim a primeira tarefa a ser executada é baixar o código fonte. O projeto FreeBSD
utiliza um servidor CVS totalmente reescrito, sendo mais rápido e consumindo uma
menor quantidade de recursos que os servidores CVSs tradicionais. Estes servidores
também são conhecidos como CVSup Server. Para realizar o download do código fonte
é utilizada uma ferramenta chamada csup, que se conecta a algum mirror do servidor
CVSup, compara o código fonte do sistema em questão com o código fonte
armazenado no servidor e copia apenas os arquivos que foram alterados para o
sistema, evitando assim a necessidade de baixar todo o código fonte do sistema a cada
atualização.
Para iniciar a atualização dos fontes, basta dizer ao csup o que atualizar, de onde
atualizar e como realizar a atualização. Isto é feito pelo arquivo Supfile.
Os arquivos de exemplos de configuração de um supfile ficam armazenados em
/usr/share/examples/cvsup e podem ser utilizados para atualizar diferentes tipos de
versões. Os arquivos encontrados neste diretório são:
95
cvs-supfile: Este supfile mantém todo o repositório de código fonte do FreeBSD,
mas é recomendado apenas para desenvolvedores.
doc-supfile: Este arquivo informa ao csup para atualizar a documentação local do
sistema (FAQ, Handbook e alguns artigos).
gnats-supfile: Irá criar uma cópia local dos relatórios de problemas (Problem
Report – PR).
ports-supfile: Este supfile atualiza a árvore do ports para a última versão.
stable-supfile: Atualiza o código fonte para a última versão estável.
standard-supfile: Este supfile irá atualizar os fontes do sistema para a última
versão do sistema instalado.
www-supfile: Faz o download da última versão do website do FreeBSD

Os vários componentes que podem ser atualizados via csup são chamados também de
coleções, por exemplo, coleção do ports, coleção da documentação, coleção dos
fontes. O objetivo deste capítulo é a atualização da coleção dos fontes.

Para a maior parte dos servidores, o arquivo mais indicado é o stable-supfile, e é este
arquivo que será explorado.

6.4.1 Stable-supfile
Baseado no arquivo de exemplo, um arquivo supfile deve ser:

*default host=cvsup.br.FreeBSD.org
*default base=/var/db
*default prefix=/usr
*default release=cvs tag=RELENG_8
*default delete use-rel-sulfix
*defaul compress
src-all

*default host=cvsup.br.FreeBSD.org

Essa linha indica o servidor do repositório onde o sistema será sincronizado. Dessa o
servidor cvsup.br.FreeBSD.org será o servidor de onde todo o código fonte do sistema
será atualizado.

*default base=/var/db
Esta linha indica ao csup onde armazenar os arquivos de status, incluindo uma lista de
arquivos baixados. Isto acelera as próximas atualizações. Todas as informações
geradas pelo csup são armazenadas em /var/db/sup

*default prefix=/usr
Esta entrada direciona o csup a colocar todos os arquivos de códigos fonte que ele
atualiza no diretório indicado. Não é recomendado alterar este parâmetro, somente em
casos específicos onde os fontes não estão armazenados em /usr/src.

96
*default release=cvs tag=RELENG_8
Esta entrada contém duas informações, a primeira indica que o csup deverá atualizar o
código fonte para a versão estável no repositório (default release=cvs). Essa opção é
que garante que após a atualização do sistema, este estará com as últimas e mais
estáveis versões possíveis, portanto esta opção nunca deve ser alterada. A segunda
informação (tag=RELENG_8) indica para qual versão do FreeBSD o csup deverá
atualizar. Nesta opção a indicação feita ao csup é que este deve atualizar para a última
versão estável disponível do FreeBSD 8, tornando o sistema STABLE.
Para instalar uma errata branch da versão 8.0, a tag é: tag=RELENG_8_0

Caso queira atualizar o sistema para a versão –current, utilize a seguinte tag:
*default release=cvs tag=.

*default delete use-rel-sulfix


A opção delete fornece plenas permissões para o csup deletar todos os arquivos que
forem descenessários após durante a após a atualização do sistema. Já a opção use-
rel-sulfix indica ao csup para utilizar o sufixo da releng que será utilizada na atualização.
*defaul compress
Esta opção faz com que o csup utilize um método de compresão para fazer o download
dos fontes, economizando banda.

src-all
Por fim, esta linha indica ao sistema que todos os fontes serão atualizados, sem
nenhuma excessão. Caso exista a necessidade de atualizar algum módulo em
específico, seja pela vontade do administrador ou mesmo por uma descoberta de
vulnerabilidade, basta comentar a linha src-all e descomentar as opções que necessitar:
#src-base
#src-bin
#src-contrib
#src-etc
#src-games
#src-gnu
#src-include
#src-kerberos5
#src-kerberosIV
#src-lib
#src-libexec
#src-release
#src-sbin
#src-share
#src-sys
#src-tools
#src-usrbin
#src-usrsbin
#src-crypto
#src-eBones
#src-secure
#src-sys-crypto

97
Estas são as opções necessárias para a atualização do sistema. Para criar o arquivo
supfile, basta utilizar um editor de sua preferência e criar o arquivo /etc/supfile. Se
quiser apenas escolher opções ao invés de criar um arquivo novo, basta utilizar o
comando:

#cp /usr/share/examples/cvsup/stable-supfile /etc/supfile

Ao final desta etapa, a atualização do sistema pode ser iniciada.

Para dar início a atualização do sistema, basta utilizar o comando:

#csup -g -L 2 /etc/supfile

Onde -g desabilita o modo gráfico e -L 2 indica ao csup para utilizar a verbosidade mais
detalhada possível. A opção -L comporta 3 opções, de 0 a 2, onde 0 não exibe nada a
não ser mensagens de erro e 2 é a opção mais detalhada.

O csup permite que o endereço do servidor de repositório seja fornecido no momento


da atualização com a opção -h seguida do nome do servidor. Com esta opção o host
declarado no arquivo supfile é ignorado.
Uma dica é no momento da atualização, utilizar um utilitário chamado fastest_cvsup,
localizado em /usr/ports/sysutils/fastest_cvsup, que indica dentro de um determinado
país, quais são os três servidores CVSup mais rápidos.
Por exemplo, uma busca pelos servidores mais rápidos no Brasil:

#fastest_cvsup -c br
>> Querying servers in countries: br
--> Connecting to cvsup.br.freebsd.org [143.106.51.13]...
- server replied: OK 17 0 SNAP_16_1h CVSup server ready
- time taken: 4.91 ms
--> Connecting to cvsup2.br.freebsd.org [143.106.10.150]...
- server replied: OK 17 0 SNAP_16_1h CVSup server ready
- time taken: 1.19 ms
--> Connecting to cvsup3.br.freebsd.org [146.164.53.65]...
- server replied: OK 17 0 SNAP_16_1h CVSup server ready
- time taken: 11.61 ms

>> Speed Daemons:


- 1st: cvsup2.br.freebsd.org
- 2nd: cvsup.br.freebsd.org
- 3rd: cvsup3.br.freebsd.org

Pode-se notar que o servidor mais rápido é o cvsup2.br.freebsd.org, assim ele pode ser
declarado no momento da execução do csup:

#csup -g –h cvsup2.br.freebsd.org -L 2 /etc/supfile

Para simplificar, o mesmo comando pode ser dado da seguinte forma:

#csup -g -h `fastest_cvsup -c br -Q` -L2 /etc/supfile

98
6.4.2 Construção do FreeBSD a partir do fonte.
Após ter baixado a última versão do código fonte e antes de inicializar o processo de
construção, é altamente recomendável a leitura do arquivo /usr/src/UPDATING, que
contém em ordem cronológica inversa, qualquer aviso e informações importantes sobre
alterações no sistema. Ler este arquivo com atenção irá evitar dores de cabeça no
processo de atualização.

Para dar inicio ao processo de compilação da base do sistema, a primeira coisa a ser
feita é estar dentro do diretório /usr/src
Para a construção do sistema, o comando utilizado é o make, que lê as instruções do
arquivo /usr/src/Makefile e as executa na ordem que devem ser executadas.
Dessa forma a execução deve ser:

#cd /usr/src
#make buildworld

O comando make buildworld funciona da seguinte forma:


1. Constrói a parte dos fontes as ferramentas necessárias para a construção do
compilador do sistema;
2. Constrói o compilador e as bibliotecas associadas;
3. Utiliza todas as ferramentas, compilador e bibliotecas para a construção do
sistema.

Toda a saída deste comando é armazenada dentro de /usr/obj, garantindo que o


sistema em funcionamento não será afetado durante o processo de construção. Esta
etapa pode levar algumas horas, dependendo da capacidade do hardware.

Se tudo correr bem, será exibida uma tela como essa:

# make buildworld
--------------------------------------------------------------
>>> World build started on Sun Feb 28 14:52:49 BRT 2010
--------------------------------------------------------------

--------------------------------------------------------------
>>> Rebuilding the temporary build tree
--------------------------------------------------------------
rm -rf /usr/obj/usr/src/tmp
mkdir -p /usr/obj/usr/src/tmp/lib
mkdir -p /usr/obj/usr/src/tmp/usr
mkdir -p /usr/obj/usr/src/tmp/legacy/usr
mtree -deU -f /usr/src/etc/mtree/BSD.usr.dist -p
/usr/obj/usr/src/tmp/legacy/usr >/dev/null
mtree -deU -f /usr/src/etc/mtree/BSD.usr.dist -p
/usr/obj/usr/src/tmp/usr >/dev/null
mtree -deU -f /usr/src/etc/mtree/BSD.include.dist -p
/usr/obj/usr/src/tmp/usr/include >/dev/null
ln -sf /usr/src/sys /usr/obj/usr/src/tmp

--------------------------------------------------------------
>>> stage 1.1: legacy release compatibility shims
--------------------------------------------------------------

99
--------------------------------------------------------------
>>> stage 1.2: bootstrap tools
--------------------------------------------------------------

===> etc/sendmail (all)


rm -f freebsd.cf
m4 -D_CF_DIR_=/usr/src/etc/sendmail/../../contrib/sendmail/cf/
/usr/src/etc/sendmail/../../contrib/sendmail/cf/m4/cf.m4
/usr/src/etc/sendmail/freebsd.mc > freebsd.cf
chmod 444 freebsd.cf
rm -f freebsd.submit.cf
m4 -D_CF_DIR_=/usr/src/etc/sendmail/../../contrib/sendmail/cf/
/usr/src/etc/sendmail/../../contrib/sendmail/cf/m4/cf.m4
/usr/src/etc/sendmail/freebsd.submit.mc > freebsd.submit.cf
chmod 444 freebsd.submit.cf
.
.
.
--------------------------------------------------------------
>>> World build completed on Sun Feb 28 17:02:57 BRT 2010
--------------------------------------------------------------

6.4.3 Compilando e instalando um novo kernel


Após uma nova construção do sistema, o mais recomendado a se fazer é compilar um
kernel GENERIC para verificarmos se o processo de atualização ocorreu sem
problemas. Caso tudo tenha dado certo, é hora de instalar o kernel customizado.
Para isso:
#cd /usr/src
#make buildkernel KERNCONF=NOME_DO_KERNEL
#make installkernel KERNCONF=NOME_DO_KERNEL

Com estes passos realizados sem nenhum problema, é hora de prepararmos o


ambiente para a instalação do mundo.

6.4.4 Preparação para a instalação do mundo


Esta é a primeira etapa que não pode mais ser desfeita, certifique-se de possuir um
backup atualizado do sistema, caso contrário, em casos de pane, você terá muita dor
de cabeça.
Antes de iniciarmos a instalação do mundo própriamente dita, temos que dar uma
olhada na ferramenta mergemaster.
Apesar do processo de construção do mundo fazer grande parte da atualização, ele
não a faz totalmente. É necessário ainda atualizar individualmente o diretório /etc, pois
a cada nova versão ou atualização os scripts ou arquivos do diretório /etc podem ser
modificados, deletados ou ainda inclusos outros novos.
Para auxiliar nesta tarefa, podemos utilizar a ferramenta mergemaster, que é um script
em Shell que irá auxiliar na tarefa de encontrar diferenças entre os arquivos
armazenados em /etc e os novos em /usr/src/etc.

100
NOTA Mais uma vez alertamos para a importância de se ter um backup completo do diretório /etc
antes de iniciar o uso da ferramenta mergemaster.

Logo após executar os comandos de construção e instalação do kernel, digite o


seguinte comando:

#mergemaster -p
*** The directory specified for the temporary root environment,
/var/tmp/temproot, exists. This can be a security risk if untrusted
users have access to the system.

Use 'd' to delete the old /var/tmp/temproot and continue


Use 't' to select a new temporary root directory
Use 'e' to exit mergemaster

Default is to use /var/tmp/temproot as is

How should I deal with this? [Use the existing /var/tmp/temproot]

Nesta tela pressione enter para continuar, você irá se deparar com uma tela assim:
+++ ./etc/group 2009-08-03 05:13:06.000000000 -0300
@@ -1,6 +1,6 @@
-# $FreeBSD: src/etc/group,v 1.35.10.1.2.1 2009/10/25 01:10:29 kensmith
Exp $
+# $FreeBSD: src/etc/group,v 1.35.10.1 2009/08/03 08:13:06 kensmith Exp
$
#
-wheel:*:0:root,marcus
+wheel:*:0:root
daemon:*:1:
kmem:*:2:
sys:*:3:
@@ -29,4 +29,3 @@
www:*:80:
nogroup:*:65533:
nobody:*:65534:
-marcus:*:1001:

Use 'd' to delete the temporary ./etc/group


Use 'i' to install the temporary ./etc/group
Use 'm' to merge the temporary and installed versions
Use 'v' to view the diff results again

Default is to leave the temporary file to deal with by hand

How should I deal with this? [Leave it for later]

A primeira comparação a ser realizada pelo mergemaster é no arquivo /etc/group. É


imprescindível prestar atenção nos seguintes detalhes:
Toda linha a ser removida da nova versão é iniciada com um sinal de menos “-“;
Toda linha a ser inserida na nova versão é iniciada com um sinal de mais “+”;

101
Ao se utilizar a opção d, o sistema descarta o novo arquivo e continua com o arquivo
antigo (linhas iniciadas com “-“), ao se escolher a opção i, o sistema instala o novo
arquivo, substituindo todas as linhas conflitantes pelas linhas com sinal “+”.

Preste muita atenção, pois ao se instalar um novo arquivo, seu usuário será deletado.
Neste caso as opções mais recomendadas são manter o arquivo original ou utilizar a
opção m e explorar o arquivo linha a linha, inserindo as linhas desejadas.

Logo após, uma nova tela será exibida para a escolha:


*** Displaying differences between ./etc/master.passwd and installed version:

--- /etc/master.passwd 2010-02-27 13:17:02.000000000 -0300


+++ ./etc/master.passwd 2009-08-03 05:13:06.000000000 -0300
@@ -1,6 +1,6 @@
-# $FreeBSD: src/etc/master.passwd,v 1.40.22.1.2.1 2009/10/25 01:10:29
kensmith Exp $
+# $FreeBSD: src/etc/master.passwd,v 1.40.22.1 2009/08/03 08:13:06 kensmith
Exp $
#
-root:$1$vk28cfT8$S5Nn42LODHFfOGKZwAaGK.:0:0::0:0:Charlie &:/root:/bin/csh
+root::0:0::0:0:Charlie &:/root:/bin/csh
toor:*:0:0::0:0:Bourne-again Superuser:/root:
daemon:*:1:1::0:0:Owner of many system processes:/root:/usr/sbin/nologin
operator:*:2:5::0:0:System &:/:/usr/sbin/nologin
@@ -21,4 +21,3 @@
pop:*:68:6::0:0:Post Office Owner:/nonexistent:/usr/sbin/nologin
www:*:80:80::0:0:World Wide Web Owner:/nonexistent:/usr/sbin/nologin
nobody:*:65534:65534::0:0:Unprivileged user:/nonexistent:/usr/sbin/nologin
-marcus:$1$VMdPrGYY$MfGH6VOrxaz0qMNIZU/0H1:1001:1001::0:0:User
&:/home/marcus:/bin/sh

Use 'd' to delete the temporary ./etc/master.passwd


Use 'i' to install the temporary ./etc/master.passwd
Use 'm' to merge the temporary and installed versions
Use 'v' to view the diff results again

Default is to leave the temporary file to deal with by hand

How should I deal with this? [Leave it for later]

Novamente, muito cuidado com este arquivo, pois você poderá perder sua conta de
usuário bem como a senha da conta de root.
Feita esta primeira comparação com o mergemaster, é hora de instalar o mundo.

6.5 Instalação do mundo


É recomendável que a instalação do mundo seja feita em modo mono usuário, para
isso:

#shutdown now

Com isso o sistema mata todos os processos necessários e para tudo, mantendo-se
apenas em modo mono usuário.
Depois é necessário montar o sistema de arquivos, para isso
102
#mount -a

O sistema de arquivos é montado conforme o arquivo /etc/fstab


Entre no diretório /usr/src e instale o novo mundo

#cd /usr/src
#make installworld

Terminado o processo o sistema está parcialmente instalado. Novamente é hora de a


ferramenta mergemaster entrar em ação, dessa vez digite:

#mergemaster -Ui

A opção -U faz com que o mesgemaster atualize automaticamente todos os arquivos de


configuração que não foram alterados e a opção i irá abrir uma tela de decisão para
cada arquivo de configuração que já foi modificado.
Ao final do mesgemaster, basta reiniciar o sistema.

#reboot

Após o sistema reiniciar é hora de realizar a limpeza.


Primeiro checamos as

# make check-old
>>> Checking for old files
/usr/share/man/man8/rc.early.8.gz
/usr/share/man/man3/pselect.3.gz
>>> Checking for old libraries
>>> Checking for old directories
To remove old files and directories run 'make delete-old'.
To remove old libraries run 'make delete-old-libs'.

>>> Removing old files (only deletes safe to delete libs)


remove /usr/share/man/man8/rc.early.8.gz? y
remove /usr/share/man/man3/pselect.3.gz? y
>>> Old files removed
>>> Removing old directories
>>> Old directories removed
To remove old libraries run 'make delete-old-libs'.

>>> Removing old libraries


Please be sure no application still uses those libraries, else you
can not start such an application. Consult UPDATING for more
information regarding how to cope with the removal/revision bump
of a specific library.
>>> Old libraries removed

103
104
7. Atualizando a árvore do ports
Assim como o FreeBSD, a árvore do ports é continuamente atualizada com novas
versões de software. Para realizar a atualização da árvore, o FreeBSD disponibiliza
duas ferramentas, a primeira e já conhecida, csup através do arquivo ports-supfile e
também a ferramenta portsnap, desenvolvida por Colin Percival e disponível na base do
sistema desde sua versão 6.2.
A escolha de cada ferramenta fica a cargo de cada administrador, mas a partir do
momento que uma delas foi escolhida, apenas esta poderá ser utilizada para realizar as
atualizações. Aqui abordaremos a ferramenta portsnap.

7.1 Portsnap
O portnsnap possui algumas vantagens em relação ao csup, que deixam a vida dos
administradores de sistema muito mais fácil. Algumas dessas vantagens são:
Todas as atualizações são assinadas criptograficamentes aumentando a
segurança;
Não requer nenhuma configuração e utiliza poucos comandos para atualizar toda
a árvore;
Está incluso na base do FreeBSD, não sendo necessária a instalação de
softwares de terceiros;
Utiliza uma menor quantidade de recursos, tanto de rede quanto de disco ao se
comparar com o protocolo CVSup.

7.1.2 Configurando o portsnap


Como foi descrito, o portsnap pode ser utilizado sem nenhuma configuração prévia,
mas se alguma alteração for necessária, seu arquivo de configuração pode ser
localizado em /etc/portsnap.conf. Algumas opções desse arquivo são:

SERVERNAME=portsnap.freebsd.org
Esta linha indica ao portsnap de qual servidor ele fará o download das atualizações. O
servidor portsnap.freebsd.org é atualmente um conjunto de servidores. Futuramente o
projeto FreeBSD poderá adicionar mirrors regionais, assim como para os packages e
também para o CVSup. Quando isto acontecer, o servidor regional mais próximo deverá
ser adicionado nesta linha.

KEYPRINT=9b5feee6d69f170e3dd0a2c8e469ddbd64f13f978f2f3aede40c9863
3216c330
Esta é uma chave criptográfica para o servidor portsnap. O portsnap assina
criptograficamente as atualizações para garantir sua autenticidade e integridade.

REFUSE arabic chinese french german hebrew hungarian japanese


A variável REFUSE indica ao portsnap que ele não deve atualizar as categorias nela
descrita.

105
7.1.3 Utilizando o portsnap
A atualização via portsnap, assim como no csup, é incremental, o que significa que não
é necessário fazer o download de toda a árvore do ports a cada atualização.
Quando o portsnap é utilizado pela primeira vez, é baixado de um servidor portsnap o
último snapshot de toda a árvore e depois é extraído em /usr/ports. Este procedimento
irá baixar um arquivo de aproximadamente 61MB. Os comandos para sua execução
são:

#portsnap fetch
#portsnap extract

A partir da segunda utilização do portsnap, este é seguido de outro parâmetro,


indicando que apenas os ports que possuem atualizações deverão ser atualizados.
Esta atualização pode ser feita via:

#portsnap fetch update

Também é possível agendar uma atualização, diária, por exemplo, da árvore do ports.
Para isso os parâmetros são um pouco diferentes: portsnap cron update. O parâmetro
cron irá realizar o update no intervalo de tempo de uma hora, com a esolha do tempo
aleatóriamente evitando sobrecargas nos servidores de atualiação. Dessa forma, para
exemplificar uma atualização agendada diariamente para as cinco da manhã, uma
entrada na crontrab deverá ser feita da seguinte forma:

0 5 * * * /usr/sbin/portsnap cron update

7.2 Atualizando os ports instalados


Após a atualização da coleção do ports, todos os ports instalados a partir desse
momento estarão atualizados, mas os anteriores a esta atualização, deverão ser
atualizados evitando falhas de segurança.
A atualização de aplicativos já instalados pode se tornar uma tarefa árdua, uma vez que
vários aplicativos são dependentes de outros aplicativos e a atualização de apenas um
deles pode fazer com que outros parem de funcionar ou funcionem de forma incorreta.
Para evitar problemas como esses, o FreeBSD disponibiliza na árvore do ports, duas
ferramentas para auxiliar nesta tarefa, o portupgrade e o portmaster.
O portupgrade é a ferramente original do FreeBSD para atualização dos ports. É escrita
em Ruby e mantém um banco de dados das informações da árvore do ports.
O portmaster é apenas um Shell script que realiza as tarefas mais comuns na
atualização dos ports, não utiliza outros softwares ou bancos de dados. Como é bem
mais simples, as chances de algo errado acontecer, são menores.

NOTA É altamente recomendável que antes de atualizar qualquer port instalado, um backup de seus
arquivos de configuração seja feito.

Para instalar o portmaster:


#cd /usr/ports/ports-mgmt/portmaster
#make install clean

106
Execute o programa com o seguinte parâmetro:
#portmaster -l

Uma lista será exibida com todos os ports instalados no sistema. Esta lista é dividida
em quatro sublistas, sendo elas: root ports, trunk ports, branch ports e leaf ports.
Root ports não possuem dependências de nenhum outro software e também
não são dependência de outros softwares. Por exemplo, o próprio portmaster é
um root port. Alguns outros aplicativos, como o sudo, bash e zip são root ports.
Trunk ports não possuem dependências, mas são dependências de outros
softwares. Geralmente são bibliotecas compartilhadas, scripts e linguagens de
programação. Para ilustrar exemplos desta categoria podemos citar a linguagem
Perl.
Branch ports possuem dependências e também são dependências. Podemos
encontrar nesta divisão o apache, o Java e o sistema x.
Leaf ports apenas possuem dependências, mas não são dependências de
nenhum outro software. Aqui podemos encontrar softwares como editores de
texto, navegadores web, clientes de chat entre outros.

Um exemplo de saída do comando portmaster -l


lopez# portmaster -l
===>>> Root ports (No dependencies, not depended on)
===>>> bigreqsproto-1.0.2
===>>> inputproto-1.5.0
===>>> libcheck-0.9.6
===>>> libtool-2.2.6a
===>>> portmaster-2.19
===>>> xcmiscproto-1.1.2
===>>> xf86bigfontproto-1.1.2
===>>> xorg-macros-1.2.1
===>>> 8 root ports

===>>> Trunk ports (No dependencies, are depended on)


===>>> autoconf-wrapper-20071109
===>>> automake-wrapper-20071109
===>>> expat-2.0.1
===>>> jpeg-7
===>>> kbproto-1.0.3
===>>> libiconv-1.13.1
===>>> m4-1.4.13,1
===>>> perl-threaded-5.8.9_3
===>>> pkg-config-0.23_1
===>>> png-1.2.40
===>>> printproto-1.0.4
===>>> python26-2.6.2_3
===>>> xextproto-7.0.5
===>>> 13 trunk ports

===>>> Branch ports (Have dependencies, are depended on)

107
===>>> apache-2.0.63_3
===>>> autoconf-2.62
===>>> freetype2-2.3.9_1
===>>> gettext-0.17_1
===>>> libICE-1.0.4_1,1
===>>> libSM-1.1.0_1,1
===>>> libX11-1.2.1_1,1
===>>> libXau-1.0.4
===>>> libXaw-1.0.5_1,1
===>>> libXdmcp-1.0.2_1
===>>> libXext-1.0.5,1
===>>> libXmu-1.0.4,1
===>>> libXp-1.0.0,1
===>>> libXpm-3.5.7
===>>> libXt-1.0.5_1
===>>> libgcrypt-1.4.4
===>>> libgpg-error-1.7
===>>> libpthread-stubs-0.1
===>>> libxcb-1.4
===>>> libxml2-2.7.5
===>>> p5-gettext-1.05_2
===>>> php5-5.2.11
===>>> php5-ctype-5.2.11
===>>> php5-dom-5.2.11
===>>> php5-filter-5.2.11
===>>> php5-hash-5.2.11
===>>> php5-iconv-5.2.11
===>>> php5-json-5.2.11
===>>> php5-pcre-5.2.11
===>>> php5-pdo-5.2.11
===>>> php5-pdo_sqlite-5.2.11
===>>> php5-posix-5.2.11
===>>> php5-session-5.2.11
===>>> php5-simplexml-5.2.11
===>>> php5-spl-5.2.11
===>>> php5-sqlite-5.2.11
===>>> php5-tokenizer-5.2.11
===>>> php5-xml-5.2.11
===>>> php5-xmlreader-5.2.11
===>>> php5-xmlwriter-5.2.11
===>>> t1lib-5.1.2_1,1
===>>> xcb-proto-1.5
===>>> xproto-7.0.15
===>>> 43 branch ports

===>>> Leaf ports (Have dependencies, not depended on)


===>>> automake-1.10.1
===>>> gmake-3.81_3
===>>> help2man-1.36.4_3
===>>> libxslt-1.1.26
===>>> php5-extensions-1.3
===>>> php5-gd-5.2.11
===>>> php5-gettext-5.2.11
===>>> porteasy-2.8.4
===>>> xtrans-1.2.3
===>>> 9 leaf ports

===>>> 73 total installed ports

108
7.2.1 Identificando softwares desnecessários
Muitas vezes instalamos softwares para realização de testes ou apenas para a
execução de uma tarefa específica, mas com o passar do tempo este software não é
mais útil e fica apenas consumindo espaço em disco ou até mesmo criando brechas na
segurança por apresentar vulnerabilidades. O portmaster facilita a busca por estes
softwares. Geralmente softwares desse tipo estão localizados nas categorias root ports
e leaf ports, mas podem ser encontrados em todas elas. Se encontrar um port
desconhecido ou que não se recorde de sua funcionalidade, utilize o comando whereis
+ nome do port para ver onde ele está instalado e também cheque a descrição do
software. Se realmente não for mais necessário, desinstale-o com o comando:
#portmaster -e nome_do_port

O parâmetro -e faz com que o portmaster desinstale o port e todas as suas


dependências se e somente se elas não forem dependências de outros ports
instalados.

7.2.2 Identificando e atualizando softwares


Os ports que possuem atualização podem ser encontrados com o comando
#portmaster -L
===>>> libcheck-0.9.6
===>>> New version available: libcheck-0.9.8
===>>> php5-5.2.11
===>>> New version available: php5-5.2.12

Neste caso para atualizar o php, basta a execução do seguinte comando:


#portmaster php5-5.2.11

O portmaster irá atualizar o PHP5 e todas as suas dependências que necessitarem de


atualizações, neste caso, após a execução do comando, a seguinte mensagem será
exibida:

The following actions will be taken if you choose to proceed:


Upgrade php5-5.2.11 to php5-5.2.12
Upgrade libxml2-2.7.5 to libxml2-2.7.6_1
Upgrade libiconv-1.13.1 to libiconv-1.13.1_1
Upgrade libtool-2.2.6a to libtool-2.2.6b

Mesmo assim ainda existem chances do processo de atualização falhar. O portmaster


durante este processo desinstala a versão antiga do port a ser atualizado e depois
instala a versão nova, criando assim uma janela de tempo entre o port ser desinstalado
e a nova versão instalada. Para previnir qualquer eventualidade neste processo, pode-
se executar o programa com a opção -b que irá manter um backup do port desinstalado
em /usr/ports/packages/portmaster-backup/
Após a atualização ser completada com êxito, caso tenha utilizado o comando com a
opção -b limpe o diretório de backup para evitar uso desnecessário do disco.

109
Em alguns casos, após a atualização do FreeBSD, alguns softwares podem não
funcionar corretamente. Isto ocorre devido à atualização de bibliotecas que eram
requeridas pelo software, por exemplo, a atualização da libutil.so.5 para libutil.so.6 pode
fazer com que o sudo para de funcionar. O portmaster não consegue encontrar este
tipo de problemas, mas pode ajudar a resolver, reinstalando o software. Para isso
apenas digite portmaster e o nome do software.
Este procedimento fará com que o portmaster construa novamente o software, ligando-
o as novas bibliotecas instaladas e removendo as dependências para os arquivos
obsoletos. Caso o port a reconstruído esteja na categoria leaf ports, o comando pode
ser utilizado acrescido do parâmetro -f que fará com que todas as dependêcias deste
software também sejam atualizadas.

7.2.3 Reconstruindo programas dependentes.


O portmaster automaticamente atualiza softwares requeridos por um software que está
sendo atualizado, mas também pode atualizar todos os softwares dependentes do
software em questão. Esta opção de atualização pode ser executada com o comando:
#portmaster -r <nome_do_port>

Exemplificando:
#portmaster -r expat-2.0.1
===>>> The following actions will be taken if you choose to proceed:
Upgrade expat-2.0.1 to expat-2.0.1_1
Re-install apache-2.0.63_3
Re-install php5-5.2.12
Upgrade php5-ctype-5.2.11 to php5-ctype-5.2.12
Upgrade php5-dom-5.2.11 to php5-dom-5.2.12
Upgrade php5-spl-5.2.11 to php5-spl-5.2.12
Upgrade php5-pcre-5.2.11 to php5-pcre-5.2.12
Upgrade php5-simplexml-5.2.11 to php5-simplexml-5.2.12
Re-install php5-extensions-1.3
Upgrade php5-iconv-5.2.11 to php5-iconv-5.2.12
Upgrade php5-pdo-5.2.11 to php5-pdo-5.2.12
Upgrade php5-pdo_sqlite-5.2.11 to php5-pdo_sqlite-5.2.12
Upgrade php5-sqlite-5.2.11 to php5-sqlite-5.2.12
Upgrade php5-json-5.2.11 to php5-json-5.2.12
Upgrade php5-tokenizer-5.2.11 to php5-tokenizer-5.2.12
Upgrade php5-filter-5.2.11 to php5-filter-5.2.12
Upgrade php5-hash-5.2.11 to php5-hash-5.2.12
Upgrade php5-posix-5.2.11 to php5-posix-5.2.12
Upgrade php5-xml-5.2.11 to php5-xml-5.2.12
Upgrade php5-xmlreader-5.2.11 to php5-xmlreader-5.2.12
Upgrade php5-xmlwriter-5.2.11 to php5-xmlwriter-5.2.12
Upgrade php5-session-5.2.11 to php5-session-5.2.12
Upgrade php5-gd-5.2.11 to php5-gd-5.2.12
Upgrade jpeg-7 to jpeg-8
Upgrade png-1.2.40 to png-1.2.42
Upgrade freetype2-2.3.9_1 to freetype2-2.3.11
Upgrade php5-gettext-5.2.11 to php5-gettext-5.2.12

===>>> Proceed? y/n [y]

110
Ao escolher a opção y, nem todos os ports serão atualizados, alguns, como o apache e
o PHP serão apenas reconstruídos, criando assim novos vínculos com as bibliotecas
atualizadas.

7.2.4 Ignorando Ports


Ocasionalmente, você pode não querer atualizar um port que faça parte de uma
recursão, como no método de atualiazação anterior. Um bom exemplo disso é o
software OpenOffice.org, uma atualização completa dele e de todas as suas
dependências pode levar horas.
Para casos como este, basta criar um arquivo +IGNOREME no diretório de instalação
do port:
#cd /var/db/pkg/nome_do_port
#touch +IGNOREME

7.2.5 Reduzindo o tamanho da árvore do ports.


Ao longo do tempo, após várias instalações, a árvore do ports fica cada vez maior, uma
vez que para cada port instalado, todo o seu código fonte é baixado na pasta distfiles. É
recomendável que periódicamente seja feita uma limpeza na árvore, reduzindo o uso de
disco.
O portmaster possui uma função para executar a limpeza da árvore. Ele busca todas as
distfiles desnecessárias e pergunta se você deseja mesmo remover cada uma delas.
Para isso digite:

#portmaster -clean-distfiles

Se houver uma quantidade grande de distfiles, este processo se tornará cansativo e


pode ser resolvido apagando todas as distfiles sem confirmação, com:
#portmaster -clean-distfiles-all

Outro problema que acontece é quando uma instalação é feita sem o comando clean no
final, isso acaba deixando a pasta work dentro da árvore do ports, o que causa um
aumento no consumo de espaço em disco. Para resolver este problema a própria
árvore do ports possui sua solução:
#cd /usr/ports
#make clean NOCLEANDEPENDS=Yes

Este comando fará recursão em toda a árvore do ports e realiza um make clean para
cada port com o diretório work.
Com estas ferramentas você será capaz de deixar seu sistema sempre atualizado e de
forma segura.

111
112
8. Apache, PHP e MySQL

8.1 Introdução
O Apache é um esforço da Apache Software Foundation para desenvolver e manter o
servidor web livre para sistemas operacionais modernos.
O Apache é o servidor web mais utilizado no mundo desde Abril de 1996. Uma
implementação comum do apache é sua instalação junto do PHP e MySQL para
interpretação de páginas dinâmicas.
Este capítulo cobrirá aspectos básicos da instalação e configuração do Apache, PHP e
MySQL no sistema FreeBSD

8.2 Instalação do apache


Devido aos beneficios e facilidades que o ports nos oferece seguiremos a instalação do
apache através dele. Uma abordagem simples e direta mostrando a facilidade e rapidez
que conseguimos construir um servidor web no FreeBSD.

Primeiramente devemos ir ao diretório /usr/ports/www/ e escolher qual a versão do


apache que desejamos que seja instalada.

paguera# cd /usr/ports/www/apache
apache-contrib/ apache-mode.el/ apache13-modperl/
apache13-modssl/ apache13/ apache22-peruser-mpm/
apache-forrest/ apache13+ipv6/ apache13-modssl+ipv6/
apache13-ssl/ apache20/ apache22/

Agora vocês devem estar se perguntando, qual a versão eu devo usar?

Bom, a reposta para esta pergunta pode ser usada para outros tipos de instalações as
quais temos dúvidas quanto às versões. O melhor caminho para ter a certeza de que
se está fazendo a coisa certa é consultar a documentação do software do site do
desenvolvedor.

Acessando o site oficial do apache (http://httpd.apache.org/) podemos encontrar as


informações referentes às versões mais atualizadas e diferenças que cada uma tem
entre si, melhorias, novas implementações e etc.
Podemos dizer que esta é uma boa pratica e que deveria ser utilizada sempre.

Evidência retirada do site.

113
Como podemos afirmar que a melhor versão 2.2.14 indicada pelo site é a mesma que
está no diretório /usr/ports/www/apache22 ?

Uma maneira simples e que vale para outros pacotes também é checar o arquivo
Makefile.

# grep "^PORTVERSION=" /usr/ports/www/apache22/Makefile


PORTVERSION= 2.2.14

Agora que já sabemos a versão correta a ser instalada, seguiremos com a instalação.
Vamos utilizar o comando make config para verificar quais módulos estão ou não
habilitados.

# make config

114
Utilizaremos as configurações padrões para a nossa instalação. Vale lembrar que
habilitar tudo não é sinonimo de boa configuração. O mesmo vale para desabilitar tudo.
Tenha certeza do que você está adicionando e removendo.

Uma vez configurado vamos prosseguir selecionando OK. Em seguida iremos iniciar a
compilação/instalação do apache através do comando:

# make install clean

Logo após a execução dos comandos o sistema fará o download do apache e suas
dependências para a compilação e instalação. O que vemos a seguir são as
mensagens exibidas durante o processo de instalação.

To enable a module category: WITH_<CATEGORY>_MODULES


To disable a module category: WITHOUT_<CATEGORY>_MODULES

Per default categories are:


AUTH AUTHN AUTHZ DAV CACHE MISC
Categories available:
AUTH AUTHN AUTHZ CACHE DAV EXPERIMENTAL LDAP MISC PROXY SSL SUEXEC
THREADS

To see all available knobs, type make show-options


To see all modules in different categories, type make show-categories
You can check your modules configuration by using make show-modules

===> Vulnerability check disabled, database not found


===> Found saved configuration for apache-2.2.14_5
=> MD5 Checksum OK for apache22/httpd-2.2.14.tar.bz2.
=> SHA256 Checksum OK for apache22/httpd-2.2.14.tar.bz2.
===> apache-2.2.14_5 depends on file: /usr/local/bin/perl5.8.9 - found
===> Patching for apache-2.2.14_5
===> apache-2.2.14_5 depends on file: /usr/local/bin/perl5.8.9 - found
===> Applying extra patch /usr/ports/www/apache22/files/opt-patch-
modules:proxy:mod_proxy_connect.c
===> Applying FreeBSD patches for apache-2.2.14_5
===> apache-2.2.14_5 depends on file: /usr/local/bin/perl5.8.9 - found
===> apache-2.2.14_5 depends on file: /usr/local/bin/autoconf-2.62 -
not found
===> Verifying install for /usr/local/bin/autoconf-2.62 in
/usr/ports/devel/autoconf262
===> Vulnerability check disabled, database not found
=> autoconf-2.62.tar.bz2 doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch from http://ftp.gnu.org/gnu/autoconf/.
===> Extracting for autoconf-2.62
=> MD5 Checksum OK for autoconf-2.62.tar.bz2.
=> SHA256 Checksum OK for autoconf-2.62.tar.bz2.
===> autoconf-2.62 depends on file: /usr/local/bin/perl5.8.9 - found
===> Patching for autoconf-2.62
===> autoconf-2.62 depends on file: /usr/local/bin/perl5.8.9 - found
===> Applying FreeBSD patches for autoconf-2.62
===> autoconf-2.62 depends on executable: gm4 - not found
===> Verifying install for gm4 in /usr/ports/devel/m4
===> Vulnerability check disabled, database not found
===> Found saved configuration for m4-1.4.13,1
=> m4-1.4.13.tar.bz2 doesn't seem to exist in /usr/ports/distfiles/.

115
=> Attempting to fetch from http://ftp.gnu.org/gnu/m4/.
===> Extracting for m4-1.4.13,1
=> MD5 Checksum OK for m4-1.4.13.tar.bz2.
=> SHA256 Checksum OK for m4-1.4.13.tar.bz2.
===> Patching for m4-1.4.13,1
===> Applying FreeBSD patches for m4-1.4.13,1
===> Configuring for m4-1.4.13,1
checking for a BSD-compatible install... /usr/bin/install -c -o root -g
wheel
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... build-aux/install-sh -c -d
checking for gawk... no
checking for mawk... no
checking for nawk... nawk
checking whether make sets $(MAKE)... yes
checking for gcc... cc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether cc accepts -g... yes
...
...
Installing configuration files
Installing HTML documents
Installing error documents
Installing icons
Installing CGIs
Installing header files
Installing build system files
Installing man pages and online manual
To run apache www server from startup, add apache22_enable="YES"
in your /etc/rc.conf. Extra options can be found in startup script.

Your hostname must be resolvable using at least 1 mechanism in


/etc/nsswitch typically DNS or /etc/hosts or apache might
have issues starting depending on the modules you are using.
===> Installing rc.d startup script(s)
===> Compressing manual pages for apache-2.2.14_5
===> Running ldconfig
/sbin/ldconfig -m /usr/local/lib
===> Registering installation for apache-2.2.14_5
===> SECURITY REPORT:
This port has installed the following files which may act as
network servers and may therefore pose a remote security risk to the
system.
/usr/local/lib/libapr-1.so.3

This port has installed the following startup scripts which may
cause these network services to be started at boot time.
/usr/local/etc/rc.d/apache22
/usr/local/etc/rc.d/htcacheclean

If there are vulnerabilities in these programs there may be a


security risk to the system. FreeBSD makes no guarantee about the
security of ports included in the Ports Collection. Please type 'make
deinstall' to deinstall the port if this is a concern.
116
For more information, and contact details about the security
status of this software, see the following webpage:
http://httpd.apache.org/

Pronto! Você acaba de terminar a instalação do apache, agora só nos resta dedicarmos
mais alguns minutos para fazer as configurações prévias e então iniciar o serviço.

Porém, esse processo de instalação pode exigir acompanhamento periódico devido ao


apache instalar várias dependências. Algumas vezes deixamos a instalação do apache
em andamento enquanto trabalhamos com outras atividades em diferentes terminais e,
decorrido algum tempo, descobrimos que a instalação do apache está parada
aguardando a confirmação de alguma opção de instalação.
Podemos sintetizar esse momento através do roteiro abaixo.

Você está trabalhando em outras coisas quando:

Alt + TAB – Instalação parada esperando intervenção, você responde ao ports e a


instalação prossegue;

Alt + TAB – Você volta ao trabalho;

Alt + TAB – Instalação parada esperando intervenção, você responde ao ports e a


instalação prossegue;

Alt + TAB – Você volta ao trabalho

Alt + TAB – E advinha? Instalação parada esperando intervenção novamente.

Felizmente há uma boa notícia! Podemos agrupar toda a intervenção de configuração


em um momento para que possamos responder todos os questionamentos do ports, um
após o outro, e deixar a etapa downloads, compilação e instalação sem interrupções.
Essa é uma dica muito útil que muitos usuários desconhecem.
Primeiramente vamos checar quais são todas as opções disponíveis com o comando
make showconfig-recursive que mostrará configurações para o pacote e todas as suas
dependências.

# make showconfig-recursive
===> The following configuration options are available for apache-
2.2.14_5 and dependencies
===> The following configuration options are available for apache-
2.2.14_5:
APR_FROM_PORTS=off "Use devel/apr as APR (preferred)"
THREADS=off "Enable threads support in APR"
MYSQL=off "Enable MySQL support for apr-dbd"
PGSQL=off "Enable PostgreSQL support for apr-dbd"
SQLITE=off "Enable SQLite support for apr-dbd"
IPV6=on "Enable IPv6 support"
117
BDB=off "Enable BerkeleyDB dbm"
AUTH_BASIC=on "Enable mod_auth_basic"
AUTH_DIGEST=on "Enable mod_auth_digest"
AUTHN_FILE=on "Enable mod_authn_file"
AUTHN_DBD=off "Enable mod_authn_dbd"
AUTHN_DBM=on "Enable mod_authn_dbm"
AUTHN_ANON=on "Enable mod_authn_anon"
AUTHN_DEFAULT=on "Enable mod_authn_default"
AUTHN_ALIAS=on "Enable mod_authn_alias"
AUTHZ_HOST=on "Enable mod_authz_host"
AUTHZ_GROUPFILE=on "Enable mod_authz_groupfile"
AUTHZ_USER=on "Enable mod_authz_user"
AUTHZ_DBM=on "Enable mod_authz_dbm"
AUTHZ_OWNER=on "Enable mod_authz_owner"
AUTHZ_DEFAULT=on "Enable mod_authz_default"
CACHE=on "Enable mod_cache"
DISK_CACHE=on "Enable mod_disk_cache"
FILE_CACHE=on "Enable mod_file_cache"
MEM_CACHE=off "Enable mod_mem_cache"
DAV=on "Enable mod_dav"
DAV_FS=on "Enable mod_dav_fs"
BUCKETEER=off "Enable mod_bucketeer"
CASE_FILTER=off "Enable mod_case_filter"
CASE_FILTER_IN=off "Enable mod_case_filter_in"
EXT_FILTER=off "Enable mod_ext_filter"
LOG_FORENSIC=off "Enable mod_log_forensic"
OPTIONAL_HOOK_EXPORT=off "Enable mod_optional_hook_export"
OPTIONAL_HOOK_IMPORT=off "Enable mod_optional_hook_import"
OPTIONAL_FN_IMPORT=off "Enable mod_optional_fn_import"
OPTIONAL_FN_EXPORT=off "Enable mod_optional_fn_export"
LDAP=off "Enable mod_ldap"
AUTHNZ_LDAP=off "Enable mod_authnz_ldap"
ACTIONS=on "Enable mod_actions"
ALIAS=on "Enable mod_alias"
ASIS=on "Enable mod_asis"
AUTOINDEX=on "Enable mod_autoindex"
CERN_META=on "Enable mod_cern_meta"
CGI=on "Enable mod_cgi"
CHARSET_LITE=on "Enable mod_charset_lite"
DBD=off "Enable mod_dbd"
DEFLATE=on "Enable mod_deflate"
DIR=on "Enable mod_dir"
DUMPIO=on "Enable mod_dumpio"
ENV=on "Enable mod_env"
EXPIRES=on "Enable mod_expires"
HEADERS=on "Enable mod_headers"
IMAGEMAP=on "Enable mod_imagemap"
INCLUDE=on "Enable mod_include"
INFO=on "Enable mod_info"
LOG_CONFIG=on "Enable mod_log_config"
LOGIO=on "Enable mod_logio"
MIME=on "Enable mod_mime"
MIME_MAGIC=on "Enable mod_mime_magic"
NEGOTIATION=on "Enable mod_negotiation"
REWRITE=on "Enable mod_rewrite"
SETENVIF=on "Enable mod_setenvif"
SPELING=on "Enable mod_speling"
STATUS=on "Enable mod_status"
UNIQUE_ID=on "Enable mod_unique_id"
118
USERDIR=on "Enable mod_userdir"
USERTRACK=on "Enable mod_usertrack"
VHOST_ALIAS=on "Enable mod_vhost_alias"
FILTER=on "Enable mod_filter"
VERSION=on "Enable mod_version"
PROXY=off "Enable mod_proxy"
PROXY_CONNECT=off "Enable mod_proxy_connect"
PATCH_PROXY_CONNECT=on "Patch proxy_connect SSL support"
PROXY_FTP=off "Enable mod_proxy_ftp"
PROXY_HTTP=off "Enable mod_proxy_http"
PROXY_AJP=off "Enable mod_proxy_ajp"
PROXY_BALANCER=off "Enable mod_proxy_balancer"
PROXY_SCGI=off "Enable mod_proxy_scgi"
SSL=on "Enable mod_ssl"
SUEXEC=off "Enable mod_suexec"
CGID=off "Enable mod_cgid"
===> Use 'make config' to modify these settings
===> The following configuration options are available for perl-5.10.1:
DEBUGGING=off "Build with debugging support"
GDBM=off "Build GDBM_File extension"
PERL_MALLOC=off "Use Perl malloc"
PERL_64BITINT=on "Use 64 bit integers (on i386)"
THREADS=off "Build threaded perl"
MULTIPLICITY=off "Use multiplicity"
SUIDPERL=off "Build set-user-id suidperl binary"
SITECUSTOMIZE=off "Run-time customization of @INC"
USE_PERL=on "Rewrite links in /usr/bin"
===> Use 'make config' to modify these settings
===> The following configuration options are available for libiconv-
1.13.1_1:
EXTRA_ENCODINGS=on "Include extra character sets"
EXTRA_PATCHES=off "Apply patches to fix CP932 add EUCJP-MS"
===> Use 'make config' to modify these settings
===> The following configuration options are available for m4-1.4.13,1:
LIBSIGSEGV=off "Use libsigsegv for better diagnostics"
===> Use 'make config' to modify these settings

Acima temos cada um dos valores padrão para os menus que o sistema exibirá na
instalação do apache e suas dependências. Através do comando seguinte podemos
responder a todos esses questionamentos de uma só vez.

# make config-recursive

Algumas janelas de configuração serão exibidas:

119
120
Assim que o sistema terminar todos os questionamentos, podemos iniciar o processo
de instalação através do comando make install clean, que desta vez irá fazer o
download dos fontes, a compilação e a instalação sem pedir qualquer intervenção ao
usuário.

Se algo der errado, cair a conexão ou se você responder algo errado, o que muitas
vezes não é tão incomum de acontecer ainda temos as seguintes combinações
possíveis:

Retomar a configuração
# make config-recursive

Pular as perguntas das quais você ja respondeu


# make config-conditional

Se mesmo assim você estiver incerto se está correto ou não e deseja repetir o processo
todo novamente, a combinação abaixo remove todas as configurações feitas
anteriormente e volta as respostas padrão para o estado original
# make rmconfig-recursive
===> Removing user-specified options for apache-2.2.14_5 and
dependencies
===> Removing user-configured options for apache-2.2.14_5
===> Removing user-configured options for perl-5.10.1
===> No user-specified options configured for autoconf-2.62
===> No user-specified options configured for libtool-2.2.6b
===> No user-specified options configured for expat-2.0.1_1
===> No user-specified options configured for pcre-8.00
===> No user-specified options configured for libiconv-1.13.1_1

121
===> No user-specified options configured for m4-1.4.13,1
===> No user-specified options configured for help2man-1.37.1
===> No user-specified options configured for gmake-3.81_3
===> No user-specified options configured for autoconf-wrapper-20071109
===> No user-specified options configured for p5-gettext-1.05_2
===> No user-specified options configured for gettext-0.17_1

Remoção feita, agora podemos iniciar novamente a configuração com make config-
recursive e responder as perguntas novamente.

Se você já esta ciente das opções e deseja instalar as configurações padrões pré
definidas para o pacote faça o seguinte:

# make install BATCH=yes

A instalação será feita sem te perguntar absolutamente nada.

8.3 Configuração do Apache


Agora vamos agora iniciar o apache. Como o apache é um programa terceiro os
arquivos de inicialização foram colocados abaixo do diretório /usr/local/etc/rc.d/

Vamos checar qual é o atual status do nosso novo serviço.

# /usr/local/etc/rc.d/apache22 status
Cannot 'status' apache22. Set apache22_enable to YES in /etc/rc.conf or
use 'onestatus' instead of 'status'.

Obtivemos a mensagem acima porque ainda não adicionamos a seguinte linha no


/etc/rc.conf

apache22_enable=”YES”

Se mesmo assim não quisermos configura a linha agora podemos tanto obter status
quanto iniciar o serviço com:

# /usr/local/etc/rc.d/apache22 onestatus
apache22 is not running.

# /usr/local/etc/rc.d/apache22 onestart
Performing sanity check on apache22 configuration:
Syntax OK
Starting apache22.

# /usr/local/etc/rc.d/apache22 onestatus
apache22 is running as pid 99239.

Podemos ver que o apache subiu e checar se o serviço está escutando na porta 80

# sockstat -46 -p 80
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN
ADDRESS

122
www httpd 99244 3 tcp4 6 *:80 *:*
www httpd 99243 3 tcp4 6 *:80 *:*
www httpd 99242 3 tcp4 6 *:80 *:*
www httpd 99241 3 tcp4 6 *:80 *:*
www httpd 99240 3 tcp4 6 *:80 *:*
root httpd 99239 3 tcp4 6 *:80 *:*

Vamos então tentar conectar ao nosso servidor www por um web browser de sua
preferencia, conectado ao servidor por um web browser e rodando seguinte comando
para checar as conexões podemos perceber que uma conexão foi estabelecida pelo
cliente 201.95.181.116 na porta 3970

# sockstat -46 -p 80
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN
ADDRESS
www httpd 99372 3 tcp4 6 *:80 *:*
www httpd 99244 3 tcp4 6 *:80 *:*
www httpd 99243 3 tcp4 6 *:80 *:*
www httpd 99242 3 tcp4 6 *:80 *:*
www httpd 99241 3 tcp4 6 *:80 *:*
www httpd 99240 3 tcp4 6 *:80 *:*
www httpd 99240 13 tcp4 143.106.51.5:80 201.95.181.116:3970
root httpd 99239 3 tcp4 6 *:80 *:*

Espere alguns minutos, atualize a página novamente no web browser e faça o mesmo
teste novamente.
Você vai perceber que o host 201.95.181.116 conectou-se novamente, porém em uma
porta diferente, desta vez utilizou a 3978.

# sockstat -46 -p 80
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN
ADDRESS
www httpd 99372 3 tcp4 6 *:80 *:*
www httpd 99244 3 tcp4 6 *:80 *:*
www httpd 99243 3 tcp4 6 *:80 *:*
www httpd 99242 3 tcp4 6 *:80 *:*
www httpd 99241 3 tcp4 6 *:80 *:*
www httpd 99240 3 tcp4 6 *:80 *:*
www httpd 99240 13 tcp4 143.106.51.5:80 201.95.181.116:3978
root httpd 99239 3 tcp4 6 *:80 *:*
paguera#

Vamos agora refinar as configurações do /usr/local/etc/apache22/httpd.conf .

Para quem gosta de ir direto ao ponto, segue um exemplo do arquivo padrão


httpd.conf sem os comentários:

paguera# egrep -v "^#| *#" /usr/local/etc/apache22/httpd.conf |


sed '/^$/d'
ServerRoot "/usr/local"
Listen 80
LoadModule authn_file_module libexec/apache22/mod_authn_file.so
LoadModule authn_dbm_module libexec/apache22/mod_authn_dbm.so

123
LoadModule authn_anon_module libexec/apache22/mod_authn_anon.so
LoadModule authn_default_module
libexec/apache22/mod_authn_default.so
LoadModule authn_alias_module libexec/apache22/mod_authn_alias.so
LoadModule authz_host_module libexec/apache22/mod_authz_host.so
LoadModule authz_groupfile_module
libexec/apache22/mod_authz_groupfile.so
LoadModule authz_user_module libexec/apache22/mod_authz_user.so
LoadModule authz_dbm_module libexec/apache22/mod_authz_dbm.so
LoadModule authz_owner_module libexec/apache22/mod_authz_owner.so
LoadModule authz_default_module
libexec/apache22/mod_authz_default.so
LoadModule auth_basic_module libexec/apache22/mod_auth_basic.so
LoadModule auth_digest_module libexec/apache22/mod_auth_digest.so
LoadModule file_cache_module libexec/apache22/mod_file_cache.so
LoadModule cache_module libexec/apache22/mod_cache.so
LoadModule disk_cache_module libexec/apache22/mod_disk_cache.so
LoadModule dumpio_module libexec/apache22/mod_dumpio.so
LoadModule include_module libexec/apache22/mod_include.so
LoadModule filter_module libexec/apache22/mod_filter.so
LoadModule charset_lite_module
libexec/apache22/mod_charset_lite.so
LoadModule deflate_module libexec/apache22/mod_deflate.so
LoadModule log_config_module libexec/apache22/mod_log_config.so
LoadModule logio_module libexec/apache22/mod_logio.so
LoadModule env_module libexec/apache22/mod_env.so
LoadModule mime_magic_module libexec/apache22/mod_mime_magic.so
LoadModule cern_meta_module libexec/apache22/mod_cern_meta.so
LoadModule expires_module libexec/apache22/mod_expires.so
LoadModule headers_module libexec/apache22/mod_headers.so
LoadModule usertrack_module libexec/apache22/mod_usertrack.so
LoadModule unique_id_module libexec/apache22/mod_unique_id.so
LoadModule setenvif_module libexec/apache22/mod_setenvif.so
LoadModule version_module libexec/apache22/mod_version.so
LoadModule ssl_module libexec/apache22/mod_ssl.so
LoadModule mime_module libexec/apache22/mod_mime.so
LoadModule dav_module libexec/apache22/mod_dav.so
LoadModule status_module libexec/apache22/mod_status.so
LoadModule autoindex_module libexec/apache22/mod_autoindex.so
LoadModule asis_module libexec/apache22/mod_asis.so
LoadModule info_module libexec/apache22/mod_info.so
LoadModule cgi_module libexec/apache22/mod_cgi.so
LoadModule dav_fs_module libexec/apache22/mod_dav_fs.so
LoadModule vhost_alias_module libexec/apache22/mod_vhost_alias.so
LoadModule negotiation_module libexec/apache22/mod_negotiation.so
LoadModule dir_module libexec/apache22/mod_dir.so
LoadModule imagemap_module libexec/apache22/mod_imagemap.so
LoadModule actions_module libexec/apache22/mod_actions.so
LoadModule speling_module libexec/apache22/mod_speling.so
124
LoadModule userdir_module libexec/apache22/mod_userdir.so
LoadModule alias_module libexec/apache22/mod_alias.so
LoadModule rewrite_module libexec/apache22/mod_rewrite.so
<IfModule !mpm_netware_module>
<IfModule !mpm_winnt_module>
User www
Group www
</IfModule>
</IfModule>
ServerAdmin you@example.com
DocumentRoot "/usr/local/www/apache22/data"
<Directory />
AllowOverride None
Order deny,allow
Deny from all
</Directory>
<Directory "/usr/local/www/apache22/data">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
<FilesMatch "^\.ht">
Order allow,deny
Deny from all
Satisfy All
</FilesMatch>
ErrorLog "/var/log/httpd-error.log"
LogLevel warn
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\"
\"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\"
\"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "/var/log/httpd-access.log" combined
</IfModule>
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/usr/local/www/apache22/cgi-bin/"
</IfModule>
<IfModule cgid_module>
</IfModule>
<Directory "/usr/local/www/apache22/cgi-bin">
AllowOverride None
125
Options None
Order allow,deny
Allow from all
</Directory>
DefaultType text/plain
<IfModule mime_module>
TypesConfig etc/apache22/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
</IfModule>
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
Include etc/apache22/Includes/*.conf
paguera#

Acima estão as configurações padrões, vamos então alterar algumas e entender outras.
Lembrando que o httpd.conf como muitos outros arquivos de configuração há vários
comentários. É altamente recomendável dispensar algum tempo lendo-os.

Não queremos que o serviço www fique disponível em todos os endereços IPs de
nosso servidor como exemplo abaixo:

# sockstat -46 -p 80
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN
ADDRESS
www httpd 99497 3 tcp4 6 *:80 *:*
www httpd 99496 3 tcp4 6 *:80 *:*
www httpd 99495 3 tcp4 6 *:80 *:*
www httpd 99494 3 tcp4 6 *:80 *:*
www httpd 99493 3 tcp4 6 *:80 *:*
root httpd 99492 3 tcp4 6 *:80 *:*

O * indica que todos os IPs configurados no servidor irão ouvir na porta 80

Para isso vamos identificar qual o IP desejamos deixar dedicado

# netstat -nI bge0


Name Mtu Network Address Ipkts Ierrs Opkts
Oerrs Coll
bge0 1500 <Link#1> 00:1e:c9:28:13:4c 2480898 0 134151
0 0
bge0 1500 143.106.51.0/ 143.106.51.5 212940 - 131872
- -
paguera#

Agora editaremos a seguinte linha no httpd.conf

Antiga linha: Listen 80

126
Vamos substituir por: Listen 143.106.51.5:80

Isso vai fazer com que somente o endereço IP 143.106.51.5 escute na porta 80.

Vamos então iniciar o apache novamente e verificar se as configurações funcionaram


corretamente.

# /usr/local/etc/rc.d/apache22 start
Cannot 'start' apache22. Set apache22_enable to YES in /etc/rc.conf or
use 'onestart' instead of 'start'.

Vamos logo adicionar a linha solicitada no arquivo /etc/rc.conf para evitar maiores
transtornos.

# grep "^apache22_enable=" /etc/rc.conf


apache22_enable="YES"

Pronto, agora sim.

# /usr/local/etc/rc.d/apache22 start
Performing sanity check on apache22 configuration:
Syntax OK
Starting apache22.

Apache em execução, vamos verificar se nossas configurações funcionaram


adequadamente:

# sockstat -46 -p 80
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN
ADDRESS
www httpd 6196 3 tcp4 143.106.51.5:80 *:*
www httpd 6195 3 tcp4 143.106.51.5:80 *:*
www httpd 6194 3 tcp4 143.106.51.5:80 *:*
www httpd 6193 3 tcp4 143.106.51.5:80 *:*
www httpd 6192 3 tcp4 143.106.51.5:80 *:*
root httpd 6191 3 tcp4 143.106.51.5:80 *:*

Tudo rodando como configurado. Reparem que agora o * foi substituído pelo IP que
especificamos.

Agora vamos configurar a diretiva ServerAdmin para que um email seja informado em
caso de algum erro ocorrer.

ServerAdmin webmaster@meudominio.com.br

Utilizada para aqueles que têm um dominio registrado, não é obrigatório colocar seu
dominio nesta opção, porém isso evita alguns erros que podem acontecer na
inicialização do apache.

ServerName www.meudominio.com.br:80

127
DocumentRoot é onde o apache irá buscar pelos arquivos, poderíamos colocar no /web
por exemplo, porém como este nosso servidor www é somente para fins didáticos
vamos deixar o valor padrão.

DocumentRoot "/usr/local/www/apache22/data"

Uma das opções para garantir a segurança do nosso servidor www é a sessão
<Directory >, nela podemos especificar quais os tipos de acesso para cada diretório de
paginas a ser visitado pelo cliente.

O Directory / abaixo se refere ao ServerRoot que definimos no inicio do arquivo de


configuração, podemos ver que ninguém tem acesso direto a ele:

<Directory />
AllowOverride None
Order deny,allow
Deny from all
</Directory>

O seguinte é o DocumentRoot, este já é mais acessível permitindo que todos possam ve-
lo

<Directory "/usr/local/www/apache22/data">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>

Para as opções como FollowSymLinks e demais, consulte a pagina oficial


http://httpd.apache.org/docs/2.2/mod/core.html#options

Algumas vezes nossas paginas não são abertas no browser, aparecendo somente uma
lista de arquivos que há no diretório. Isso acontece porque o apache está configurado a
buscar uma lista de páginas se não for informado o nome da página desejada. A
diretiva que configura esse comportamento é a DirectoryIndex.

DirectoryIndex index.html

Neste caso somente paginas index.html serão precessadas automaticamente.

Um ponto importante que foi incorporado na versão 2.2 do apache é a divisão dos
vhosts e de outros arquivos do arquivo principal (httpd.conf), isso ajuda bastante na
compreensão e organização do conteúdo.

#cat /usr/local/etc/apache22/extra/httpd-vhosts.conf

#
# Virtual Hosts
128
#
# If you want to maintain multiple domains/hostnames on your
# machine you can setup VirtualHost containers for them. Most
configurations
# use only name-based virtual hosts so the server doesn't need to
worry about
# IP addresses. This is indicated by the asterisks in the
directives below.
#
# Please see the documentation at
# <URL:http://httpd.apache.org/docs/2.2/vhosts/>
# for further details before you try to setup virtual hosts.
#
# You may use the command line option '-S' to verify your virtual
host
# configuration.

#
# Use name-based virtual hosting.
#
NameVirtualHost *:80

#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost
container.
# The first VirtualHost section is used for all requests that do
not
# match a ServerName or ServerAlias in any <VirtualHost> block.
#
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/usr/local/docs/dummy-host.example.com"
ServerName dummy-host.example.com
ServerAlias www.dummy-host.example.com
ErrorLog "/var/log/dummy-host.example.com-error_log"
CustomLog "/var/log/dummy-host.example.com-access_log" common
</VirtualHost>

<VirtualHost *:80>
ServerAdmin webmaster@dummy-host2.example.com
DocumentRoot "/usr/local/docs/dummy-host2.example.com"
ServerName dummy-host2.example.com
ErrorLog "/var/log/dummy-host2.example.com-error_log"
CustomLog "/var/log/dummy-host2.example.com-access_log"
common
</VirtualHost>

Para os que ainda não sabem o que é vhost, lá vai:


129
vhost é uma abreviação carinhosa para VirtualHost, utilizado para que mais de um
domínio possa funcionar em um servidor. Sem ele teriamos praticamente que ter um
servidor apache para cada domínio, o que atualmente é inviável devido à grande
quantidade de webpages.

A configuração do vhost quanto dos outros parametros do httpd.conf e afins é bem


intuitiva como exemplos e comentários, para maiores detalhes e configurações mais
refinadas consulte http://httpd.apache.org/docs/vhosts/ .

Vamos abrir uma página e ver como esta o nosso servidor web:

Se tudo estiver correto podemos ver a pratica:

Sugestivo não ?!

Vamos então criar uma simples pagina em php e ver o que acontece:

# pwd
/usr/local/www/apache22/data

# ls
index.html index.php

# mv index.html index.htm

# cat index.php
<?php
php_info();
?>

Devido a nossa alteração da pagina index.html para index.htm o apache não foi capaz
de processá-la já que na diretiva DirectoryIndex não havia index.php nem index.htm.

Vamos corrigir isso:


130
# grep index.php /usr/local/etc/apache22/httpd.conf
DirectoryIndex index.php index.htm

Ja que alteramos um arquivo de configuração precisamos da releitura do arquivo para


que as configurações efetuadas tenham efeito.

# apachectl graceful

Ou

# /usr/local/etc/rc.d/apache22 graceful

Checando nossa pagina agora:

O que aconteceu ?!

8.4 Instalação PHP


Como não temos o PHP instalado, a pagina foi interpretada como texto normal.
Daremos inicio a instalação do php:

# cd /usr/ports/lang/php5
# make config

131
Devemos marcar a opção APACHE, em seguida OK
# make install clean
===> Vulnerability check disabled, database not found
===> Found saved configuration for php5-5.2.12
=> php-5.2.12.tar.bz2 doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch from http://dk.php.net/distributions/.
php-5.2.12.tar.bz2 0% of 8862 kB 33 kBps
.
.
.
***************************************************************

Make sure index.php is part of your DirectoryIndex.

You should add the following to your Apache configuration file:

AddType application/x-httpd-php .php


AddType application/x-httpd-php-source .phps

***************************************************************
===> Compressing manual pages for php5-5.2.12
===> Registering installation for php5-5.2.12
===> SECURITY REPORT:
This port has installed the following files which may act as
network servers and may therefore pose a remote security risk to the
system.
/usr/local/libexec/apache22/libphp5.so
/usr/local/bin/php
/usr/local/bin/php-cgi

If there are vulnerabilities in these programs there may be a


security risk to the system. FreeBSD makes no guarantee about the
security of ports included in the Ports Collection. Please type 'make
deinstall' to deinstall the port if this is a concern.
132
For more information, and contact details about the security
status of this software, see the following webpage:
http://www.php.net/
===> Cleaning for pkg-config-0.23_1
===> Cleaning for libxml2-2.7.6_1
===> Cleaning for php5-5.2.12

8.5 Integrando Apache e PHP


Conforme a mensagem de pós-instalação, vamos adicionar as linha requisitadas pelo
php em nosso arquivo httpd.conf. Vale lembrar que podemos ver essa mensagem a
qualquer momento através do comando:

# pkg_info –Dx php5

# grep x-httpd-php /usr/local/etc/apache22/httpd.conf


AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

Linhas adicionadas, vamos agora ver se tudo esta funcionando como esperado.

# /usr/local/etc/rc.d/apache22 restart
Performing sanity check on apache22 configuration:
Syntax OK
Stopping apache22.
Waiting for PIDS: 6229.
Performing sanity check on apache22 configuration:
Syntax OK
Starting apache22.

Ops... Fatal error, mas fique feliz porque sabemos que a instalação do PHP foi com
sucesso, ja que a pagina foi processada.

Vamos então ver o que a de errado na linha 2 da nossa pagina.

# cat /usr/local/www/apache22/data/index.php
<?php
php_info();
?>

Isso mesmo, a função php_info não existe, o correto é phpinfo. Feita as devidas
alterações vamos ver qual o comportamento agora.

133
Agora sim !

Analise esta pagina gerada pelo phinfo pois há varias opções e valores do apache e
php.

8.6 Instalação do MySQL


134
Bom pessoal já temos um servidor web rodando com apache, simples assim. Para
adicionar suporte a MySQL podemos fazer simplesmente:

# cd /usr/ports/databases/php5-mysql
paguera# make config
===> No options to configure
paguera# make install clean
===> Vulnerability check disabled, database not found
===> Extracting for php5-mysql-5.2.12
=> MD5 Checksum OK for php-5.2.12.tar.bz2.
=> SHA256 Checksum OK for php-5.2.12.tar.bz2.
===> Patching for php5-mysql-5.2.12
===> php5-mysql-5.2.12 depends on file: /usr/local/bin/phpize - found
===> php5-mysql-5.2.12 depends on file: /usr/local/bin/autoconf-2.62 -
found
===> php5-mysql-5.2.12 depends on shared library: mysqlclient.15 - not
found
===> Verifying install for mysqlclient.15 in
/usr/ports/databases/mysql50-client
===> Vulnerability check disabled, database not found
=> mysql-5.0.90.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch from
ftp://ftp.fi.muni.cz/pub/mysql/Downloads/MySQL-5.0/.
.
.
.
----------------------------------------------------------------------
Build complete.
Don't forget to run 'make test'.
===> Installing for php5-mysql-5.2.12
===> php5-mysql-5.2.12 depends on file:
/usr/local/include/php/main/php.h - found
===> Generating temporary packing list
===> Checking if databases/php5-mysql already installed
===> Registering installation for php5-mysql-5.2.12
************************************************************************
****

The following line has been added to your


/usr/local/etc/php/extensions.ini
configuration file to automatically load the installed extension:

extension=mysql.so

************************************************************************
****
===> Cleaning for mysql-client-5.0.90
===> Cleaning for php5-mysql-5.2.12

Pronto, após esta instalação o PHP ja está apto a interpretar comandos do MySQL.

Dificil ?!, Acabamos de criar um servidor www com suporte a PHP e MySQL,
praticamente uma das combinações mais utilizados nos dias de hoje.

135
136
9. DNS Bind
9.1 Introdução
O DNS (Domain Name Server) é um serviço de mapeamento de nomes em endereços
IP (e vice-versa) que dá vida à internet como conhecemos. Aplicações utilizam o
endereço IP nas suas comunicações. Devido à difícil memorização dos endereços IP,
foi criado o serviço de tradução DNS.
No inicio da internet, sistemas operacionais mantinham um arquivo texto ( /etc/hosts)
contendo uma lista de nomes e endereços IP de todos os hosts da internet . Com o
crescimento da internet esse método tornou-se inviável. Para solucionar o problema
criou-se um banco de dados hierárquico e distribuído que contem informações de
mapeamento de endereços IP. Assim surgia um dos serviços mais importantes da
internet, o servidor DNS.
Vejamos o diagrama abaixo para entendermos melhor a hierarquia dos servidores dns.

Retirado de http://bio3d.colorado.edu/tor/sadocs/dns/dns-1.png
Veremos uma implementação do servidor de DNS no sistema FreeBSD. O objetivo
deste capítulo é apresentar alguns aspectos do servidor DNS e principalmente detalhes
da sua implementação no sistema FreeBSD.

9.2 O BIND – Berkeley Internet Name Domain


O BIND é a implementação do servidor DNS mais utilizada no mundo. Muitas vezes o
BIND é referenciado pelo nome de seu daemon, o named.
Uma característica interessante da implementação do BIND no FreeBSD é que
dispensa a instalação do servidor, pois o serviço é parte integrante do sistema. Sendo
assim, para criarmos nosso servidor BIND, basta configurarmos os arquivos
necessários.
O FreeBSD 8.0 possui a versão 9.6.1 do BIND conforme vemos abaixo.
# named –v
BIND 9.6.1-P1

137
O diretório que mantém as informações do named é /etc/namedb. Veremos a seguir os
principais arquivos.

9.2.1 named.root
Contém a lista de servidores de mais alto nível na internet (root servers). Caso o
servidor DNS local receba uma consulta que não está armazenada em seu cache, ele
pesquisa os rootservers para obter a resposta desejada para consulta DNS.
Normalmente esse arquivo não necessita nenhuma configuração.

9.2.2 named.conf
O named.conf é o principal arquivo de configuração do servidor named. Dentro dele
podemos definir diversas diretivas que configuram o comportamento do servidor.
Esse arquivo aceita comentários semelhante aos utilizados da linguagem C. Podemos
utilizar duas barras (//) para comentar de um determinado ponto até o fim daquela
linha ou utilizar o comentário de múltiplas linhas delimitadas por /* e */.

9.3 Arquivos de configuração de zona


O servidor dns permite o agrupamento lógico de hosts e endereços IP´s em zonas.
Cada zona possui seu arquivo de configuração no formato texto que define o
mapeamento nome em IP (ou vice-versa).
Boa parte da administração de um servidor dns consiste na edição desses arquivos,
inserindo ou removendo informações sobre mapeamento. Veremos adiante exemplos
desse arquivo.

9.4 Resource Records (RRs)


O named disponibiliza as informações em forma de Resource Records (RRs). Vejamos
alguns exemplos de RRs mais utilizados:
SOA (Start Of Authority) – Identifica o inicio de uma zona ao qual o servidor
especificado tem autoridade sobre esse domínio. É composto de parâmetros
como: endereço do administrador do domínio, número serial, tempo de
atualização (refresh), tempo de consulta ao master (retry), tempo de expiração
(expire) e TTL mínimo.
A (Address) – Mapeamento de nomes em endereços IPv4
PTR (Pointer) – Mapeamento reverso, ou seja, endereços IP em nomes
CNAME (Canonical Name) – Nomes canônicos que são utilizados como
apelidos. Referenciam um registro tipo A.
NS (Name Servers) – Especifica os servidores que possuem autoridade sobre o
domínio especificado.
MX (Mail Exchange) – Especifica os servidores de email para o domínio

138
9.5 Configurando o named
Agora que já conhecemos alguns detalhes do named, chegou a hora de configurá-lo
para podermos entender melhor seu funcionamento.
Utilizarei como exemplo de configuração o domínio fictício aulabsd.com.br com
endereços IP 192.168.0.0/24. Baseando-se nesse exemplo, segue o arquivo
named.conf com as principais diretivas.
// Clausula options contem diversas diretivas que configuram o
comportamento
// do servidor

options {
// Define o diretório de trabalho do named.
directory "/etc/namedb";

// Define um arquivo texto que contem o pid do named


pid-file "/var/run/named/pid";

// Define uma string que será exibida quando for consultada


a versão
// do bind. Seu uso e aconselhado para ocultar a versão e
assim
// dificultar um possível ataque
version "[SECURE]";

// Especifica em quais endereços o named atendera suas


requisições
// Você pode especificar algum endereço caso a maquina tenha
mais de
// um ou comentar a diretiva para que ele receba requisições
// em qualquer endereço disponível
listen-on { 127.0.0.1; 192.168.0.10; };

// Especifica que todas as requisições serão encaminhadas ao


servidor
// definido pelo endereço IP especificado. Note que a
diretiva abaixo
// não será interpretada pelo named por estar comentada
// (entre /* e */)
/*
forwarders {
192.168.0.50;
};
*/

// Os caracteres “};” abaixo indicam que a clausula options esta


terminada

139
};

// Abertura da clausula zone que fornece informações sobre a zona


referenciada
// A zona "." significa toda a internet, ou seja, os root servers
// A diretiva type hint define o tipo da zona, essa é a única
zona definida
// com esse tipo, todas as outras são do tipo master ou slave
// A diretiva file indica o arquivo que contem as informações da
zona, ou
// nesse caso os endereços dos servidores root servers na
internet
// Observe que podemos especificar as diretivas type e file em
uma linha ou
// utilizando uma linha para cada diretiva.
zone "." { type hint; file "named.root"; };

// A zona localhost e a responsável por mapear o host localhost


para o IP
// 127.0.0.1. A diretiva type indica que esse servidor é o
master da zona
// e a diretiva file indica o arquivo que contem as informações
da zona
// Por padrão, o FreeBSD mantém os arquivos localhost-forward.db
(mapeamento
// direto) e localhost-reverse.db (mapeamento reverso) para o
localhost
zone "localhost" { type master; file "master/localhost-
forward.db"; };

// Declaração do mapeamento reverso do localhost. Declaracoes de


zona reversa
// sempre terminam com o nome .in-addr.arpa
zone "127.in-addr.arpa" { type master; file "master/localhost-
reverse.db"; };

// Abaixo temos uma zona definida como aulabsd.com.br


// A diretiva type indica que esse servidor é o master da zona
(Adiante
// veremos configuração de zona tipo slave).
// A diretiva file indica qual o arquivo que contem todas as
informações
// sobre a zona definida na clausula zone.
zone "aulabsd.com.br" {
type master;
file "master/aulabsd.com.br.db";
};
140
// A zona declarada acima é responsável pelo mapeamento direto do
nome
// xxx.aulabsd.com.br em um endereço IP 192.168.0.XX. Lembre-se
que
// alguns serviços necessitam do mapeamento reverso, ou seja, do
IP
// 192.168.0.XX -> xxx.aulabsd.com.br. Para que isso seja
possível precisamos
// da declaração da zona in-addr.arpa conforme abaixo (notem que
a declaração
// a esquerda do nome "in-addr.arpa" é justamente os 3 primeiros
octetos
// da rede 192.168.0.0 porém em ordem invertida)
zone "0.168.192.in-addr.arpa" {
type master;
file "master/192.168.0.db";
};

Agora que temos o arquivo named.conf configurado, precisamos configurar as


informações da zona direta aulabsd.com.br e reversa 0.168.192.in-addr.arpa nos
arquivos aulabsd.com.br.bd e 192.168.0.db respectivamente.
É importante salientar que não existe uma regra definida para nomear os arquivos de
zona direta e reversa. Normalmente cada administrador de rede segue o seu padrão
de nomeação.
Analisaremos abaixo o conteúdo do arquivo de mapeamento direto da zona
aulabsd.com.br.

// Time to live para as informações da zona


$TTL 14400
// O registro SOA indica que o servidor possui autoridade sob a
zona
// aulabsd.com.br.
@ IN SOA ns1 hostmaster (
// O serial da zona normalmente é formado pelo concatenação
ultima
// data de alteração da zona (AAAAMMDDSS)seguido de um numero que
// indica a alteração feita no dia (SS)
2010012500 ; Serial
// Refresh - Intervalo de tempo em segundos em que o servidor
// secundário consultará o primário para verificar atualizações.
Isso
// é realizado comparando os seriais entre os servidores.
// Se houver atualizações, o secundário irá sincronizar com o
// primário através da transferência da zona.
86400 ; Refresh
// Retry – Caso o servidor primário esteja indisponível, o
servidor
// secundário utilizará o intervalo de retry para verificação da
141
// conexão com o primário.
7200 ; Retry
// Expire – Caso o servidor primário não possa ser contactado no
// período de tempo estabelecido pelo expire, o servidor
secundário
// deixa de responder sobre informações dessa zona
3600000 ; Expire
// TTL para respostas negativas desta zona
14400 ; min ttl
)
// As 2 linhas abaixo definem os servidores para esta zona
@ IN NS ns1
@ IN NS ns2
// O registro MX (Mail Exchange) define o servidor de e-mail para
esta
// zona. O número 10 representa a prioridade do servidor.
Números
// menores estabelecem maior prioridade
@ IN MX 10 mx1

// Os registros tipo A definem uma mapeamento direto (nome -> IP)


ns1 IN A 192.168.0.1
ns2 IN A 192.168.0.2
mx1 IN A 192.168.0.10
server1 IN A 192.168.0.12

// O registro CNAME funciona como um apelido, ou seja, www é um


// apelido para server1 que possui o IP 192.168.0.12
www IN CNAME server1
ftp IN CNAME server1

Agora que já vimos a configuração da zona aulabsd.com.br, veremos a seguir as


informações do mapeamento reverso dessa zona. As informações da zona reversa são
semelhantes às encontradas na zona direta. Basicamente o que difere são os registros
(RRs) tipo PTR (POINTER).

$TTL 14400
@ IN SOA ns1 hostmaster (
2010012502 ; Serial
86400 ; Refresh
7200 ; Retry
3600000 ; Expire
14400 ; min ttl
)
@ IN NS ns1.aulabsd.com.br.
@ IN NS ns2.aulabsd.com.br.
// Abaixo temos os registros PTR que são responsáveis pelo
mapeamento

142
// reverso (IP -> host) da zona. Notem que os nomes dos hosts
devem
// ser definidos no formato FQDN (Fully Qualifield Domain Name,
ou
// seja, a declaração é formada pelo nome + domínio com o “.”
como
// terminação.
1 IN PTR ns1.aulabsd.com.br.
2 IN PTR ns2.aulabsd.com.br.
10 IN PTR mx1.aulabsd.com.br.
12 IN PTR server1.aulabsd.com.br.

Neste ponto temos o serviço configurado e pronto para funcionar, porém ao iniciá-lo
recebemos a mensagem abaixo:
# /etc/rc.d/named start
Cannot 'start' named. Set named_enable to YES in /etc/rc.conf or use
'onestart' instead of 'start'.

Isso ocorreu porque não existe o registro na inicialização do named no rc.conf. Para
configurar a inicialização correto do named, basta acrescentar a diretiva
named_enable=”YES” no arquivo /etc/rc.conf

# /etc/rc.d/named start
Starting named.
Vamos analisar o log messages para verificarmos se o named foi realmente
iniciado com sucesso.
# cat /var/log/messages | grep named
Feb 25 22:34:41 vbox named[1007]: starting BIND 9.6.1-P1 -t /var/named -
u bind
Feb 25 22:34:41 vbox named[1007]: built with '--prefix=/usr' '--
infodir=/usr/share/info' '--mandir=/usr/share/man' '--enable-threads' '-
-disable-ipv6' '--enable-getifaddrs' '--disable-linux-caps' '--with-
openssl=/usr' '--with-randomdev=/dev/random' '--without-idn' '--without-
libxml2'
Feb 25 22:34:41 vbox named[1007]: command channel listening on
127.0.0.1#953
Feb 25 22:34:41 vbox named[1007]: command channel listening on ::1#953
Feb 25 22:34:41 vbox named[1007]: running

9.6 Configurando DNS server secundário (SLAVE)

São necessários no mínimo dois servidores DNS para o funcionamento de um domínio.


Um deles atua como primário (master), onde são feitas as alterações necessárias para
a administração do domínio. Essas alterações são transferidas para o segundo
servidor, que atua como secundário (slave).
O funcionamento do primário e do secundário proporciona alta disponibilidade através
da redundância do serviço. Caso um dos servidores pare de funcionar, o outro continua
respondendo consultas DNS e mantendo seu domínio operacional.
Podemos configurar um servidor para atuar como secundário de um domínio qualquer
através de diretivas definidas no named.conf. Para exemplificar melhor essa
143
configuração, suponhamos que nosso servidor é secundário do domínio
aulabsd2.com.br (zona direta e reversa) que utiliza a classe de IP 192.168.10.0/24 e
que possui o servidor primário com o IP 192.168.10.10. Para configurarmos nosso
servidor para ser o secundário devemos incluir as linhas abaixo no named.conf:

zone "aulabsd2.com.br" {
// A diretiva type indica que este servidor atua como slave e
deve sincronizar
// as informações desta zona com os servidores indicados na
diretiva masters
type slave;
file "slave/aulabsd2.com.br.db";
masters { 192.168.10.10; };
};

zone "10.168.192.in-addr.arpa" {
type master;
file "slave/192.168.10.db";
masters { 192.168.10.10; };

};

Para que a transferência de zona entre os servidores dns primários e secundários


funcione adequadamente, é necessária a inclusão de diretiva no servidor primário que
autorize essa transferência. Abaixo temos a configuração recomendada para o servidor
primário da zona aulabsd2.com.br.

options {
....
// A diretiva abaixo configura o named globalmente para não
// permitir transferências de zonas
allow-transfer {"none";};
};
...
zone "aulabsd2.com.br" in{
....
// A diretiva abaixo permite o servidor 192.168.0.1 transferir
// as informações apenas desta zona.
allow-transfer (192.168.0.1;);
};
...
zone "10.168.192.in-addr.arpa" in{
....
allow-transfer (192.168.0.1;);
};

144
9.7 Testando nosso servidor dns
O FreeBSD disponibiliza poderosas ferramentas para nos auxiliar a executar pesquisas
(queries) em nosso servidor DNS para fins de testes.
Utilizaremos o comando host para sabermos se nosso servidor está resolvendo o nome
ns1.aulabsd.com.br.
# host ns1.aulabsd.com.br
ns1.aulabsd.com.br has address 192.168.0.1

# host 192.168.0.1
1.0.168.192.in-addr.arpa domain name pointer ns1.aulabsd.com.br.

Como vimos acima, o comando host foi utilizado para fazer uma consulta simples ao
nosso servidor DNS e podemos constatar que nosso servidor respondeu as consultas
adequadamente.
Outro aplicativo muito útil é o dig, que executa consultas DNS com um nível maior de
detalhamento e opções de consulta.
# dig www.aulabsd.com.br

; <<>> DiG 9.6.1-P1 <<>> www.aulabsd.com.br


;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44202
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 2

;; QUESTION SECTION:
;www.aulabsd.com.br. IN A

;; ANSWER SECTION:
www.aulabsd.com.br. 14400 IN CNAME server1.aulabsd.com.br.
server1.aulabsd.com.br. 14400 IN A 192.168.0.12

;; AUTHORITY SECTION:
aulabsd.com.br. 14400 IN NS ns2.aulabsd.com.br.
aulabsd.com.br. 14400 IN NS ns1.aulabsd.com.br.

;; ADDITIONAL SECTION:
ns1.aulabsd.com.br. 14400 IN A 192.168.0.1
ns2.aulabsd.com.br. 14400 IN A 192.168.0.2

;; Query time: 2 msec


;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Feb 26 00:22:26 2010
;; MSG SIZE rcvd: 142

Podemos utilizar o dig para executar consultas reversas adicionando o parâmetro -x


# dig -x 192.168.0.12
;; global options: +cmd
145
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59803
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;12.0.168.192.in-addr.arpa. IN PTR

;; ANSWER SECTION:
12.0.168.192.in-addr.arpa. 14400 IN PTR server1.aulabsd.com.br.

;; AUTHORITY SECTION:
0.168.192.in-addr.arpa. 14400 IN NS ns1.aulabsd.com.br.

;; ADDITIONAL SECTION:
ns1.aulabsd.com.br. 14400 IN A 192.168.0.1

;; Query time: 1 msec


;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Feb 26 00:22:29 2010
;; MSG SIZE rcvd: 113

Abaixo temos um exemplo de pesquisa de registros MX (Mail Exchange) em nosso


domínio de exemplo.
# dig mx aulabsd.com.br

; <<>> DiG 9.6.1-P1 <<>> mx aulabsd.com.br


;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9144
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3

;; QUESTION SECTION:
;aulabsd.com.br. IN MX

;; ANSWER SECTION:
aulabsd.com.br. 14400 IN MX 10 mx1.aulabsd.com.br.

;; AUTHORITY SECTION:
aulabsd.com.br. 14400 IN NS ns1.aulabsd.com.br.
aulabsd.com.br. 14400 IN NS ns2.aulabsd.com.br.

;; ADDITIONAL SECTION:
mx1.aulabsd.com.br. 14400 IN A 192.168.0.10
ns1.aulabsd.com.br. 14400 IN A 192.168.0.1
ns2.aulabsd.com.br. 14400 IN A 192.168.0.2

;; Query time: 2 msec


;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Feb 26 01:53:13 2010
;; MSG SIZE rcvd: 136

Nos exemplos demonstrados acima o dig utilize o servidor DNS definido em


/etc/resolv.conf para executar suas consultas. Podemos especificar qual servidor
será consultado conforme abaixo:
# dig @ns1.unicamp.br www.unicamp.br

146
; <<>> DiG 9.6.1-P1 <<>> @ns1.unicamp.br www.unicamp.br
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14410
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 2
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;www.unicamp.br. IN A

;; ANSWER SECTION:
www.unicamp.br. 3600 IN CNAME lvs0.unicamp.br.
lvs0.unicamp.br. 3600 IN A 143.106.10.30

;; AUTHORITY SECTION:
unicamp.br. 86400 IN NS ns1.ansp.br.
unicamp.br. 86400 IN NS ns1.unicamp.br.
unicamp.br. 86400 IN NS ns3.unicamp.br.

;; ADDITIONAL SECTION:
ns1.unicamp.br. 3600 IN A 143.106.2.2
ns3.unicamp.br. 86400 IN A 143.106.2.133

;; Query time: 20 msec


;; SERVER: 143.106.2.2#53(143.106.2.2)
;; WHEN: Fri Feb 26 02:34:40 2010
;; MSG SIZE rcvd: 158

Abaixo temos uma utilização do dig muito interessante. Através da opção trace ligada
(+trace) podemos ver todo o caminho que a consulta percorreu desde o root server até
o servidor do domínio em questão.
Através das informações exibidas pelo dig podemos ter uma boa idéia de como é
organizada a hierarquia dos servidores de DNS na internet.
dig +trace www.uol.com.br
; <<>> DiG 9.6.1-P1 <<>> +trace www.uol.com.br
;; global options: +cmd
. 509746 IN NS b.root-servers.net.
. 509746 IN NS j.root-servers.net.
. 509746 IN NS c.root-servers.net.
. 509746 IN NS h.root-servers.net.
. 509746 IN NS i.root-servers.net.
. 509746 IN NS g.root-servers.net.
. 509746 IN NS d.root-servers.net.
. 509746 IN NS a.root-servers.net.
. 509746 IN NS f.root-servers.net.
. 509746 IN NS k.root-servers.net.
. 509746 IN NS m.root-servers.net.
. 509746 IN NS e.root-servers.net.
. 509746 IN NS l.root-servers.net.
;; Received 500 bytes from 127.0.0.1#53(127.0.0.1) in 2 ms

br. 172800 IN NS B.DNS.br.


br. 172800 IN NS E.DNS.br.

147
br. 172800 IN NS F.DNS.br.
br. 172800 IN NS C.DNS.br.
br. 172800 IN NS A.DNS.br.
br. 172800 IN NS D.DNS.br.
;; Received 284 bytes from 192.33.4.12#53(c.root-servers.net) in 189 ms

uol.com.br. 86400 IN NS borges.uol.com.br.


uol.com.br. 86400 IN NS charles.uol.com.br.
uol.com.br. 86400 IN NS eliot.uol.com.br.
;; Received 143 bytes from 200.219.154.10#53(D.DNS.br) in 245 ms

www.uol.com.br. 300 IN A 200.221.2.45


www.uol.com.br. 300 IN A 200.98.249.120
uol.com.br. 3600 IN NS eliot.uol.com.br.
uol.com.br. 3600 IN NS borges.uol.com.br.
uol.com.br. 3600 IN NS charles.uol.com.br.
;; Received 175 bytes from 200.221.11.98#53(eliot.uol.com.br) in 21 ms

Podemos utilizar o comando dig para testarmos se a transferência de zona entre os


servidores primários e secundários ocorrem com sucesso. Se o comando for executado
no servidor secundário da zona aulabsd2.com.br e não retornar todos os registros da
zona significa que algo está errado.
# dig bsd2.com.br @192.168.10.10 axfr

148

Você também pode gostar