Cú điện thoại lúc 2 giờ sáng và nỗi ám ảnh mang tên Dependency Hell
Mình vẫn nhớ như in cái đêm hôm đó. Con server CentOS 7 đang gánh đống legacy code bỗng ‘bay màu’ sau một pha nâng cấp OpenSSL đầy tự tin của một cậu junior. Kết quả thật thảm khốc: toàn bộ service Python và PHP lăn đùng ra chết vì không tìm thấy thư viện tương ứng. Đứng giữa lựa chọn cài lại toàn bộ OS hoặc ngồi ‘khâu’ lại hàng trăm symlink nát bét, mình mới thấy các công cụ như yum hay apt đôi khi là con dao hai lưỡi.
Đó là lúc mình bén duyên với Nix. Trên con server cũ kỹ năm ấy, Nix giống như một ‘ốc đảo’ an toàn. Nó cho phép mình cài các công cụ mới nhất mà không chạm vào một sợi lông chân nào của hệ thống gốc vốn đã quá mong manh.
So sánh các phương pháp quản lý phần mềm hiện nay
Thông thường, khi cần chạy ứng dụng với các phiên bản thư viện khác nhau, dân kỹ thuật thường chọn một trong ba con đường:
- Package Manager truyền thống (Apt, DNF): Cài mọi thứ vào
/usr/bin. Cách này nhanh nhưng rủi ro cực cao nếu bạn cần chạy song song hai bản OpenSSL khác nhau. Chỉ cần một lệnhupgradenhầm, đường về nhà sẽ rất gian nan. - Containerization (Docker): Đóng gói mọi thứ vào image. Giải pháp này cô lập tốt nhưng lại ngốn tài nguyên. Chạy một script Python 10 dòng mà phải vác theo cái container 500MB thì thật sự ‘overkill’.
- Nix Way – Tiếp cận kiểu Functional: Nix cài đặt mỗi package vào một thư mục riêng biệt trong
/nix/store. Mỗi thư mục có mã hash duy nhất (ví dụ:7f8...-python3-3.12) dựa trên các dependency của nó. Bạn có thể cài 10 phiên bản Python trên cùng một máy mà chẳng sợ ông nào ‘đánh nhau’ với ông nào.
Tại sao Nix lại là giải pháp ‘cô lập và an toàn’?
Những điểm ‘ăn tiền’ nhất
- Atomic upgrades và rollbacks: Khi cài package mới, Nix không ghi đè trực tiếp mà tạo một symlink mới. Nếu lỗi? Chỉ cần một giây để
rollbackvề trạng thái cũ. Hệ thống của bạn không bao giờ rơi vào cảnh ‘nửa nạc nửa mỡ’. - Cài đặt không cần root: Sau khi setup ban đầu, bạn có thể cài phần mềm vào profile cá nhân mà không cần dùng đến
sudo. Điều này cực kỳ quan trọng trên các server production nghiêm ngặt. - Môi trường nhất quán: ‘Chạy trên máy tôi thì chắc chắn chạy trên máy bạn’. Nix đảm bảo mọi thư viện phụ thuộc được kéo về chính xác đến từng bit, loại bỏ hoàn toàn lỗi ‘thiếu file .so’ kinh điển.
Vài điểm trừ cần ‘sống chung với lũ’
- Ngốn dung lượng: Thư mục
/nixsẽ phình to rất nhanh. Một hệ thống Nix cơ bản có thể dễ dàng chiếm 2-5GB chỉ sau vài lần vọc vạch. - Đường cong học tập: Cú pháp ngôn ngữ Nix hơi ‘dị’ so với dân đã quen kiểu code tuần tự truyền thống.
Hướng dẫn triển khai Nix trên Linux thực chiến
Để ổn định nhất, mình khuyên các bạn nên cài đặt theo kiểu Multi-user.
1. Cài đặt Nix nhanh
Mở terminal và dán lệnh dưới đây. Bạn sẽ cần quyền sudo để tạo cấu trúc thư mục /nix ban đầu.
sh <(curl -L https://nixos.org/nix/install) --daemon
Sau khi chạy xong, hãy restart lại shell hoặc chạy lệnh này để ‘nạp’ lại environment:
. /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh
2. Tìm kiếm và cài đặt Package
Giả sử bạn cần htop bản mới nhất thay vì bản ‘đồ cổ’ có sẵn trong repo OS. Đầu tiên, hãy tìm tên chính xác:
nix-env -qaP | grep htop
Sau đó cài đặt chỉ bằng một nốt nhạc:
nix-env -iA nixpkgs.htop
Thử gõ which htop, bạn sẽ thấy nó nằm trong /home/user/.nix-profile/bin/htop thay vì /usr/bin.
3. Sử dụng nix-shell để tạo môi trường ‘dùng một lần’
Đây là tính năng mình cực kỳ tâm đắc. Bạn cần Node.js 18 để test nhanh một dự án nhưng không muốn cài nó vĩnh viễn vào máy? Hãy dùng:
nix-shell -p nodejs-18_x
Ngay lập tức, bạn có Node 18 để quẩy. Gõ exit, môi trường này tan biến, trả lại sự sạch sẽ cho hệ thống. Không để lại dấu vết, không rác rưởi.
4. Quản lý phiên bản và Rollback
Nếu chẳng may cài nhầm một đống package gây xung đột, đừng hoảng loạn. Chỉ cần lệnh này là xong:
nix-env --rollback
Bạn cũng có thể xem lại lịch sử các ‘đời’ cài đặt bằng nix-env --list-generations để biết mình đã làm gì với hệ thống.
Kinh nghiệm thực tế: Khi nào bạn thực sự cần Nix?
Trong công việc hàng ngày, mình áp dụng Nix vào hai kịch bản chính:
- Trên Production Server: Mình dùng Nix để cài các tool hỗ trợ (như
aws-cli,kubectl,htop). Cách này giúp server luôn sạch, không bị rác bởi các dependency linh tinh của hệ thống. - Setup dự án cho Team: Mình tạo file
shell.nixchứa danh sách compiler và thư viện. Dev mới vào chỉ cần gõnix-shelllà có ngay môi trường giống hệt các đàn anh, không còn cảnh mất cả buổi sáng chỉ để fix lỗi cài cắm.
Nix không phải là ‘viên đạn bạc’ thay thế hoàn toàn Docker, nhưng nó lấp đầy khoảng trống về sự tiện lợi và độ an toàn mà các công cụ khác còn thiếu. Nếu bạn đã chán cảnh gỡ lỗi dependency lúc nửa đêm, hãy thử cài Nix ngay hôm nay.

