Pessoal, boa tarde.

No sabado foi comitado um novo port na categoria sysutils batizado de tinybsd. Estamos agora disponibilizando ao publico o nosso projeto.

O TinyBSD é um script de criação de sistemas embarcados baseado no FreeBSD com o objetivo de ser rápido, fácil e 100% funcional. Atualmente a imagem padrão gerada com suporte a bridge, dummynet,firewall, todas as placas de rede do sistema gasta em torno de 20MB, mas fazendo uma limpeza é possível colocar para trabalhar um sistema mínimo em torno de 8MB.

Precisamos então que voce nos ajude no projeto, testando, enviando sugestoes e fazendo criticas construtivas.

- Sobre o TinyBSD

O TinyBSD foi projetado por dois brasileiros, por mim e o Patrick Tracanelli. A idéia de desenvolver um novo script para criação de um sistema embarcado surgiu quando Poul-Henning Kamp colocou no CURRENT o NanoBSD. Depois de analisar os scripts do NanoBSD e ver que ele demorava demais para criar o sistema já que havia a necessidade de recompilar todo o sistema e ocupava espaço desnecessário no sistema. O PicoBSD já praticamente não funciona direito na serie 5.X, além de sua mídia frágil (disquete). Esse motivos levaram a criação do TinyBSD.

A principal questão que ajudou na velocidade de criação de um sistema baseado no TinyBSD foi que a partir da série 5.X o FreeBSD vem por padrão com todas os seus binários compilados dinâmicamente, ou seja todos os binários necessitam de determinadas bibliotecas para o seu funcionamento, o que leva os binários ficarem com um tamanho bem menor e ainda não haver necessidade de uma recompilação de determinadas partes do sistema para usar o método dinâmico.

Na série 4.X do FreeBSD todos os binários da base do sistema são estáticos, ou seja não precisam de bibliotecas para o seu funcionamento, com isso também o tamanho de seus bínarios são bem maiores. Por esses motivos, o TinyBSD foi desenvolvido para trabalhar somente com FreeBSD série 5.X e 6.X.

- Instalando o TinyBSD

Primeiramente atualize a sua coleção de ports ou somente a categoris sysutils. 
Entre no diretorio:

# cd /usr/ports/sysutils/tinybsd
# make install

Automaticamente ele fará o download dos scripts na página oficial do projeto.

- Arquivos do TinyBSD

Os arquivos de configuração do TinyBSD estão disponíveis em 
/usr/local/share/tinybsd. O script de criação do sistema está disponível em 
/usr/local/bin/tinybsd.

O sistema foi todo projetado baseado na facilidade de customização de imagens a 
partir do PicoBSD e o script de compilação baseado no NanoBSD.

# ls /usr/local/share/tinybsd
TINYBSD tinybsd.basefiles
Temos em seu diretório esses dois arquivos principais. Vejamos o que são esses 
arquivos:

TINYBSD: Assim como o PicoBSD havia o seu kernel pré-definido, aqui também 
temos o kernel chamado de TINYBSD.

# more TINYBSD

machine         i386
cpu             I486_CPU
cpu             I586_CPU
cpu             I686_CPU
ident           TINYBSD

#To statically compile in device wiring instead of /boot/device.hints
#hints          "GENERIC.hints"         #Default places to look for devices.
...

Como se pode ver é um arquivo de kernel identico ao do seu sistema, basta 
definir quais opções habilitar o desabilitar em seu kernel de acordo com sua 
necessidade.

tinybsd.basefiles: Assim como no PicoBSD havia o crunch.conf para definirmos 
quais arquivo desejamos ter em nosso sistema, aqui temos nossos arquivos que 
serão colocados em nosso sistema embarcado, já está disponível todos os 
arquivos necessários para o funcionamento do sistema. Coloque ou remova os 
binários que você deseja de acordo com sua necessidade. Vejamos o arquivo:

# more tinybsd.basefiles
# contents of ${WORKDIR}/boot
boot/boot0
boot/boot1
boot/boot2
boot/defaults/loader.conf
boot/device.hints
...
# contents of ${WORKDIR}/bin
bin/[:bin/test
bin/cat
bin/chflags
bin/chio
bin/chmod
...

E assim por diante, caso você queria por exemplo adicionar o binário "setkey" 
que está no diretório /usr/sbin bastaríamos colocar a seguinte linha no arquivo na área 
do /usr/sbin, ficando da seguinte forma:

usr/sbin/pw
usr/sbin/pwd_mkdb
usr/sbin/setkey

tinybsd: É o script de criação de todo o sistema. Dificilmente você precisará 
mexer neste script, a idéia dele é criar um diretório de trabalho temporário 
onde será criada toda a árvore de diretórios do sistema. Feito isso ele irá 
copiar todos os binários setados no arquivo tinybsd.basefiles, depois compilar 
seu kernel de acordo com suas definições do arquivo TINYBSD e então copiar as 
bibliotecas necessárias de acordo com a saída de dependências geradas pelos 
binários. Povoamos o diretório /etc no diretório temporário de trabalho e 
colocamos algumas configurações padrões importantes no /etc/rc.conf a serem 
configuradas como:

hostname="tinybsd.freebsd.org"
sendmail_enable="NONE"
sshd_enable="YES"
usbd_enable="NO"
inetd_enable="NO"
portmap_enable="NO"
update_motd="NO"
varmfs="YES"
populate_var="YES"
varsize="8192"

E finalmente por último criamos uma imagem vazia de acordo com a especificação 
de sua mídia que deve ser passado como parâmeto na execução do script e 
copiamos todos os arquivos do diretório de trabalho temporário para a imagem 
montada no diretório /mnt.

- Executando o TinyBSD

Sabendo como funciona o TinyBSD é hora de criarmos nossa própria imagem. Vamos 
conduzir essa criação do sistema por passos.

1) Edite o arquivo de configuração do kernel TINYBSD e defina quais opções 
serão necessárias você retirar ou acrescentar.

2) Edite o tinybsd.basefiles e defina quais binários você deseja ou não deseja 
ter em seu sistema.

3) Pegue as informações corretas do seu dispositivo para onde você quer mandar 
a imagem do TinyBSD, para isso coloque na máquina em questão o seu dispositivo 
e obtenha as informações necessárias através do diskinfo(8).

# diskinfo -v /dev/ad2
ad2
       512             # sectorsize
       20060135424     # mediasize in bytes (19G)
       39179952        # mediasize in sectors
       38869           # Cylinders according to firmware.
       16              # Heads according to firmware.
       63              # Sectors according to firmware.

Para criar minha imagem eu preciso saber o tamanho da midia em setores 
(mediasize in sectors), cabeças de acordo com o firmware (Heads according to 
firmware), setores de acordo com o firmware (Sectors according to firmware) e 
por opcionalmente você pode definir o nome da imagem que será gerada, caso você 
nao especifique o nome será tinybsd.bin.
Já que com o diskinfo nos obtemos essas informações agora basta executar o 
script tinybsd. Lembre-se que são 3 parâmetros e 1 opcional, caso eu esqueça de 
passar algum deles o script me mostrará o seguinte erro:

# /usr/local/bin/tinybsd
Woops!
Usage: tinybsd <mediasize in sectors> <heads according to firmware> <sectors according to firmware> [<tinybsd image name>]

  Example: tinybsd 62592 4 32

  Run diskinfo(8) -v against your CF device to get correct information
  about your disk.

Passando corretamente os parâmetros:

# /usr/local/bin/tinybsd 39179952 16 63
Creating directory hierarchy...
./bin missing (created)
./boot missing (created)
./boot/defaults missing (created)
./boot/kernel missing (created)
./boot/modules missing (created)
./dev missing (created)
./etc missing (created)
...

No final temos uma imagem gerada chamada tinybsd.bin, agora basta copia-la para 
o dispositivo de destino, exemplo:

# dd if=tinybsd.bin of=/dev/ad2

Inicie o seu novo sistema embarcado e logue nele. Qualquer alteração no 
sistema, deve ser antes montado a raíz como escrita, já que ela está 
trabalhando em modo somente leitura para poupar escrita em disco e em caso de 
pique de energia não perderemos dados. Para então montá-la como escrita utilize 
o mount:

# mount -u -o rw /

Feita suas alterações volte o sistema para trabalhar somente como modo de 
leitura:

# mount -u -o ro /

Assim que você logar no sistema configure uma senha de root, já que 
inicialmente o sistema é criado sem uma senha.

Se você der um df(1) teremos as seguintes partições:

# df
Filesystem 1K-blocks  Used Avail Capacity  Mounted on
/dev/ad0a      29359 19446  7565    72%    /
devfs              1     1     0   100%    /dev
procfs             4     4     0   100%    /proc
/dev/md0        3694   114  3286     3%    /var
/dev/md1        19566    6 17996     0%    /tmp 

Como se pode notar o /var e o /tmp estão montados em /dev/md0 e /dev/md1 respectivamente, ou seja estão utilizando o sistema de disco em memória, isso porque os dados em /var e /tmp como por exemplo em /var/log necessitam de escrita o tempo todo, e como nosso sistema trabalha 99% do tempo como somente leitura, teríamos problemas na gravação desses dados, portanto uma alternativa utilizada é colocar esses dados em memória, com isso não teremos problemas de escrita. Porém caso você reinicie a máquina todos esses dados serão perdidos, portanto caso você necessite estar salvando esses logs, sugiro mandar a saída dos logs sempre para uma outra máquina.
A linha de configuração que chama o script do sistema de criação do /var em memória está no 
/etc/rc.conf em "varmfs="YES"", além de montar o /var na memória ele também o 
povoa com toda sua estrutura de subdiretórios. Inicialmente o /var é criado na memória utilizando 
somente 32MB de espaço, na maioria das vezes é suficiente, porém se você acham necessário estar 
alterando pode modificar a seguinte linha no arquivo /etc/rc.conf:
varsize="32m"

Troque o 32m para o valor de Mbytes desejado. Tenha cuidado para nao utilizar 
toda sua memória para o /var.

- Ports e o TinyBSD

Você pode também instalar aplicativos através do ports, para isso basta definir 
a variável PREFIX para o diretório de destino da imagem. Vamos supor que eu 
queira instalar o apache na imagem recém criada, para isso eu faria o seguinte:

# mdconfig -a -t vnode -f tinybsd.bin -u 0

Estamos utilizando o mdconfig para habilitar o disco de memória zero.

# mount /dev/md0s1a /mnt

Pronto, agora montamos nossa imagem no diretório temporário /mnt. Vamos então 
instalar o apache via ports:

# cd /usr/ports/www/apache13
# make install PREFIX=/mnt/usr/local
===>  Vulnerability check disabled
apache_1.3.31.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
Attempting to fetch from http://www.apache.org/dist/httpd/.
...
     This port has installed the following startup scripts which may cause
     these network services to be started at boot time.
/mnt/usr/local/etc/rc.d/apache.sh
....

Terminada a instalação vamos então verificar se o apache foi instalado 
corretamente em nosso diretório /mnt.

# cd /mnt/usr/local/sbin
# ls -lga httpd
-rwxr-xr-x  1 root  wheel  252439 Jul 14 15:31 httpd

Nosso aplicativo foi instalado com sucesso. Você deve ter notado que no final 
da instalaçao ele aponta o caminho inteiro da variável PREFIX que colocamos. O 
problema disso é que quando seu sistema for iniciar o apache ele o procurará em 
/mnt e não em /usr. Para isso então devemos editar o arquivo de inicialização 
do apache em /usr/local/etc/rc.d chamado apache.sh e alterar tudo que estiver 
com o caminho /mnt e remove-lo.

ATENÇÃO: Uma coisa muito importante a se considerar são as dependências. 
Verifique antes de qualquer coisa, se o aplicativo que você deseja instalar 
possui dependências e caso possua, verifica se o espaço que você colocou para 
seu sistema será suficiente para alocar tanto o aplicativo quanto suas 
dependências.

- Download do script

O TinyBSD é um projeto que ainda se encontra em pleno desenvolvimento, tanto o 
script quanto sua documentação. A idéia é que futuramente ele possa se integrar 
na árvore do projeto FreeBSD.

Caso você queira testar ou usar a versão BETA do script, sinta-se à vontade 
para puxá-lo no site oficial do projeto em http://www.tinybsd.org ou através da 
coleção de ports sysutils/tinybsd no FreeBSD.

--
Atenciosamente
Jean Milanez Melo
FreeBSD Brasil LTDA.
Fone: (31) 3281-9633
http://www.freebsdbrasil.com.br


_______________________________________________
Freebsd mailing list
Freebsd@fug.com.br
http://mail.fug.com.br/mailman/listinfo/freebsd_fug.com.br

Responder a