VOOZH about

URL: https://dev.to/derangga/nix-series-nixos-installation-2pn7

⇱ Nix Series: NixOS Installation - DEV Community


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

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

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

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

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

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

Verifikasi hasil partisi:

lsblk

Harusnya muncul sda1 dan sda2 di bawah sda.
👁 Disk Partition


4. Format Partition

Jalankan perintah berikut:

mkfs.ext4 -L nixos /dev/sda1
mkfs.fat -F 32 -n boot /dev/sda2

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

6. Generate Nix Configuration

nixos-generate-config --root /mnt

Perintah ini menghasilkan dua file:

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

👁 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

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;

 system.stateVersion = "25.11"; # sesuaikan dengan versi NixOS yang diinstall
}

8. Install NixOS

nixos-install

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

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)

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

Tambahkan baris ini:

 ...
 system.stateVersion = "25.11";

 # Enable flakes
 nix.settings.experimental-features = [
 "nix-command"
 "flakes"
 ];

Lalu apply sebagai default boot

nixos-rebuild switch

👁 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

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

Kamu juga bisa setup remote origin dan dipush ke githubmu

3. Setup Flake

Tambahkan file flake.nix

touch flake.nix

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
 ];
 };
 };
}

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

nix flake check

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

👁 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

👁 List Generations

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
];

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

Perintah ini memiliki sytax seperti ini:

sudo nixos-rebuild switch --flake {path_flake}#{hostname}

6. Bonus: install lazyvim

git clone https://github.com/LazyVim/starter ~/.config/nvim

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";
 };
 };

âš ī¸ 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

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";
}

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;
 }
 ];
 };
 };
}

3. Rebuild

Rebuild NixOS system.

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

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