Quebrando alguns mitos do Yocto Project
- por Sergio Prado
O Yocto Project tem evoluído rapidamente, mas ainda existem alguns mitos relacionados a este projeto quando o comparamos com outras ferramentas de build como o Buildroot.
Um dos mitos do Yocto Project é o tempo excessivo de compilação.
Me lembro que no começo do projeto a primeira compilação levava mesmo muitas horas. Pois é, hoje leva um pouco mais que meia hora, se sua máquina for boa e se tiver uma conexão razoável com a Internet.
Para comparar os tempos de compilação, gerei uma distribuição completa para a Beaglebone Black com o Buildroot e com o Yocto Project. Para isso, utilizei uma máquina com o Ubuntu 14.04 64 bits, processador Intel i7-3770 3.40GHz (4 núcleos com Hyper-Threading) e 16GB de RAM.
A geração da distribuição completa (toolchain, bootloader, kernel, rootfs) no Buildroot levou aproximadamente 48 minutos:
$ wget https://buildroot.org/downloads/buildroot-2016.08.1.tar.gz $ tar xfv buildroot-2016.08.1.tar.gz $ cd buildroot-2016.08.1/ $ sed -i "s/^# BR2_TARGET_ROOTFS_TAR.*/BR2_TARGET_ROOTFS_TAR=y/" configs/beaglebone_defconfig $ make beaglebone_defconfig $ make real 48m34.125s user 53m0.828s sys 9m51.594s |
Já a geração da distribuição completa (toolchain, bootloader, kernel, rootfs) com o Yocto Project levou aproximadamente 46 minutos!
$ git clone -b krogoth git://git.yoctoproject.org/poky $ source poky/oe-init-build-env $ sed -i "s/^MACHINE.*/MACHINE ?= \"beaglebone\"/" conf/local.conf $ time bitbake core-image-minimal real 46m10.218s user 231m39.627s sys 46m55.965s |
Agora vejam que interessante. O campo “user” do comando time representa o tempo total de CPU gasto pelo processo rodando em user space e o campo “sys” representa o tempo total de CPU gasto pelo processo rodando em kernel space. Isso significa que, se somarmos “user” e “sys” temos o tempo total de CPU consumido pelo processo.
Fazendo este cálculo, podemos verificar que a compilação do Buildroot consumiu aproximadamente 63 minutos e a compilação do Yocto Project consumiu aproximadamente 258 minutos (isso porque o Yocto Project processa muito mais receitas na sua primeira compilação). Porém, como o Yocto Project é muito melhor em paralelizar o trabalho de compilação, os tempos finais de compilação ficaram bem parecidos!
Um outro mito comum do Yocto Project é que ele gera um rootfs muito grande. Isso não é necessariamente verdade!
O Buildroot gerou um rootfs (arquivo no formato tar) de aproximadamente 2MB:
$ ls -lh output/images/rootfs.tar -rw-r--r-- 1 sprado sprado 2,0M Nov 12 17:01 output/images/rootfs.tar |
E o Yocto Project gerou um rootfs (arquivo no formato tar) de aproximadamente 5,3MB. Sim, é um pouco mais que o dobro da imagem gerada pelo Buildroot, mas não é nada muito excessivo.
$ bzcat tmp/deploy/images/beaglebone/core-image-minimal-beaglebone.tar.bz2 > rootfs.tar $ ls -lh rootfs.tar -rw-rw-r-- 1 sprado sprado 5,3M Nov 12 18:01 rootfs.tar |
E se trocarmos a configuração da distro no local.conf para “poky-tiny“, que inclui menos componentes de software e utiliza a musl como biblioteca do sistema, o tamanho do rootfs gerado pelo Yocto Project diminui para 1,6MB, menor que o do Buildroot!
$ sed -i "s/^DISTRO.*/DISTRO ?= \"poky-tiny\"/" conf/local.conf $ bitbake core-image-minimal $ bzcat tmp/deploy/images/beaglebone/core-image-minimal-beaglebone.tar.bz2 > rootfs.tar $ ls -lh rootfs.tar -rw-rw-r-- 1 sprado sprado 1,6M Nov 13 11:02 rootfs.tar |
É lógico que estes testes podem variar dependendo da capacidade da sua máquina de desenvolvimento e das características do kit de desenvolvimento e da imagem gerada. Minha intenção aqui é mostrar que o Yocto Project tem evoluído bastante nos últimos releases, e isso inclui melhorias nos tempos de compilação e no tamanho das imagens geradas.
O Buildroot é uma ferramenta fantástica, bem mais simples e intuitiva que o Yocto Project. Por outro lado, o Yocto Project é bem mais flexível, completo e dá um controle maior ao desenvolvedor de distribuições Linux. Na prática, estas ferramentas se complementam. Melhor para nós, que temos duas ótimas opções para construir distribuições Linux para dispositivos embarcados.
Um abraço,
Sergio Prado