Giới Thiệu
Nix là một công cụ mạnh mẽ cho việc quản lý cấu hình hệ thống và phụ thuộc dự án. Trong bài viết này, chúng ta sẽ khám phá cách sử dụng Nix để cấu hình toàn bộ hệ thống của bạn, bao gồm các gói, thiết lập shell, cấu hình trình soạn thảo và cả các tùy chọn hệ thống macOS.
Thay vì duy trì các tệp dotfiles, danh sách brew và các kịch bản thiết lập trên nhiều kho chứa khác nhau, mọi thứ sẽ được lưu trữ ở một nơi và có thể áp dụng chỉ với một lệnh duy nhất.
Cấu Trúc Cấu Hình
Cấu hình của tôi nằm ở ~/.config/nix:
nix
nix-config/
├── flake.nix # Điểm vào
├── common/ # Chia sẻ giữa tất cả hệ thống
│ ├── packages.nix # Công cụ CLI
│ ├── zsh/ # Cấu hình shell
│ ├── neovim/ # Thiết lập trình soạn thảo
│ ├── tmux/ # Bộ chia màn hình terminal
│ └── claude-code/ # Tích hợp trợ lý AI
└── systems/
├── aarch64-darwin/ # Dành cho macOS
│ ├── homebrew.nix # Ứng dụng GUI
│ └── defaults.nix # Tùy chọn hệ thống
└── aarch64-linux/ # Dành cho Linux
└── home-linux.nix
Flake Chính
Dưới đây là flake.nix kết nối mọi thứ lại với nhau:
nix
{
description = "Cấu hình Nix đa nền tảng";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
nix-darwin = {
url = "github:LnL7/nix-darwin";
inputs.nixpkgs.follows = "nixpkgs";
};
home-manager = {
url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs = { self, nix-darwin, nixpkgs, home-manager, ... }: {
# Cấu hình macOS
darwinConfigurations = {
"rick" = nix-darwin.lib.darwinSystem {
system = "aarch64-darwin";
modules = [
./common
./systems/aarch64-darwin
home-manager.darwinModules.home-manager
{
home-manager = {
useGlobalPkgs = true;
useUserPackages = true;
users.svenlito = import ./systems/aarch64-darwin/home.nix;
};
}
];
};
};
# Cấu hình Linux
homeConfigurations = {
morty = home-manager.lib.homeManagerConfiguration {
pkgs = import nixpkgs { system = "aarch64-linux"; };
modules = [ ./systems/aarch64-linux/home-linux.nix ];
};
};
};
}
Quản Lý Gói Chung
Thay vì duy trì các trình quản lý gói riêng biệt, tôi có một tệp định nghĩa các công cụ CLI cốt lõi:
nix
# common/packages.nix
{ pkgs, ... }: {
home.packages = with pkgs; [
# Thay thế CLI hiện đại
eza # thay thế cho ls
bat # thay thế cho cat
ripgrep # thay thế cho grep
fd # thay thế cho find
zoxide # thay thế cho cd
# Công cụ phát triển
gh # CLI GitHub
lazygit # Git TUI
tmux # Bộ chia màn hình terminal
neovim # Trình soạn thảo
];
}
Tệp này được bao gồm trong cả cấu hình macOS và Linux. Cùng một công cụ, cùng một phiên bản, ở khắp mọi nơi.
Ứng Dụng GUI Trên macOS
Trên macOS, tôi sử dụng Homebrew cho các ứng dụng GUI:
nix
# systems/aarch64-darwin/homebrew.nix
homebrew = {
enable = true;
casks = [
"orbstack" # Thay thế Docker
"ghostty" # Terminal
"raycast" # Thay thế Spotlight
"1password"
"linear"
"slack"
"spotify"
"notion-calendar"
];
onActivation = {
autoUpdate = true;
cleanup = "zap"; # Xóa các casks không được liệt kê
};
};
Ngay cả các ứng dụng GUI cũng có thể được khai báo và quản lý phiên bản.
Tùy Chọn Hệ Thống macOS
Các tùy chọn hệ thống có thể được cấu hình dưới dạng mã:
nix
# systems/aarch64-darwin/defaults.nix
system.defaults = {
dock = {
autohide = true;
show-recents = false;
tilesize = 48;
};
NSGlobalDomain = {
AppleShowAllExtensions = true;
InitialKeyRepeat = 15;
KeyRepeat = 2;
};
finder = {
AppleShowAllExtensions = true;
ShowPathbar = true;
FXEnableExtensionChangeWarning = false;
};
};
Áp Dụng Cấu Hình
Trên macOS:
bash
# Nhân bản cấu hình
git clone https://github.com/svnlto/nix-config ~/.config/nix
cd ~/.config/nix
# Áp dụng (tự động phát hiện tên máy)
nixswitch
Trên Linux:
bash
# Nhân bản cấu hình
git clone https://github.com/svnlto/nix-config ~/.config/nix
cd ~/.config/nix
# Áp dụng (tự động phát hiện tên máy - đảm bảo tên máy khớp với cấu hình trong flake.nix)
home-manager switch --flake .#$(hostname)
Chỉ cần một lệnh để cài đặt và cấu hình:
- Tất cả các công cụ CLI
- Môi trường shell (zsh, alias, prompt)
- Thiết lập trình soạn thảo (Neovim với LSP)
- Bộ chia màn hình terminal (tmux)
- Ứng dụng GUI (macOS)
- Tùy chọn hệ thống (macOS)
Lệnh Tùy Chỉnh
Tôi đã thêm các lệnh trợ giúp trong cấu hình zsh của mình:
nix
# systems/aarch64-darwin/home.nix
shellAliases = {
# xây dựng lại hệ thống macOS (tự động phát hiện tên máy)
nixswitch = "sudo darwin-rebuild switch --flake ~/.config/nix#$(scutil --get LocalHostName)";
# Cập nhật và xây dựng lại
nix-upgrade = "nix flake update ~/.config/nix && nixswitch";
# xây dựng lại quản lý nhà ở Linux (tự động phát hiện tên máy)
hmswitch = "home-manager switch --flake ~/.config/nix#$(hostname)";
hm-upgrade = "cd ~/.config/nix && nix flake update && hmswitch";
};
Bây giờ nixswitch sẽ xây dựng lại toàn bộ hệ thống macOS của tôi, và hmswitch sẽ xử lý các cấu hình Linux.
Hỗ Trợ Khôi Phục
Mỗi thay đổi tạo ra một thế hệ mới. Nếu có gì đó bị lỗi:
bash
# Trên macOS
sudo darwin-rebuild rollback
# Trên Linux
home-manager generations # Liệt kê các phiên bản có sẵn
home-manager switch --switch-generation 42
Khôi phục nguyên tử cho cấu hình hệ thống.
Quy Trình Quản Lý Cấu Hình
Quy trình làm việc của tôi:
- Chỉnh sửa các tệp cấu hình trong
~/.config/nix - Chạy
nixswitch(macOS) hoặchmswitch(Linux) - Thay đổi được áp dụng ngay lập tức
- Nếu có gì đó bị lỗi, quay lại thế hệ trước đó
Tất cả thay đổi đều được lưu trong git, vì vậy tôi cũng có thể hoàn tác các commit nếu cần.
Tại Sao Điều Này Hoạt Động
Sử dụng cùng một công cụ cho cả cấu hình dự án và hệ thống có nghĩa là:
- Một ngôn ngữ (Nix) cho tất cả quản lý môi trường
- Cấu hình hệ thống được quản lý phiên bản
- Thiết lập có thể tái tạo trên các máy
- Dễ dàng onboarding (nhân bản kho, chạy một lệnh)
- Khôi phục nguyên tử nếu có gì đó bị lỗi
Tệp flake.nix trong mỗi dự án định nghĩa các phụ thuộc dự án. Tệp flake.nix trong ~/.config/nix định nghĩa các phụ thuộc hệ thống: cùng một mẫu, cùng một công cụ, nhưng phạm vi khác nhau.
Bắt Đầu
- Cài đặt Nix:
bash
sh <(curl -L https://nixos.org/nix/install)
- Kích hoạt flakes trong
~/.config/nix/nix.conf:
nix
experimental-features = nix-command flakes
-
Fork hoặc nhân bản một cấu hình khởi động (như của tôi)
-
Tùy chỉnh theo nhu cầu của bạn
-
Chạy
nixswitch(macOS) hoặchmswitch(Linux)
Cấu hình đầy đủ của tôi: github.com/svnlto/nix-config