Você está na página 1de 148

Agência para a Formação Profissional da Unicamp

Treinamento
Administração Básica de Servidores

Autores
Marcus Vinícius Lahr Giraldi
Renato Luiz de Sousa

2012
UNICAMP
Agência para a Formação Profissional da Unicamp

Treinamento
Administração Básica de Servidores

Atualização 2012

Autores:
Marcus Vinícius Lahr Giraldi
Renato Luiz de Sousa

Instrutor:
Marcus Vinícius Lahr Giraldi
marcus@iel.unicamp.br

2012
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
2.5 Exercícios ............................................................................................................. 31
2.5.1 Instalação do FreeBSD pelo método Customizado ....................................... 31
3. Unix Básico ................................................................................................................ 35
3.1 Introdução ............................................................................................................ 35
3.2 Efetuando o login no sistema ............................................................................... 35
3.3 O interpretador de comandos - shell ........................................................................ 36
3.4 Arquivos de configuração da Shell ....................................................................... 36
3.5 Permissão de arquivos/diretórios ............................................................................. 37
3.5.1 Alterando permissões ........................................................................................ 39
3.5.2 Alterando a propriedade .................................................................................... 39
3.6 Estrutura de Diretórios ............................................................................................. 40
3.7 Comandos diversos ................................................................................................. 41
3.8 Os arquivo /etc/passwd e /etc/master.passwd ......................................................... 42
3.9 O arquivo /etc/group ................................................................................................ 43
3.10 Comandos para manipulação de contas de usuários ............................................ 44
3.10.1 Criando usuários com adduser........................................................................ 44
3.10.2 Removendo usuários com rmuser ................................................................... 45

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

4
5.2.1 Sysctl MIBs .................................................................................................... 78
5.2.2 Manipulando Sysctls ...................................................................................... 78
5.3 Módulos de kernel ................................................................................................ 79
5.3.1 Visualizando os módulos carregados ............................................................ 79
5.3.2 Carregando e descarregando módulos ......................................................... 79
5.4 Construindo seu próprio Kernel ............................................................................ 80
5.4.1 Arquivo de configuração ................................................................................ 81
6. Atualização do FreeBSD ............................................................................................ 96
6.1 Versoes do FreeBSD ........................................................................................... 96
6.1.1 Releases ........................................................................................................ 96
6.1.2 Errata Branches ............................................................................................. 96
6.1.3 FreeBSD-current ............................................................................................ 96
6.1.4 FreeBSD-stable ............................................................................................. 96
6.2 Métodos de atualização. ...................................................................................... 97
6.3 Atualização Binária ............................................................................................... 97
6.3.1 Utilizando o freebsd-update ........................................................................... 97
6.4 Atualização por código fonte ................................................................................ 98
6.4.1 Stable-supfile ................................................................................................. 99
6.4.2 Construção do FreeBSD a partir do fonte. ................................................... 102
6.4.3 Compilando e instalando um novo kernel .................................................... 103
6.4.4 Preparação para a instalação do mundo ..................................................... 104
6.5 Instalação do mundo .......................................................................................... 106
7. Atualizando a árvore do ports .................................................................................. 108
7.1 Portsnap ............................................................................................................. 108
7.1.2 Configurando o portsnap ............................................................................. 108
7.1.3 Utilizando o portsnap ................................................................................... 109
7.2 Atualizando os ports instalados .......................................................................... 109
7.2.1 Identificando softwares desnecessários ...................................................... 112
7.2.2 Identificando e atualizando softwares .......................................................... 112
7.2.3 Reconstruindo programas dependentes. ..................................................... 113
7.2.4 Ignorando Ports ........................................................................................... 114
7.2.5 Reduzindo o tamanho da árvore do ports. ................................................... 114
8. DNS Bind ................................................................................................................. 116
8.1 Introdução .............................................................................................................. 116
8.2 O BIND – Berkeley Internet Name Domain ........................................................ 116
8.2.1 named.root................................................................................................... 117
8.2.2 named.conf .................................................................................................. 117

5
8.3 Arquivos de configuração de zona...................................................................... 117
8.4 Resource Records (RRs) .................................................................................... 117
8.5 Configurando o named ....................................................................................... 118
8.6 Configurando DNS server secundário (SLAVE) ................................................. 122
8.7 Testando nosso servidor dns .............................................................................. 124
9. Dispositivos Nativos de Segurança .......................................................................... 128
9.1 O usuário toor ..................................................................................................... 128
9.2 O arquivo /etc/ttys ............................................................................................... 128
9.3 Chflags ............................................................................................................... 130
9.4 Kernel securelevels ............................................................................................ 132
9.5 sshd_config ........................................................................................................ 134
9.6 Opções de montagem no /etc/fstab .................................................................... 136
9.7 Mostrar todos os processos ................................................................................ 138
9.8 Criptografia blowfish ........................................................................................... 139
9.9 Exercícios ........................................................................................................... 140
9.9.1 Habilitando e removendo o usuário toor ...................................................... 140
9.9.2 Configurando os terminais ........................................................................... 140
9.9.3 Utilizando chflags ......................................................................................... 141
9.9.4 Kernel secureleves ....................................................................................... 143
9.9.5 sshd_config .................................................................................................. 145
9.9.6 Mostrar todos os processos ......................................................................... 145
9.9.7 Criptografia Blowfish .................................................................................... 146

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
Fonte: 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

8
responsável pelo desenvolvido do NetBSD que trabalhava no intuito de fazer
com que o BSD fosse 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.

12
Boot FreeBSD with ACPI disable
Inicia o FreeBSD desabilitando suporte ACPI. Caso tenha problemas na
inicialização normal essa opção é recomendada.

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.

13
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)


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.

16
Standard – Begin a standard installation (recommended)
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.

17
Fixit – Repair mode with CDROM/Floppy or start Shell
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).

18
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.

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 é
T definido por um número. A partição do tipo BSD é definida pelo
número 165.
Define as configurações da geometria do disco. É utilizada
G
quando o kernel não detecta corretamente essas configurações.
Alterna a unidade de medida do tamanho do slice entre ST
Z
(Setores), 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
C ponto de montagem. 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 Altera argumentos do newfs

R Exclui a partição seleciona e mescla com a partição adjacente

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.

23
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 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).

24
Selecionaremos a opção Install from a FreeBSD CD/DVD

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

25
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.

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.

27
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 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.

28
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”

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.

29
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.

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.

30
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.

2.5 Exercícios
2.5.1 Instalação do FreeBSD pelo método Customizado

1. Insira o cd do freebsd e aguarde.

2. Na tela Welcome to FreeBSD aguarde até ser carregado ou pressione enter

3. Na tela country selection, escolha o número 31 – Brazil

4. Na tela system console keymap, selecione Brazil Iso (accent) – Brazil ISO
keymap
(accent keys).

5. Na tela FreeBSD/i386 8.0-RELEASE – sysinstall main menu , selecione a


opção custom (Begin a custom installation (for experts))

6. Na tela Choose Custom Installation Options, selecione a opção 2 options –


View/Set Various installation options

7. Na tela Options Editor, apenas observe as opções e suas legendas e tecle


esc para sair

8. Na tela Choose Custom Installation Options, selecione a opção 3 Partition –


Allocate disk space for freebsd

9. Observe que pode aparecer uma janela de erro com o título User
confirmation Request – selecione Yes

31
10. Na tela FDISK Partition Editor observe o nome do disco, sua geometria e
mais algumas informações.

11. Seguindo a legenda na parte inferior da tela, selecione a partição unused


(ficará azul) e tecle A

12. Selecione agora a partição ad1s1 com a descrição freebsd e tecle S.


Observe a Flag A indicando que esta partição é bootavel

13. Tecle Q para finalizar

14. Na tela Install boot manager for drive all, selecione a opção Standard –
Install a standard MBR (non-interactive boot manager)

15. De volta a janela Choose Custom Installation Options, selecione 4 Label –


Label allocated disk partitions

16. Tecle A para utilizar o particionamento automático

NOTA: Por ser uma instalação de aprendizagem estamos utilizando o particionamento


automático. O tamanho e a quantidade de cada partição deve ser montada de acordo
com o seu ambiente. Por isso recomendamos que se estde fortemente os aplicativos
que serão utilizados, bem como seu esquema ideal de particionamento.

17. Ao finalizar estará novamente na tela Choose Custom Installation Options,


selecione então a opção 5 Distributions – Select distribution(s) to extract

18. Na tela choose distributions, selecione a opção 4 Developer Full sources,


binaries and doc but no games e utilize a barra de espaço para fazer a seleção.

19. Na tela FreeBSD Documentation Installation Menu, selecione com a barra


de espaço a opção en – English Documentation (required)

20. Selecione a opção X Exit – Exit this menu (returning to prévios)

21. A tela User confirmation Requested mostrará uma informação sobre o


ports, selecione No

22. De volta para a tela Choose Distributions, selecione exit

21. Na tela Choose Custom Installation Options, escolha a opção 6 media –


Choose the instalation media type

22. Na tela Choose Instalation Media, escolha a opção 1 CD/DVD Install from a
FreeBSD CD/DVD

23. E pela última vez na tela Choose Custom Installation Options, escolha a
opção 7 Commit – Perform any pending Partition/Label/Extract actions.

24. A tela User Confirmation Request avisa que esta é a última chance,
selecione Yes para continuar.
32
Observações da instalação: Neste momento o instalador do FreeBSD está
copiando os arquivos do CD para o HD recém formatado. Utilize a combinação
de teclas alt+f2 para visualizar os arquivos que estão sendo copiados.

25. Na tela User Confirmation Requested (Visit the general configuration menu
for a chance to set any last options). Selecione No

26. De volta para a primeira tela: FreeBSD/i386 8.0-RELEASE selecione a


opção Configure Do post-install configurations of FreeBSD

27. Na janela FreeBSD Configuration Menu, selecione a opção Root Password


– Set the system manager´s password.

28. Digite freebsdafpu em frente a new password:

29. E em frente de Retype New Password: digite novamente freebsdafpu


30. Na tela FreeBSD Configuration Menu, selecione User Management – Add
user and group information

31. Na tela User and group management selecione a opção User Add a new
user to the system.

32. Na tela add a new user, observe que há vários campos e no final da tela, em
amarelo, existem as legendas para cada campo.

33. Começando pelo campo “Login ID:” observe a legenda “The login name of
the user (mandatory)” Digite então o login do seu usuário

34. O campo UID: especifica o ID numérico para o usuário, deixe o padrão

35. No campo group, deixe em branco

36. Digite sua senha no campo password e

37. Digite novamente a senha no campo confirm password:

38. No campo Full name digite o nome completo do usuário

39. Deixe o campo Member groups em branco

40. O campo Home directory deve ser utilizado apenas se existir a necessidade
de alterar a pasta default, deixando em branco ele cria o home do usuário em
/home/username

41. E finalmente deixe o campo Login Shell da forma padrão, ou então escolha
um shell de sua preferência.

42. Na tela User and Group management, escolha X Exit Exit this menu
(returning to previous)

33
43. Na tela FreeBSD configuration Menu, selecione Time Zone – Set which
time zone you’re in

44. Na tela Select local or UTC (Greenwich Mean Time) clock, selecione No

45. Na tela Time Zone Selector, selecione 2 American – North and South

46. Na tela Countries in America – North And South, selecione 9 Brazil

47. Na tela Brazil Time Zones, selecione 8 S & SE Brazil (GO, DF, MG, ES, RJ,
SP, PR, SC, RS)

48. Na tela confirmation observe que no horário de verão aparecerá a


abreviação BRST indicando o Brazilian Sumertime, caso contrário aparecerá
BRT. Selecione Yes.
49. Na tela FreeBSD Configuration Menu, selecione X Exit

50. De volta a tela FreeBSD/i386 8.0-RELEASE aperte o cursor para a direita


selecionando a opção Exit Install.

51. Na tela User Confirmation Requested, selecione YES

52. Na janela Message, tecle ok e retire o cd de instalação do drive.

34
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'.

35
You may also use sysinstall(8) to re-enter the installation
and
configuration utility. Edit /etc/motd to change this login
announcement. $

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
36
# 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).

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 à

37
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--
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

38
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.
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

39
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
/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.

40
Diretório Descrição
/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.

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


especificados ls –la /
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
mv arq1.txt arq2.txt
para o destino. Pode ser utilizado para
alterar o nome de um arquivo ou diretório
cat Exibe o conteúdo de um arquivo cat teste.txt

41
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
especificado. Essa ligação pode ser um ln a1.txt mesmo_a1.txt
soft link ou um hardlink dependendo dos
argumentos especificados
head Exibe as linhas iniciais do arquivo head arq1.txt
especificado head -25 arq2.txt
tail Exibe as linhas finais do arquivo tail –f /var/log/messages
especificado tail -30 arq1.txt
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
shutdown –p +3
imediatamente ou após determinado
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.

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:Ful
ano de Tal:/home/fulano:/bin/sh

Os campos representam respectivamente:

42
 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.
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).

43
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:
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.

44
# 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.
# 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.

45
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


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:

46
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

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.

47
# 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
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

48
# /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.

Fonte:
http://www.rwc.uc.edu/thomas/Intro_Unix_Text/Images/Unix_file_system.png

É 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

49
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. O valor 0 desabilita o backup via dump. Valores
maiores que 0 indicam o intervalo em dias entre os backups.
 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)
/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.

50
 -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

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

51
# 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
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]

52
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

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]

53
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)
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

54
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


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.

55
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


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

56
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.
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):

57
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.

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 1s

58
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

3.16 Exercícios
3.16.1 Com base na execução do comando abaixo:
# ls -li
total 4
22148 -rw-r--r-- 2 root wheel 7 Feb 14 00:10 a.txt
22149 drwxr-xr-x 2 root wheel 512 Feb 14 00:11 b.txt
22150 lrwxr-xr-x 1 root wheel 5 Feb 14 00:12 c.txt ->
a.txt
22148 -rw-r--r-- 2 root wheel 7 Feb 14 00:10 d.txt

Responda:

 Qual o tipo de cada um dos elementos listados ?


 Existe alguma relação entre os elementos exibidos ? Em caso positivo,
qual a sintaxe do comando para gera-lo ?
 Qual o comando necessário que possibilite que qualquer usuário do
sistema edite d.txt ?
 Qual o comando necessário que altera a posse do grupo de b.txt para
um grupo chamado nobody ?

3.16.2 Precisamos configurar um disco recém adicionado ao nosso sistema. A


partição tipo ufs é /dev/ad1s1d e deve ser montado em /backup. Por questões
de segurança, não deve ser permitido a execução de binários e arquivos com
suid ativado. Qual a linha que deve ser incluída no /etc/fstab para que a
partição seja utilizada pelo sistema ?

3.16.3 Com base na linha abaxio do arquivo /etc/master.passwd


user1:*LOCKED*$1$H$g2lQp74HR3hwo1FQq0:1002:1002::0:0:User1:/
home/user1:/bin/sh

Responda:

 Qual o UID e GID do usuário ?


 Ele tem poderes de administrador ? Por que ?
 O usuário pode se logar no sistema? Em caso negativo, qual o comando
que possibita seu uso ?

59
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.

60
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:

61
#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

62
/usr/ports/Mk/bsd.commands.mk
...
/usr/ports/x11/xzoom/
/usr/ports/x11/yakuake-kde4/
/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.

63
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 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.

64
 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.
 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.

65
 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.
 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

66
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/

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:

67
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

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

68
 -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
 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

69
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;
 -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:

70
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.

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.

71
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á 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;

72
 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.

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.

73
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 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:

74
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.


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

75
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.
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.

76
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

77
5.2.1 Sysctl MIBs
Como foi dito anteriormente, a sysctl é organizada na forma de uma MIB,
possuindo categorias distintas. A tabela a seguir 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

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

78
Para maiores informações sobre sysctl, verifique sua manpage.

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


A tarefa de carregar e descarregar um módulo de kernel pode ser executada
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ê desejasse 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.

79
Para descarregar um módulo, 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ó ficarão 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 com todas as opções e módulos que podem ser carregados
via loader.conf estão em /boot/defaults/loader.conf

A parte mais complicada de se trabalhar com módulos de kernel é saber qual


módulo deve ser carregado. Geralmente este recurso será utilizado quando um
novo dispositivo, como uma placa de rede, for instalado e este 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

80
Para isso o FreeBSD fornece algumas ferramentas, como o dmesg, sysctl,
uname e pciconf.

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. Os principais arquivos
deste diretório 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 uma 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.

81
 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 é independente da plataforma, 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

82
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

Note que a saída do comando informa o tipo, ou seja, 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 pode ser substituída por um nome padrão a ser utilizado
para o kernel.

A seguir 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. Durante o momento da
configuração do kernel é possível retirar ou acrescentar opções, conforme as
necessidades do ambiente.

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

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.

83
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
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

84
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:

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:

85
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

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

86
# Bus support.
device acpi
device eisa
device pci

# Floppy drives
device fdc

# ATA and ATAPI devices


device ata
device atadisk # ATA disk drives
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

87
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)
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

88
# 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.
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.

89
# 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
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'')

90
# 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
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

91
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

# 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

92
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

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

------------------------------------------------------------
--

93
>>> stage 1: configuring the kernel
------------------------------------------------------------
--
cd /usr/src/sys/i386/conf;
PATH=/usr/obj/usr/src/tmp/legacy/usr/sbin:/usr/obj/usr/src/t
mp/legacy/usr/bin:/usr/obj/usr/src/tmp/legacy/usr/games:/usr
/obj/usr/src/tmp/usr/sbin:/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/t
mp/legacy/usr/bin:/usr/obj/usr/src/tmp/legacy/usr/games:/usr
/obj/usr/src/tmp/usr/sbin:/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
------------------------------------------------------------
--
>>> 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

------------------------------------------------------------
--

94
>>> 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/t
mp/legacy/usr/bin:/usr/obj/usr/src/tmp/legacy/usr/games:/usr
/obj/usr/src/tmp/usr/sbin:/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.

95
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.

96
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


O processo de atualização binária é dividido em duas etapas, download das
atualizações e aplicação delas.

97
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:

98
 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.

99
*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

100
#src-secure
#src-sys-crypto

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:

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

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

102
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
------------------------------------------------------------
--

------------------------------------------------------------
--
>>> 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

103
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.

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:

104
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
“+”;

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

105
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

#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.

106
#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

107
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=9b5feee6d69f170e3dd0a2c8e469ddbd64f13f978f2f3aede40
c98633216c330
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.

108
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.

109
Para instalar o portmaster:

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

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

110
===>>> 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)


===>>> 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

111
===>>> 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

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

112
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.

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

113
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]

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

114
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.

115
8. DNS Bind

8.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.

8.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

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

8.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.

8.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
*/.

8.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.

8.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

117
8.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

};

118
// 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";
};

// A zona declarada acima é responsável pelo mapeamento


direto do nome

119
// 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
// conexão com o primário.

120
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

121
// 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

8.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.

122
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 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;);
};

123
8.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

124
Podemos utilizar o dig para executar consultas reversas adicionando o
parâmetro -x
# dig -x 192.168.0.12
;; global options: +cmd
;; 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:

125
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

; <<>> 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.

126
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.
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

127
9. Dispositivos Nativos de Segurança

Neste capítulo serão abordados conceitos básicos sobre a segurança do


FreeBSD e para implementar estes conceitos, serão utilizadas algumas
ferramentas nativas do próprio sistema.

9.1 O usuário toor


Dependendo da política de segurança adotada, o usuário toor pode ser
considerado um aliado do administrador de sistemas ou um grande vilão. Este
usuário é mantido em todos os sistemas BSD e existe no BSD Unix original
desde sua criação.
Tendo os mesmos provilégios que o usuário root, o usuário toor pode ser
utilizado em alguma emergência, onde o detentor da senha do root não se
encontra ou mesmo esquecido a senha.
A conta de super usuário toor vem por padrão sem senha e impossibilitada de
ser utilizada. Para se ter acesso à conta toor é necessário alterar sua senha.
Para isso como root basta executar o comando:

#passwd toor

A partir deste momento a conta toor poderá ser utilizada.


É possível observar que ela possui UID 0 e GID 0.

Cabe a cada administrador de sistema a decisão da utilização ou não da conta


toor. Caso ela seja utilizada recomenda-se fortemente a criação de uma senha
forte para ela. Caso não seja utilizada, a melhor opção é deletar a conta.
Para deletar a conta, é necessário usar o comando vipw, uma vez que o
comando rmuser se nega a excluir um usuário com UID 0.

9.2 O arquivo /etc/ttys


Para permitir que um administrador de sistema realize várias tarefas ao mesmo
tempo, o FreeBSD por padrão disponibiliza até 8 terminais virtuais. Para alterar
entre os terminais basta utilizar a combinação alt+f1 até alt+f8. Todas as
configurações de terminais virtuais, consoles locais, terminais remotos e todo o
tipo de terminal utilizado no FreeBSD são armazenadas no arquivo /etc/ttys

A primeira linha a ser configurada indica o console utilizado quando em modo


monousuário. Observe que é chamado de console

console none unknown off secure

Já em modo multiusuário o FreeBSD utiliza terminais virtuais, definidos de 0 a 7


e o terminal 8 pode ser utilizado como terminal gráfico caso um servidor de
ambiente gráfico esteja instalado no sistema

128
ttyv0 "/usr/libexec/getty Pc" cons25 on secure
# Virtual terminals
ttyv1 "/usr/libexec/getty Pc" cons25 on secure
ttyv2 "/usr/libexec/getty Pc" cons25 on secure
ttyv3 "/usr/libexec/getty Pc" cons25 on secure
ttyv4 "/usr/libexec/getty Pc" cons25 on secure
ttyv5 "/usr/libexec/getty Pc" cons25 on secure
ttyv6 "/usr/libexec/getty Pc" cons25 on secure
ttyv7 "/usr/libexec/getty Pc" cons25 on secure
ttyv8 "/usr/local/bin/xdm -nodaemon" xterm off secure

Dentre as várias opções presentes neste arquivo, a que mais nos interesse é a
última coluna, que define o tipo de opração da console e dos terminais virtuais.

É importante salientar que os modos definidos por “secure” e “insecure” não se


referem ao funcionamento da console, mas sim do ambiente físico onde se
localiza o equipamento.
Se o modo está configurado como secure, significa que este equipamento está
em um ambiente físico seguro, onde apenas poucas pessoas possuem acesso.
Já se a configuração está setada para insecure, significa que o equipamento
está em um ambiente inseguro, como um corredor por exemplo.
Para alterar o modo da console, basta substituir a linha:
console none unknown off secure

por

console none unknown off insecure

A partir deste momento, ao entrar em modo monousuário, o FreeBSD irá solicitar


a senha de root.

NOTA A utilização da console em modo insecure é recomendável, evitando que qualquer


usuário que tenha acesso físico ao equipamento mesmo não conhecendo a senha de
root consiga altera-lá, como já foi visto nesta apostila.
É importante ressaltar que após utilizar a opção insecure, não será mais possível
recuperar a senha de root por equecimento entrando em modo monousuário.

Outra utilização muito interessante da configuração “insecure” é garantir a


auditoria do servidor quando este é administrado por mais de um administrador.
Até este momento todo login foi feito diretamente em um terminal virtual com o
usuário root. Este tipo de login irá gerar em /var/log/messages entradas como:

Feb 11 18:28:02 wiki login: ROOT LOGIN (root) ON ttyv0

Supondo que logo após este login, um script mal escrito acabe causando
instabilidade ou mesmo travamento em algum processo crucial para este
ambiente, como identificar, dentre os administradores, quem foi o responsável
por esta execução? Afinal todos logam diretamente como root.
A solução para este problema é alterar a configuração de cada terminal virtual
pra insecure, o que irá impedir que um usuário logue como root diretamente.

129
Uma tentativa de login em um terminal “insecure” iria gerar uma saída parecida
com esta:

Feb 11 18:32:27 wiki login: pam_acct_mgmt(): authentication


error

E o usuário iria receber na tela um “login error”


Ou seja, se todos ttyv<n> forem “insecure” o usuário root estará impossibilitado
de logar diretamente em um terminal, obrigando o administrador a logar com seu
usuário e após executar o comando su para se tornar super usuário e também
possuir a senha do root.

Esta pequena configuração garante dois níveis adicionais de segurança no login


do sistema, onde, para um usuário conseguir os privilégios de super usuário, ele
precisa transpor três etapas:
1- Usuário sem privilégio necessita de senha para se autenticar no sistema.
Autenticação número 1.
2- Usuário sem privilégio necessita de direitos para se tornar super usuário,
ou seja, deve pertencer ao grupo wheel. Verificação de segurança.
3- O usuário tem que saber a senha de root para tornar-se super usuário.
Autnticação número 2.

Dessa forma é possível acompanhar cada usuário que se tornou super usuário
analisando entradas em /var/log/messages:

Feb 11 18:41:40 wiki su: marcus to root on /dev/ttyv1

9.3 Chflags
Todos os sistemas operacionais baseados em Unix possuem permissões dando
direitos de leitura, escrita e execução em arquivos e diretórios para o dono do
arquivo, grupo ou todos os usuários. O FreeBSD estende o esquema de
permissões utilizando as flags de arquivos, ou chflags, que atuam juntas com o
esquema já conhecido de permissões para aumentar a segurança do sistema.
Para a utilização destas flags, se faz necessário o uso do comando chflags.
O comando chflags possui sintaxe bem parecida com o comando chmod,
permitindo recursividade e até mesmo ser aplicado em links simbólicos.
Este comando, aqui identificado por chflags(1) faz uso da chamanda de sistema
chflags(2). A diferenciação numérica é feita na hora de se usar a manpage, por
exemplo, para ter acesso a manpage do comando chflags basta executar o
comando

#man chflags
Ou
#man 1 chflags

Já para se obter a manpage da chamada de sistema chflags

#man 2 chflags

130
A sintaxe básica do comando é

chflags [opções] <flags> <arquivo>

É importante conhecer todas as chflags e suas funcionalidades:

Nome Função Usuário habilitado


Esta chflag permite que o arquivo
seja arquivado, ou seja, qualquer
cópia irá manter todos os seus
arch, archived Super usuário
atributos. É uma exceção a opção
nodump.

O arquivo se torna opaco quando


acessado por meio de dispositivos
Super usuário ou dono do
opaque abertos externamente. Esta flag irá
arquivo
esconder alguns atributos, como os
de autoridade ou permissões
Esta opção torna o arquivo ou a
Super usuário ou dono do
nodump pasta uma excessão ao comando
arquivo
dump
Opção conhecida como append
only. Quando setada esta opção, o
arquivo não pode ser aberto para
sappnd, sappend Super usuário
edição, apenas concatenado,
tornando-se uma excelente opção
para arquivos de logs.
Tem o mesmo comportamento que
uappnd, uappend sappnd, mas esta flag é setada pelo Dono do arquivo
dono do arquivo
Opção de imutabilidade do arquivo.
Com esta flag setada o arquivo não
schg, schange,
pode ser editado, renomeado, Super usuário
simmutable
apagado, ter suas permissões
alteradas, etc.
As mesmas opções de schg, com a
uchg, uchange, Dono do arquivo
diferença que o usuário root pode
uimmutable
apagar o arquivo.
Arquivos com esta flag não podem
sunlnk, sunlink sob hipótese nenhuma serem Super usuário
apagados.
uunlnk, uunlink As mesmas opções de sunlnk Dono do arquivo

Cada chflag pode ser removida colocando-se o prefixo “no” em cada uma delas,
com exceção da chflag nodump, que para ser removida é necessário retirar o
prefixo “no”.
Segundo a manpage do comando chflags, para se remover todas as chflags de
um arquivo, utilizar o comando:

#chflags 0 <nome_do_arquivo>

131
Das chflags apresentadas, as mais utilizadas como opção de segurança em um
sistema são sappnd para arquivos de log e schg para arquivos de sistema que
não serão modificados e arquivos binários, impedindo assim que um atacante
substitua um binário legitmo por um binário adulterado.

Segundo a FreeBSD Brasil, uma boa prática de segurança é proteger


recursivamente com chflags os seguintes paths:
 /kernel
 /stand
 /bin
 /sbin
 /usr/bin
 /usr/sbin
 /usr/local/bin
 /usr/local/sbin
 /usr/local/libexec
 /usr/libexec
 /usr/local/lib
 /usr/lib

Pois estas pastas contêm binários que são criados durante a instalação ou
atualização do sistema. Vale lembrar que para uma atualização do sistema,
estes paths devem ser desprotegidos.

Para visualizar as chflags definidas, basta utilizar o comando

#ls –lo

Ex:
#ls –lo messages
-rw-r--r-- 1 root marcus schg 13459 Feb 12 00:07 messages

9.4 Kernel securelevels


O FreeBSD possui mecanismos de segurança para executar o sistema
operacional em múltiplos níveis, com comportamentos distintos. Estes
mecanismos são chamados de níveis de segurança do kernel ou kernel
securelevels.
Os níveis de segurança do kernel são, resumidamente, formas distintas de
operações onde o próprio sistema (kernel) impõe algumas restrições a mais à
forma como diversas operações, internas ou essências ao sistema, são
utilizadas. Os níveis de segurança do kernel modificam essencialmente o
comportamento em nível de sistema.
É necessário deixar claro que a utilização de níveis de segurança deixa a
administração do sistema mais complicada, mas por outro lado, também deixa a
vida de um atacante mais complicada. Para uma utilização ideal dos níveis de
segurança é encessário um estudo das características do sistema e um bom
planejamento. É altamente aconselhável que os níveis de segurança sejam
utilizados com chflags para aumentar ainda mais a segurança do sistema.

132
Existem cinco níveis diferentes, -1, 0, 1, 2 e 3, onde o -1 é o nível mais inseguro
e o nível 3 é o mais seguro.

Securelevel -1: modo permanentemente inseguro


É o modo padrão, sinônimo de kernel securelevel desligado. Não prove
nenhuma segurança adicional de kernel.

Securelevel 0: modo inseguro


Este modo é utilizado apenas durante o processo de boot. Ele garente que as
permissões dos arquivos sejam respeitadas.

Securelevel 1: modo seguro


A partir deste nível as características de segurança começam a se tornarem
mais robustas:
 As chflags podem ser definidas, mas não podem ser removidas
 Módulos de kernel não podem ser carregados ou descarregados
 Programas não conseguem escrever diretamente na memória via
/dev/mem e /dev/kmen. O servidor gráfico X para de funcionar a partir
deste ponto.
 Nenhum dispositivo de armazenamento pode ser aberto para escrita
direta a não ser por processos do sistema.

Securelevel2: modo altamente seguro


Este nível de segurança incorpora todas as características descritas
anteriormente e adiciona mais duas:
 Discos não podem ser abertos para escrita direta, apenas pelo comando
mount. Neste nível torna-se impossível a formatação de discos utilizando
o comando newfs e aplicações que fazem acesso direto ao disco, como o
comando dd não pode ser utilizado.
 O relógio do sistema não pode ser alterado para mais de um segundo.

Securelevel 3: modo seguro de rede


Neste modo, todas as regras definidas nos modos anteriores estão ativas e ele
acrescenta mais uma regra: regras de firewall não podem ser alteradas. Este é o
modo de segurança máximo de um sistema.

Este é o comportamento que cada nível de segurança implementa no FreeBSD.


Note que cada nível age de maneira recursiva sobre os níveis anteriores, ou
seja, cada um deels implementa suas funcionalidades e as funcionalidades de
todos os níveis abaixo dele.

Os níveis de segurança podem ser implementados diretamente com um servidor


em produção. Para isso basta alterar uma variável sysctl. Os comandos a seguir
ilustram como obter informação do nível de segurança atual:

# sysctl -d kern.securelevel
kern.securelevel: Current secure level

133
# sysctl kern.securelevel
kern.securelevel: -1

Para se alterar o nível de segurança, basta passar o novo nível na chamada da


sysctl:

# sysctl kern.securelevel=1
kern.securelevel: -1 -> 1

A alteração do nível de segurança é uma operação incremental, ou seja, os


níveis podem subis, mas jamais podem baixar. A seguir um exemplo da tentativa
de baixar o nível de segurança de 2 para 0

# sysctl kern.securelevel=0
kern.securelevel: 2
sysctl: kern.securelevel: Operation not permitted

Sempre que o sistema for reiniciado o nível de segurança volta para seu valor
padrão que é -1. Para tornar esta operação permanente é necessário aumentar
o nível de segurança direto em /etc/rc.conf ou em /etc/sysctl.conf.

/etc/rc.conf
kern_securelevel_enable=”YES”
kern_securelevel=”2”

/etc/sysctl.conf
kern.securelevel=2

Sendo assim os níveis de segurança podem ser ativados a qualquer momento


do boot ou do sistema em produção. È necessário utilizar com cautela o
carregamento no boot, pois uma vez que os níveis de segurança sejam elevados
antes do término do carregamento do rc.conf, a neggação de privilégios pode
atrapalhar o funcionamento de alguns programas, como o fsck por exemplo, que
faz uso direto no disco e pode falhar se a segurança do sistema estiver em nível
2 ou superior.
Recomenda-se fortemente que o administrador faça todas as configurações em
um servidor para depois, como última etapa ativar os níveis de segurança.

A combinação dos níveis de segurança com as chflags vistas anteriormente


podem garantir total imutabilidade de um sistema, evitando que atacantes
consigam explorar falhas de aplicação, como um script PHP mal escrito ou uma
vulnerabilidade no servidor web e instalar qualquer rootkit ou trojan no sistema.
O único inconveniente de se proteger um sistema com estas duas ferramentas é
a necessidade de entrar em modo monousuário para desativar as flags toda vez
que uma atualização do sistema for necessária.

9.5 sshd_config
O OpenSSH presente na base do FreeBSD foi desenvolvido pela equipe do
OpenBSD. As configurações padrões já tornam esse serviço seguro, mas

134
existem outras que podem ser configuradas para tonar o serviço ainda mais
seguro. As configurações ficam em /etc/ssh/sshd_config.
Este subcapítulo da apostila irá tratar apenas algumas configurações do SSH,
para maiores informações é recomendado a leitura de man sshd e man
sshd_config.
A seguir serão analisados os principais parâmetros de configuração do arquivo
sshd_config:

#VersionAddendum FreeBSD-20090522

Esta linha adiciona um adendo ao número da versão do deamon sshd. O padrão


do FreeBSD é informativo e mostra a data da compilação. Caso a segurança por
obscuridade seja uma opção, é interessante a alteração desta linha.

#Port 22

O daemon sshd ouve por padrão a porta TCP 22. Caso haja a necessidade de
alterar a porta, basta remover o comentário desta linha e alterar sua numeração

#Protocol 2

Definição do tipo de protocolo que o sshd irá utilizar. Existem dois protocolos,
ssh v2 e ssh v1. O ssh v1 é conhecido por ter muitas falas de segurança. Até o
FreeBSD 5, ele vinha como opção padrão do sshd_config, a partir da versão 6,
passaram a omitir a versão 1 da configuração do arquivo. É possível se for a
vontade do administrador, rodar o ssh utilizando sua versão 1, bastanto alterar a
linha de protocolo para 1.

#AddressFamily any

Esta linha indica qual família de endereços o sshd irá utilizar. As opções são any,
inet para utilizar apenas endereços IPv4 e inet6 para utilização de endereços
IPv6. Se o servidor não utiliza endereços IPv6, é recomendado alterar o
AddressFamily para inet

#ListenAddress 0.0.0.0
#ListenAddress ::

Especifica qual endereço IP local o sshd irá ouvir. A opção padrão é 0.0.0.0 o
que significa que o daemon irá ouvir todos os endereços presentes nas
interfaces. É uma boa prática deixar o endereço da interface utilizada para
conexão nesta linha.
Na linha de baixo é possível observar que o sshd também está ouvido todos os
endereços IPv6 disponíveis nas interfaces, para desabilitar, basta omitir esta
linha.
Continuando com o arquivo de configuração, abaixo dessas linhas existe um
bloco de tratamento de chaves públicas e privadas. É aconselhável manter tudo
como está.
Logo após estão as linhas que configuram a habilidade do sshd logar
informações:

135
# Logging
# obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH
#LogLevel INFO
As opções podem ser mantidas como estão uma vez que guardam muita
informação importante nos logs. Uma funcionalidade maior de log, apenas a
clausula DEBUG oferece, mas esta é recomendada para encontrar problemas.

Outra opção interessante é manter a linha

#PermitRootLogin no

Como discutido na segurança dos terminais virtuais, o usuário será obrigado a


utilizar o ssh para após elevar-se a super usuário. Dessa forma o nível de
segurança se torna maior.

Outra consideração interessante nas configurações do ssh é a possibilidade de


restringir os usuários que podem se logar via este serviço e mesmo os
endereços de onde determinados usuários possam se logar.
Estas configurações não estão presentes no arquivo de configuração, mas
podem ser adicionadas, elas são:
 AllowUsers
 AllowGroups
 DenyUsers
 DenyGroups

A linha AllowUsers define quais usuários podem se logar via ssh. O fato de
colocar o login de um usuário nesta linha irá automaticamente bloquear todos os
outros usuários de se logar ao servidor. Uma configuração interessante é que
esta linha permite que o host por onde o usuário esteja se conectando seja
também informado, reforçando ainda mais a segurança, pois determinado
usuário pode realizar a conexão apenas de determinado host: user@host1.com
ou user@192.168.0.180.
A linha AllowGroups permite que grupos inteiros possam se conectar ao
servidor. Da mesma forma, se utilizada, apenas os grupos aqui constados
poderão se conectar ao servidor.
DenyUsers identifica quais os usuários que não poderão logar e finalmente
DenyGroups identifica quais grupos não poderão logar no servidor.

9.6 Opções de montagem no /etc/fstab


Esta é uma consideração de segurança que deve ser levada em consideração.
Além dos atributos tradicionais, existem alguns outros atributos que podem ser
declarados nos pontos de montagem do /etc/fstab aumentando ainda mais a
segurança do ambiente.
Estas opções são
 noexec
 noatime

136
 nosuid
 tcp

A opção noexec indica que nenhum arquivo naquele ponto de montagem possa
ser excutado, ainda que tenha permissões e direito de execução.

A opção noatime evita que o tempo de acesso dos arquivos seja atualizado.
Noatime significa “No Access Time”. Sistemas de arquivos Unix podem
normalmente ter alguns metadados frequentemente atualizados, entre eles além
da data de criação do arquivo, existe a data da última modificação e também a
data do último acesso. Essas informações podem ser verificadas com o
comando stat em cada arquivo. Para alguns diretórios é interessante habilitar
esta opção por questões de performance.

A opção nosuid evita que qualquer processo assuma privilégios de outros


usuários senão os usuários que os executarem.

A opção tcp deve ser usada em sistemas de arquivos remotos, como NFS, para
forçar que sua montagem seja feita com o protocolo TCP ao invés do UDP.

A implementação dos pontos de montagem vai depender muito do planejamento


e necessidades de cada ambiente. O administrador de sistemas deve perder um
tempo planejando como será seu esquema de partições e quais características
irá implementar em cada uma delas.
Como dica fica a montagem da partição /tmp com noexec, nosuid e nodev.
Para usuários de squid que tenham partições próprias para o chache, um bom
ganho de performance se dá utilizando a opção noatime.

# Device Mountpoint FStype Options Dump


Pass#
/dev/ad4s1b none swap sw 0 0
/dev/ad4s1a / ufs rw 1 1
/dev/ad4s1e /tmp ufs rw,nosuid,noexec 2 2
/dev/ad4s1f /usr ufs rw 2 2
/dev/ad4s1d /var ufs rw 2 2
/dev/acd0 /cdrom cd9660 ro,noauto 0 0

É importante lembrar que no processo de reconstrução total do FreeBSD, mais


precisamente no processo de instalação (make installworld) se a partição /tmp
estiver montada com noexec o processo irá falhar pois ele cria rotinas
temporárias e as executa nesta partição.
Não é necessário reiniciar o servidor para alterar o ponto de montagem da
partição tmp.Em caso de erro no processo de reconstrução, basta rodar os
seguintes comandos:

#mount | grep tmp


/dev/ad4s1e on /tmp (ufs, local, noexec, nosuid, soft-
updates)

137
Exibe as informações da partição /tmp. É possível observar que a opção noexec
está habilitada.
Basta então montar novamente a partição, passando o parâmetro –u de update
no comando mount.

#mount -u -o rw /tmp
#mount | grep tmp
/dev/ad4s1e on /tmp (ufs, local, soft-updates)

E a partição está montada sem nenhuma restrição. Após o processo, retorne as


restrições na partição utilizando o mesmo comando:

#mount -u -o rw,nosuid,noexec /tmp

9.7 Mostrar todos os processos


O comportamento padrão do FreeBSD é mostrar todos os processos para todos
os usuários, dessa forma, mesmo os usuários disprivilegiados, como WWW
pode listar todos os processos do sistema por scripts CGI ou php.
Desabilitar esta opção implica em determinado usuário ver apenas seus
processos e não mais poder visualizar os demais processos que estão rodando
no sistema. Esta configuração apenas não faz efeito para o usuário root, que
continua enxergando todos.
Esta configuração fica armazenada em uma variável sysctl chamada
security.bsd.see_other_uids.

Examinando a descrição e o valor padrão desta variável é possível observar que


ela vem habilitada:

# sysctl -d security.bsd.see_other_uids
security.bsd.see_other_uids: Unprivileged processes may see
subjects/objects with different real uid

# sysctl security.bsd.see_other_uids
security.bsd.see_other_uids: 1

Para desabilitar esta variável, basta utilizar o comando:

# sysctl security.bsd.see_other_uids=0

Feito isso cada usuário só verá seus próprios processos.

Para automatizar esse processo, editar o arquivo /etc/sysctl.conf e descomentar


a linha:

# Uncomment this to prevent users from seeing information


about processes that
# are being run under another UID.
#security.bsd.see_other_uids=0

138
9.8 Criptografia blowfish
O FreeBSD possui a criptografia blowfish na base. Ela somente não é utilizada
como padrão, pois alguns países como EUA e China proíbem o uso de tal
criptografia em sistemas. Como não Brasil não há restrições contra qualquer tipo
de criptografia, ela pode ser utilizada normalmente.
Para garantir que o FreeBSD utilize a criptografia Blowfish preferencialmente na
hora de codificar informações é necessário alterar o arquivo /etc/login.conf
Neste arquivo existe uma linha
:passwd_format=md5:\

Basta alterar a linha para


:passwd_format=blf:\

Após a alteração é necessário utilizar o comando cap_mkdb


# cap_mkdb /etc/login.conf

Finalmente é preciso alterar o arquivo /etc/auth.conf, descomentando a linha


crypt_default para que ele entenda o blowfish como criptografia. A linha deve
ficar assim:

crypt_default = blf md5 des

Com isso estamos garantindo que o FreeBSD utiliza preferencialmente a


criptografia Blowfish e se necessário tente as demais criptografias. É importante
manter os demais padrões neste arquivo, pois o auth.conf além de se referir a
autenticação na base do usuário, interfere também em autenticação remota e
demias autenticações que o FreeBSD faça.

A partir deste ponto, a próxima vez que uma senha for definida, ela será
blowfish. Veja a seguir a diferença da senha do usuário Marcus. A mesma senha
foi utilizada, mas na primeira linha ela é md5 e na segunda, blowfish:

marcus:$1$CxrSJal0$cl3/GBqgpi8hMq6ybyFXO0:1001:1001::0:0:Use
r &:/home/marcus:/bin/sh
marcus:$2a$04$Pd4NwhGNkvTKRfhQi.uPzOCfrI0mnA74Xqk.Jz9YJ6OuK2
cqZ/itK:1001:1001::0:0:User &:/home/marcus:/bin/sh

139
9.9 Exercícios
9.9.1 Habilitando e removendo o usuário toor

1 -No terminal do sistema, logado como root, execute o comando #id toor anote
o resultado:
__________________________________________________________

2- execute o comando:
#rmuser toor
Foi possível excluir o usuário? ( )sim ( )não Qual foi o motivo?
__________________________________________________________

3- Habilite o usuário toor com o seguinte comando:


#passwd toor
Digite um password para o usuário

4- Abra um segundo terminal com alt+f2 e realize o login com o usuário toor

5- Verifique o id do usuário digitando o comando


# id

6- Faça o logof do usuário toor e volte ao terminal 1 com alt+f1

7- Digite o comando vipw navegue até a linha que referencia o usuário toor e
digite dd
#vipw
toor:*:0:0::0:0:Bourne-again Superuser:/root:

8- Após digitar dd, saia do arquivo salvando as alterações pressionando a tecla


esc : x

9.9.2 Configurando os terminais

1- Efetue login com o usuário root.

2- Utilizando o editor de sua preferência abra para edição o arquivo /etc/ttys

3- Altere na linha correspondente a console a palavra secure para insecure:


console none unknown off secure
depois da alteração:
console none unknown off insecure

4- Salve o arquivo

5- Reinicie o servidor e na tela Welcome to FreeBSD escolha a opção “4. Boot


FreeBSD in single user mode”

6- Verifique se ao entrar em modo monousuário a senha de root foi solicitada.

140
7- Reinicie o micro e entre normalmente em modo multiusuário, abra novamente
o arquivo /etc/ttys para edição.

8- selecione a linha ttyv1 e altere de secure para insecure


ttyv1 "/usr/libexec/getty Pc" cons25 on insecure

9- No seu terminal 0 (alt+f1) de um tail no arquivo /var/log/messages


# tail –f /var/log/messages

10- Abra o terminal 1 utilizando alt+f2 e tente logar como root. O login foi bem
sucedido? ( ) sim ( ) não

11- Volte ao terminal 0 (alt+f1) e verifique a última linha que está aparecendo na
tela. Anote aqui o resultado:
__________________________________________________________
__________________________________________________________

12- Abra agora o terminal 3 com alt+f3 e efetue o login como root. O login foi
bem sucedido? ( ) Sim ( ) Não

13- Volte para o terminal 0 (alt+f1) e verifique a última linha aparecendo. Anote
aqui o resultado:
__________________________________________________________
__________________________________________________________

14- Volte novamente ao terminal 2 (alt+f1) e logue com o usuário freebsdafpu

15- Novamente no terminal 0 (alt+f1) verifique a última entrada. Veja que nada
mudou.

16- De volta ao terminal 2 (alt+f1) se promova para super usuário utilizando o


comando su e logue como root

17- Observe mais uma vez a última entrada do log que está aberto no terminal 0
(alt+f1)

18- Utilize a combinação de teclas crtl+c para fechar o arquivo de log que está
aberto e abra mais uma vez para edição o arquivo /etc/ttys

19- Altere desde o console ttyv0 até ttyv7 para insecure. Salve e feche o arquivo.

9.9.3 Utilizando chflags

1- Faça login no terminal 0 com o usuário freebsdafpu

2- Crie um diretório chamado security


# mkdir security

3- Acesse o diretório security e crie dois arquivos userlog e userconfig


# touch userlog

141
# touch userconfig
# touch userpassword

4- Edite os dois arquivos e coloque um texto qualquer.

5- Atribua as chflags da seguinte maneira:


# chflags uappnd userlog
# chflags uchg userconfig
# chflags uunlnk userpassword

6- Verifique se as flags foram atribuidas com o commando:


# ls –lo

7- Com o editor de sua preferência, edite os três arquivos, colocando um texto


qualquer. A edição foi possível em quais arquivos?
__________________________________________________________
__________________________________________________________

8- Com o comando cat, concatene em cada um dos arquivos o arquivo


/var/log/messages.
# cat /var/log/messages >> userconfig
# cat /var/log/messages >> userlog
# cat /var/log/messages >> userpasswd

9- Em quais arquivos a concatenação foi possível?


__________________________________________________________
__________________________________________________________

10- Apague os três arquivos


# rm userconfig
# rm userlog
# rm userpasswd

11- Eleve os privilégios para super usuário e como descrito nos passos 3 e 4 crie
e edite os seguintes arquivos: systemconfig, systemlog, systempasswd

12- Atribua chflags da seguinte forma:


# chflags sappnd systemlog
# chflags schg systemconfig
# chflags sunlnk systempassword

13- Repita os passos de 6 a 10 nos novos arquivos. Responda abaixo quais


puderam ser editados e concatenados:
__________________________________________________________
__________________________________________________________
__________________________________________________________
__________________________________________________________

14- Ainda como usuário root, tente apagar todos os arquivos, incluindo os
criados pelo usuário freebsdafpu. Quais foram apagados?
__________________________________________________________
__________________________________________________________

142
15- Remova as chflags com o comando
# chflags 0 <arquivo> para os arquivos que restaram na pasta

16- Verifique se as flags foram mesmo removidas com o comando


# ls -lo

9.9.4 Kernel secureleves

1- Efetue login no terminal 0 como root.

2- Verifique o nível de segurança atual pelo comando:


# sysctl kern.securelevel

3- Vá até a pasta /var/log e atribua a chflag sappnd aos arquivos messages


# chflags sappnd messages

4- Remova a chflag com o comando


# chflags nosappnd messages

5- Aumente o nível de segurança do kernel para 0


# sysctl kern.securelevel=0

6- Repita os passos 3 e 4. Foi possível remover as flags? ( )Sim ( )Não

7- Aumente o nível de segurança para 1 conforme o passo 5 e repita novamente


os passos 3 e 4. Foi possível remover as flags? ( )Sim ( )Não

8- Reinicie o servidor com o comando reboot

9- Logue como root e volte a pasta /var/log e tente remover a flag atribuída ao
arquivo messages.

10- Verifique como no passo 2 o nível de segurança do kernel. O que


aconteceu?
__________________________________________________________
__________________________________________________________
__________________________________________________________

11- Anote aqui o horário atual, na seguinte notação AAAAMMDDHHMM (ano


mês dia hora minuto).
__________________________________________________________

12- Utilizando o comando date, coloque a data do servidor para 20 de dezembro


de 2012, exatamente as 4 da tarde:
# date 201212201600

13- Apenas digitando o comando date, verifique se a atualização funcionou.


# date

143
14- Volte o sistema para a data atual utilizando os dados anotados no passo 11.

15- Eleve o nível de segurança do kernel para 2


# sysctl kern.securelevel=2

16- Atribua novamente a flag ao arquivo messages, como no passo 3.

17- Repita o procedimento dos passos 12 e 13, foi possível aterar a data? ( )Sim
( )Não Porque?
__________________________________________________________
__________________________________________________________
__________________________________________________________

18- Abra para edição o arquivo /etc/sysctl.conf e adicione a seguinte linha:


kern.securelevel=2

19- Reinicie o sistema, logue como root e tente remover a chflad do arquivo
messages ou alterar a data do sistema. Houve êxito em alguma tentativa? (
)Sim ( )Não

20- Verifique como no passo 2 o nível de segurança do kernel. Compare agora


com a anotação do passo 10. Existe alguma diferença?
__________________________________________________________
__________________________________________________________
__________________________________________________________

21- Tente alterar o nível de segurança para 1 e depois para 0.


# sysctl kern.securelevel=1
# sysctl kern.securelevel=0

22- Aumente o nível de segurança para 3


# sysctl kern.securelevel=3

23- Entre os passos 21 e 22, quais comandos funcionaram? Por que?


__________________________________________________________
__________________________________________________________
__________________________________________________________
__________________________________________________________

24- Reinicie o servidor e na tela Welcome to FreeBSD escolha a opção “4. Boot
FreeBSD in single user mode”

25- Monte todo o sistema de arquivos com o comando


# mount –a

26- Abra para edição o arquivo /etc/sysctl.conf e remova a linha


kern.securelevel=2

27- Salve o arquivo e reinicie o servidor.

144
9.9.5 sshd_config

1- Logue no terminal 0 como root.

2- Faça um backup do arquivo /etc/ssh/sshd_config


# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

3- Verifique se o ssh está iniciando com o sistema. O arquivo /etc/rc.conf deve


conter a linha sshd_enable=”YES”
Se a linha na estiver presente, adicione e salve o arquivo.

4- Dê um telnet da porta 22 de seu endereço de loopback e anote a resposta do


comando:
# telnet 127.0.0.1 22
__________________________________________________________
__________________________________________________________

5- Abra para edição o arquivo /etc/ssh/ssdh_config e apague tudo. Adicione o


seguinte conteúdo:
VersionAddendum Servidor Seguro
Port 22
Protocol 2
AddressFamily inet
ListenAddress <seu ip>
SyslogFacility AUTH
LogLevel INFO
Subsystem sftp /usr/libexec/sftp-server

6- Reinicie o serviço de ssh:


# /etc/rc.d/sshd restart

7- Repita o passo 4, anote o resultado:


__________________________________________________________
__________________________________________________________

8- Tente efetuar a conexão ssh utilizando o protocolo ssh 1.


# ssh -1 127.0.0.1
Foi possível? ( )Sim ( )Não Por que?
__________________________________________________________
__________________________________________________________

9.9.6 Mostrar todos os processos

1- Logue no terminal 0 como root e no terminal 1 com o usuário freebsdafpu


2- No terminal 1, rode o comando top, verifique quais processos estão
aparecendo

3- No terminal 0, rode o comando top e verifique se são os mesmos processos


do passo 2.
145
4- Saia do comando top e altere o valor da variável sysctl
security.bsd.see_other_uids para 0
# sysctl security.bsd.see_other_uids=0

5- Rode novamente o comando top.

6- Alterne para o terminal 1 (alt+f2) e verifique as alterações do comando top do


usuário freebsdafpu

7- Para tonar esta modificação permanente, volte para o terminal 0 (alt+f1) e


edite o arquivo /etc/sysctl.conf, descomentando a linha
security.bsd.see_other_uids=0

9.9.7 Criptografia Blowfish

1- Efetue login como root no terminal 0

2- Abra para edição o arquivo /etc/login.conf

3- Altere a linha “:passwd_format=md5:\” para


:passwd_format=blf:\

4- Salve o arquivo e utilize o comando


# cap_mkdb /etc/login.conf

5- Abra para edição o arquivo /etc/auth.conf

6- Substitua a linha “# crypt_default = md5 des” por


crypt_default = blf md5 des
Lembre-se de descomentar a linha e salve o arquivo.

7- Concatene o conteúdo do arquivo master.passwd com um arquivo temporário


utilizando o seguinte comando:
# cat /etc/master.passwd | grep freebsdafpu >> /home/freebsdafpu/passwd.txt

8- Altere a senha do usuário freebsdafpu. Coloque a mesma senha.


# passwd freebsdafpu

9- Repita o passo 7 e abra o arquivo passwd.txt para verificação. Veja se existe


alguma diferença entre as senhas.

146