# GNU Guix

GNU Guix ( /ɡiːks/ ) é um gerenciador de pacotes multiplataforma funcional e uma ferramenta para instanciar e gerenciar sistemas operacionais do tipo Unix, baseado no gerenciador de pacotes Nix . As receitas de configuração e pacotes são escritas no Guile Scheme . GNU Guix é o gerenciador de pacotes padrão da distribuição do sistema GNU Guix .
Diferentemente dos gerenciadores de pacotes tradicionais, o Guix (como o Nix) utiliza um modelo de implantação puramente funcional, onde o software é instalado em diretórios exclusivos gerados por meio de hashes criptográficos . Todas as dependências de cada software estão incluídas em cada hash. Isso resolve o problema do inferno de dependências, permitindo que várias versões do mesmo software coexistam, o que torna os pacotes portáteis e reproduzíveis . A realização de cálculos científicos em uma configuração Guix foi proposta como uma resposta promissora à crise de replicação .
O desenvolvimento do GNU Guix está interligado com o Sistema GNU Guix, uma distribuição de sistema operacional instalável usando o kernel Linux-libre e o sistema init GNU Shepherd .

## Características gerais

Os pacotes Guix são definidos por meio de APIs funcionais do Guile Scheme, projetadas especificamente para gerenciamento de pacotes. As dependências são rastreadas diretamente nesta linguagem por meio de valores especiais chamados "derivações", que são avaliados pelo daemon Guix de forma preguiçosa . O Guix rastreia essas referências automaticamente para que os pacotes instalados possam ser coletados como lixo quando nenhum outro pacote depender deles. Ao custo de maiores requisitos de armazenamento, todas as atualizações no Guix têm a garantia de serem atômicas e podem ser revertidas.
O recurso de reversão do Guix é herdado do design do Nix e raramente é encontrado em outros sistemas operacionais, pois requer uma abordagem pouco ortodoxa sobre como o sistema deve funcionar (veja MicroOS ). O gerenciador de pacotes Guix, como o Nix, pode, no entanto, ser usado em muitas distribuições como Debian e Parabola . Isso também permite que vários usuários instalem software com segurança no mesmo sistema sem privilégios de administrador.
Comparado aos gerenciadores de pacotes tradicionais, os repositórios de pacotes Guix podem crescer consideravelmente e, portanto, exigir mais largura de banda; embora, comparado às soluções de contêiner (como o Docker ), que também são comumente empregadas para resolver o inferno das dependências, o Guix seja mais enxuto e esteja em conformidade com práticas como não se repita e fonte única da verdade . Se o usuário optar por construir tudo a partir do código-fonte, será necessário ainda mais espaço de armazenamento e largura de banda.
Herdado do design do Nix, a maior parte do conteúdo do gerenciador de pacotes é mantido em um diretório /gnu/store, onde somente o daemon Guix tem acesso de gravação. Isso é obtido por meio de montagens de vinculação especializadas, onde o Store como um sistema de arquivos é montado somente para leitura, proibindo interferência até mesmo do usuário root, enquanto o daemon Guix remonta o Store como leitura/gravação em seu próprio namespace privado. Guix conversa com esse daemon para construir coisas ou buscar substitutos, que são todos mantidos na loja. Os usuários são desencorajados a mexer manualmente na loja remontando-a como gravável, pois isso anula todo o propósito da loja.
Guix - como Nix - construiu instalações de coleta de lixo para ajudar a podar itens mortos da loja e manter os vivos .
Este é um exemplo de uma definição de pacote para o hello-package:
Foi escrito usando Guile. As receitas do pacote podem ser facilmente inspecionadas (executando, por exemplo, guix edit hello ) e alteradas no Guix, tornando o sistema transparente e muito fácil de modificar.
Herdado do design do Nix, toda manipulação de itens da loja é independente uma da outra, e os diretórios da loja começam com um hash codificado em base32 do código-fonte da derivação junto com suas entradas.

## Perfis

O pacote Guix usa gerações de perfis, que são uma coleção de links simbólicos para itens específicos da loja, compreendendo o que o usuário instalou no perfil. Cada vez que um pacote é instalado ou removido, uma nova geração será construída.
Por exemplo, o perfil de um usuário que instalou apenas o GNU Hello contém links para o item da loja que contém a versão do hello instalada com o GUIX usado no momento.
Por exemplo, na versão c087a90e06d7b9451f802323e24deb1862a21e0f do guix, isso corresponde ao seguinte item: /gnu/store/md2plii4g5sk66wg9cgwc964l3xwhrm9-hello-2.10 (compilado a partir da receita acima).
Além dos links simbólicos, cada perfil criado pelo guix também contém uma união de todos os manuais de informações, páginas de manual, ícones, fontes, etc. para que o usuário possa navegar pela documentação e ter acesso a todos os ícones e fontes instalados.
Os links simbólicos padrão para gerações de perfil são armazenados em /var/guix no sistema de arquivos.

### Vários perfis de usuário

O usuário pode criar qualquer número de perfis invocandoguix package -p PROFILE-NAME COMMAND . Um novo diretório com o nome do perfil e os links simbólicos de geração do perfil será criado no diretório atual.

## Reverter

O pacote Guix permite a reversão instantânea para uma geração de perfil anterior, alterando o link simbólico para uma geração de perfil anterior. Os perfis também são armazenados na loja, por exemplo, este item é um perfil que contém hello acima: /gnu/store/b4wipjlsapvnijmbawl7sh76087vpl4n-profile (criado e ativado ao executar guix install hello ).
O shell Guix permite que o usuário entre facilmente em um ambiente onde todos os pacotes necessários para o desenvolvimento de software estão presentes, sem obstruir o perfil padrão do usuário com dependências para vários projetos.
Por exemplo, correndoguix shell --development hello entra em um ambiente descartável onde tudo o que é necessário para compilar hello no guix está presente (gcc, guile, etc.).
Sem o--development sinalizador, apenas o pacote hello seria instalado e não suas dependências de compilação. Isto substitui oguix environmentcomando , que instala as dependências de um pacote por padrão, pois foi considerado mais intuitivo para o comando instalar os pacotes especificados por padrão e instalar apenas dependências de desenvolvimento com um sinalizador.

### Ambiente de desenvolvimento persistente

Se você quiser um ambiente persistente com root gc que não seja coletado como lixo na próxima execução do guix gc, você pode criar uma raiz:
Por exemplo, correndoguix shell --root=hello-root --development hello entra em um ambiente onde tudo o que é necessário para compilar o guix está presente (gcc, guile, etc.) e registrado como root no diretório atual (por meio de links simbólicos para os itens no armazenamento).

## Pacote

O pacote Guix permite que o usuário agrupe itens de armazenamento e os envie como uma imagem binária do docker, um tarball relocável, um arquivo de pacote Debian ou um binário squashfs .

## Gráfico

O gráfico Guix permite ao usuário visualizar diferentes gráficos dos pacotes e suas dependências.

## Sistema Guix (sistema operacional)
### Suporte de arquitetura

As seguintes arquiteturas de CPU são suportadas no momento:
* IA-32
* x86-64
* ARMv7
* AArch64
* POWER9
* RISC-V 64
* MIPS64

### Serviços do sistema

Os serviços do sistema, que são definidos no Esquema Guile, permitem ao usuário compor declarativamente a configuração de daemons e serviços de segundo plano e especificar configurações. Isso permite que o usuário, dentro de um único arquivo de configuração ou configuração modularizada, configure todo o sistema operacional (por exemplo, ter um proxy Tor, um servidor ssh e um servidor web servindo guix-web via nginx em uma porta específica na inicialização). Eles podem:
* gerar arquivos no sistema de arquivos (necessário para alguns aplicativos, por exemplo, arquivos em /etc )
* execute qualquer código para configurar daemons
* crie contas específicas de usuários e grupos (por exemplo, um usuário de banco de dados para PostgreSQL )

### Sistema de inicialização GNU Shepherd

O sistema Guix usa o GNU Daemon Shepherd, anteriormente conhecido como "dmd" ("Daemon Managing Daemons"), como seu sistema init, que é desenvolvido em conjunto com o Guix e é escrito e configurável em Guile . Ele fornece funcionalidade de espaço do usuário de forma assíncrona como serviços, que no Shepherd são funções genéricas e tipos de dados de objeto que ele usa para estender o sistema operacional base de uma maneira definida. Ao contrário do systemd, um processo de pastoreio do espaço do usuário é executado como o usuário. No centro do modelo Shepherd de inicialização do espaço do usuário está o conceito de extensão, uma forma de componibilidade pela qual os serviços são projetados para serem sobrepostos a outros serviços, aumentando-os com comportamentos mais elaborados ou especializados, conforme desejado. Isso expressa os relacionamentos de dependência baseados em instanciação encontrados em muitos sistemas init modernos, tornando o sistema modular, mas também permite que os serviços interajam variadicamente com outros serviços de maneiras arbitrárias, por exemplo, um serviço que estende dois outros serviços, exigindo apenas que um esteja presente, mas estendendo prontamente o segundo se for instanciado posteriormente sem a necessidade de qualquer reconfiguração ou configuração adicional.
Shepherd também fornece serviços virtuais que permitem o despacho dinâmico sobre uma classe de objetos de serviço relacionados, como todos aqueles que instanciam um agente de transferência de correio (MTA) para o sistema. Um sistema governado pelo daemon Shepherd pode representar seu espaço de usuário como um gráfico acíclico direcionado, com o "serviço de sistema", que é responsável pelas fases iniciais de inicialização e inicialização, como sua raiz, e todos os serviços inicializados posteriormente como extensões da funcionalidade do serviço de sistema, direta ou transitivamente sobre outros serviços.
Ele foi projetado para ser altamente programável pelo administrador do sistema usando Guile, mas também pode ser usado para gerenciar perfis por usuário de daemons e serviços sem privilégios. Seus serviços e configuração são armazenados uniformemente como código Scheme orientado a objetos e, embora um conjunto básico de serviços seja fornecido com o Sistema Guix básico, novos serviços arbitrários podem ser declarados de forma flexível e, por meio do sistema de objetos de Guile, GOOPS, os serviços existentes podem ser redefinidos a critério do usuário, solicitando ao Shepherd que reescreva dinamicamente os serviços de maneiras especificadas na instanciação.
O GNU Shepherd foi originalmente projetado para funcionar com o GNU Hurd e mais tarde foi adotado pelo Guix System.

### Reverter

Semelhante ao recurso de reversão do Nix, se uma atualização do sistema deixar os usuários com um sistema quebrado, eles podem facilmente reverter pacotes individuais, bem como todo o estado do sistema, com um comando simples:</br> guix package --roll-back</br> Isso significa que o tipo de canal estável que é muito comum em outras distribuições Linux não é mais necessário para usuários que desejam relatar um bug e esperar alguns minutos ao tentar atualizar via guix pull . Isso é realizado por uma combinação do gerenciador de pacotes funcionais do Guix, que trata cada pacote e configuração do sistema como uma entidade imutável e reproduzível, e o sistema de geração que mantém um histórico de configurações do sistema como "gerações". Essas gerações são armazenadas como perfis separados, que permitem que você volte para qualquer configuração anterior, e você pode ver essas gerações com</br> guix package --list-generations .

### Recepção

Jesse Smith do DistroWatch Weekly analisou o GNU Guix System 0.15.0 (na época chamado GuixSD) e disse: "O GuixSD tem um gerenciador de pacotes que eu gosto", mas criticou o suporte limitado de hardware e sua documentação limitada. Desde então, a documentação foi expandida e melhorada com vídeos e um livro de receitas em seis idiomas com tutoriais, guias de instruções e exemplos.
Uma área específica onde o Guix pode oferecer ao usuário melhorias em relação aos gerenciadores de pacotes tradicionais é no campo de fluxos de trabalho científicos reproduzíveis, principalmente em Computação de Alto Desempenho . Dessa forma, o Guix ofereceria uma maneira de compartilhar um ambiente computacional reproduzível, ou seja, o Guix usando uma receita para o software/ambiente científico específico forneceria todas as informações necessárias para descrever exclusivamente a árvore de dependências para construir e executar esse software . Isso não seria fácil de conseguir, por exemplo, em outros sistemas mistos com vários gerenciadores de pacotes para cada linguagem de programação. No entanto, isso fornece apenas uma condição necessária, mas não suficiente, para que os fluxos de trabalho científicos sejam reproduzíveis, pois é necessário incorporar a coleta e o processamento de dados ao fluxo de trabalho. Se isso for adicionado como parte da receita Guix, poderá satisfazer os rigorosos requisitos de reprodutibilidade.

## História

O projeto foi iniciado em junho de 2012 por Ludovic Courtès, um dos hackers do GNU Guile.
Em 20 de agosto de 2015, foi anunciado que o Guix havia sido portado para o GNU Hurd .

## Releases

O projeto não tem um cronograma de lançamento fixo e até agora era lançado aproximadamente a cada 6 meses.
Há planos para um próximo lançamento 1.5.0, já que houve um intervalo de 20 meses desde o lançamento 1.4.0.

## Veja também

* Debian GNU/Hurd
* NixOS – Um sistema operacional similar, que inspirou o GNU Guix
* Comparação de distribuições Linux
* ↑ «GNU Guix Reference Manual». www.gnu.org. Consultado em 23 April 2018 Verifique data em: |acessodata= (ajuda)
* ↑ Ludovic Courtès (2013). Functional Package Management with Guix. Madrid, Spain: European Lisp Symposium
* ↑ Dolstra, E. The Purely Functional Software Deployment Model. PhD thesis, Faculty of Science, Utrecht, The Netherlands. January 2006. ISBN 90-393-4130-3.
* ↑ Hinsen, Konrad (July 2020). «Staged computation: the technique you did not know you were using». Computing in Science and Engineering. 22 (4): 99–103. Bibcode:2020CSE....22d..99H. ISSN 1558-366X. doi:10.1109/MCSE.2020.2985508. Consultado em 4 de novembro de 2022 Verifique data em: |data= (ajuda)
* ↑ Vallet, Nicolas; Michonneau, David; Tournier, Simon (4 October 2022). «Toward practical transparent verifiable and long-term reproducible research using Guix» (PDF). Scientific Data. 9 (1). 597 páginas. Bibcode:2022NatSD...9..597V. ISSN 2052-4463. PMC 9532446. PMID 36195618. doi:10.1038/s41597-022-01720-9. Consultado em 4 de novembro de 2022 Verifique data em: |data= (ajuda)
* ↑ «What to call Guix?» (Lista de grupo de correio)
* ↑ «guix-europe». git.savannah.gnu.org. Consultado em 16 May 2019. Arquivado do original em 24 January 2021 Verifique data em: |acessodata=, |arquivodata= (ajuda)
* ↑ «Guix - Debian Package Tracker»
* ↑ «Parabola GNU/Linux-libre - Package Search». www.parabola.nu. Consultado em 14 de setembro de 2021
* ↑ «Invoking guix gc». gnu.org. Consultado em 16 May 2019 Verifique data em: |acessodata= (ajuda)
* ↑ «Invoking guix package». gnu.org. Consultado em 16 May 2019 Verifique data em: |acessodata= (ajuda)
* ↑ «Invoking guix shell». gnu.org. Consultado em 22 Nov 2023
* ↑ «From 'guix environment' to 'guix shell'». gnu.org. Consultado em 22 Nov 2023
* ↑ «Invoking guix pack». gnu.org. Consultado em 3 September 2024 Verifique data em: |acessodata= (ajuda)
* ↑ «Invoking guix graph». gnu.org. Consultado em 16 May 2019 Verifique data em: |acessodata= (ajuda)
* ↑ Mathieu Othacehe. «Porting GuixSD to ARMv7». Consultado em February 17, 2018. Cópia arquivada em December 25, 2017 Verifique data em: |acessodata=, |arquivodata= (ajuda)
* ↑ Marusich, Chris; Le Bouter, Léo (April 12, 2021). «New Supported Platform: powerpc64le-linux». Consultado em October 6, 2021. Cópia arquivada em May 16, 2021 Verifique data em: |acessodata=, |arquivodata=, |data= (ajuda)
* 1 2 «Supported Platforms (GNU Guix Reference Manual)». GNU Guix. Consultado em 23 de outubro de 2024
* ↑ «guix.git». git.savannah.gnu.org. Consultado em 11 May 2019. Arquivado do original em May 11, 2019 Verifique data em: |acessodata=, |arquivodata= (ajuda)
* ↑ «Re: Help with preparing to move from Arch Linux to Guix» (Lista de grupo de correio)
* ↑ «guix-devel mailing lists». Consultado em 5 de novembro de 2016. Arquivado do original em September 19, 2019 Verifique data em: |arquivodata= (ajuda)
* 1 2 «GNU Guix Reference Manual: Service Composition». GNU Project. Consultado em 5 de novembro de 2016. Arquivado do original em January 1, 2019 Verifique data em: |arquivodata= (ajuda)
* ↑ «systemd: Unit Dependencies and Order». Fedora Magazine. November 25, 2015. Consultado em 5 de novembro de 2016. Arquivado do original em August 1, 2020 Verifique data em: |arquivodata=, |data= (ajuda)
* ↑ «The GNU Shepherd Manual: Jump Start». GNU Project. Consultado em 5 de novembro de 2016. Arquivado do original em August 1, 2020 Verifique data em: |arquivodata= (ajuda)
* ↑ «GNU Guix Reference Manual: Shepherd Services». GNU Project. Consultado em 5 de novembro de 2016. Arquivado do original em January 1, 2019 Verifique data em: |arquivodata= (ajuda)
* ↑ «The GNU Shepherd Manual». GNU Project. Consultado em 5 de novembro de 2016. Arquivado do original em August 1, 2020 Verifique data em: |arquivodata= (ajuda)
* ↑ «GNU Guix Reference Manual: Services». GNU Project. Consultado em 5 de novembro de 2016. Arquivado do original em December 25, 2018 Verifique data em: |arquivodata= (ajuda)
* ↑ «GNU Guix Reference Manual: Service Types and Services». GNU Project. Consultado em 5 de novembro de 2016. Arquivado do original em January 5, 2019 Verifique data em: |arquivodata= (ajuda)
* ↑ «GNU Guix Reference Manual: Using the Configuration System». GNU Project. Consultado em 5 de novembro de 2016. Arquivado do original em April 29, 2019 Verifique data em: |arquivodata= (ajuda)
* ↑ «GNU Shepherd». GNU project. Consultado em 12 de fevereiro de 2016. Arquivado do original em February 12, 2016 Verifique data em: |arquivodata= (ajuda)
* ↑ «Invoking guix system». www.gnu.org. Consultado em 27 April 2019. Arquivado do original em May 26, 2019 Verifique data em: |acessodata=, |arquivodata= (ajuda)
* ↑ Courtès, Ludovic (2013). «Functional Package Management with Guix». arXiv:1305.4584 [cs.PL]
* ↑ «Multi-dimensional transactions and rollbacks, oh my!». guix.gnu.org
* ↑ Smith, Jesse. «Guix System Distribution 0.15.0 and ReactOS 0.4.9». distrowatch.com (778). Consultado em 30 de agosto de 2018. Cópia arquivada em July 30, 2019 Verifique data em: |arquivodata= (ajuda)
* ↑ «Videos». Consultado em 3 de março de 2020. Arquivado do original em August 1, 2020 Verifique data em: |arquivodata= (ajuda)
* ↑ «Cookbook». Consultado em 3 de março de 2020. Arquivado do original em August 1, 2020 Verifique data em: |arquivodata= (ajuda)
* ↑ «Guix-HPC — Reproducible software deployment for high-performance computing — Blog». hpc.guix.info (em inglês). Consultado em 5 de novembro de 2024
* ↑ Vallet, Nicolas; Michonneau, David; Tournier, Simon (4 de outubro de 2022). «Toward practical transparent verifiable and long-term reproducible research using Guix». Scientific Data (em inglês). 9 (1). 597 páginas. ISSN 2052-4463. doi:10.1038/s41597-022-01720-9
* ↑ «A GNU Distribution» (Lista de grupo de correio) |nome1= sem |sobrenome1= em Authors list (ajuda)
* ↑ «[GSoC update] Porting Guix to GNU/Hurd» (Lista de grupo de correio) |nome1= sem |sobrenome1= em Authors list (ajuda)
* ↑ «About — GuixSD». www.gnu.org (em inglês). Consultado em 3 de maio de 2018
* Sítio oficial
* DistroWatch.com: {{{2}}} (em alemão, em inglês, em castelhano, em francês e em português). {{{2}}} no DistroWatch.
* List of Guix packages
Predefinição:Package management systems