Guia Rápido do FreeBSD para Usuários &linux; JohnFerrell 2008 The FreeBSD Documentation Project $FreeBSD$ $FreeBSD$ &tm-attrib.freebsd; &tm-attrib.linux; &tm-attrib.intel; &tm-attrib.redhat; &tm-attrib.unix; &tm-attrib.general; O objetivo deste documento é familiarizar rapidamente os usuários intermediários e avançados de &linux; com o FreeBSD. Introdução Este documento irá destacar as diferenças entre &os; e &linux; para que os usuários intermediários e avançados possam rapidamente se familiarizar com os conceitos básicos do FreeBSD. Esta é apenas uma rápida introdução técnica, ela não tenta discutir as diferenças filosóficas entre os dois sistemas operacionais. Este documento assume que você já tem o &os; instalado. Se você não tem o &os; instalado ou precisa de ajuda com o processo de instalação, por favor, consulte o capítulo Instalando o FreeBSD no Handbook. <literal>Shells</literal>: Sem Bash? Usuários vindos do &linux; são frequentemente surpreendidos por não encontrarem o Bash como o shell padrão no &os;. De fato, o Bash nem mesmo está presente na instalação padrão. Em vez disso, o &os; usa o &man.tcsh.1; como shell padrão. Embora o Bash e seus outros shells favoritos estejam disponíveis na Coleção de Ports do &os;. Se você instalar outros shells, o &man.chsh.1; poderá ser usado para definir o shell padrão dos usuários. Contudo, é recomendável que o shell padrão do root permaneça inalterado. A razão para isso é que shells não incluídos na base do sistema são normalmente instalados em /usr/local/bin ou /usr/bin. Caso ocorra um problema no sistema de arquivos no qual estão localizados o /usr/local/bin e o /usr/bin, eles não poderão ser montados. Neste caso, o usuário root não teria acesso ao seu shell padrão, o que o impediria de efetuar login. Por este motivo uma segunda conta root, a conta toor, foi criada para uso com shells que não fazem parte da base do sistema. Leia o FAQ de segurança para obter informações sobre a conta toor. Pacotes e <literal>Ports</literal>: Adicionando programas no &os; Além do tradicional método &unix; de instalação de programas (baixar o código fonte, extrair, editar o código fonte, e compilar), o &os; oferece dois outros métodos para instalar aplicações: pacotes e ports. Uma lista completa de todos os ports e pacotes disponíveis pode ser encontrada aqui. Pacotes Pacotes são aplicações pré-compiladas, o equivalente no &os; ao .deb nos sistemas baseados no Debian/Ubuntu e ao .rpm nos sistemas baseados no Red Hat/Fedora. Pacotes são instalados usando &man.pkg.add.1;. Por exemplo, o seguinte comando instala o Apache 2.2: &prompt.root; pkg_add /tmp/apache-2.2.6_2.tbz Usar a opção dirá ao &man.pkg.add.1; para baixar automaticamente o pacote e instalá-lo, juntamente com quaisquer dependências que ele possua: &prompt.root; pkg_add -r apache22 Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-6.2-release/Latest/apache22.tbz... Done. Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-6.2-release/All/expat-2.0.0_1.tbz... Done. Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-6.2-release/All/perl-5.8.8_1.tbz... Done. [snip] To run apache www server from startup, add apache22_enable="YES" in your /etc/rc.conf. Extra options can be found in startup script. Se você está rodando uma versão de release do &os; (6.2, 6.3, 7.0, etc., geralmente instalada a partir de um CD-ROM) o pkg_add -r vai baixar o pacote compilado especificamente para esta versão. Este pacote pode não ser a versão mais atual da aplicação. Você pode usar a variável PACKAGESITE para sobrescrever este comportamento padrão. Por exemplo, ajuste PACKAGESITE para ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-6-stable/Latest/ para baixar os pacotes mais recentes compilados para a série 6.X. Para mais informações sobre pacotes, por favor, consulte a seção 4.4 do Handbook do &os;: Usando o Sistema de Pacotes. <literal>Ports</literal> O segundo método para instalação de aplicações no &os; é a Coleção de Ports. A Coleção de Ports é um framework de Makefiles e patches especialmente customizados para a instalação de vários programas a partir do código fonte no &os;. Ao instalar um port o sistema irá baixar o código fonte, aplicar qualquer patch necessário, compilar o código, e instalar a aplicação. O mesmo processo será aplicado para todas as suas dependências. A Coleção de Ports, por vezes designada como a árvore de ports, pode ser encontrada em /usr/ports. Isto assumindo que a Coleção de Ports foi instalada durante o processo de instalação do &os;. Se a Coleção de Ports não foi instalada, ela pode ser adicionada a partir dos discos de instalação usando &man.sysinstall.8;, ou baixada dos servidores do &os; usando &man.csup.1; ou &man.portsnap.8;. Instruções detalhadas para a instalação da Coleção de Ports podem ser encontradas na seção 4.5.1 do Handbook. A instalação de um port é tão simples (geralmente) quanto entrar no diretório do port desejado e iniciar o processo de compilação. O exemplo seguinte instala o Apache 2.2 a partir da Coleção de Ports: &prompt.root; cd /usr/ports/www/apache22 &prompt.root; make install clean Um grande benefício do uso do ports para instalar programas é a possibilidade de personalizar as opções de instalação. Por exemplo, ao instalar o Apache 2.2 a partir do ports, você poderá habilitar o mod_ldap definindo a variável WITH_LDAP ao executar &man.make.1;: &prompt.root; cd /usr/ports/www/apache22 &prompt.root; make WITH_LDAP="YES" install clean Por favor, leia a seção 4.5 do Handbook do &os;, Usando a Coleção de Ports, para maiores informações sobre a Coleção de Ports. <literal>Ports</literal> ou pacotes, qual eu devo usar? Pacotes são apenas ports pré-compilados, então na prática é uma questão de instalarmos a partir do código fonte (ports) contra instalarmos de um pacote binário. Cada método tem seus próprios benefícios: Pacotes (binário) Instalação rápida (a compilação de grandes aplicações pode ser um tanto demorada). Você não precisar saber como compilar o programa. Não é necessário instalar compiladores no seu sistema. <literal>Ports</literal> (código fonte) Possibilidade de personalizar as opções de instalação. (Pacotes normalmente são compilados com as opções padrões. Com o ports você pode personalizar várias opções, como a compilação de módulos adicionais ou a mudança do path de instalação padrão.) Você pode aplicar seus próprios patches se assim desejar. Se você não tem qualquer requisito especial, o sistema de pacotes provavelmente vai se adequar muito bem à sua situação. Se você for precisar personalizar a instalação, o ports é a melhor opção. (E lembre-se, se você precisa personalizar a instalação, mas prefere pacotes, você pode compilar um pacote personalizado a partir do ports usando make package e, em seguida, copiar o pacote para outros servidores.) Inicialização do Sistema: Onde estão os <foreignphrase>run-levels</foreignphrase>? O &linux; usa o sistema SysV init, enquanto o &os; usa o tradicional BSD-style &man.init.8;. Sob o BSD-style &man.init.8; não existem run-levels e nem /etc/inittab, em vez disso a inicialização é controlada pelo utilitário &man.rc.8;. O script /etc/rc/etc/defaults/rc.conf e /etc/rc.conf para determinar quais serviços serão iniciados. Os serviços especificados são, então, inicializados rodando os scripts de inicialização correspondentes em /etc/rc.d/ e /usr/local/etc/rc.d/. Esses scripts são similares aos scripts localizados em /etc/init.d/ nos sistemas &linux;. Por que existem dois locais para scripts de inicialização de serviços? Os scripts encontrados em /etc/rc.d/ são para aplicações que são parte da base do sistema. (&man.cron.8;, &man.sshd.8;, &man.syslog.3;, e outros.) Os scripts em /usr/local/etc/rc.d/ são para aplicações instaladas pelo usuário, como Apache, Squid, etc. Qual é a diferença entre a base do sistema e as aplicações instaladas pelo usuário? O &os; é desenvolvido como um sistema operacional completo. Em outras palavras, o kernel, bibliotecas do sistema, e utilitários de nível de usuário (como &man.ls.1;, &man.cat.1;, &man.cp.1;, etc.) são desenvolvidos juntos e lançados como um só. Isso é designado como base do sistema. As aplicações instaladas pelo usuário são aplicações que não fazem parte da base do sistema, como Apache, X11, Mozilla Firefox, etc. Estas aplicações instaladas pelo usuário são geralmente instaladas usando os Pacotes e a Coleção de Ports. A fim de mantê-las separadas da base do sistema, as aplicações dos usuário são normalmente instaladas sob /usr/local/. Portanto, os binários instalados pelo usuário residem em /usr/local/bin/, arquivos de configuração em /usr/local/etc/, e assim por diante. Os Serviços são ativados espeficificando NomeDoServiço_enable="YES" em /etc/rc.conf (&man.rc.conf.5;). Dê uma olhada em /etc/defaults/rc.conf para visualizar os padrões do sistema, essas configurações padrões podem ser sobrescritas por configurações em /etc/rc.conf. Quando instalar aplicações adicionais não deixe de analisar a documentação para determinar como ativar qualquer serviço associado. O seguinte trecho do /etc/rc.conf ativa o &man.sshd.8; e o Apache 2.2. Ele também determina que o Apache deve ser iniciado com SSL. # enable SSHD sshd_enable="YES" # enable Apache with SSL apache22_enable="YES" apache22_flags="-DSSL" Uma vez que o serviço foi ativado em /etc/rc.conf, ele pode ser inicializado pela linha de comando (sem precisar reinicializar o sistema): &prompt.root; /etc/rc.d/sshd start Se o serviço não foi ativado, ele pode ser inicializado pela linha de comando usando : &prompt.root; /etc/rc.d/sshd forcestart Configuração da rede Interfaces de Rede Em vez do identificador genérico ethX, que o &linux; usa para identificar uma interface de rede, o &os; usa o nome do driver do dispositivo de rede seguido por um número como identificador. A seguinte saída do &man.ifconfig.8; mostra duas interfaces de rede &intel; Pro 1000 (em0 e em1): &prompt.user; ifconfig em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 options=b<RXCSUM,TXCSUM,VLAN_MTU> inet 10.10.10.100 netmask 0xffffff00 broadcast 10.10.10.255 ether 00:50:56:a7:70:b2 media: Ethernet autoselect (1000baseTX <full-duplex>) status: active em1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 options=b<RXCSUM,TXCSUM,VLAN_MTU> inet 192.168.10.222 netmask 0xffffff00 broadcast 192.168.10.255 ether 00:50:56:a7:03:2b media: Ethernet autoselect (1000baseTX <full-duplex>) status: active Configuração IP Um endereço IP pode ser atribuído a uma interface de rede usando &man.ifconfig.8;. No entanto, para mantê-lo persistente entre as reinicializações, a configuração deve ser incluída em /etc/rc.conf. O seguinte exemplo configura o hostname, o endereço IP, e o gateway padrão: hostname="server1.example.com" ifconfig_em0="inet 10.10.10.100 netmask 255.255.255.0" defaultrouter="10.10.10.1" Use a seguinte sintaxe para configurar a interface para DHCP: hostname="server1.example.com" ifconfig_em0="DHCP" <literal>Firewall</literal> Como o IPTABLES no &linux;, o &os; também oferece um firewall ao nível de kernel; atualmente o &os; oferece três opções de firewalls: IPFIREWALL IPFILTER PF O IPFIREWALL, ou IPFW (o comando para gerenciar um conjunto de regras IPFW é &man.ipfw.8;), é o firewall desenvolvido e mantido pelos desenvolvedores do &os;. O IPFW pode ser integrado com &man.dummynet.4; para prover a capacidade de controle de tráfego e simular diferentes tipos de conexões de rede. Amostra de uma regra do IPFW para permitir uma conexão de entrada do SSH: ipfw add allow tcp from any to me 22 in via $ext_if IPFILTER é um aplicativo de firewall desenvolvido por Darren Reed. Ele não é específico para o &os; e foi portado para vários sistemas operacionais, incluindo NetBSD, OpenBSD, SunOS, HP/UX, e Solaris. Amostra do comando IPFILTER para permitir uma conexão de entrada do SSH: pass in on $ext_if proto tcp from any to any port = 22 O último aplicativo de firewall, PF, é desenvolvido pelo projeto OpenBSD. O PF foi criado como um substituto para o IPFILTER. Como tal, a sintaxe do PF é muito similar à do IPFILTER. O PF pode ser integrado com &man.altq.4; para prover recursos de QoS. Amostra do comando PF para permitir uma conexão de entrada do SSH: pass in on $ext_if inet proto tcp from any to ($ext_if) port 22 Atualizando o &os; Existem três métodos para atualizar um sistema &os;: a partir do código fonte, atualização binária, e a partir dos discos de instalação. A atualização a partir do código fonte é a mais demorada, mas por outro lado é a que oferece a maior flexibilidade. O processo envolve a sincronização de uma cópia local do código fonte do sistema a partir dos servidores Subversion do &os;. Uma vez que o código fonte local está atualizado, você pode compilar a nova versão do kernel e dos aplicativos de nível de usuário. Para maiores informações sobre atualizações a partir do código fonte veja o capítulo sobre atualização no Handbook do &os;. As atualizações binárias são similares ao uso do yum ou apt-get para atualizar sistemas &linux;. O comando &man.freebsd-update.8; vai baixar e instalar as novas atualizações. As atualizações podem ser agendadas usando &man.cron.8;. Se você utilizar o &man.cron.8; para agendar as atualizações, por favor, certifique-se de usar freebsd-update cron em seu &man.crontab.1; para reduzir a possibilidade de que um grande número de máquinas busquem as atualizações todas ao mesmo tempo. 0 3 * * * root /usr/sbin/freebsd-update cron O último método de atualização, a partir dos discos de instalação, é um processo bastante simples. Efetue o boot a partir dos discos de instalação e selecione a opção para atualizar. procfs: Morto, mas vivo na memória No &linux;, para determinar se o encaminhamento IP está ativado, você pode olhar em /proc/sys/net/ipv4/ip_forward. No &os; você precisa usar o &man.sysctl.8; para ver esta e outras opções do sistema, pois o &man.procfs.5; tornou-se obsoleto nas versões mais recentes do &os;. (Embora sysctl também esteja disponível no &linux;.) No exemplo do encaminhamento IP, você poderia usar o seguinte comando para determinar se ele está ativado no seu sistema FreeBSD: &prompt.user; sysctl net.inet.ip.forwarding net.inet.ip.forwarding: 0 A opção é utilizada para listar todas as configurações do sistema: &prompt.user; sysctl -a kern.ostype: FreeBSD kern.osrelease: 6.2-RELEASE-p9 kern.osrevision: 199506 kern.version: FreeBSD 6.2-RELEASE-p9 #0: Thu Nov 29 04:07:33 UTC 2007 root@i386-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC kern.maxvnodes: 17517 kern.maxproc: 1988 kern.maxfiles: 3976 kern.argmax: 262144 kern.securelevel: -1 kern.hostname: server1 kern.hostid: 0 kern.clockrate: { hz = 1000, tick = 1000, profhz = 666, stathz = 133 } kern.posix1version: 200112 ... Alguns dos valores do sysctl estão disponíveis somente para leitura. Existem ocasiões nas quais o procfs é necessário, como na execução de programas antigos, no uso do &man.truss.1; para rastrear chamadas de sistema, e para possibilitar a Compatibilidade Binária com Linux. (Embora a Compatibilidade Binária com Linux use seu próprio procfs, &man.linprocfs.5;.) Se você precisar montar o procfs, você pode adicionar a seguinte entrada no /etc/fstab: proc /proc procfs rw,noauto 0 0 vai prevenir /proc de ser montado automaticamente durante o boot. E então monte o procfs com: &prompt.root; mount /proc Comandos Comuns Gerenciamento de Pacotes Comando no &linux; (Red Hat/Debian) Equivalente no &os; propósito yum install pacote / apt-get install pacote pkg_add -r pacote Instala o pacote a partir do repositório remoto rpm -ivh pacote / dpkg -i pacote pkg_add -v pacote Instala um pacote rpm -qa / dpkg -l pkg_info Lista de pacotes instalados Gerenciamento do Sistema Comando no &linux; Equivalente no &os; Propósito lspci pciconf Lista de dispositivos PCI lsmod kldstat Lista de módulos do kernel carregados modprobe kldload / kldunload Carrega/descarrega módulos do kernel strace truss Rastrear chamadas de sistema Conclusão Esperamos que este documento tenha fornecido para você o suficiente para começar a utilizar o &os;. Certifique-se de dar uma olhada no Handbook do &os; para se aprofundar nos tópicos abordados, assim como nos muitos tópicos não mencionados neste documento.