0
0
Lập trình
Admin Team
Admin Teamtechmely

Cấu Hình Toàn Bộ Hệ Thống Với Nix: Hướng Dẫn Chi Tiết

Đăng vào 3 tuần trước

• 7 phút đọc

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 Copy
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 Copy
{
  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 Copy
# 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 Copy
# 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 Copy
# 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 Copy
# 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 Copy
# 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 Copy
# 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 Copy
# 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:

  1. Chỉnh sửa các tệp cấu hình trong ~/.config/nix
  2. Chạy nixswitch (macOS) hoặc hmswitch (Linux)
  3. Thay đổi được áp dụng ngay lập tức
  4. 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

  1. Cài đặt Nix:
bash Copy
sh <(curl -L https://nixos.org/nix/install)
  1. Kích hoạt flakes trong ~/.config/nix/nix.conf:
nix Copy
experimental-features = nix-command flakes
  1. Fork hoặc nhân bản một cấu hình khởi động (như của tôi)

  2. Tùy chỉnh theo nhu cầu của bạn

  3. Chạy nixswitch (macOS) hoặc hmswitch (Linux)


Cấu hình đầy đủ của tôi: github.com/svnlto/nix-config

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào