HOWTO Build Your Own LFD (Linux Floppy Disk) - UFMG
HOWTO Build Your Own LFD (Linux Floppy Disk) - UFMG
HOWTO Build Your Own LFD (Linux Floppy Disk) - UFMG
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>HOWTO</strong> <strong>Build</strong> <strong>Your</strong> <strong>Own</strong> <strong>LFD</strong> (<strong>Linux</strong> <strong>Floppy</strong> <strong>Disk</strong>)<br />
Neste tutorial será descrito passoapasso como construir sua própria distro <strong>Linux</strong>, que cabe em 1<br />
disquete. Ele tem como objetivo incentiválo a fazer seu próprio LDF, mas adaptandoo às suas<br />
necessidades, como BACKUP, REDE, ou somente por pura curiosidade, e claro, aprofundar os<br />
conhecimentos de como funciona um sistema <strong>Linux</strong>. Aqui nós criaremos um Rescue <strong>Disk</strong>, que pode<br />
acessar partições, que pode ser usado por exemplo caso o S.O não iniciar mais, você poderá acessar<br />
pelo seu <strong>LFD</strong> e transferir os dados para outra partição ou outro HD.<br />
1 – Pacotes necessários para construção.<br />
Nós precisaremos inicialmente desses pacotes:<br />
1° O Kernel do <strong>Linux</strong>, que pode ser baixado em http://kernel.org<br />
OBS: A Versão usada aqui foi a 2.6.17.7, mas você pode usar outra de sua preferência, mas as<br />
referencias aqui, serão dessa versão.<br />
2° O Busybox, que é um conjunto de programas como o ls, chmod, mkdir compactados em um só<br />
binário, e muitos outros, e pode ser obtido em http://busybox.net<br />
3° Você precisa dos compiladores e bibliotecas , certifiquese de que tem instalado o GCC e a<br />
libncursers, com os seu pacotes de desenvolvimento, que geralmente se chama libncursesdev.<br />
Consulte a documentação e os repositórios de sua distribuição.<br />
4° Precisa ter instalado o bootloader SYSLINUX, para que nossa minidistro possa ser carregada.<br />
Após ter certeza de que tem todas essas dependências satisfeitas, podemos começar!<br />
01
ATENÇÃO: Todos os comandos, a partir daqui devem ser executados<br />
como root !<br />
1 – Criando a base do sistema.<br />
Crie um diretório com o nome de sua preferência, aqui eu criei o “mylinux”.<br />
# mkdir mylinux<br />
Entre nele<br />
# cd mylinux<br />
Iremos agora criar um intrd (ou Initial Ram <strong>Disk</strong>), que é onde ficará armazenada a raiz ( / ou rootfs)<br />
do sistema.<br />
# dd if=/dev/zero of=initrd bs=1440k count=1<br />
Aqui criamos um initrd de 1.4 MB.<br />
Agora criaremos o sistema de arquivos dentro desse initrd, no formato EXT2.<br />
# mke2fs F m0 b 1024 initrd<br />
Agora iremos montar o initrd usando o loop do kernel, para que possamos passar os aquivos para<br />
dentro dele. Antes teremos que criar o ponto de montagem.<br />
Crie o ponto de montagem no lugar de sua preferencia, aqui foi o /mnt/imgs.<br />
# mkdir /mnt/imgs<br />
Agora monte o initrd em /mnt/imgs.<br />
# mount o loop initrd /mnt/imgs<br />
Agora que nosso initrd está pronto, iremos compilar os outros componentes, 1° o Busybox e depois<br />
o Kernel.<br />
02
2 – Compilando o busybox.<br />
Depois de baixar o Busybox com o formato .tar.gz em http://busybox.net,<br />
descompacteo no<br />
diretório que você criou.<br />
OBS: Aqui foi usada a versão 1.3.1, mas como no Kernel, você pode trocar as versões.<br />
# tar zxvf busybox1.3.1.tar.gz<br />
Será criado um diretório camado busybox1.3.1, entre nele.<br />
# cd busybox1.3.1<br />
Agora começaremos a configurar o busybox. Digite o seguinte comando para entrar no menu de<br />
configuração do Busybox.<br />
# make menuconfig<br />
Você deve ver uma tela como essa:<br />
03
Entre no menu Busybox Settings ><br />
General Configuration > e verá a seguinte tela:<br />
Marque as opções iguais a da imagem acima.<br />
Agora marque as seguintes opções no menu > Busybox Settings<br />
> <strong>Build</strong> Options<br />
[*] <strong>Build</strong> BusyBox as a static binary (no shared libs)<br />
[ ] <strong>Build</strong> shared libbusybox (NEW) //Não marque as que não estão com o * na frente//<br />
[*] <strong>Build</strong> with Large File Support (for accessing files > 2 GB)<br />
[*] Compile all sources at once<br />
04
Em seguida, vá para o menu > Busybox Settings<br />
> Installation Options<br />
Entre na opção “BusyBox installation prefix” e coloque o alias onde foi montado o nosso initrd,<br />
aqui no caso, /mnt/imgs. Então coloque o seu alias dentro dessa opção, que é onde será instalado o<br />
Busybox.<br />
Agora com o busybox com as configurações principais selecionadas, volte ao menu principal em<br />
comece a marcar as opções que você deseja.<br />
OBS: Marque somente o que você precisa, pois senão deixará o busybox muito grande, e não<br />
será possível colocálo no initrd. Marque os principais, como ls, chmod, mkdir, mount,<br />
umount, mkswap, fdisk entre muitos outros...<br />
Depois que acabar de selecionar os aplicativos que você vai querer, salve a configuração e<br />
retorne ao Shell.<br />
05
Ao tentar compilar o busybox estaticamente (quer dizer, sem dependência de bibliotecas), tive um<br />
problema que foi rapidamente sanado, com a retirada de uma pequena parte do código do arquivo<br />
“applets.c”. Para corrigir isso entre no diretório onde está contido o busybox, depois no diretório<br />
“applets”e abra com seu editor de texto favorito o arquivo “applets.c”<br />
Olhe o antes e o depois de como ficou o código.<br />
ANTES:<br />
A Parte que está selecionada é a parte que será retirada do código.<br />
06
DEPOIS:<br />
É assim que ficará o código, somente com as linhas que estão marcadas acima.<br />
Agora voltando ao diretório do busybox, dê o comando “make” para começar a compilação<br />
# make<br />
E depois que foi tudo compilado, vamos instalar o busybox dentro do initrd.<br />
# make install<br />
Se aparecer alguma mensagem de erro durante e instalação, veja se o busybox não ficou muito<br />
grande, e não coube dentro do initrd.<br />
Logo em seguida, entre no diretório onde nosso initrd foi montado para criar os diretórios<br />
necessários.<br />
# cd /mnt/imgs<br />
07
Agora crie os diretórios dev, media, etc e proc<br />
# mkdir dev proc media etc<br />
Entre no etc e crie outro diretório com o nome de init.d<br />
#mkdir init.d<br />
Volte ao diretório abaixo<br />
# cd ..<br />
Entre no dev e para criar os dispositivos que serão usados. Usei o Script MAKEDEV para criar os<br />
dispositivos. Primeiro criaremos os terminais.<br />
# MAKEDEV console<br />
Ele criará os dispositivos “console” e mais um monte de tty's... Mas nós só precisamos do<br />
“console”, tty0, tty1, tty2. Delete os demais. Agora crie os dispositivos especias, como o /dev/zero<br />
com o comando:<br />
# MAKEDEV zero<br />
Ele irá criar o loop0, loop1... ram, ram0, ram1... Apague do loop2 até o loop7 e o ram2 até o<br />
ram16. NÃO APAGUE OS OUTROS DISPOSITIVOS!<br />
Depois criaremos o acesso aos HD's, aqui eu tenho somente um HD (hda), então eu crio ele com o<br />
comando:<br />
# MAKEDEV hda<br />
Ele irá criar o hda e os hda1, hda2 e etc... Cloque o dispositivo que você quiser, como hdb, hdc e<br />
etc... Tudo depende dos dispositivo que você tem no computador.<br />
Agora está na hora de criar os arquivos de configuração, como o inittab, rc.S e fstab. Vamos criar<br />
o inittab, o arquivo responsável pela inicialização do sistema. Para que seu sistema tenha suporte<br />
ao arquivo inittab, na configuração do busybox que a opção do init esteja habilitada com suporte<br />
ao inittab:<br />
> Init Utilities<br />
> init<br />
[*] init<br />
[ ] debugging aid (NEW)<br />
[*] Support reading an inittab file (NEW)<br />
[ ] Support running commands with a controllingtty (NEW)<br />
[*] Be _extra_ quiet on boot (NEW)<br />
[ ] Support dumping core for child processes (debugging only) (NEW)<br />
[*] Support running init from within an initrd (not initramfs) (NEW)<br />
[*] poweroff, halt, and reboot (NEW)<br />
[*] mesg (NEW)<br />
08
Agora abaixo, um exemplo de um arquivo inittab:<br />
#BOF<br />
#Aqui o aquivo que o init usa para executar as funções iniciais.<br />
::sysinit:/etc/init.d/rc.S<br />
#O 1° console<br />
::respawn:/bin/sh<br />
# O Segundo console<br />
tty2::respawn:/bin/sh<br />
#Aqui você pode ativar outros consoles, mas para isso você terá que criar as tty's correspondentes<br />
#tty3::askfirst:/bin/sh<br />
#tty4::askfirst:/bin/sh<br />
::restart:/sbin/init<br />
# Comandos para reboot...<br />
::ctrlaltdel:/sbin/reboot<br />
::shutdown:/bin/umount a r<br />
::shutdown:/sbin/swapoff a<br />
#EOF<br />
Crie um arquivo chamado inittab, cole esse texto dentro dele, e coloque o arquivo dentro do<br />
diretório etc da distro, ex:<br />
# cp inittab /mnt/imgs/etc<br />
Dê permissão de leitura a todos, escrita somente pelo root e execução por todos:<br />
# chmod 755 /mnt/imgs/etc/inittab<br />
Feito isso, criaremos o arquivo fstab, que é responsável pela montagem das partições. Aqui um<br />
exemplo do arquivo fstab:<br />
#BOF<br />
#/etc/fstab<br />
proc /proc proc defaults 0 0<br />
#EOF<br />
Um arquivo simples, mas de muita importância. Coloqueo no etc em seu initrd e dê as mesmas<br />
permissões do arquivo anterior.<br />
09
Agora o arquivo rc.S, que ficará lá no etc/init.d da distro. Abaixo um exemplo, do arquivo rc.S,<br />
essa é a minha versão, sintase a vontade para modificálo a seu modo.<br />
#!/bin/sh<br />
echo<br />
echo<br />
echo " My<strong>Linux</strong> versao 0.1"<br />
echo<br />
echo<br />
echo "Montando /proc.....................................................[ OK ]"<br />
mount t proc proc /proc<br />
echo "ProcFS Montado em /proc com sucesso................[ OK ]"<br />
sleep 1<br />
echo " Eba! Minha Propria Minidistro!!!"<br />
echo<br />
echo<br />
Salve o arquivo dentro do etc/init.d da distro (/mnt/imgs/etc/init.d), e após copiado, de as seguintes<br />
permissões a ele:<br />
# chmod +x /mnt/imgs/etc/init.d/rc.S<br />
Tudo Pronto!!! Agora desmontaremos a imagem do initrd, a compactaremos e começaremos a<br />
configuração do nosso Kernel!<br />
# umount /mnt/imgs<br />
Agora vamos compactála com o gzip<br />
# gzip 9 initrd<br />
Isso vai criar um arquivo chamado initrd.gz, que é a raiz do nosso sistema (rootfs)<br />
Após todos esses passos, vamos passar para a parte fácil de nossa brincadeira, a configuração e<br />
compilação de nosso Kernel, com as nossas especificações.<br />
10
3 Compilando o Kernel<br />
Agora vamos começar a configuração do Kernel de nossa distro. Ele deve conter o mínimo<br />
possível de opções marcadas, para que ele possa ficar compacto e caber no disquete.<br />
Depois de baixar o Kernel no formato .tar.bz2 (tenha preferencia por esse formato, pois são mais<br />
compactos e consequentemente, o download é mais rápido), copie o arquivo e descompacteo no<br />
diretório que você criou lá no inicio, aqui, o “mylinux”.<br />
# tar jxvf linux2.6.17.7.tar.bz2<br />
Após descompactar, entre no diretório criado.<br />
# cd linux2.6.17.7<br />
E digite o seguinte comando:<br />
# make allnoconfig<br />
Esse comando desmarca todas as opções que já vem previamente marcadas, prevenindo que não<br />
marcaremos nenhuma opção que não será usada. Agora digite o seguinte comando para começar a<br />
configuração do Kernel:<br />
# make menuconfig<br />
Você verá uma tela como essa abaixo.<br />
11
Colocarei aqui as opções que devem ser marcadas, mas sintase livre para customizar a<br />
configuração, mas lembrando que o kernel tem que ficar pequeno, para caber no disquete junto<br />
como o initrd.<br />
OBS: As opções que aparecem abaixo são as que serão marcadas com o * .<br />
Configuração do Kernel 2.6.17.7 :<br />
Code maturity level options > ( Desabilite essa opção)<br />
General setup ><br />
[*] Support for paging of anonymous memory (swap)<br />
[*] System V IPC<br />
[*] Sysctl support<br />
[*] Kernel .config support<br />
[*] Enable 16bit UID system calls<br />
[*] Enable VM86 support<br />
[*] Configure standard kernel features (for small systems)<br />
Loadable module support > ( Desabilite essa opção, pois nossa distro não terá suporte a<br />
módulos, portanto, não é também necessário ter os programas modprobe, rmmod e etc...Mas você<br />
pode habilitála caso for desenvolver uma distro maior, com suporte a alguns módulos, como os de<br />
placa de rede, SCSI e etc...)<br />
Block layer > (Desabilite esta opção)<br />
Processor type and features ><br />
Subarchitecture Type (PCcompatible) > (Entre nessa opção e escolha PCcompatible)<br />
Processor family (386) > (Entre nessa opção e escolha 386)<br />
[*] Generic x86 support<br />
[*] Enable seccomp to safely compute untrusted bytecode<br />
Timer frequency (1000 HZ) > Entre nessa opção e escolha 1000 HZ)<br />
Power management options (ACPI, APM) > (Desabilite esta opção)<br />
Bus options (PCI, PCMCIA, EISA, MCA, ISA) ><br />
[*] PCI support<br />
[*] ISA support<br />
[*] EISA support<br />
[*] Generic PCI/EISA bridge<br />
Executable file formats ><br />
[*] Kernel support for ELF binaries<br />
Networking > ( Desabilite esta opção, caso não queira suporte a rede, isso deixa o kernel um<br />
pouco menor)<br />
12
Device Drivers ><br />
Generic Driver Options ><br />
[*] Prevent firmware from being built<br />
Connector unified userspace kernelspace linker > (Desabilite esta opção)<br />
Memory Technology Devices (MTD) > (Desabilite esta opção)<br />
Parallel port support > (Desabilite esta opção)<br />
Plug and Play support > (Desabilite esta opção)<br />
Block devices ><br />
Normal floppy disk support<br />
Loopback device support<br />
RAM disk support<br />
(16) Default number of RAM disks<br />
(4096) Default RAM disk size (kbytes)<br />
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support<br />
ATA/ATAPI/MFM/RLL support ><br />
ATA/ATAPI/MFM/RLL support<br />
Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support<br />
Please see Documentation/ide.txt for help/info on IDE drives<br />
Include IDE/ATA2 DISK support<br />
Include IDE/ATAPI CDROM support<br />
Include IDE/ATAPI FLOPPY support<br />
IDE chipset support/bugfixes<br />
generic/default IDE chipset support<br />
[*] Other IDE chipset support<br />
SCSI device support > (Desabilite esta opção)<br />
Old CDROM drivers (not SCSI, not IDE) > (Desabilite esta opção)<br />
Multidevice support (RAID and LVM) > (Desabilite esta opção)<br />
Fusion MPT device support > (Desabilite esta opção)<br />
IEEE 1394 (FireWire) support > (Desabilite esta opção)<br />
I2O device support > (Desabilite esta opção)<br />
ISDN subsystem > (Desabilite esta opção)<br />
Telephony Support > (Desabilite esta opção)<br />
13
Input device support ><br />
[*] Keyboards ><br />
Character devices ><br />
[*] Virtual terminal<br />
[*] Support for console on virtual terminal<br />
[*] Unix98 PTY support<br />
[*] Legacy (BSD) PTY support<br />
(256) Maximum number of legacy PTY in use<br />
I2C support > (Desabilite esta opção)<br />
SPI support > (Desabilite esta opção)<br />
Dallas's 1wire bus > (Desabilite esta opção)<br />
Hardware Monitoring support > (Desabilite esta opção)<br />
Misc devices > (Desabilite esta opção)<br />
Multimedia devices > (Desabilite esta opção)<br />
Graphics support ><br />
Support for frame buffer devices<br />
[*] Enable firmware EDID<br />
VGA 16color graphics support<br />
[*] VESA VGA graphics support<br />
Console display driver support ><br />
[*] VGA text console<br />
Framebuffer Console support<br />
Logo configuration > (Essa é opcional, somente colocarei para ter o tux no canto<br />
superior esquerdo da tela.)<br />
[*] Bootup logo<br />
[*] Standard 16color <strong>Linux</strong> logo<br />
Sound > (Desabilite esta opção)<br />
USB support > (Desabilite esta opção)<br />
MMC/SD Card support > (Desabilite esta opção)<br />
LED devices > (Desabilite esta opção)<br />
14
InfiniBand support > (Desabilite esta opção)<br />
EDAC error detection and reporting (RAS) (EXPERIMENTAL) > (Desabilite esta opção)<br />
Real Time Clock > (Desabilite esta opção)<br />
File systems ><br />
Second extended fs support<br />
[*] Ext2 extended attributes<br />
[*] Ext2 POSIX Access Control Lists<br />
[*] Ext2 execute in place support<br />
Ext3 journalling file system support<br />
[*] Ext3 extended attributes<br />
[*] Ext3 POSIX Access Control Lists<br />
Reiserfs support<br />
[*] ReiserFS extended attributes<br />
[*] ReiserFS POSIX Access Control Lists<br />
Minix fs support<br />
Filesystem in Userspace support<br />
CDROM/DVD Filesystems ><br />
ISO 9660 CDROM file system support<br />
[*] Microsoft Joliet CDROM extensions<br />
[*] Transparent decompression extension<br />
DOS/FAT/NT Filesystems ><br />
MSDOS fs support<br />
VFAT (Windows95) fs support<br />
(437) Default codepage for FAT<br />
(iso88591) Default iocharset for FAT<br />
NTFS file system support<br />
Pseudo filesystems ><br />
[*] /proc file system support<br />
[*] /proc/kcore support<br />
[*] sysfs file system support<br />
[*] Virtual memory file system support (former shm fs)<br />
Kernel hacking > (Desabilite esta opção)<br />
Security options > (Desabilite esta opção)<br />
Cryptographic options > (Desabilite esta opção)<br />
15
Library routines ><br />
CRCCCITT functions<br />
CRC16 functions<br />
CRC32 functions<br />
CRC32c (Castagnoli, et al) Cyclic RedundancyCheck<br />
Finalmente, acaba por aqui a configuração do Kernel. Salve a configuração e compileo com o<br />
comando:<br />
# make<br />
Essa etapa demora um pouquinho, vá tomar um refrigerante ou um café, relaxe um pouco, pois<br />
estamos quase chegando na etapa final! Após a compilação chegar ao final, temos basicamente<br />
tudo feito, só falta criar um arquivo vazio de 1,4 MB, formatalo com um sistema de arquivos<br />
FAT, colocar e configurar o Bootloader, copiar o kernel junto com o initrd.gz para dentro dela e<br />
pronto!<br />
Vamos lá!<br />
Crie o arquivo vazio com o comando:<br />
# dd if=/dev/zero of=mylinux.img bs=1440k count=1<br />
Formateo com o comando:<br />
# mkdosfs mylinux.img<br />
Depois instalaremos o bootloader SYSLINUX na nossa distro, assim:<br />
# syslinux s mylinux.img<br />
Agora, montaremos nosso arquivo usando o loop do kernel, como já fizemos antes, e também<br />
podemos usar o ponto de montagem que criamos antes, o “/mnt/imgs”.<br />
# mount o loop mylinux.img /mnt/imgs<br />
Agora copie o kernel e o initrd.gz para dentro da imagem<br />
# cp linux2.6.17.7/arch/i386/boot/bzImage /mnt/imgs/vmlinuz<br />
e<br />
# cp initrd.gz /mnt/imgs<br />
16
Teremos que criar o arquivo de configuração do syslinux. Crie dois arquivos, um chamado<br />
“syslinux.cfg”, que é o arquivo de configuração e outro “mylinux.msg” , que é uma mensagem que<br />
será mostrada na tela antes do boot.<br />
Coloque as seguintes linha dentro do arquivo syslinux.cfg:<br />
default linux<br />
prompt 1<br />
display mylinux.msg<br />
label linux<br />
KERNEL vmlinuz<br />
APPEND load_ramdisk=1 initrd=initrd.gz root=/dev/ram0 rw<br />
TIMEOUT 200<br />
Copie o arquivo para dentro da imagem montada no /mnt/imgs<br />
# cp syslinux.cfg /mnt/imgs<br />
Agora crie o arquivo “mylinux.msg” e coloque as seguintes linhas:<br />
Mylinux 0.1<br />
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\<br />
Press para continuar...<br />
E também copieo para o /mnt/imgs<br />
# cp mylinux.msg /mnt/imgs<br />
PRONTO!!!!!!!<br />
Só falta desmontar a imagem e dar boot!<br />
Desmonte com o comando:<br />
# umount /mnt/imgs<br />
Agora é só testar. Você pode queimar em um disquete e reiniciar a máquina para testar ou usar um<br />
emulador como o Bochs ou Qemu.<br />
Podese passar a imagem para o disquete como o comando:<br />
# dd if=mylinux.img of=/dev/fd0<br />
17
Eu usei o Qemu, que é prefeito para esse tipo de teste. Teste com Qemu assim:<br />
# qemu fda mylinux.img<br />
Bom, se tudo funcionar direitinho, como você queria, fique feliz, pois agora você tem sua própria<br />
distro <strong>Linux</strong> personalizada, que roda inteiramente de um disquete!!!<br />
Agora podemos ver alguns screenshots do “My<strong>Linux</strong>” funcionando no Qemu...<br />
Tela de Boot.<br />
Boot<br />
18
Inicialização<br />
Em funcionamento...<br />
19
Os Screenshots acima mostram o processo de boot, inicialização e funcionamento da nossa<br />
minidistro. Usea da forma que for mais conveniente para você. Um exemplo de como ela pode<br />
ser usada, uma experiência própria:<br />
“Certa vez um Pentium 100 MHz com 32 MB de memória, não iniciava mais o seu Windows 95,<br />
mas dentro dele haviam contidas algumas informações importantes, como cadastro de telefones e<br />
endereços de alunos. Como ele não era capaz de iniciar um Live CD para que eu pudesse fazer<br />
backup das informações e repassalas para outro HD, tirei meu <strong>LFD</strong>, espetei outro HD na máquina<br />
e pude fazer backup com sucesso das informações.”<br />
Essa é só uma das formas de como usar seu <strong>LFD</strong>. A partir de agora, com os conhecimentos<br />
adquiridos com o tutorial, você pode fazer um <strong>LFD</strong> totalmente personalizado, com uma tela de<br />
boot mais bonita, um nome legal, um kernel mais recente ou com suporte a outras coisa, para que<br />
o <strong>LFD</strong> tenha uma função específica, como servidor de DHCP, ou o que você queira. Sua<br />
imaginação é o limite!<br />
Base de Desenvolvimento:<br />
Todos os precedimentos apresentados aqui foram testados no Debian Etch 4.0 Testing/Unstable,<br />
com o GCC 4.0.<br />
Sobre o Autor:<br />
Gabriel Duarte Guimarães Costa – Usuário <strong>Linux</strong> a 5 anos, técnico em informática e cursa o 2°<br />
Grau técnico em Processamento de Dados na FAETEC E.T.E República – RJ e Desenvolvedor<br />
do <strong>LFD</strong> Terabeauts, que pode ser baixado em http://code.google.com/p/terabeauts<br />
Mande comentários, sugestões, críticas ou idéias para confusosk8@gmail.com<br />
Nota de Copyright<br />
Copyright © 2007 Gabriel Duarte<br />
Esse manual está licenciado nos termos da GNU FDL (Free Documentation License). Ele é<br />
feito na intenção de ser útil à comunidade mas vem sem nenhuma garantia.<br />
20
Visite http://code.google.com/p/terabeauts e colabore com o projeto.<br />
21