Stop Yocto Build with Default downloads, sstate-cache, and tmp Directories

One thing that annoyed me for some time was starting a Yocto build and, only after a few minutes or hours, remember to fix the downloads, sstate-cache and tmp directories in build/conf/local.conf.

In general we want to share the downloads and the sstate-cache with other builds to speed things up as much as possible, especially when several people are working on the same the build machine. In that case we would just commit that configuration to the repository, so everyone uses it and forgets about it.

However we can also have the case where people build on many shared machines with different configurations as well on their local machines. Then everyone agrees to leave the default because that makes nobody happy.

In this case that configuration is never committed to the repository and is always floating around, get lost on a stash for a rebase or merge, and so on. When you less expect the build has started and the default directories are being used.

By default Yocto uses three directories inside build: downloads, sstate-cache, and tmp. I want to always use somewhere else.

So, to fail the build when I forget to change them, I simply create the three directories and make them read-only.

cd build
mkdir downloads sstate-cache tmp
chmod 555 downloads sstate-cache tmp

And, if this idea pleases everybody in the team, it is possible to create some placeholder read-only file inside each directory before making the directories read-only (with chmod 555 ...), then commit these untouchable directories to the repository.

touch downloads/ro sstate-cache/ro tmp/ro
chmod 444 downloads/ro sstate-cache/ro tmp/ro

I hope this helps and good luck!

Error Building Qt6 Toolchain with Yocto

Error Building Qt6 Toolchain with Yocto

I was trying to build Qt6 toolchain with Yocto (meta-qt6 from https://code.qt.io/yocto/meta-qt6 branch 6.7) but I got an error with the following lines:

$ bitbake meta-toolchain-qt6
FileNotFoundError: [Errno 2] No such file or directory: 'cups-config'
ERROR: Task (meta-qt6/recipes-qt/qt6/qtpdf_git.bb:do_compile) failed with exit code '1'

It seems that cups is necessary to build qtpdf. So I created a new meta layer with the following bbappend file, which fixed the issue.

# File: qtpdf_git.bbappend
DEPENDS += " cups "

I created a meta layer to fix this issue. Check it out on GitHub:

https://github.com/djboni/meta-qt6-fix

I hope this helps and good luck!

Ansible: Criptografando Senhas de Usuários

As vezes queremos gerar uma senha fixa para usuários, a qual vamos reutilizar em várias máquinas.

Um exemplo típico é criar usuário administrador, capaz de realizar login com senha. Dessa forma, caso ocorra algum problema com o servidor SSH ou perca a sua chave privada junto com o seu HD, ainda é possível fazer login direto na máquina, por VNC ou por outros meios de acesso remoto.

Porém essa é a senha de administrador de muitos computadores e não queremos colocá-la diretamente em scripts de configuração, como os do Ansible, onde podem ser lidas diretamente.

Podemos, no entanto, criar uma versão encriptada da senha (a mesma usada no arquivo /etc/shadow) e aí sim colocá-la no script.

O código abaixo cria uma senha segura 24 caracteres utilizando pwgen. A opção -s indica que a senha deve ser completamente aleatória.

$ pwgen -s 24 1
> VONga6jUFoXCMQNhDlHgTHQY

Por fim usamos openssl passwd para encriptar a senha gerada Usamos a opção -6 para criptografar a senha com SHA512.

$ openssl passwd -6 'VONga6jUFoXCMQNhDlHgTHQY'
> $6$80Ll7KOwC/XDQVgZ$NwTjYG8cXcMTr9NI1EbtaX7OEAIBq3ULUSJPmpjtk/vUiyB9duYO3aNqmWmBnS.mjgaN37/mo34R8COzNrFBh0

Dessa forma, a preciosa senha está segura, longe de olhos curiosos, e podemos colocá-la no script de criação de usuários.

# Arquivo:  tasks/default-tasks.yml
---
- name: Criar usuário admin com senha
  ansible.builtin.user:
    name: admin
    comment: Usuário Administrador
    password: "$6$80Ll7KOwC/XDQVgZ$NwTjYG8cXcMTr9NI1EbtaX7OEAIBq3ULUSJPmpjtk/vUiyB9duYO3aNqmWmBnS.mjgaN37/mo34R8COzNrFBh0"

Copiando a suas chaves SSH do GitHub ou GitLab

As vezes queremos copiar uma chave pública SSH para um computador.

Esse é um jeito fácil de adicionar a sua própria chave ou de adicionar a chave de alguém para te ajudar com algum problema.

Tendo uma conexão com a internet, é possível fazer o download das chaves públicas SSH de qualquer usuário do GitHub ou GitLab.

Com os comandos abaixo é possível fazer o download da chave adicioná-las nas chaves permitidas para acesso SSH. Basta trocar USUARIO pelo nome do usuário desejado.

  1. Configure a máscara de permissões para 077: leitura e escrita apenas para o usuário dono.
    • umask 077
  2. Crie a pasta ~/.ssh, se ela não existir.
    • mkdir -p ~/.ssh
  3. Faça o download das chaves:
    • GitHub: curl https://github.com/USUARIO.keys >>~/.ssh/authorized_keys
    • GitLab: curl https://gitlab.com/USUARIO.keys >>~/.ssh/authorized_keys

Também podemos usar wget em vez de curl, substituindo curl por wget -O-.

Mudei um arquivo no Yocto mas o Bitbake não recompila

Quando compilando uma imagem no Yocto, às vezes o Bitbake se confunde e não consegue determinar que um arquivo mudou na receita.

Nesse ponto, recomendo limpar toda as pastas tmp e sstate-cache e recompilar do zero. No entanto, recompilar do zero pode demorar muito e podemos deixar isso para o fim do dia.

Para resolver o problema sem tomar muito tempo, basta limpar o diretório de trabalho e o cache. Digamos que esteja trabalhando no arquivo NOME.bb, utilizamos os comandos abaixo.

$ bitbake NOME -c clean
$ bitbake NOME -c cleansstate

Então basta compilar a imagem novamente.

$ bitbake IMAGEM