

NixOS cho Dev: Cách tạo môi trường Linux Reproducible với Flakes
NixOS là bản phân phối Linux dựa trên Nix package manager – công cụ cho phép tạo môi trường phát triển reproducible, đảm bảo cùng code chạy giống nhau trên mọi máy. Bài viết hướng dẫn cách áp dụng Nix flakes cho workflow dev thực tế.
Tại sao NixOS phù hợp cho developer
Nix giải quyết vấn đề “works on my machine” bằng cách quản lý toàn bộ môi trường qua file declarative. Mỗi dependency được định nghĩa từ Nixpkgs, đảm bảo version nhất quán.
Khác với Docker chỉ isolate runtime, Nix isolate toàn bộ build process. Bạn có thể rebuild project 2 năm sau và được chính xác binary giống hệt hôm nay – mọi dependency từ glibc đến openssl đều pinned bằng hash SHA256.
Khái niệm “reproducibility” ở đây không chỉ là “build thành công” mà là “build ra output bit-for-bit identical”. Nix đạt reproducibility bằng cách loại bỏ mọi implicit state: thời gian biên dịch, thứ tự file system, timestamp từ package manager.

Cấu trúc Nix Flakes
Nix Flakes là cơ chế mới, đơn giản hóa cách tổ chức project:
# flake.nix
{
description = "Dev environment for MyProject";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs { inherit system; };
in {
devShells.default = pkgs.mkShell {
buildInputs = with pkgs; [
nodejs_20
python3
postgresql_16
rustc
cargo
];
};
}
);
}
Chạy nix develop trong thư mục project sẽ drop bạn vào shell có sẵn tất cả dependency. File flake.lock ghi lại chính xác revision của nixpkgs và mọi input khác.
Garbage collection
Nix không xóa package cũ khi upgrade. Mỗi phiên bản giữ trong store (/nix/store). Khi bạn không cần, GC tự động dọn dựa trên reachable path từ các gcroot. Điều này giúp rollback nhanh bằng cách đổi symlink.
Công cụ hữu ích cho dev
- direnv: Tự động kích hoạt môi trường khi vào thư mục project (
direnv allow) - devenv: Template preset cho phổ biến ngôn ngữ/framework (Python, Go, Node, Rust…)
- devenv LSP: Hỗ trợ IDE integration (VS Code, Neovim) với auto-complete cho Nix
- nix-direnv: Cache environment giữa các lần reload, nhanh hơn direnv thuần
Home Manager cho dotfiles
Ngoài project-level flakes, NixOS có Home Manager – module quản lý dotfiles và user packages qua file Nix. Bạn có thể declare:
home.packages = with pkgs; [
neovim
tmux
lazygit
bat
fd
];
programs.git = {
enable = true;
userName = "hung";
userEmail = "[email protected]";
};
Chạy home-manager switch để sync mọi config lên máy mới chỉ trong vài phút. Không cần manual copy .bashrc, .config/nvim, v.v.
Lưu ý khi triển khai
NixOS có learning curve, nhưng đầu tư ban đầu được đền đáp bằng cú pháp gần như duy nhất tái tạo môi trường. Cho team nhỏ hoặc solo dev, có thể dùng nix develop mà không cần cài đặt toàn bộ NixOS.
Mẹo nhỏ: dùng nix --offline khi offline để vẫn dùng cached store, không gọi remote. Tắt automatic garbage collection nếu muốn giữ nhiều generation.
Đối với team lớn, cân nhắc Atuin (shell history sync) kết hợp Nix để đồng bộ cả editor config và shell history.
NixOS vs Docker vs Traditional distro
NixOS khác với Docker ở mức độ isolate: Docker chỉ containerize runtime, còn NixOS isolate toàn bộ OS. Mỗi reboot, hệ thống được rebuild từ store.
Khác với Ubuntu/Debian: NixOS không có /etc được sửa tay, mọi config đều trong /etc/nixos/configuration.nix. Khi bạn cài nginx qua nixos-rebuild switch, file config tự động được tạo từ attribute set. Khi remove nginx, file được xóa sạch không để lại rác.
Hiệu suất: Docker và NixOS có performance tương đương vì không dùng VM. NixOS có thể nhanh hơn vì không có Docker daemon overhead.
Triển khai NixOS trong CI/CD
Bạn không cần chuyển cả server sang NixOS để tận dụng Nix. Chỉ cần cài nix trên Ubuntu/Debian, thêm nix-shell vào GitHub Actions workflow:
steps:
- uses: actions/checkout@v4
- uses: cachix/install-nix-action@v30
- run: nix develop --command cargo test
Dịch vụ Cachix cache binary giữa các lần build, rút ngắn thời gian CI từ phút xuống giây. Binary được sign chống giả mạo.
Khi nào NixOS không phù hợp
NixOS không phù hợp nếu bạn cần proprietary software phổ biến (Adobe suite, some CAD tools) vì build từ source khó khăn. Linux gaming còn hạn chế so với SteamOS. Cũng cần quen với việc đọc manual NixOS để custom deeply – dấu phẩy, override, attribute set có syntax riêng.
FAQ thường gặp
NixOS có chạy được .NET và Unity không? Có, qua NixOS biology tools hoặc nix-shell. Unity hỗ trợ qua flatpak hoặc Linux desktop edition. Windows game qua Wine hoặc Proton-GE.
Rollback thế nào? NixOS bootloader hiển thị danh sách generation. Chọn generation cũ, reboot. Mọi thứ restore trạng thái trước đó. Hoặc dùng nix-env --rollback trên user-level.
Làm sao học Nix syntax nhanh? Dùng nix repl để interactive thử attribute set. Đọc nix.dev – có thể học trong 1 tuần nếu đã biết functional programming cơ bản.
Nguồn: Nix Flakes Manual, Zero to Nix Guide
