LinuxAn Hung Nguyen
Bắt đầu hành trình mới với hệ điều hành mang tên NixOS
Tại sao mình chọn NixOS sau khi trải nghiệm nhiều bản phân phối Linux? Một góc nhìn về quản lý cấu hình, rollback và tái tạo môi trường phát triển.

Mục lục
Bắt đầu hành trình mới với hệ điều hành mang tên NixOS
Sau khi trải nghiệm kha khá bản phân phối Linux, cuối cùng mình đã quyết định chọn NixOS làm hệ điều hành chính.
Có lẽ nhiều người sẽ thắc mắc tại sao mình lại chọn NixOS khi trước đây đã từng sử dụng Arch Linux, Debian và các hệ điều hành dựa trên Debian như Ubuntu. Thực tế, mình cũng đã thử nghĩ ra khá nhiều cách để quản lý và đồng bộ môi trường Linux giữa các máy tính.
Một số bạn có thể biết mình qua những dự án và thư viện mình từng phát triển cho Linux. Và chính quá trình làm việc với các dự án đó đã khiến mình nhận ra một vấn đề khá đau đầu: làm thế nào để quản lý hệ điều hành và tái tạo chính xác môi trường làm việc khi cần?
Vấn đề với cách quản lý hệ thống truyền thống
Một trong những vấn đề mình thường gặp khi sử dụng các bản phân phối Linux là việc quản lý những thay đổi trên hệ thống đang hoạt động.
Khi cài đặt package, cập nhật thư viện hoặc thay đổi cấu hình, các thao tác này thường tác động trực tiếp lên môi trường hiện tại. Nếu muốn quản lý những thay đổi đó một cách có hệ thống, mình phải tự xây dựng thêm các công cụ hỗ trợ.
Chẳng hạn, mình có thể viết shell script để tự động cài đặt các package, thiết lập cấu hình hoặc chuẩn bị môi trường phát triển. Một cách khác là đóng gói môi trường dưới dạng archive, chẳng hạn như file .tar, rồi sao chép sang các máy tính khác.
Mình đã từng trải qua những cách làm này trước đây. Về cơ bản, chúng vẫn hoạt động, nhưng có khá nhiều bất tiện.
Việc duy trì các shell script không đơn giản chỉ là liệt kê danh sách package rồi chạy lệnh cài đặt. Mình còn phải bảo đảm rằng script hoạt động đúng trên từng hệ thống, các phiên bản thư viện tương thích với nhau và cấu hình sau khi triển khai thực sự giống với môi trường ban đầu.
Đôi khi, mình còn phải dựng thêm máy ảo để kiểm tra xem những script đó có hoạt động ổn định hay không.
Nói chung, việc bảo đảm nhiều máy tính có cùng một môi trường làm việc đôi khi còn mệt hơn cả việc phát triển dự án :)))
NixOS giải quyết vấn đề này như thế nào?
Đối với NixOS, cách tiếp cận khá khác biệt.
Thay vì xem hệ điều hành là một tập hợp các thay đổi được thực hiện trực tiếp lên hệ thống hiện tại, NixOS cho phép mình khai báo trạng thái mong muốn của hệ thống thông qua các file cấu hình.
Sau đó, khi chạy nixos-rebuild, NixOS sẽ xây dựng một generation mới tương ứng với cấu hình đã khai báo.
Mỗi generation đại diện cho một phiên bản cấu hình hệ thống đã được xây dựng. Những generation cũ vẫn có thể được giữ lại, cho phép mình khởi động lại vào phiên bản trước hoặc rollback khi cấu hình mới gặp vấn đề.
Ví dụ, nếu mình cập nhật một package hoặc thay đổi cấu hình khiến hệ thống hoạt động không như mong muốn, mình có thể quay lại generation trước đó thay vì phải tự khôi phục từng thay đổi một.
Đây là một trong những điểm mình thích nhất ở NixOS.
Tất nhiên, rollback không có nghĩa là mọi dữ liệu đều được khôi phục. Các thay đổi đối với dữ liệu người dùng, database hoặc những file nằm ngoài phạm vi quản lý của NixOS vẫn cần được xử lý riêng. Tuy vậy, đối với cấu hình hệ thống và các thành phần được quản lý bởi Nix, cơ chế generation thực sự rất hữu ích.
Quản lý cấu hình bằng Git
Một ưu điểm khác là mình có thể quản lý các file cấu hình NixOS bằng Git.
Thay vì ghi nhớ mình đã thay đổi những gì trên hệ thống, mình có thể theo dõi toàn bộ lịch sử chỉnh sửa trong repository.
Ví dụ, cấu hình của mình có thể được tổ chức thành các file riêng biệt cho từng thành phần:
flake.nix: Khai báo các input và cấu trúc build của hệ thống.configuration.nix: Cấu hình các thành phần chính của NixOS.- Các file cấu hình riêng: Quản lý từng dịch vụ, ứng dụng hoặc chức năng cụ thể.
- Home Manager: Quản lý cấu hình môi trường người dùng nếu cần.
Khi muốn thay đổi cấu hình, mình chỉ cần chỉnh sửa các file tương ứng, kiểm tra diff rồi build lại hệ thống.
Điều này giúp việc quản lý cấu hình trở nên rõ ràng hơn, đồng thời dễ dàng đồng bộ giữa các máy tính.
Nếu có nhiều máy sử dụng NixOS, mình có thể tổ chức cấu hình theo từng host nhưng vẫn tái sử dụng những thành phần chung. Nhờ vậy, việc duy trì nhiều hệ thống không còn quá phụ thuộc vào các thao tác thủ công.
Reproducibility: Lý do lớn nhất khiến mình chọn NixOS
Đây có lẽ là vấn đề khiến mình đau đầu nhất trong quá trình nghiên cứu và phát triển các dự án AI.
Mình từng gặp rất nhiều vấn đề liên quan đến thư viện khi cần chạy lại các paper hoặc tiếp tục phát triển những dự án cũ. Có những dự án yêu cầu phiên bản Python cụ thể, một phiên bản CUDA nhất định hoặc những thư viện chỉ tương thích với một số phiên bản framework nhất định.
Khi môi trường hiện tại không còn tương thích, mình đôi khi phải tìm cách dựng lại môi trường giống hệt với môi trường ban đầu.
Và nếu cần tái tạo cả hệ điều hành, phiên bản thư viện hệ thống và các dependency liên quan thì đó quả thật là một cực hình 🙂
Đây là lúc mình nhận ra giá trị của reproducibility — khả năng tái tạo môi trường một cách nhất quán.
Với Nix, mình có thể khai báo các dependency cần thiết và xây dựng môi trường phát triển riêng cho từng dự án, thay vì phải thay đổi liên tục môi trường hệ thống.
Ví dụ, mình có thể sử dụng nix develop để tạo một development shell chứa những công cụ cần thiết cho dự án. Khi thoát khỏi shell, mình không cần giữ toàn bộ các công cụ đó trong môi trường làm việc thường ngày.
Một cấu hình development shell có thể được lưu cùng repository, cho phép những người khác sử dụng cùng cấu hình để xây dựng môi trường tương ứng trên máy của họ.
Điều này đặc biệt hữu ích khi mình muốn chia sẻ dự án, chuyển sang một máy tính khác hoặc quay lại nghiên cứu một paper sau nhiều tháng.
Dĩ nhiên, Nix không tự động bảo đảm mọi thứ đều tái tạo hoàn hảo. Những thành phần phụ thuộc vào phần cứng, driver, dịch vụ bên ngoài hoặc dependency không được khóa phiên bản vẫn có thể gây ra khác biệt. Nhưng ít nhất, Nix giúp mình kiểm soát môi trường tốt hơn rất nhiều.
NixOS không dành cho tất cả mọi người
Tuy nhiên, mình không nghĩ NixOS là lựa chọn phù hợp với tất cả mọi người.
NixOS rất tiện lợi khi đã hiểu được cách hoạt động của hệ thống, nhưng ban đầu có thể khiến người dùng mất khá nhiều thời gian để làm quen với Nix language, flakes, cách quản lý package và mô hình cấu hình khai báo.
Thậm chí, mình đã thấy không ít người chuyển từ Arch Linux sang NixOS rồi cuối cùng lại quay về Arch.
Và điều đó hoàn toàn bình thường.
Mỗi hệ điều hành đều có những ưu điểm, hạn chế và triết lý thiết kế riêng. Một hệ thống phù hợp với người này chưa chắc đã phù hợp với người khác.
Đối với mình, điều quan trọng nhất không phải là sử dụng hệ điều hành nào đang phổ biến, mà là tìm được một môi trường khiến mình cảm thấy thoải mái, có thể kiểm soát và đồng hành lâu dài trong công việc.
Tìm một hệ điều hành phù hợp với tính cách của mình cũng giống như tìm một người bạn đời vậy — nơi ta cảm thấy an toàn và có thể đồng hành cùng nhau :)))
P/S
Mình vẫn dùng Windows để chơi LOL nha =)))
Cơ mà dạo này mình muốn dùng NixOS làm hệ điều hành chính vì thích cách nó quản lý cấu hình và môi trường phát triển hơn.
Còn nếu chỉ làm data science hoặc chạy những tác vụ thông thường thì Windows kết hợp với WSL vẫn dư sức đáp ứng nhu cầu của mình.
Cuối cùng, công cụ chỉ là công cụ. Chọn thứ phù hợp với công việc và cách mình làm việc vẫn là quan trọng nhất!
