Post em Destaque

Feliz Natal e fechando com dica do fsck automático

Gostaria de desejar, em nome de todos da BSDInfo, um feliz Natal para todos os leitores do nosso blog. Que a paz e muita saúde estejam com vocês e esperamos fazer mais em 2013. Aproveitando deixo aqui uma pequena dica para quem tem servidores à distância. Pode ocorrer em algum momento a necessidade...

Leia mais...

Como saber de forma rápida e prática se perdeu alguma lib importante

Posted by gondim | Posted in Dicas, FreeBSD | Posted on 22-04-2012

Tags:,

8

Uma das coisas que mais acontecem quando atualizamos determinados pacotes ou até mesmo o sistema FreeBSD é alguma lib que já existia ser atualizada e os programas que já haviam sido instalados e compilados com aquela lib antiga, darem pau.

Normalmente isso ocorre com alguma lib muito utilizada como foi o caso recentemente do pacote pcre-8.30_1 que vem a libpcre que contém funções de expressões regulares e que são utilizadas por aplicações importantes como: Postfix e PHP

Nesse caso todos os pacotes que estavam usando a libpcre após a atualização, quebraram e você não percebeu. Vai perceber quando os serviços caírem e não levantarem mais. Por isso é sempre bom fazer uma checagem após as atualizações e existe um pacote muito importante que pode lhe ajudar nessa tarefa de checar todos os pacotes instalados no sistema e lhe dizer quem precisa ser recompilado.

O nome do “santo” aqui é o bsdadminscripts que possui algumas ferramentas e a que vamos usar é a pkg_libchk. Mãos à obra:

# cd /usr/ports/sysutils/bsdadminscripts

# make install clean distclean

Após a instalação o comando à seguir vai ler todos os pacotes instalados e se tiver algum quebrado será mostrado:

# pkg_libchk -q -r

Com a lista de pacotes quebrados você já saberá o que precisa ser recompilado. Como eu utilizo o portmaster para gerenciar meus pacotes, o trabalho fica bem mais tranquilo. Mas cada um usa o que achar melhor, o importante é saber o que consertar.

É isso aí pessoal.

Share Button

Quando serviços ficam caindo… o que fazer até a solução chegar?

Posted by gondim | Posted in Dicas, FreeBSD | Posted on 22-04-2012

Tags:, , ,

3

Serviços rodando não deveriam cair simplesmente do nada. Muitos deles informam a causa em seus logs ou tentam pelo menos dar uma dica do problema. Pode estar relacionado muitas das vezes com problemas de memória como os segfaults (signal 11) mas as vezes os segfaults podem indicar um bug na aplicação que em algum momento esta simplesmente fecha. O fato é que você precisa investigar o que esta causando o problema mas enquanto isso você precisa garantir que o serviço não pare. Existe uma ferramenta chamada daemontools que monitora um determinado serviço que desejar e se o mesmo cair, instantaneamente o daemontools trata de levantá-lo. É a famosa “gambiarra”.

Para instalarmos o daemontools farei com exemplo o serviço do radius, pois se este cair a autenticação de vários clientes parariam aqui no meu caso:

# cd /usr/ports/sysutils/daemontools

# make install clean distclean

Após instalarmos criaremos o diretório de monitoramento do nosso serviço de exemplo, o radius:

# mkdir -p /var/service/radius

Dentro desse diretório que criamos, você criará um arquivo chamado run com o seguinte conteúdo:

#!/bin/sh
exec fghack /usr/local/sbin/radiusd

Nesse caso o daemontools vai iniciar o /usr/local/sbin/radiusd. Não vamos habilitar o radius no /etc/rc.conf porque o próprio daemontools vai se encarregar de levantar o serviço. Veja que estou dando um exemplo com o radiusd mas que pode ser aplicado à outros serviços.

# chmod 755 /var/service/radius/run

Não podemos deixar de dar permissão de execução para o nosso script. O nome dele precisa ser run. Ok?

Se for monitorar outros serviços basta criar outros subdiretórios dentro do /var/service e os devidos arquivos run.

Para finalizarmos nosso exemplo colocamos a seguinte configuração no /etc/rc.conf:

svscan_enable=”YES”
svscan_servicedir=”/var/service”

Agora podemos iniciar o daemontools e quando fizermos isso, todos os serviços que ele estiver monitorando serão levantados:

# /usr/local/etc/rc.d/svscan start

Vejamos o que ele fez:

# ps afx|grep radius
1587  ??  I         0:00.12 supervise radius
35029  ??  I         0:00.00 fghack /usr/local/sbin/radiusd
35031  ??  Ss       57:22.67 /usr/local/sbin/radiusd

O PID 35031 é o nosso radius rodando propriamente dito, os outros são o daemontools fazendo seu papel. Se quiser fazer um teste basta fazer um kill -9 no 35031 e verá que o mesmo será levantado instantaneamente. 🙂

Bem é isso, be happy!

PS: Sempre verifique o motivo das quedas, veja nos logs, contate o mantenedor do port, busque a solução e não a gambiarra.  🙂

Share Button

PPPoE client no FreeBSD, do ppp ao mpd.

Posted by gondim | Posted in FreeBSD | Posted on 17-04-2012

Tags:, , ,

0

Com o crescimento da banda larga no Brasil e diminuição dos valores cobrados pelas operadoras, as empresas cada vez mais contratam links não dedicados para acesso à Internet. Tais links, na maioria das vezes, vem acompanhados de um protocolo chamado PPPoE.

O FreeBSD vem com um cliente nativo para fazer essa conexão PPPoE (ppp) e um outro muito mais parrudo que pode ser instalado via ports, chamado mpd. O mpd é um software polivalente porque ele faz quase tudo em 1. Ele pode fazer pppoe client, pppoe server, pptp server, pptp client e outras coisinhas lá.

Se você está recebendo agora o link do seu ISP e ele exige que você faça uma conexão PPPoE, você só as seguintes opções:

1ª Colocar um router e compartilhar para a sua rede.

ou

2ª Ligar o link no seu Windão e fazer a configuração do PPPoE.

ou

3ª Usar outro sistema que tenha suporte ao PPPoE.

ou

4ª Deixar o seu FreeBSD fazer todo o trabalho de conexão e ainda agregar outras coisas à ele como: Proxy, Firewall, dhcp para a sua rede, redundância de link/balanceamento e o que lhe for mais útil.

Vamos primeiramente configurar o PPPoE nativo e depois com a Internet funcionando poderemos instalar o mpd:

Salvando a configuração atual do ppp.conf:

# cp /etc/ppp/ppp.conf /etc/ppp/ppp.conf.bkp

Depois zerem o arquivo original:

# >/etc/ppp/ppp.conf

Agora com um editor ee ou vi ou seu editor preferido coloque esses dados dentro do arquivo ppp.conf:

default:
      ident user-ppp VERSION (built COMPILATIONDATE)
      set log phase
      set log local phase lcp ipcp ccp tun command
intnet:
      set device PPPoE:em0:Intnet5
      set mru 1492
      set mtu 1492
      set authname gondim
      set authkey 12345678
      set login
      set dial
      enable dns
      add default HISADDR
      set timeout 0
      open

Reparem na identação pois temos 2 sessões chamadas “default:” e “intnet:”. O que vem abaixo deles está identado um ou mais espaços para a direita. Onde tem “intnet:” você pode trocar para o nome do seu provedor. Exemplo: velox:

Mais abaixo tem a linha: set device PPPoE:em0:Intnet5  onde você vai alterar para:

device PPPoE:<sua_interface_de_rede_de_saída>:<nome_do_serviço>

Se você não souber o nome do serviço então você pode remove-lo ficando assim como exemplo:

device PPPoE:em0

O em0 é nome da minha interface de rede e que por um acaso é onde está ligado o cabo de rede do Provedor.

Em authname gondim você vai colocar seu login de acesso no provedor. Exemplo de um acesso ao Velox:

set authname 2266666666@telemar.com.br 

Em set authkey você vai colocar a sua senha de acesso.  Exemplo aqui do Velox seria:

set authkey 2266666666

O restante na conexão você vai receber o DNS do seu provedor, IP e gateway default. Tudo na interface tun0.

Para testar a conexão só executar:

# ppp -ddial intnet

Onde intnet é o nome que  escolhi na sessão no ppp.conf. Se conectar certinho quando você fizer o ifconfig vai ver que a interface tun0 vai estar com o IP dado pelo provedor da conexão.

(root@strong)[/etc/ppp]# ifconfig tun0
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1492
options=80000<LINKSTATE>
inet 186.xxx.48.69 –> 10.247.0.1 netmask 0xffffffff
Opened by PID 447

Se for querer parar por aqui e quiser usar apenas essa configuração, você pode colocar isso tudo no /etc/rc.conf para que conecte automaticamente após o boot do sistema:

# Configurando a conexão PPPoE
ppp_enable=”YES”
ppp_mode=”ddial”
ppp_profile=”intnet”

Só não esqueça de trocar o ppp_profile para o nome que você escolheu na sessão no ppp.conf.

Uma vez que estamos conectados na Internet agora podemos passar para o mpd. O mpd que instalaremos será a versão 5:

# cd /usr/ports/net/mpd5

# make install clean distclean

Após a instalação do mpd as configurações serão colocadas em /usr/local/etc/mpd5.

No diretório de configuração encontraremos 3 arquivos exemplos: mpd.conf.sample, mpd.script.sample e mpd.secret.sample

Para o nosso caso usaremos o mpd.conf.sample que renomearemos para mpd.conf

# cd /usr/local/etc/mpd5

# mv mpd.conf.sample mpd.conf

Abaixo meu exemplo de configuração:

startup:
      # configure mpd users
      set user gondim minha_senha admin
      # configure the console
      set console self 127.0.0.1 5005
      set console open
      # configure the web server
      set web self 0.0.0.0 5006
      set web open

default:
      load pppoe_client

pppoe_client:
      create bundle static B1
      set iface route default
      set ipcp ranges 0.0.0.0/0 0.0.0.0/0
      create link static L1 pppoe
      set link action bundle B1
      set auth authname gondim
      set auth password senha_provedor
      set link max-redial 0
      set link mtu 1492
      set link keep-alive 10 60
      set pppoe iface em0
      set pppoe service “”
      open

Muito cuidado com a identação porque é importante para o bom funcionamento. Não esqueça de alterar as linhas abaixo para o usuário, senha de conexão do seu provedor e a interface de rede onde entra o cabo do Provedor:

set auth authname gondim

set auth password senha_provedor

set pppoe iface em0

No bloco startup é bom definir um  usuário e senha para acesso via console e web do mpd. O mpd também oferece 2 interfaces de administração sendo elas via console e web. Você pode mantê-las habilitadas ou não. Não é nosso objetivo aqui nos aprofundar no mpd mas para aqueles que se interessarem, aqui vai o link da documentação: mpd5

Para deixarmos a conexão sendo feita no boot vamos adicionar a seguinte linha no /etc/rc.conf:

mpd_enable=”YES”

É isso aí pessoal e até a próxima!

Share Button

Instalação AMP

Posted by lgvalentim | Posted in Dicas, FreeBSD | Posted on 16-04-2012

Tags:

0

Sei que para muitos parece simples, mas para os que estão chegando também temos que dar atenção.

Neste guia será apresentada uma instalação básica de Apache, MySQL e PHP no FreeBSD

MYSQL
Acessar o  ports do MySQL

cd /usr/ports/databases/mysql50-server

2. Compilar e instalar o port

make && make install

3. Editar o ficheiro /etc/rc.conf e acrescentar a seguite linha para garantir que o MySQL inicie automaticamente

mysql_enable=”YES”

4. Reiniciar o sistema

shutdown -r now

5. Definir um password para o utilizador root do MySQL

mysqladmin -u root password ‘nova password’

APACHE

Acessar o ports do Apache

cd /usr/ports/www/apache22

2. Compilar e instalar o apache

make && make install

3. Na listagem de opções não esquecer de confirmar a opção MySQL

4. Editar o ficheiro /etc/rc.d e adicionar a seguinte linha

apache22_enable=’YES’

PHP

1. Acessar o port do php

cd /usr/ports/lang/php5

2. compilar

make && make install

3. confirmar a opção para compilar o modulo para o Apache

4. Acessar o port  php5-extensions

cd /usr/ports/lang/php5-extensions

5. compilar

make && make install

6. Copiar o ficheiro de configuração do php

cp /usr/local/etc/php.ini-dist /usr/local/etc/php.ini

7.Editar o ficheiro de configuração do Apache (/usr/local/etc/apache22/httpd.conf) e acrescentar as seguintes linhas:

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

8.Procurar a linha:

DirectoryIndex index.html

e alterar para:

DirectoryIndex index.php index.html

9.Iniciar o Servidor de Apache

/usr/local/etc/rc.d/apache22 start

 

Bem… #ficaadica

Share Button

CPU Affinity, uma brincadeira de criança.

Posted by gondim | Posted in Dicas, FreeBSD | Posted on 16-04-2012

Tags:, ,

0

Nem sempre é uma boa ideia ter processos migrando de CPU o tempo todo, pois pode atrapalhar o desempenho de algumas aplicações no seu sistema. Aqui vou falar de um caso muito especial que é quando você tem um grande tráfego de rede tipo acima de 100Mbps. Quando temos um grande tráfego de dados nas interfaces de rede e a irq delas muda de CPU isso pode causar um load maior no sistema e até perda de pacotes na transmissão. Então nos resta fixar aquela interface de rede à uma CPU específica e faremos isso usando um recurso chamado CPU Affinity. Muitos sistemas possuem esse recurso assim como GNU/Linux e FreeBSD. Sendo que o mais intuitivo e simples que já vi, foi o do FreeBSD. Enquanto o primeiro sistema precisa usar o /proc e formas meio toscas para isso, no FreeBSD temos a ferramenta cpuset que faz o que se propõe e cujo man é muito bem documentado com exemplos. Podemos fazer CPU Affinity com process id, set id, thread id e irq. Faremos uso aqui do irq para colocarmos nossas interfaces de rede em CPUs específicas.

Vamos começar listando nossas CPUs, isso pode ser visto pelo comando: top -P ou fazendo:

# cpuset -g
pid -1 mask: 0, 1, 2, 3, 4, 5, 6, 7

Nesse meu caso temos de 0 à 7. Agora precisaremos descobrir as interrupções das interfaces de rede. Não a interrupção que vemos no dmesg mas aquela que o próprio FreeBSD gerou virtualmente.

O melhor comando que conheço para fazer a tarefa de descobrir a irq é o devinfo:

# devinfo -rv | less

Procure pela sua interface de rede, no meu caso aqui uma Intel PCI-e de nome em0 e achei esse trecho:

            em0 pnpinfo vendor=0x8086 device=0x10d3 subvendor=0x8086 subdevice=0x34da at slot=0 function=0 handle=\_SB_.PCI0.MRP1.HART
Interrupt request lines:
256
257
258

Achamos então as interrupções 256, 257 e 258 da em0. Agora vamos dizer que eu queira jogá-las em CPUs diferentes:

/usr/bin/cpuset -l 5 -x 256
/usr/bin/cpuset -l 6 -x 257
/usr/bin/cpuset -l 7 -x 258

Com os comandos acima eu disse que a irq 256 vai para a CPU 6, 257 na CPU 7 e 258 na CPU 8.

Parece até a propaganda da Oi… Simples assim rsrsr

Esses comandos você pode adicionar em um arquivo /etc/rc.local se existir, caso não exista basta criá-lo e colocar esses comandos assim:

#!/bin/sh

/usr/bin/cpuset -l 5 -x 256
/usr/bin/cpuset -l 6 -x 257
/usr/bin/cpuset -l 7 -x 258

Depois um chmod +x /etc/rc.local

Mais dúvidas… o man cpuset, como eu disse, é muito bem documentado.

Share Button

File System ZFS na Raiz com FreeBSD 9

Posted by gondim | Posted in FreeBSD | Posted on 12-04-2012

Tags:, ,

31

ZFS é um Sistema de Arquivos brilhante! Extremamente seguro, rápido e com recursos que outros filesystems gostariam de ter. O ZFS vem no FreeBSD 9.0 com uma nova atualização e novos recursos. Infelizmente no instalador do FreeBSD 9.0 ainda não temos a opção de instalação do ZFS, todavia isso pode ser contornado usando ou o PC-BSD 9.0 ou fazendo o processo manualmente. O que mostrarei aqui neste post é uma configuração feita pelo George Kontostanos em seu post original ZFS Root.

A configuração à seguir usa um esquema com GPT e swap em ZFS:

1º Para iniciar nossa instalação precisaremos ter em mãos o DVD de instalação do FreeBSD. Precisa ser o DVD que pode ser baixado daqui:

FreeBSD 9.0 64 bits
FreeBSD 9.0 32 bits

2º Começaremos então a nossa configuração. Nesse post teremos a configuração para 1 disco apenas e a opção com 2 discos, nesse caso para fazer um mirroring.

a) Criando a partição GPT e adicionando o código de inicialização do ZFS no boot no 1º disco apenas:

gpart create -s gpt ada0
gpart add -b 34 -s 94 -t freebsd-boot ada0
gpart add -t freebsd-zfs -l disk0 ada0
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0

 

b) Criando a partição GPT e adicionando o código de inicialização do ZFS no boot no 2º disco para mirroring:

gpart create -s gpt ada1
gpart add -b 34 -s 94 -t freebsd-boot ada1
gpart add -t freebsd-zfs -l disk1 ada1
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1

 

3º Vamos criar o pool.

a) Para um disco apenas:

gnop create -S 4096 /dev/gpt/disk0
zpool create -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache zroot /dev/gpt/disk0.nop
zpool export zroot
gnop destroy /dev/gpt/disk0.nop
zpool import -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache zroot

 

b) Para um segundo disco no caso de mirroring:

gnop create -S 4096 /dev/gpt/disk0
gnop create -S 4096 /dev/gpt/disk1
zpool create -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache zroot mirror /dev/gpt/disk0.nop /dev/gpt/disk1.nop
zpool export zroot
gnop destroy /dev/gpt/disk0.nop
gnop destroy /dev/gpt/disk1.nop
zpool import -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache zroot

 

4º Vamos setar aqui o bootfs e checksum do nosso ZFS.

zpool set bootfs=zroot zroot
zfs set checksum=fletcher4 zroot

 

5º Agora vamos criar nossos filesystems. Aqui vale também a imaginação e a criatividade. No meu caso fiz algumas adições mas estou mantendo a configuração original. Essa é uma das grandes vantagens do ZFS, a flexibilidade, como podem notar. Reparem que podemos comprimir um filesystem com ‘compression’, também podemos dizer se nesse filesystem podemos executar binários com ‘exec’ e ainda se vai desligar o suid com ‘setuid’. O ‘quota’, embora não apareça nesse nosso exemplo, também é muito útil para limitações de espaço.

zfs create zroot/usr
zfs create zroot/usr/home
zfs create zroot/var
zfs create -o compression=on -o exec=on -o setuid=off zroot/tmp
zfs create -o compression=lzjb -o setuid=off zroot/usr/ports
zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/distfiles
zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/packages
zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/usr/src
zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/crash
zfs create -o exec=off -o setuid=off zroot/var/db
zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/db/pkg
zfs create -o exec=off -o setuid=off zroot/var/empty
zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/log
zfs create -o compression=gzip -o exec=off -o setuid=off zroot/var/mail
zfs create -o exec=off -o setuid=off zroot/var/run
zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/tmp

 

6º Criaremos nosso swap de 4Gb mas faça de acordo com a sua necessidade.

zfs create -V 4G zroot/swap
zfs set org.freebsd:swap=on zroot/swap
zfs set checksum=off zroot/swap

 

7º Abaixo a criação do link simbólico do home e acerto nas permissões do /tmp e /var/tmp.

chmod 1777 /mnt/tmp
cd /mnt ; ln -s usr/home home
chmod 1777 /mnt/var/tmp

 

8º Chegamos na instalação propriamente dita do nosso FreeBSD 9.0 na sua forma mais crua.

sh
cd /usr/freebsd-dist
export DESTDIR=/mnt
for file in base.txz lib32.txz kernel.txz doc.txz ports.txz src.txz;
do (cat $file | tar –unlink -xpJf – -C ${DESTDIR:-/}); done

 

9º Essa parte agora é IMPORTANTÍSSIMA. Não esqueça de fazer ou sofrerá as conseqüências. rsrsrs

cp /var/tmp/zpool.cache /mnt/boot/zfs/zpool.cache

 

10º Aqui vamos habilitar o ZFS no boot, dizer quem vai ser nosso raiz do sistema e criar um fstab vazio. Sim vazio porque o ZFS não usa o fstab mas ele precisa existir para que não dê erro no boot do sistema.

echo ‘zfs_enable=”YES”‘ >> /mnt/etc/rc.conf
echo ‘zfs_load=”YES”‘ >> /mnt/boot/loader.conf
echo ‘vfs.root.mountfrom=”zfs:zroot”‘ >> /mnt/boot/loader.conf
touch /mnt/etc/fstab

 

Reinicie agora e assim que carregar ajuste o time zone info com tzsetup, coloque uma senha para o root com o passwd e adicione um usuário seu de acesso usando o adduser. Feito isso… be happy!

Share Button