Bonjour à tous,
## ~/.dotfiles
configuration.nix -> /etc/nixos/configuration.nix
flake.lock -
flake.nix -
gnome.nix -> /etc/nixos/gnome.nix
hardware-configuration.nix -> /etc/nixos/hardware-configuration.nix
hdd.nix -> /etc/nixos/hdd.nix
home.nix -> ~/.config/home-manager/home.nix
pcloud.nix -> /etc/nixos/pcloud.nix
starship.toml -> ~/.config/starship.toml
vm.nix -> /etc/nixos/vm.nix
Comment gérer ses fichiers ils sont tous centralisés dans ~/.dotflies et viennent de différents endroits ?
Utilise t’on des liens symboliques pour gérer tout ça ?
Si oui ‘stow’ ou ‘ln’ ?
Je suis entrain de lire : “Enabling NixOS with Flakes | NixOS & Flakes Book” et il parle de mettre flake.nix dans /etc/nixos/
Qu’en pensez vous ?
Avec nix
, la solution usuelle est d’utiliser Home Manager (c.f. Home Manager Manual).
Home Manager is a Nix-powered tool for reproducible management of the contents of users’ home directories. This includes programs, configuration files, environment variables and, well… arbitrary files.
1 Like
Je l’utilise, c’est lui qui m’as fait me poser ce genre de questions, car depuis la creation de mon dossier .dotfiles j’ai le double de fichiers à gérer.
car depuis la creation de mon dossier .dotfiles j’ai le double de fichiers à gérer
Il faudrait que tu détailles un peu ton setup pour que l’on puisse comprendre si c’est un problème…
D’après ce que tu as partagé dans le premier post, il semblerait que tu mettes dans ton repository .dotfiles
des fichiers qui sont à la fois à destination de l’installation de l’host (e.g. configuration.nix
), et à la fois pour ton utilisateur (e.g. home.nix
).
Ce n’est pas un problème en soit de tout avoir dans le même repository (chacun s’organise comme il le souhaite). Mais du coup, c’est un peu “naturel” d’avoir le double de fichiers.
1 Like
Je n’avais pas lu cette ressource avant, et j’en doute. Je viens de confirmer ce doute en lisant un peu en diagonale.
flake.nix
ne va pas nécessairement dans le /etc/nixos
. En fait, la solution canonique en utilisant flake, c’est de déclarer les configurations pour les hôtes dans outputs.nixosConfigurations.<name>
.
Ensuite, il devient possible de sudo nixos-rebuild switch --flake .#<name>
pour déployer sa machine (en utilisant --target-host
pour déployer sur une machine distante).
1 Like
Ce qui nous amène à l’intégration de la configuration d’un hôte et d’utilisateurs sur cet hôte en utilisant home-manager
.
home-manager
propose un module qui permet de déclarer quelle configuration appliquer à un utilisateur, directement dans la configuration d’un hôte :
{
// ... reste de la configuration de ton hôte
home-manager.users.Breizil29 = import ./home.nix;
}
Ça s’utilise très bien avec flake ou non (en ce cas, ça vit dans /etc/nixos
).
Mais du coup, ça permet d’élégamment faire vivre tous les fichiers de configuration dans le même repository. Certains sont pour l’hôte, d’autres pour l’utilisateur.
Personnellement, mon repository de configurations suit la structure suivante :
somePath/
├── flake.nix
├── machines/
│ ├── laptop-foo.nix
│ └── server-bar.nix
└── home.nix
1 Like
alias rebuild=‘sudo nixos-rebuild switch’
[I] gg@nixos ~/.dotfiles> rebuild --flake .
building the system configuration...
updating GRUB 2 menu...
stopping the following units: accounts-daemon.service
activating the configuration...
setting up /etc...
reloading user units for gg...
restarting sysinit-reactivation.target
reloading the following units: dbus.service
restarting the following units: polkit.service
starting the following units: accounts-daemon.service
the following new units were started: home-manager-gg.service, nix-daemon.service, run-credentials-systemd\x2dtmpfiles\x2dresetup.service.mount, sysinit-reactivation.target, systemd-tmpfiles-resetup.service
Au redémarrage je suis obligé de lancer cet commande pour recupérer mon bureau complet, car il ne charge pas home.nix.
car il ne charge pas home.nix
home.nix
n’est jamais “chargé” au runtime du système. Lors du nixos-rebuild
, il est buildé, les composants qu’il déclare mis dans le /nix/store
, et hooké au reste du système par un service systemd
(systemctl status home-manager-gg
pour voir le statut).
La question est plutôt de savoir pourquoi le système booté est différent de celui sur lequel tu as switch
avant le reboot
➜ systemctl status home-manager-gg
● home-manager-gg.service - Home Manager environment for gg
Loaded: loaded (/etc/systemd/system/home-manager-gg.service; enabled; preset: enabled)
Active: active (exited) since Wed 2024-08-21 08:56:16 CEST; 2h 5min ago
Invocation: b06eee34d9e343b0a8532bbe8feb76f0
Process: 5746 ExecStart=/nix/store/sjk40sk2njkfaf3ar66sr8kx5qy3imxk-hm-setup-env /nix/store/s7aa8jqwvz7pl80wnsrbl659z2m9mkxc-home-manager-generation (code=exited, status=0/SUCCESS)
Main PID: 5746 (code=exited, status=0/SUCCESS)
IP: 0B in, 0B out
Mem peak: 6.6M
CPU: 246ms
Aug 21 08:56:16 nixos hm-activate-gg[5746]: Activating checkLinkTargets
Aug 21 08:56:16 nixos hm-activate-gg[5746]: Activating writeBoundary
Aug 21 08:56:16 nixos hm-activate-gg[5746]: Activating installPackages
Aug 21 08:56:16 nixos hm-activate-gg[5746]: Activating linkGeneration
Aug 21 08:56:16 nixos hm-activate-gg[5746]: Cleaning up orphan links from /home/gg
Aug 21 08:56:16 nixos hm-activate-gg[5746]: Creating profile generation 4
Aug 21 08:56:16 nixos hm-activate-gg[5746]: Creating home file links in /home/gg
Aug 21 08:56:16 nixos hm-activate-gg[5746]: Activating onFilesChange
Aug 21 08:56:16 nixos hm-activate-gg[5746]: Activating reloadSystemd
Aug 21 08:56:16 nixos systemd[1]: Finished Home Manager environment for gg.
home.nix
{ config, pkgs, ... }:
{
home.username = "gg";
home.homeDirectory = "/home/gg";
home.stateVersion = "24.11";
home.packages = with pkgs; [
firefox geany google-chrome alacritty spotify goodvibes gimp
songrec strawberry keepassxc cherrytree flameshot feh vlc virt-manager
gnome-tweaks gnome-terminal gnome-themes-extra
font-awesome ttf_bitstream_vera fira-code hack-font ibm-plex jetbrains-mono cascadia-code
starship fish papirus-icon-theme materia-theme pcloud
];
# Allow unfree packages
nixpkgs.config.allowUnfree = true;
# Home Manager is pretty good at managing dotfiles. The primary way to manage
# plain files is through 'home.file'.
#home.file = {
# # Building this configuration will create a copy of 'dotfiles/screenrc' in
# # the Nix store. Activating the configuration will then make '~/.screenrc' a
# # symlink to the Nix store copy.
# ".screenrc".source = dotfiles/screenrc;
# # You can also set the file content immediately.
# ".gradle/gradle.properties".text = ''
# org.gradle.console=verbose
# org.gradle.daemon.idletimeout=3600000
# '';
# Home Manager can also manage your environment variables through
# 'home.sessionVariables'. These will be explicitly sourced when using a
# shell provided by Home Manager. If you don't want to manage your shell
# through Home Manager then you have to manually source 'hm-session-vars.sh'
# located at either
#
# ~/.nix-profile/etc/profile.d/hm-session-vars.sh
#
# or
#
# ~/.local/state/nix/profiles/profile/etc/profile.d/hm-session-vars.sh
#
# or
#
# /etc/profiles/per-user/gg/etc/profile.d/hm-session-vars.sh
#
#home.sessionVariables = {
# EDITOR = "emacs";
#};
# Let Home Manager install and manage itself.
programs.home-manager.enable = true;
programs.starship.enable = true;
#};
}
flake.nix
{
description = "NixOS configuration";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
home-manager.url = "github:nix-community/home-manager";
home-manager.inputs.nixpkgs.follows = "nixpkgs";
};
outputs = inputs@{ nixpkgs, home-manager, ... }: {
nixosConfigurations = {
nixos = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
./configuration.nix
home-manager.nixosModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.users.gg = import ./home.nix;
# Optionally, use home-manager.extraSpecialArgs to pass
# arguments to home.nix
}
];
};
};
};
}
➜ home-manager switch --flake .
warning: updating lock file '/home/gg/.dotfiles/flake.lock'
error: flake 'path:/home/gg/.dotfiles' does not provide attribute 'packages.x86_64-linux.homeConfigurations', 'legacyPackages.x86_64-linux.homeConfigurations' or 'homeConfigurations'
error: flake 'path:/home/gg/.dotfiles' does not provide attribute 'packages.x86_64-linux.homeConfigurations', 'legacyPackages.x86_64-linux.homeConfigurations' or 'homeConfigurations'
error: flake 'path:/home/gg/.dotfiles' does not provide attribute 'packages.x86_64-linux.homeConfigurations', 'legacyPackages.x86_64-linux.homeConfigurations' or 'homeConfigurations'
error: flake 'path:/home/gg/.dotfiles' does not provide attribute 'packages.x86_64-linux.homeConfigurations."gg".activationPackage', 'legacyPackages.x86_64-linux.homeConfigurations."gg".activationPackage' or 'homeConfigurations."gg".activationPackage'
Ce flake.nix démarre toutes mes applications
{
description = "NixOS configuration";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
home-manager.url = "github:nix-community/home-manager/master";
home-manager.inputs.nixpkgs.follows = "nixpkgs";
};
outputs = { self, nixpkgs, home-manager, ... }:
let
lib = nixpkgs.lib;
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system};
in {
nixosConfigurations = {
nixos = lib.nixosSystem {
inherit system;
modules = [ ./configuration.nix ];
};
};
homeConfigurations = {
gg = home-manager.lib.homeManagerConfiguration {
inherit pkgs;
modules = [ ./home.nix ];
};
};
};
}