Skip to content

Instantly share code, notes, and snippets.

@queeup
Last active April 8, 2024 23:21
Show Gist options
  • Star 16 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save queeup/1666bc0a5558464817494037d612f094 to your computer and use it in GitHub Desktop.
Save queeup/1666bc0a5558464817494037d612f094 to your computer and use it in GitHub Desktop.
Nix package manager install (single user) on Fedora Silverblue

Nix package manager on Fedora Silverblue

Install nix

curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | \
    sh -s -- install ostree --no-confirm --persistence=/var/lib/nix

Fix sudo

echo "Defaults  secure_path = /nix/var/nix/profiles/default/bin:/nix/var/nix/profiles/default/sbin:$(sudo printenv PATH)" | sudo tee /etc/sudoers.d/nix-sudo-env

Old way

  • This is a single user install.

  • For multi user install and without changing selinux mode: https://gist.github.com/matthewpi/08c3d652e7879e4c4c30bead7021ff73

  • Please note that these instructions are not offically supported or condoned by Nix and are not guaranteed to always work, but from my testing everything seems to work perfectly fine.

  • Change SELinux mode to permissive

    sudo setenforce Permissive
    sudo sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
  • Create the nix directory in a persistent location

    sudo mkdir /var/lib/nix
    sudo chown $USER:$USER /var/lib/nix
  • /etc/systemd/system/mkdir-rootfs@.service

    [Unit]
    Description=Enable mount points in / for ostree
    ConditionPathExists=!%f
    DefaultDependencies=no
    Requires=local-fs-pre.target
    After=local-fs-pre.target
    
    [Service]
    Type=oneshot
    ExecStartPre=chattr -i /
    ExecStart=mkdir -p '%f'
    ExecStopPost=chattr +i /
  • /etc/systemd/system/nix.mount

    [Unit]
    Description=Nix Package Manager
    DefaultDependencies=no
    After=mkdir-rootfs@nix.service
    Wants=mkdir-rootfs@nix.service
    Before=sockets.target
    After=ostree-remount.service
    BindsTo=var.mount
    
    [Mount]
    What=/var/lib/nix
    Where=/nix
    Options=bind
    Type=none
    
    [Install]
    WantedBy=local-fs.target
  • Enable and mount the nix mount.

    # Ensure systemd picks up the newly created units
    sudo systemctl daemon-reload
    # Enable the nix mount on boot.
    sudo systemctl enable nix.mount
    # Mount the nix mount now.
    sudo systemctl start nix.mount
  • Install Nix

    sh <(curl -L https://nixos.org/nix/install) --no-daemon
  • Load Nix into your environment. Enable bash/fish/zhs completion for nix installed commands

    Load Nix into your environment. The installer modified ~/.bash_profile, but it isn't used when you start a terminal from desktop, it's only used when using a full shell login with bash -l, which doesn't happen on silverblue.

    tee --append $HOME/.bashrc <<EOF
    # Nix Package Manager
    if [ -e $HOME/.nix-profile/etc/profile.d/nix.sh ]; then
        source $HOME/.nix-profile/etc/profile.d/nix.sh;
    fi
    EOF
  • Links:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment