Nix trên Ubuntu và Debian: Đa phiên bản phần mềm và Hoàn tác tức thì (Atomic Rollbacks)

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

Thoát khỏi “địa ngục phụ thuộc” (Dependency Hell)

Các công cụ tiêu chuẩn như APT rất tuyệt vời cho sự ổn định của hệ thống. Tuy nhiên, chúng sẽ gặp khó khăn khi bạn cần chạy đồng thời ba phiên bản Node.js khác nhau hoặc muốn thử nghiệm một gói mới mà không làm xáo trộn hệ thống tệp toàn cục. Trên VPS Ubuntu 22.04 với 4GB RAM, tôi nhận thấy Nix giúp giảm đáng kể chi phí triển khai. Thay vì phải chạy năm container Docker riêng biệt cho các tiện ích nhỏ—mỗi cái ngốn tới 300MB RAM—giờ đây tôi chạy chúng trực tiếp và cô lập thông qua Nix.

Nix thay đổi tư duy quản lý như thế nào

Để hiểu tại sao Nix là một sự chuyển đổi căn bản cho các hệ thống dựa trên Debian, chúng ta phải xem xét cách nó xử lý các tệp tin so với các công cụ thông thường.

1. Nix và APT

APT cài đặt các tệp vào các thư mục dùng chung như /usr/bin. Điều này tạo ra một môi trường toàn cục, nơi việc nâng cấp một thư viện Python duy nhất có thể vô tình làm hỏng ba ứng dụng khác. Nix tránh điều này bằng cách lưu trữ mọi gói trong một thư mục con riêng biệt bên trong /nix/store. Tên của các thư mục này bao gồm một mã băm mật mã (cryptographic hash) duy nhất. Nhờ đó, bạn có thể cài đặt Python 3.8, 3.10 và 3.12 cùng một lúc mà không bao giờ lo chúng xung đột với nhau.

2. Nix và Docker

Docker cung cấp sự cô lập thông qua các container, nhưng điều này đi kèm với chi phí lớn về dung lượng đĩa và thời gian khởi động. Một image Docker Ubuntu cơ bản có thể chiếm 80MB ngay cả khi chưa cài đặt công cụ nào. Nix cung cấp sự cô lập ở cấp độ gói với hiệu suất của một tệp thực thi gốc. Tôi sử dụng nó cho các môi trường phát triển cần các trình biên dịch C++ cụ thể. Nó mang lại khả năng tái lập (reproducibility) của một container nhưng không tốn tới 2GB dung lượng image.

Thực tế khi sử dụng Nix

Bạn nên cân nhắc giữa lợi ích thực tế và lộ trình học tập trước khi chuyển toàn bộ quy trình làm việc của mình sang Nix.

Ưu điểm

  • Cập nhật tức thì (Atomic Upgrades): Nix không bao giờ ghi đè tệp trong quá trình cập nhật. Nó chỉ đơn giản là trỏ một liên kết tượng trưng (symbolic link) mới đến phiên bản mới. Nếu cập nhật thất bại, hệ thống của bạn vẫn giữ nguyên trạng thái cũ.
  • Không cần quyền Sudo: Sau khi hoàn tất thiết lập ban đầu, bất kỳ người dùng nào cũng có thể cài đặt phần mềm. Đây là một điểm cộng lớn cho các máy chủ dùng chung, nơi bạn không có quyền root nhưng cần một phiên bản cụ thể của ripgrep.
  • Môi trường di động: Bạn có thể thêm tệp shell.nix vào kho lưu trữ Git. Khi đồng nghiệp clone về, họ chỉ cần chạy một lệnh duy nhất để có được bộ công cụ (toolchain) chính xác như bạn đã dùng.

Nhược điểm và đánh đổi

  • Tiêu tốn dung lượng đĩa: Sự cô lập không hề miễn phí. Vì Nix giữ lại nhiều phiên bản phụ thuộc, thư mục /nix của bạn có thể dễ dàng tăng lên 20GB hoặc 30GB sau vài tuần thử nghiệm.
  • Ngôn ngữ mới: Bạn sẽ cần học ngôn ngữ biểu thức Nix. Đây là một ngôn ngữ lập trình hàm (functional language), cảm giác sẽ khá lạ lẫm nếu bạn đã quen viết kịch bản Bash hoặc Python thông thường.

Thiết lập trên Ubuntu và Debian

Tôi khuyên dùng kiểu cài đặt Multi-user (nhiều người dùng) cho hầu hết các thiết lập production. Nó tạo ra một nhóm nixbld chuyên dụng và một số người dùng build. Thiết lập này giúp cải thiện bảo mật và cho phép nhiều người dùng chia sẻ kho lưu trữ Nix trong khi vẫn giữ các profile cá nhân riêng tư.

Hãy kiểm tra bộ nhớ trước. Đảm bảo bạn có ít nhất 15GB dung lượng trống trên phân vùng root. Nếu không gian hạn hẹp, hãy gắn một ổ SSD chuyên dụng hoặc một ổ đĩa riêng tại /nix trước khi bắt đầu cài đặt.

Hướng dẫn triển khai

1. Cài đặt

Script cài đặt đa người dùng chính thức là con đường đáng tin cậy nhất cho các hệ thống Debian hiện đại. Nó sẽ tự động cấu hình các unit systemd cần thiết cho bạn.

sh <(curl -L https://nixos.org/nix/install) --daemon

Sau khi trình cài đặt hoàn tất, hãy cập nhật các biến môi trường của bạn bằng cách nạp profile Nix:

. /etc/profile.d/nix.sh

2. Tìm kiếm và cài đặt gói

Nix lấy dữ liệu từ một kho lưu trữ khổng lồ gọi là nixpkgs, hiện đang chứa hơn 80.000 gói. Để tìm một công cụ cụ thể như htop, hãy sử dụng lệnh tìm kiếm:

nix-env -qaP htop

Để cài đặt một gói vào profile người dùng của bạn mà không chạm vào các tệp hệ thống:

nix-env -iA nixpkgs.htop

3. Hoàn tác tức thì

Mỗi thay đổi bạn thực hiện sẽ tạo ra một “thế hệ” (generation) mới. Nếu bạn cài đặt một phiên bản mới của công cụ và nó làm hỏng các script của bạn, bạn có thể xem lịch sử ngay lập tức:

nix-env --list-generations

Để quay trở lại trạng thái hoạt động tốt trước đó, chỉ cần chạy:

nix-env --rollback

4. Sử dụng nix-shell cho các công cụ tạm thời

Đây có lẽ là tính năng tốt nhất dành cho các nhà phát triển. Hãy tưởng tượng bạn cần chạy một kịch bản Python yêu cầu Python 3.11 và thư viện requests, nhưng bạn không muốn cài chúng vĩnh viễn vào hệ thống. Bạn có thể vào một shell tạm thời:

nix-shell -p python311 python311Packages.requests

Ngay khi bạn gõ exit, các gói đó sẽ biến mất khỏi đường dẫn PATH của bạn. Hệ thống của bạn vẫn sạch sẽ, nhưng bạn vẫn có chính xác những gì mình cần cho tác vụ đó.

Giữ cho hệ thống gọn nhẹ

Nix không tự động xóa các phiên bản cũ. Nếu bạn không dọn dẹp, cuối cùng bạn sẽ hết dung lượng đĩa. Tôi đã từng chứng kiến các máy chủ bị đình trệ hoàn toàn vì kho lưu trữ Nix chiếm hết 100% dung lượng đĩa.

Dọn rác (Garbage Collection)

Để xóa các gói không được sử dụng bởi bất kỳ thế hệ (generation) nào đang hoạt động, hãy chạy:

nix-collect-garbage

Để triệt để hơn và xóa tất cả các thế hệ cũ (giải phóng nhiều không gian nhất):

nix-collect-garbage -d

Chiến lược cuối cùng

Chạy Nix song song với APT mang lại một cách tiếp cận lai trong quản lý Linux. Tôi sử dụng APT cho các thành phần cốt lõi của hệ thống như kernel, SSH và systemd. Đối với mọi thứ khác—từ các công cụ CLI đến các runtime phát triển phức tạp—tôi sử dụng Nix. Sự tách biệt này giúp hệ điều hành cơ sở ổn định trong khi vẫn mang lại cho tôi sự linh hoạt tuyệt đối cho các ứng dụng của mình. Nếu bạn đã mệt mỏi với các xung đột PPA hoặc các phụ thuộc bị hỏng, Nix là bước tiến logic tiếp theo cho quy trình làm việc của bạn.

Share: