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