Skip to content

NixOS com Flakes Habilitados

Comparado ao método de configuração padrão atualmente usado no NixOS, os Flakes oferecem melhor reprodutibilidade. Sua clara definição de estrutura de pacotes suporta inerentemente dependências de outros repositórios Git, facilitando o compartilhamento de código. Portanto, este livro sugere o uso de Flakes para gerenciar as configurações do sistema.

Esta seção descreve como usar Flakes para gerenciar a configuração do sistema NixOS, e você não precisa saber nada sobre Flakes com antecedência.

Habilitando o Suporte a Flakes para NixOS

Atualmente, Flakes ainda é uma funcionalidade experimental e não está habilitada por padrão. Precisamos modificar manualmente o arquivo /etc/nixos/configuration.nix para habilitar a funcionalidade Flakes e a nova ferramenta de linha de comando Nix que a acompanha:

nix
{ config, pkgs, ... }:

{
  imports = [
    # Incluir os resultados da análise de hardware.
    ./hardware-configuration.nix
  ];

  # ......

  # Habilitar a funcionalidade Flakes e a nova ferramenta de linha de comando Nix
  nix.settings.experimental-features = [ "nix-command" "flakes" ];
  environment.systemPackages = with pkgs; [
    # Flakes clona suas dependências através do comando git,
    # então o git deve ser instalado primeiro
    git
    vim
    wget
  ];
  # Definir o editor padrão como vim
  environment.variables.EDITOR = "vim";

  # ......
}

Após fazer essas alterações, execute sudo nixos-rebuild switch para aplicar as modificações. Em seguida, você pode usar a funcionalidade Flakes para gerenciar a configuração do seu sistema.

A nova ferramenta de linha de comando Nix também oferece algumas funcionalidades convenientes. Por exemplo, agora você pode usar o comando nix repl para abrir um ambiente interativo Nix. Se estiver interessado, você pode usá-lo para revisar e testar toda a sintaxe Nix que aprendeu anteriormente.

Alternando a Configuração do Sistema para flake.nix

Após habilitar a funcionalidade Flakes, o comando sudo nixos-rebuild switch dará prioridade à leitura do arquivo /etc/nixos/flake.nix, e, se não o encontrar, tentará usar o /etc/nixos/configuration.nix.

Você pode começar usando os modelos oficiais para aprender a escrever um flake. Primeiro, verifique quais modelos estão disponíveis:

bash
nix flake show templates

Entre eles, o modelo templates#full demonstra todos os usos possíveis. Dê uma olhada em seu conteúdo:

bash
nix flake init -t templates#full
cat flake.nix

Com base neste modelo, crie o arquivo /etc/nixos/flake.nix e escreva o conteúdo da configuração. Todas as modificações subsequentes do sistema serão gerenciadas pelos Nix Flakes. Aqui está um exemplo do conteúdo:

nix
{
  description = "Um flake simples para NixOS";

  inputs = {
    # Fonte oficial de pacotes NixOS, usando o ramo nixos-25.05 aqui
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05";
  };

  outputs = { self, nixpkgs, ... }@inputs: {
    # Por favor, substitua my-nixos pelo seu nome de host
    nixosConfigurations.my-nixos = nixpkgs.lib.nixosSystem {
      system = "x86_64-linux";
      modules = [
        # Importar o configuration.nix anterior que usamos,
        # para que o antigo arquivo de configuração ainda tenha efeito
        ./configuration.nix
      ];
    };
  };
}

Aqui definimos um sistema chamado my-nixos, com seu arquivo de configuração localizado em /etc/nixos/ como ./configuration.nix. Isso significa que ainda estamos usando a configuração antiga.

Agora, quando você executa sudo nixos-rebuild switch para aplicar a configuração, o sistema não deve mudar em nada, pois simplesmente mudamos para usar os Nix Flakes, e o conteúdo da configuração permanece consistente com o anterior.

Se o nome do seu host não for my-nixos, você precisa modificar o nome de nixosConfigurations em flake.nix, ou usar --flake /etc/nixos#my-nixos para especificar o nome da configuração.

Após a mudança, podemos gerenciar o sistema através da funcionalidade Flakes.

Atualmente, nosso flake inclui estes arquivos:

  • /etc/nixos/flake.nix: O ponto de entrada para o flake, que é reconhecido e implantado quando sudo nixos-rebuild switch é executado.
  • /etc/nixos/flake.lock: O arquivo de bloqueio de versão gerado automaticamente, que registra as fontes de dados, os valores de hash e os números de versão de todas as entradas em todo o flake, garantindo a reprodutibilidade do sistema.
  • /etc/nixos/configuration.nix: Este é o nosso arquivo de configuração anterior, que é importado como um módulo em flake.nix. Atualmente, todas as configurações do sistema são escritas neste arquivo.
  • /etc/nixos/hardware-configuration.nix: Este é o arquivo de configuração de hardware do sistema, gerado pelo NixOS, que descreve as informações de hardware do sistema.

Conclusão

Até este ponto, nós apenas adicionamos um arquivo de configuração muito simples, /etc/nixos/flake.nix, que tem sido apenas um invólucro fino em torno de /etc/nixos/configuration.nix, não oferecendo nenhuma nova funcionalidade e não introduzindo nenhuma mudança disruptiva.

No conteúdo que se segue no livro, aprenderemos sobre a estrutura e funcionalidade de flake.nix e gradualmente veremos os benefícios que tal invólucro pode trazer.

Observação: O método de gerenciamento de configuração descrito neste livro NÃO é "Tudo em um único arquivo". É recomendado categorizar o conteúdo da configuração em diferentes arquivos Nix, e então introduzir esses arquivos de configuração na lista modules do flake.nix, e gerenciá-los com o Git.

Os benefícios desta abordagem são uma melhor organização dos arquivos de configuração e uma melhor manutenibilidade da configuração. A seção Modularizando a Configuração do NixOS irá explicar em detalhes como modularizar sua configuração do NixOS, e Outras Dicas Úteis - Gerenciando a Configuração do NixOS com Git irá introduzir várias melhores práticas para gerenciar a configuração do NixOS com o Git.