GNU Guix, parte 2/3 – Utilização
Este segundo post da série será sobre a instalação e uso diário do Guix.
Atualização 2021-06-13: alterações leves nas instruções de configuração e adicionado novo parágrafo na seção gc.
Instalação
A partir do Debian 11 (Bullseye) o Guix pode ser instalado pelo repositório oficial: # apt install guix
. Para versões anteriores do Debian e outras distribuições, a instalação é realizada pelo script que está disponível neste link. Para instalar pelo script, execute:
$ cd /tmp
$ wget https://git.savannah.gnu.org/cgit/guix.git/plain/etc/guix-install.sh
$ chmod +x guix-install.sh
$ ./guix-install.sh
Se o script falhar por falta de uma chave pública, execute a linha abaixo e o script novamente:
$ wget https://sv.gnu.org/people/viewgpg.php?user_id=15145 \
-qO - | gpg --import -
Se o script executar corretamente, a instalação do Guix estará completa e parte-se para a configuração.
Configuração
Para começar a usar o Guix, primeiramente é necessário sincronizar a versão dos pacotes com o repositório Git com o comando guix pull
. Execute:
$ guix pull
Este comando é análogo a um # apt update
no Debian. A primeira execução pode demorar dependendo da velocidade da conexão e da máquina pois serão baixados todos os pacotes base do Guix. Nas próximas vezes em que guix pull
for executado serão baixadas apenas as mudanças em relação à vez anterior.
Abra uma nova sessão de terminal e verifique se a sua variável $PATH
foi atualizada para incluir o perfil principal do Guix. Se tiver problemas para seguir as próximas seções, experimente adicionar as seguintes linhas no seu ~/.profile
para carregamento na sessão de login, ou no ~/.bashrc
para carregamento em uma sessão Bash. Após isso, inicie uma nova sessão.
GUIX_PROFILE="$HOME/.guix-profile"
. "$GUIX_PROFILE/etc/profile"
export XDG_DATA_DIRS="$HOME/.guix-profile/share${XDG_DATA_DIRS:+:}$XDG_DATA_DIRS"
export SSL_CERT_DIR="$HOME/.guix-profile/etc/ssl/certs"
export SSL_CERT_FILE="$HOME/.guix-profile/etc/ssl/certs/ca-certificates.crt"
export GIT_SSL_CAINFO="$SSL_CERT_FILE"
export PATH="$HOME/.config/guix/current/bin${PATH:+:}$PATH"
export GUIX_LOCPATH="$HOME/.guix-profile/lib/locale"
Observação: as variáveis de SSL precisam do pacote nss-certs
instalado pelo Guix no perfil de onde a variável o carregará.
Note que, a partir de agora, nenhum comando será executado por meio do usuário root
. Todas as operações podem ser feitas sem privilégio de administração.
Comandos principais
pull
Como visto no final da seção anterior, pull
é o comando para atualizar as informações locais do canal para o último commit no repositório Git. Ele não instala as atualizações, para isso é usado o comando package
que será visto logo abaixo.
package
Este é o comando principal do Guix, que permite instalar, remover, e atualizar os pacotes.
Vamos instalar o primeiro pacote:
$ guix package --install hello
Este comando irá baixar o pacote GNU Hello, salvá-lo em uma pasta em /gnu/store
, e criar uma ligação simbólica no perfil padrão do Guix. Após a conclusão do comando, você pode perceber que existe um executável em ~/.guix-profile/bin/
. Execute-o pelo caminho completo ou simplesmente como hello
. A saída esperada é o conhecido Hello World
. Se a segunda opção não funcionar, verifique se o caminho para o perfil está na sua variável $PATH
: echo $PATH
.
Verifique que esse arquivo é uma ligação para a store:
$ readlink ~/.guix-profile/bin/hello
Porém, decidimos que esse pacote é inútil, visto que é só um pacote de exemplo. Vamos removê-lo:
$ guix package --remove hello
Agora o perfil principal deve estar vazio. Mas, veja o que acontece quando passamos --list-generations
para o comando package
:
$ guix package --list-generations
Generation 1 Jan 12 2021 17:47:19
hello 2.10 out /gnu/store/a462kby1q51ndvxdv3b6p0rsixxrgx1h-hello-2.10
Generation 2 Jan 12 2021 17:49:20 (current)
- hello 2.10 out /gnu/store/a462kby1q51ndvxdv3b6p0rsixxrgx1h-hello-2.10
Observação: Os pacotes são identificados por um hash (no exemplo: a462kby1q51ndvxdv3b6p0rsixxrgx1h
), que corresponde ao grafo de dependências completo. Caso a função de construção ou as dependências de qualquer nível sejam alteradas, um novo hash é gerado.
O perfil possui duas gerações. Isto demonstra a natureza transacional do Guix: cada alteração no repositório é gravada e o utilizador pode voltar nas gerações passadas. Vamos reinstalar o hello
, mas desta vez não vamos criar uma terceira geração, vamos voltar para a geração anterior:
$ guix package --roll-back
Após passar a opção --roll-back
, voltamos ao estado anterior, onde o pacote hello
estava instalado. Verifique por --list-generations
que o perfil voltou à geração anterior.
Vamos instalar mais alguns pacotes, mas agora em versões específicas:
$ guix package --install gcc@8
O comando acima instalará especificamente a versão 8 do GCC. A instalação de versões de outros pacotes segue o padrão pacote@versao
. A versão pode ser apenas a maior ou incluir também a menor, dependendo do pacote (exemplo: gcc@8 ou ffmpeg@4.2).
Vários pacotes possuem informação associada que não é interessante para diferentes tipos de utilizadores, por exemplo: símbolos de depuração e documentação. Estas ocupam espaço necessário. O Debian possui diferentes pacotes para estas informações (como -dev, -doc, -dbg). O Guix trata essas informações como saídas do mesmo pacote. A saída é delimitada por :
, como no exemplo abaixo onde instalamos a documentação do pacote python-scipy. A saída padrão chama-se "out".
$ guix install python-scipy:doc
Agora, vamos supor que um tempo se passsou e guix pull
foi executado novamente. Utilizamos guix package --upgrade .
e verificamos que os três pacotes possuem atualizações:
The following packages will be upgraded:
gcc (dependencies or package changed)
hello (dependencies or package changed)
python-scipy (dependencies or package changed)
Por algum motivo não queremos atualizar o gcc. Para pular essa atualização utilizamos guix package --upgrade . --do-not-upgrade gcc
:
The following packages will be upgraded:
hello (dependencies or package changed)
python-scipy (dependencies or package changed)
Esta é uma atualização parcial: apenas os pacotes hello
e python-scipy
serão atualizados.
Por fim, vamos instalar um pacote em outro perfil:
$ guix package --install mpv -p ~/mpv
O comando acima criará um novo perfil localizado em ~/mpv
contendo apenas o pacote mpv
. Veja o script de exportação de variáveis da seção Configuração e adicione no topo daquele código, preservando as demais linhas:
GUIX_PROFILE="$HOME/mpv"
. "$GUIX_PROFILE/etc/profile"
unset GUIX_PROFILE
para que os executáveis desse perfil sejam encontrados no seu $PATH
. Inicie uma nova sessão no shell para utilizar o executável.
environment
Este comando é interessante para desenvolvedores e cria um ambiente virtual onde os pacotes que fazem parte do ambiente estão disponíveis enquanto o ambiente estiver ativo. Os pacotes dentro de um ambiente não estão (necessariamente) instalados, sua duração é somente enquanto o ambiente estiver ativo. Por exemplo:
$ guix environment --ad-hoc gsl pkg-config
Este comando torna disponível a biblioteca "gsl" para ser usada, por exemplo, para compilar um programa que faça uso da mesma. A biblioteca estará disponível apenas enquanto o ambiente estiver ativo. Verifique que a biblioteca realmente está disponível pelo comando pkg-config
:
$ pkg-config --cflags gsl
A saída deve ser -I/gnu/store/{hash}-gsl-{versao}
. Saia do ambiente executando exit
e tente executar novamente os dois códigos acima. A GSL e o pkg-config do Guix já não estarão mais disponíveis.
O comando environment
também permite criar contêneires isolados de qualquer aplicação, um caso de uso de interesse a administradores de sistemas. Vamos testar o terminal st
:
$ guix environment --container --ad-hoc st -- st
Note que o terminal não inicia porque está isolado do servidor gráfico do sistema operacional. Para iniciar é preciso conceder acesso a esse servidor:
$ guix environment --container --preserve="^DISPLAY$" --ad-hoc st -- st
Agora a janela do terminal deve ao menos iniciar. Mas, não há os comandos básicos como ls
pois o pacote coreutils
não está incluído no ambiente. Após incluir o coreutils, os comandos estão disponíveis, mas não é possível acessar as pastas do sistema operacional. Inclua também o pacote iputils
e execute ping www.debxp.org
, verificando que o container também não tem acesso à rede. Para isso, é preciso passar a opção --network
.
gc
Como o Guix guarda todas as versões de pacotes que já foram instaladas, seu consumo de espaço em disco é muito elevado. Por vezes é necessário "limpar" a store de pacotes que já não são mais utilizados. Este é o papel do coletor de lixo (gc):
$ guix gc
Este comando irá liberar o espaço ocupado por pacotes que não são mais necessários. Note que os pacotes definidos em gerações ainda são preservados. Para liberar ainda mais espaço as gerações anteriores podem ser excluídas com guix package --delete-generations
, mas o --roll-back
não poderá ser realizado em gerações anteriores à exclusão.
É recomendado manter os pacotes antigos enquanto for possível e liberar espaço apenas quando necessário. Para fazer uma exclusão parcial, pode-se usar as opções -C
ou -F
, passando o tamanho mínimo que será liberado ou o tamanho mínimo que o disco deve ter livre no final, respectivamente:
$ guix gc -C 2G # coleta pelo menos 2GB de lixo
ou
$ guix gc -F 20G # garante que o disco tenha ao menos 20GB de espaço livre
weather
Às vezes um pacote pode não ter substitutos disponíveis, devido a uma construção estar quebrada ou ainda não ter sido construído no servidor. Quando um substituto não está disponível o Guix tentará construir o pacote localmente. Para não gastar tempo e processamento construindo pacotes, verifique se existem substitutos disponíveis utilizando o comando weather
:
$ guix weather darktable
Este comando apenas informa se existem ou não substitutos disponíveis no momento. Se não existirem, o utilizador pode optar entre construir o pacote na própria máquina ou esperar um substituto aparecer.
Por fim, na documentação oficial do Guix podem ser encontrados casos de uso mais avançados dos recursos apresentados, além de comandos novos. Também explore outras funcionalidades com $ guix help
e $ guix help {comando}
. No próximo post será apresentado como o utilizador pode definir seus próprios pacotes que não fazem parte do canal oficial. Até lá!
Mto bacana Vinicius, parabéns pelo post. Eu estava inclusive com dificuldade de retirar a mensagem de problema no path que no ~/.bashrc foi resolvido. Em relação ao guix gc vi no grupo GNU do XMPP o camarada Jorge disse que ele acaba tbm removendo algumas coisas úteis como toolchain de compilação e que um meio termo seria algo como guix gc com a opção -C ou com a opção -F. E realmente ele demora mais ainda pra baixar novos pacotes depois de usar a opção gc sem nenhum parâmetro depois.
Valeu, Augusto. Eu uso o gc sem argumentos a cada 2 ou 3 meses. Não é um comando pra se usar com frequência. Como esse intervalo de tempo é grande pra mim, eu passo pela inconveniência de baixar novamente essa parte da toolchain sem reclamar. Não é por problema de espaço, é só um costume pessoal.
O -C XG coleta “X” [gigabytes] de lixo e termina antes de coletar o resto, e o -F XG deixa “X” [gigabytes] de espaço livre no disco (é pra quando o espaço apertar mesmo e você precisar liberar). São opções, mas como não tem como fazer “coleta seletiva” pra saber o que vai ser eliminado, eu prefiro limpar tudo depois de um tempo.
Se puder deixar os pacotes acumulando sem coletar o lixo, melhor. Apesar de ser um problema, os outros benefícios do Guix o compensam.
Vinicius! Un enorme agradecimiento desde Argentina.
En el manual en español de Guix no figuran variables para configurar Guix en Debian, y se me había roto la instalación.
Siguiendo tus variables pude reparar el ejecutable de Guix, ya que apuntaba a una versión vieja en lugar de a la actual.
Perdón que te hable en castellano, pero no se portugués… un saludo!!
Gracias, techapu!
Se entendi bem a questão, o executável mais recente fica em
~/.config/guix/current/bin
, esse diretório tem que estar no $PATH. Já tive esse problema quando estava começando e parece que é comum acontecer.