Skip to content

Instantly share code, notes, and snippets.

@queeup
Last active March 13, 2026 01:57
Show Gist options
  • Select an option

  • Save queeup/1666bc0a5558464817494037d612f094 to your computer and use it in GitHub Desktop.

Select an option

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

Warning

Disable composefs or enable root.transient before install and use nix on Fedora Silverblue 42. Do not mix both. Use just one method. I prefer enabling root.transient.

  • With composefs disabled

    sudo sed -i 's/,ro//' /etc/fstab
    
    sudo rpm-ostree kargs --append='ostree.prepare-root.composefs=0' --reboot
  • With root.transient enabled

    sudo tee /etc/ostree/prepare-root.conf <<'EOL'
    [composefs]
    enabled = yes
    [root]
    transient = true
    EOL
    
    rpm-ostree initramfs-etc --reboot --track=/etc/ostree/prepare-root.conf

Install nix

curl -sSfL https://artifacts.nixos.org/nix-installer | \
    sh -s -- install ostree --explain --add-channel --persistence=/var/lib/nix

Add nix unstable channel to normal user

nix-channel --add https://nixos.org/channels/nixpkgs-unstable nixpkgs
nix-channel --update

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 (Obsolete)

  • 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:

@dmitrylitmanovich
Copy link

many thanks, it helped!

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