I’ve been using NixOS for about two weeks now, after dedicating some time beforehand to studying the wiki and getting familiar with its features.
I’m genuinely thrilled with my experience so far. It took me a week to perfect my declarative configuration file, but now my system is exactly as I want it.
One of the standout features for me has been the ability to recover from a broken configuration by simply loading a previous config snapshot during boot. This functionality is a game changer and offers a far superior snapshot and rollback implementation compared to other systems.
Although some argue that NixOS is more challenging than Arch Linux, I don’t agree. There’s a learning curve, but it’s mainly because NixOS is quite unique compared to distros like Arch and Debian, which share more similarities. For instance, I had to configure my NFS drives using the declarative configuration file rather than fstab. This was fine with me since it avoided the need to install additional utilities like nfs-utils
. Similarly, NixOS integrates the firewall into the OS itself, which I appreciate.
Admittedly, Arch has a better wiki, making it easier to learn independently. However, the NixOS community, especially on Reddit, is very supportive and quick to offer help.
What I love is that my backed-up config file is all I need to perform a clean installation on a new device and get my system running exactly how I want it. This makes the initial time invested in setting up the configuration file worth it.
Currently, my main challenge is using applications outside the nix repo. Some apps, like those in AppImage format, aren’t launching, so I’m working on finding a workaround. Despite this, everything else is running smoothly.
I firmly believe that many power users in the forum would enjoy NixOS if they pushed through the learning curve. I’m not a Linux expert, and many would expect someone like me to shy away from NixOS, but the reality is quite the opposite. With some effort, anyone can master it, and in the end, it’s definitely worth it.
I am using the unstable channels on my current setup.
Here’s my config file with edits for anyone curious what it takes to set up a typical home system:
{ config, pkgs, ... }:
{
imports =
[ ./hardware-configuration.nix ];
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
boot.initrd.luks.devices."REDACTED";
boot.blacklistedKernelModules = [ "snd_hda_intel" ];
services.udev.extraRules = ''
ACTION=="add", SUBSYSTEM=="sound", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="085e", ATTR{driver}="snd_usb_audio", RUN+="/bin/sh -c 'echo 0 > /sys/%p/device/authorized'" '';
networking.hostName = "nixos";
networking.networkmanager.enable = true;
services.tailscale.enable = true;
services.tailscale.useRoutingFeatures = "client";
time.timeZone = "America/Miami";
i18n.defaultLocale = "en_CA.UTF-8";
services.xserver.enable = true;
services.displayManager.sddm.enable = true;
services.desktopManager.plasma6.enable = true;
services.xserver = {
layout = "us";
xkbVariant = "";
};
services.printing.enable = true;
hardware.pulseaudio.enable = false;
security.rtkit.enable = true;
services.pipewire = {
enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
};
users.users.nomad = {
isNormalUser = true;
description = "Mister Nomad";
extraGroups = [ "networkmanager" "wheel" ];
packages = with pkgs; [
home-manager
bitwarden-desktop
vivaldi
floorp
betterbird
libreoffice-fresh
gimp
inkscape
jitsi-meet-electron
zoom-us
zapzap
signal-desktop
telegram-desktop
hexchat
discord
qbittorrent
spotify
piper
vlc
filezilla
upscayl
popsicle
simplescreenrecorder
ventoy-full
fastfetch
zip
unzip
qt5.qtbase
];
};
programs.firefox.enable = false;
nixpkgs.config.allowUnfree = true;
environment.systemPackages = with pkgs; [
kdePackages.kate
kdePackages.kcalc
kdePackages.kaddressbook
kdePackages.korganizer
kdePackages.kolourpaint
kdePackages.kdeconnect-kde
kdePackages.partitionmanager
pavucontrol
];
system.stateVersion = "24.05";
# Enable NFS client service
services.rpcbind.enable = true;
# Define NFS mounts with nofail option
fileSystems."/mnt/nas/NetworkHome" =
{ device = "192.168.1.2:/volume1/NetworkHome";
fsType = "nfs";
options = [ "nofail" ];
};
fileSystems."/mnt/nas/NomadHome" =
{ device = "192.168.1.2:/volume1/homes/nomad";
fsType = "nfs";
options = [ "nofail" ];
};
fileSystems."/mnt/nas/Work" =
{ device = "192.168.1.2:/volume1/Work";
fsType = "nfs";
options = [ "nofail" ];
};
fileSystems."/mnt/nas/Media" =
{ device = "192.168.1.2:/volume1/Media";
fsType = "nfs";
options = [ "nofail" ];
};
# Configure firewall to allow NFS traffic
networking.firewall = {
allowedTCPPorts = [ 2049 ]; # NFS default port
allowedUDPPorts = [ 2049 ]; # NFS also uses UDP
};
}