Thoát khỏi ‘Dependency Hell’ trên Linux với Nix: Trình quản lý package cứu mình lúc 2 giờ sáng

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

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ệnh upgrade nhầ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 để rollback về 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 /nix sẽ 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:

  1. 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.
  2. Setup dự án cho Team: Mình tạo file shell.nix chứa danh sách compiler và thư viện. Dev mới vào chỉ cần gõ nix-shell là 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.

Share: