[ ACCESSING_ARCHIVE ]

My journey migrating from Arch Linux to NixOS

June 24, 2026 • BY Azzar Budiyanto
[ READ_TIME: 10 MIN ] |
. . .

Arch Addict to NixOS Ninja: How I Survived 10 Years of Arch and Still Found Room for Declarative Chaos

Look, I get it. You’re sitting there in your Arch Linux fortress, pacman commands flowing like liquid courage after three Red Bulls, feeling like the goddamn Linus Torvalds of DIY distros. Been there. Done that. Had the sudo pacman -Syu anxiety dreams for a decade. But then NixOS whispered sweet nothings in my terminal, promising reproducibility like a clingy ex, and before I knew it, I was migrating VMs like a fugitive swapping identities. This ain’t your granpa’s distro hop—it’s a full-blown existential crisis disguised as nixos-rebuild switch. Grab your .bash_history and strap in, buttercup.

Why I Ghosted Arch After 3,650 Days of Code-Worship (Spoiler: It Wasn’t the AUR)

Let’s cut the systemd crap. After ten damn years of Arch Linux—yes, I counted the pacman logs like therapy session receipts—I hit the wall. Not because Arch sucks (it doesn’t), but because the cognitive load of maintaining a bleeding-edge, hand-rolled system became my personal hell. Remember when pacman -Syu felt like popping champagne? Now it’s Russian roulette where the bullet is glibc deciding to divorce your kernel at 3 a.m. The Writer IT article nailed it: “NixOS is closer to Arch in setup than Ubuntu or Mint,” but here’s the kicker—they never told you Arch’s “simplicity” is a sugar rush destined for a crash. That decade of meticulously curated /etc configurations? One misstep and journalctl spits fire like Godzilla with indigestion.

Then I saw the Reddit post from malloc47—the Arch-to-NixOS defector who’d survived the same treadmill: “After running Arch Linux for the last decade, I’ve finally made the jump to NixOS.” My soul vibrated. This wasn’t just some noob FOMO; it was a veteran admission that Arch’s “do-it-yourself” charm hides a landmine field of configuration drift. The AUR’s infinite packages? A siren song luring you into dependency hell where packages fight like rabid cats. NixOS promised atomic upgrades and rollbacks—imagine pacman -Syu with an undo button. Too good to be true? Nah, just math. But migrating after 10 years? That’s like swapping your circulatory system mid-marathon. Cue panic-sweating into my tmux pane.

Phase Zero: The VM Gauntlet (Because Real Men Don’t Dive Headfirst Into /nix/store)

Smart folks on r/NixOS gave the cold, hard truth: “install nix in a vm, get your nix config file made and tailored to you.” Solid advice. I launched three VMs—VirtualBox for testing, VMWare for “real work,” and a sacrificial QEMU lamb for blood sacrifices. Why? Because trying to migrate a decade of custom Arch setups directly would be like defusing a bomb blindfolded. First lesson: NixOS doesn’t care about your Arch trauma. It demands purity. I used the official ISO for my test VM, then ran nixos-generate-config --root /mnt—only to realize config.nix isn’t a drop-in replacement for /etc. It’s a declarative manifesto where every service is a function, not a config file. My Arch muscle memory screamed: WHERE’S MY nginx.conf?!

Here’s where malloc47’s journey hit home—he migrated two VMs before touching his main rig. I followed suit. VirtualBox guest additions? In NixOS, that’s virtualisation.virtualbox.guest.enable = true; in configuration.nix. VMWare tools? vmwareTools.enable = true;. No more hunting PKGBUILDs or praying against AUR maintainers. The magic? nixos-rebuild switch applies changes atomically. Screw up? nixos-rebuild switch --rollback and you’re back to a known-good state faster than Arch’s pacman -S archlinux-keyring fails on a flaky connection. But don’t get cocky—this is also where the Reddit warning about non-uniform configs slapped me: “the configuration is not very uniform” (as noted by an Arch user coming from NixOS). Spot on. For ssh, you set services.openssh.settings; for nginx, it’s services.nginx.virtualHosts. Learning the NixOS module “dialect” feels like decoding hieroglyphics. But in the VM? No consequences. Just sweatpants-and-mistakes mode.

Config Alchemy: From Arch’s Fragmented Chaos to NixOS’s Declarative Symphony

Arch lovers worship the simplicity of /etc—one config file per service, like LEGO bricks you snap together. NixOS? It’s a Borg cube of declarative nirvana. Your entire system state lives in /etc/nixos/configuration.nix. But don’t expect Arch’s consistency. As that r/archlinux post observed: “In Nix os or any other declarative distros… the configuration is not very uniform.” Translation: Some services use nested attributes (services.postgresql.enable = true), others demand YAML-in-Nix abominations (services.mattermost.settings), and a few require dark rituals (looking at you, hardware.opengl). Coming from Arch, where systemctl enable just works, this felt like swapping a scalpel for a flamethrower.

I spent days dissecting the NixOS module system. Key breakthrough? Understanding option types. Arch’s sysctl.conf is plaintext; in NixOS, you set boot.kernelParams as a list. Miss a ;? Rebuild fails. Forget a "? Cue existential dread. But the payoff? Reproducibility. My config isn’t “a bunch of files”—it’s a functional spec. Need the same setup on a VM and bare metal? Same configuration.nix. Want to test an update? nixos-rebuild test runs changes in-memory. No more “but it worked on Arch!” excuses. The Writer IT article echoed this: NixOS “is very much an operating system for people with prior Linux/Unix experience,” but it demands unlearning Arch’s “one config per service” orthodoxy. Pro tip: Use nixos-option services.httpd to dissect modules. Docs lie; the option explorer doesn’t.

Dotfiles: How I Stopped Worrying and Learned to Love home-manager

Remember Ben Mezger’s dotfiles horror story? “If I switched from Arch Linux to Debian, I had to update all my scripts…” Yeah, that’s Arch’s dirty secret—it binds your config to the distro. But NixOS + home-manager? They nuke the concept of “dotfiles.” I wrapped my entire $HOME ecosystem in home.nix, managing .bashrc, .config/nvim, even VS Code extensions declaratively. No more symlinking hell. Just:

home.packages = with pkgs; [
  neovim
  git
  tmux
];
programs.bash.initExtra = "export PATH=$PATH:/opt/my-weird-bin";

home-manager isn’t just for NixOS—it works on Arch too (as noted in the non-NixOS context), but on NixOS, it syncs with system configs. My Arch dotfiles used to assume Arch-specific paths; Nix abstracts all that. Lesson: Your dotfiles shouldn’t care about /usr/bin vs /run/current-system/sw/bin. Nix’s purity forces you to define PATHs functionally, like pkgs.writeShellScriptBin "mytool" "...". Painful? Initially, yes. But now my configs run on Debian VMs via home-manager. That’s Arch’s pipe dream made real.

VM Migration: VirtualBox & VMWare, Reborn in /nix/store

malloc47 mentioned migrating VirtualBox and VMWare VMs—same playbook I used. First, the VirtualBox host: On Arch, I’d pacman -S virtualbox virtualbox-guest-iso and pray. On NixOS, it’s two lines:

virtualisation.virtualbox.host.enable = true;
virtualisation.virtualbox.host.enableExtensionPack = true;

Boom. No kernel module compilation fails. No modprobe vboxdrv tantrums. VMWare? Just as slick:

vmwareTools.enable = true;

But here’s where Arch’s “flexibility” bit me. My Arch VMs used custom kernel modules and hand-tuned /etc/vbox/networks.conf. In NixOS? Declare it:

virtualisation.virtualbox.guest.additionsISO = ./VBoxGuestAdditions.iso;
virtualisation.virtualbox.host.networks = {
  "nat-network" = {
    ip = "192.168.56.1";
    netmask = "255.255.255.0";
  };
};

Atomic rebuilds meant I could break networking, then rollback to a working config before coffee cooled. Contrast that with Arch, where a bad netctl profile could lock you out until you booted recovery media. The Reddit migration guide was crystal clear: “get your nix config file made and tailored” for VMs first. My VirtualBox VMs rebuilt in seconds; VMWare needed vmwareTools.enable = true; plus kernel module tweaks via nixpkgs.config.permittedInsecurePackages (don’t @ me). But no more dkms fails during pacman -Syu. Game. Changer.

Flake Me Maybe: When Declarative Gets Recursive

Just as I got comfy with configuration.nix, the NixOS community hit me with flakes—a declarative way to declare your declarative config. Overkill? Only until you try it. Migrating my Arch VMs’ configs to flakes felt like inception: configs generating configs. The NixOS Discourse warned: “you can just wrap your existing flake.nix outputs” when moving to flake-parts. I did exactly that:

{
  description = "My NixOS config";
  inputs = {
    nixpkgs.url = "nixpkgs/nixos-23.11";
    flake-parts.url = "github:nix-community/flake-parts";
  };
  outputs = inputs: inputs.flake-parts.lib.mkFlake { inherit inputs; } {
    systems = ["x86_64-linux"];
    perSystem = { config, self', ... }: {
      packages = [ config.packages.default ];
      nixosConfigurations."vm-host" = {
        imports = [ ./configuration.nix ];
      };
    };
  };
}

Why bother? Reproducibility on steroids. My flakes.lock file pins every dependency—no more “but it worked yesterday!” when nixpkgs updates. Arch’s AUR? More like a slot machine. With flakes, I share configs between my NixOS machine and Arch test boxes via nix run. But the learning curve? Steeper than Arch’s rolling-release upgrade cliff. As one Reddit sage noted: “RTFM but that’s basically what you need to do.” Translation: Nix demands reading the damn manual. But once it clicks? You’ll never look at package management the same way again.

The Bare-Metal Jump: When /nix/store Met My Soul

After 200 VM rebuilds, I pointed nixos-install at my main rig. The ritual: backup Arch configs, boot NixOS ISO, partition disks (NixOS uses filesystems."/".device, not /etc/fstab), then transplant my configuration.nix. Disaster struck when NixOS refused to load my proprietary NVIDIA drivers. Arch would’ve let me force dkms—NixOS yelled:

error: The option `boot.extraModulePackages' defined in `/etc/nixos/configuration.nix' does not exist.

Arch’s “just compile it” ethos fails here. NixOS requires precise syntax: boot.extraModulePackages = [ config.boot.kernelModules.nvidia_x11 ];. I rage-Googled, then remembered the option explorer: nixos-option boot.extraModulePackages. Fixed in minutes. Contrast this with Arch, where debugging a GPU driver might involve six AUR packages and a blood pact.

Post-install, the real test: restoring daily tools. Neovim? pkgs.neovim—but Arch’s nvim-qt wrapper was gone. Solution: declare it in configuration.nix‘s environment.systemPackages. Firefox? Arch ships it; NixOS needs pkgs.firefox. Simple, but Arch-trained brains expect “it just works.” It doesn’t—it works correctly. No more conflicting libraries from the AUR. Every binary is hermetic. I missed AUR’s endless repos once. Then I discovered nix search nixpkgs—100k packages, all reproducible. Game over, Arch.

The Aftermath: Is NixOS Ready for Arch Refugees? (Spoiler: Yes, But Bring Coffee)

After six months, here’s the tea: Migrating from Arch to NixOS is like trading a chainsaw for a laser scalpel. You lose the visceral thrill of pacman (sorry, no more sudo pacman -Syu adrenaline rushes), but gain surgical precision. Pain points? The config non-uniformity Reddit warned about—it takes time to internalize NixOS’s “dialect.” And flakes? They’re the future, but prepare for cognitive whiplash.

Yet the wins are undeniable. Atomic upgrades. Rollbacks that don’t suck. Configs that work identically on a VM, a Raspberry Pi, and a cloud instance. As the malloc47 migration proves, this isn’t vaporware—it’s battle-tested by Arch lifers. And home-manager? It obliterates dotfiles tribal knowledge. You’ll still curse when misplacing a ;, but unlike Arch, the error tells you exactly what to fix.

NixOS isn’t for “beginners,” as Writer IT says—it’s for masochists who’ve suffered enough to appreciate real reproducibility. But if you’ve survived Arch for years, you’ve got the chops. Start small: a VM, a minimal config, then expand. Don’t skip the VM phase (Reddit’s golden rule). Embrace the module docs. And for the love of Torvalds, use flakes.

Will NixOS replace Arch for me? Unequivocally, f*ck yes. My systems are quieter, more stable, and my config is a GitHub repo—not a fragile house of cards. But I’ll miss Arch’s “just works” simplicity… until the next glibc update breaks my world. Now, if you’ll excuse me, I’ve got a nixos-rebuild switch to run. Try not to cry into your .zshrc.

[ END_OF_ENTRY ]
|
[ SUCCESS: COPIED_TO_CLIPBOARD ]
[ ARCHIVAL_COMMAND_INDEX ]
SHOW_COMMANDS?
SEARCH_ARCHIVECTRL+K / /
GOTO_INDEXSHIFT+H
NEXT_ENTRY_PAGE]
PREV_ENTRY_PAGE[
SHARE_ENTRYSHIFT+S
CITE_SPECIMENC
MOVE_FOCUSW / S
ACTION_KEYENTER
PRINT_SPECIMENCTRL+P
PRECISION_DOWNJ
PRECISION_UPK
CLOSE_ALLESC
[ ARCHIVAL_CITATION_SPECIMEN ]
APA_FORMAT
Azzar Budiyanto. (2026). My journey migrating from Arch Linux to NixOS. Wong Edan's - by Azzar. Retrieved from https://wp.glassgallery.my.id/my-journey-migrating-from-arch-linux-to-nixos/
[ CLICK_TO_COPY ]
MLA_FORMAT
Azzar Budiyanto. "My journey migrating from Arch Linux to NixOS." Wong Edan's - by Azzar, 2026, June 24, https://wp.glassgallery.my.id/my-journey-migrating-from-arch-linux-to-nixos/.
[ CLICK_TO_COPY ]
CHICAGO_STYLE
Azzar Budiyanto. "My journey migrating from Arch Linux to NixOS." Wong Edan's - by Azzar. Last modified 2026, June 24. https://wp.glassgallery.my.id/my-journey-migrating-from-arch-linux-to-nixos/.
[ CLICK_TO_COPY ]
BIBTEX_ENTRY
@misc{glassgallery_710,
  author = "Azzar Budiyanto",
  title = "My journey migrating from Arch Linux to NixOS",
  howpublished = "\url{https://wp.glassgallery.my.id/my-journey-migrating-from-arch-linux-to-nixos/}",
  year = "2026",
  note = "Retrieved from Wong Edan's - by Azzar"
}
[ CLICK_TO_COPY ]
TECHNICAL_REF
[ REF: MY JOURNEY MIGRATING FROM ARCH LINUX TO NIXOS | SRC: WONG EDAN'S - BY AZZAR | INDEX: 710 ]
[ CLICK_TO_COPY ]