GNU Guix ( ) é 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.Dolstra, E. The Purely Functional Software Deployment Model. PhD thesis, Faculty of Science, Utrecht, The Netherlands. January 2006. . 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:(define-public hello (package (name "hello") (version "2.10") (source (origin (method url-fetch) (uri (string-append "mirror://gnu/hello/hello-" version ".tar.gz")) (sha256 (base32 "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i")))) (build-system gnu-build-system) (synopsis "Hello, GNU world: An example GNU package") (description "GNU Hello prints the message \"Hello, world!\" and then exits. It serves as an example of standard GNU coding practices. As such, it supports command-line arguments, multiple languages, and so on.") (home-page "https://www.gnu.org/software/hello/") (license gpl3+)))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 invocando . 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, correndo entra em um ambiente descartável onde tudo o que é necessário para compilar hello no guix está presente (gcc, guile, etc.).

Sem o sinalizador, apenas o pacote hello seria instalado e não suas dependências de compilação. Isto substitui ocomando , 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, correndo 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