DEV Community

Cover image for Nix Series: NixOS Installation
Dimas Rangga
Dimas Rangga

Posted on

Nix Series: NixOS Installation

Pada artikel ini kita akan memulai berinteraksi dengan nix dengan cara melakukan instalasi NixOS dengan menggunakan VirtualBox. Sebelum memulai instalasi, pastikan kamu sudah membaca series introduction nix terlebih dahulu, agar tau apa itu nix.

Prerequisite

  • Download NixOS iso di nixos official dan pilih Minimal ISO image, karena pada artikel ini akan menggunakan versi ISO tersebut
  • Download VirtualBox dan install

Setup VirtualBox

  • Buat virtual machine baru pada VirtualBox dengan pilih New
  • Pilih NixOS yang sudah didownload pada ISO image Setup New VM
  • VirtualBox sudah dibuat dengan disk minimal 20GB
  • Start VM yang sudah kita buat

Installation Step

1. Boot Live Environment

Saat pertama booting akan ada 2 pilihan NixOS, pilih yang LTS
Boot Selection
Tampilan setelah booting ISO NixOS
NixOS Installer
Setelah berhasil boot ke live environment, masuk sebagai root terlebih dahulu

sudo su
Enter fullscreen mode Exit fullscreen mode

Prompt akan berubah dari [nixos@nixos:~]$ menjadi [root@nixos:/home/nixos]#.

⚠️ Semua perintah partisi dan instalasi harus dijalankan sebagai root. Tanpa ini akan muncul error Permission denied.

2. Check Disk Information

lsblk
Enter fullscreen mode Exit fullscreen mode

Disk VirtualBox biasanya terdeteksi sebagai /dev/sda. Pastikan sebelum lanjut karena perintah berikutnya akan menghapus semua isi disk.
Pastikan outputnya seperti ini:

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda      8:0    0   20G  0 disk
sr0     11:0    1  1.6G  0 rom  /iso
Enter fullscreen mode Exit fullscreen mode

3. Disk Partition

Kita pakai parted dengan skema GPT + EFI:

parted /dev/sda -- mklabel gpt
parted /dev/sda -- mkpart primary 512MB 100%
parted /dev/sda -- mkpart ESP fat32 1MB 512MB
parted /dev/sda -- set 2 esp on
Enter fullscreen mode Exit fullscreen mode

Penjelasan setiap perintah:

Perintah Fungsi
mklabel gpt Membuat partition table baru bertipe GPT (standar modern, pengganti MBR)
mkpart primary 512MB 100% Membuat partisi root / dari 512MB sampai akhir disk
mkpart ESP fat32 1MB 512MB Membuat EFI System Partition dari 1MB sampai 512MB, format FAT32
set 2 esp on Memberi flag esp pada partisi ke-2 agar UEFI firmware mengenalinya sebagai boot partition

Layout akhir:

/dev/sda
├── sda1  (512MB → 100%)  = /      → ext4, sistem NixOS
└── sda2  (1MB   → 512MB) = /boot  → FAT32, bootloader EFI
Enter fullscreen mode Exit fullscreen mode

📝 Pesan You may need to update /etc/fstab setelah setiap perintah adalah normal, bukan error.

Verifikasi hasil partisi:

lsblk
Enter fullscreen mode Exit fullscreen mode

Harusnya muncul sda1 dan sda2 di bawah sda.
Disk Partition

Kenapa parted dengan GPT + EFI?
Kenapa parted dengan Skema GPT + EFI? Karena parted lebih straightforward untuk ditulis sebagai langkah-langkah sequential.

Kenapa GPT, bukan MBR? Karena GPT (GUID Partition Table) adalah pengganti MBR (Master Boot Record) dan berikut adalah perbedaannya:

MBR GPT
Maks partisi 4 primary 128 partisi
Maks ukuran disk 2TB 9.4ZB
Pasangan firmware BIOS/Legacy UEFI
Ketahanan Partition table hanya satu salinan Ada backup partition table di akhir disk

Karena saat membuat VM baru secara default UEFI pada VirtualBox akan aktif dan skema GPT adalah pasangan naturalnya. UEFI secara teknis bisa booting dari MBR, tapi GPT adalah standar modern dan yang direkomendasikan untuk UEFI. Kamu bisa melihat pada settings dibagian system

VM Settings System


4. Format Partition

Jalankan perintah berikut:

mkfs.ext4 -L nixos /dev/sda1
mkfs.fat -F 32 -n boot /dev/sda2
Enter fullscreen mode Exit fullscreen mode

Flag -L dan -n memberikan label pada partisi. Label ini yang dipakai saat mounting (by-label) agar lebih readable dibanding UUID.

5. Mount Partition

mount /dev/disk/by-label/nixos /mnt
mkdir -p /mnt/boot
mount -o umask=077 /dev/disk/by-label/boot /mnt/boot
Enter fullscreen mode Exit fullscreen mode

6. Generate Nix Configuration

nixos-generate-config --root /mnt
Enter fullscreen mode Exit fullscreen mode

Perintah ini menghasilkan dua file:

/mnt/etc/nixos/
├── configuration.nix        # konfigurasi utama
└── hardware-configuration.nix  # auto-detected hardware
Enter fullscreen mode Exit fullscreen mode

Generate Nix Configuration

7. Edit Configuration

Ubah konfigurasi pada /mnt/etc/nixos/configuration.nix, kita bisa menggunakan nano atau vim

vim /mnt/etc/nixos/configuration.nix
Enter fullscreen mode Exit fullscreen mode

Untuk proses instalasi saat ini, kita hanya edit seminimal mungkin.

{ config, pkgs, ... }:

{
  imports = [ ./hardware-configuration.nix ];

  # Boot loader — gunakan systemd-boot untuk UEFI
  boot.loader.systemd-boot.enable = true;
  boot.loader.efi.canTouchEfiVariables = true;

  # Networking
  networking.hostName = "nixos-server";
  networking.networkmanager.enable = true;

  # Timezone
  time.timeZone = "Asia/Jakarta";

  # User
  users.users.vboxuser = {
    isNormalUser = true;
    extraGroups = [ "wheel" ]; # wheel = akses sudo
    initialPassword = "qwerty123";
  };

  # Package dasar
  environment.systemPackages = with pkgs; [
    curl
    git
    neovim
    wget
  ];

  # SSH — penting untuk server
  services.openssh.enable = true;

  # Aktifkan flakes (persiapan post-install)
  nix.settings.experimental-features = [ "nix-command" "flakes" ];

  system.stateVersion = "25.11"; # sesuaikan dengan versi NixOS yang diinstall
}
Enter fullscreen mode Exit fullscreen mode

8. Install NixOS

nixos-install
Enter fullscreen mode Exit fullscreen mode

Saat proses instalasi, NixOS akan memberikan prompt input password.

NixOS Installation

⚠️ Password yang muncul saat prompt instalasi adalah password untuk root sedangkan password yang sudah kita deklarasikan pada configuration.nix dibagian initialPassword adalah password untuk vboxuser.

Setelah instalasi selesai, kita bisa melakukan reboot.

reboot
Enter fullscreen mode Exit fullscreen mode

9. Post Installation

Setelah proses reboot selesai, kamu bisa login dengan user vboxuser dengan password yang sudah diberikan pada initialPassword

❄ Nix Flakes ❄

Flakes adalah fitur di Nix yang mengubah cara kita mendefinisikan dan berbagi konfigurasi Nix. Sebelum Flakes ada, konfigurasi NixOS bergantung pada Nix channels. Ini semacam subscription ke versi nixpkgs tertentu yang disimpan di sistem. Permasalahannya adalah channels tidak di-lock per project, jadi dua orang yang menjalankan konfigurasi yang sama bisa mendapat hasil berbeda karena versi nixpkgs tidak identik.

Dengan Flakes, setiap konfigurasi punya file flake.nix sebagai entry point yang mendefinisikan inputs (dependency seperti nixpkgs dan home-manager) dan outputs (hasil build seperti NixOS configuration). Semua input di-lock di file flake.lock, mirip seperti package-lock.json di Node.js atau go.sum di Go, sehingga siapapun yang pakai konfigurasi yang sama akan mendapat hasil yang identik.

flake.nix       → mendefinisikan dependency dan konfigurasi
flake.lock      → mengunci versi semua dependency (auto-generated)
Enter fullscreen mode Exit fullscreen mode

Flakes juga membuat konfigurasi lebih portable dan tidak terikat ke /etc/nixos, bisa disimpan di mana saja termasuk di GitHub sebagai dotfiles.

ℹ️ Flakes masih berstatus "experimental" secara resmi, tapi sudah dipakai luas di komunitas Nix dan dianggap sebagai cara yang direkomendasikan untuk mengelola konfigurasi modern.

1. Enable Flakes

Aktifkan flakes dengan cara edit configuration.nix. Gunakan nano atau nvim untuk edit file.

nvim /etch/nixos/configuration.nix
Enter fullscreen mode Exit fullscreen mode

Tambahkan baris ini:

  ...
  system.stateVersion = "25.11";

  # Enable flakes
  nix.settings.experimental-features = [
    "nix-command"
    "flakes"
  ];
Enter fullscreen mode Exit fullscreen mode

Lalu apply sebagai default boot

nixos-rebuild switch
Enter fullscreen mode Exit fullscreen mode

Enable Flakes

Setelah flakes aktif, kita bisa memindahkan konfigurasi NixOS dari root ke home dengan cara berikut:

cp -r /etc/nixos ~/
mv nixos nix
cd nix
Enter fullscreen mode Exit fullscreen mode

Nah.. dengan ini kita tidak perlu membutuhkan root lagi untuk melakukan perubahan konfigurasi pada system NixOS kita.

2. Git Setup

Langkah selanjutnya adalah initialize git, karena nix flake hanya membaca file yang sudah ditambahkan pada git (git add).

git init
git config --global user.email "johndoe@example.com" # gunakan emailmu
git config --global user.email "johndoe" # gunakan user gitmu
Enter fullscreen mode Exit fullscreen mode

Kamu juga bisa setup remote origin dan dipush ke githubmu

3. Setup Flake

Tambahkan file flake.nix

touch flake.nix
Enter fullscreen mode Exit fullscreen mode

Lalu deklarasikan minimum konfigurasi berikut

{
  description = "NixOS Server Configuration";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
  };

  outputs =
    {
      self,
      nixpkgs,
    }:
    {
      # nixos-server adalah hostname
      nixosConfigurations.nixos-server = nixpkgs.lib.nixosSystem {
        system = "aarch64-linux";
        modules = [
          ./configuration.nix
        ];
      };
    };
}
Enter fullscreen mode Exit fullscreen mode

Stage flake.nix dengan cara git add flake.nix atau git add ., kemudian verify konfigurasi dengan cara

nix flake check
Enter fullscreen mode Exit fullscreen mode

Melakukan konfigurasi akan generate flake.lock

Nix Verify

Setelah verify sukses, kita bisa rebuild dan apply sebagai default boot:

sudo nixos-rebuild switch --flake ~/nix#nixos-server
Enter fullscreen mode Exit fullscreen mode

Nix Rebuild

Setiap kali kita melakukan nixos-rebuild, NixOS akan generate konfigurasi system baru kemudian apply as default dan kita bisa melihatnya dengan cara:

sudo nixos-rebuild list-generations
Enter fullscreen mode Exit fullscreen mode

List Generations

NixOS Rollback
Disinilah keungglan nix, kita bisa melakukan rollback ke versi sebelumnya dengan cara
sudo nixos-rebuild --rollback switch
Enter fullscreen mode Exit fullscreen mode

4. Add New Package

Untuk saat ini semua konfigurasi package yang kita install ada di configuration.nix, jadi kita butuh edit file ini dan menambahkan package yang dibutuhkan.

Pada artikel ini aku akan menggunakan lazyvim sebagai code editor

...
environment.systemPackages = with pkgs; [
    curl
    git
    neovim
    tree
    wget

    # untuk neovim
    fnm # node version manager
    gcc
    nixd
    nixfmt
];
Enter fullscreen mode Exit fullscreen mode

Perlu diingat, setiap kali melakukan penambahan package atau melakukan perubahan konfigurasi, kita butuh melakuakan rebuild dan apply sebagai default boot.

5. Nix Rebuild Command

Seperti yang kamu ketahui, untuk melakukan rebuild flake kita menjalankan perintah berikut:

sudo nixos-rebuild switch --flake ~/nix#nixos-server
Enter fullscreen mode Exit fullscreen mode

Perintah ini memiliki sytax seperti ini:

sudo nixos-rebuild switch --flake {path_flake}#{hostname}
Enter fullscreen mode Exit fullscreen mode

6. Bonus: install lazyvim

git clone https://github.com/LazyVim/starter ~/.config/nvim
Enter fullscreen mode Exit fullscreen mode

Enable SSH

Kita akan melakukan setup minimum ssh untuk VirtualBox ini agar dapat kita remote dari terminal laptop. Edit configuration.nix lalu jalankan perintah nixos-rebuild

  services.openssh = {
    enable = true;
    ports = [
      222
    ];
    settings = {
      PermitRootLogin = "no";
    };
  };
Enter fullscreen mode Exit fullscreen mode

⚠️ Konfigurasi ini hanya diperuntukkan praktik saja, untuk best practices konfigurasi ssh dapat dilihat pada NixOS Wiki

SSH Status

Agar dapat akses VirtualBox dari terminal laptop, kita membutuhkan port-forwarding. Lakukan konfigurasi port forwarding dengan cara

  • Shutdown VM terlebih dahulu. Kamu bisa klik close bar pada VM dan pilih shutdown
  • Pilih VMmu dan klik Settings
  • Pilih Network -> port forwarding

VirtualBox Network Settings

  • Tambahkan port VM: Host IP 127.0.0.1, Host Port 2222, Guest Port 222. Host port adalah target port laptop kita dan guest port adalah port dari ssh VM kita.
  • Apply Settings dan nyalakan VM dan pilih latest generations

NixOS List Generations

  • Buka terminal pada laptopmu dan lakukan ssh ke VM
ssh -p 2222 vboxuser@127.0.0.1
Enter fullscreen mode Exit fullscreen mode

Home Manager

Home Manager adalah tool dari komunitas Nix yang memungkinkan kita mengelola konfigurasi user secara deklaratif, seperti yang NixOS lakukan untuk konfigurasi sistem. Tanpa Home Manager, konfigurasi seperti ~/.gitconfig, ~/.bashrc, atau ~/.config/nvim/init.lua ditulis manual dan tidak reproducible.

Dengan Home Manager, semua konfigurasi user dideklarasikan di home.nix dan bisa di-reproduce di mesin manapun hanya dengan satu perintah.

configuration.nix home.nix
Scope System-wide Per user
Contoh nginx, SSH, kernel git config, shell aliases, dotfiles
Butuh sudo
Lokasi install /run/current-system ~/.nix-profile

1. Add home.nix

home.nix

{ config, pkgs, ... }:

{
  home.username = "vboxuser";
  home.homeDirectory = "/home/vboxuser";

  home.packages = with pkgs; [
    ripgrep
    fd
    jq
  ];

  programs = {
    bash = {
      enable = true;
      shellAliases = {
        rebuild = "sudo nixos-rebuild switch --flake ~/nix#nixos-server";
      };
    };

    lazygit = {
      enable = true;
      enableBashIntegration = true;
    };
  };

  home.stateVersion = "25.11";
}
Enter fullscreen mode Exit fullscreen mode

2. Update flake.nix

flake.nix

{
  description = "NixOS Server Configuration";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";

    home-manager.url = "github:nix-community/home-manager/release-25.11";
    home-manager.inputs.nixpkgs.follows = "nixpkgs";
  };

  outputs =
    {
      self,
      nixpkgs,
      home-manager,
    }:
    {
      nixosConfigurations.nixos-server = nixpkgs.lib.nixosSystem {
        system = "aarch64-linux";
        modules = [
          ./configuration.nix

          home-manager.nixosModules.home-manager
          {
            home-manager.useGlobalPkgs = true;
            home-manager.useUserPackages = true;
            home-manager.users.vboxuser = import ./home.nix;
          }
        ];
      };
    };
}
Enter fullscreen mode Exit fullscreen mode

3. Rebuild

Rebuild NixOS system.

sudo nixos-rebuild switch --flake ~/nix#nixos-server
source ~/.bashrc # reload bash untuk agar bisa rebuild dengan alias
Enter fullscreen mode Exit fullscreen mode

Karena kita sudah menambahkan alias pada shellAliases di home.nix, maka untuk selanjutnya kita tidak perlu mengetik perintah nixos-rebuild yang panjang itu, kita hanya tinggal menjalankan perintah rebuild

Penutup

Bagaimana menurutmu setelah melewati proses yang cukup panjang untuk install dan konfigurasi NixOS, sangat menarik bukan?

Kita bisa menambahkan package dengan mudah, melakukan konfigurasi secara deklaratif, dan bisa rollback system jika tidak cocok dengan konfigurasinya.

Berikut adalah referensi yang sangat membantu untuk melakukan explorasi nix

Top comments (0)