Khôi phục máy chủ gia đình sau sự cố thẻ SD: Câu chuyện sinh tồn với NixOS
Máy chủ gia đình Raspberry Pi 4B gặp sự cố khi thẻ microSD chết sau nhiều năm hoạt động 24/7. Tác giả xây dựng lại với NixOS, zram, btrfs RAID1 trên các ổ HDD cũ và quản lý subvolume khai báo.
Máy chủ gia đình Raspberry Pi 4B đã chết khi thẻ microSD cuối cùng cũng hỏng sau nhiều năm hoạt động 24/7. Tác giả, đang chạy NixOS, đã tận dụng sự cố này để xây dựng lại với trọng tâm là độ bền và dự phòng — và ghi lại toàn bộ quá trình.
Nguyên nhân gốc rễ là thẻ microSD bị chết, có khả năng do mất điện gây ra cú đánh cuối cùng. Tác giả đã có rất ít biện pháp phòng ngừa để giảm thiểu ghi, và thẻ đã được gắn làm hệ thống tệp gốc trong nhiều năm. Mất mát thực sự chỉ là các tệp .torrent và bộ nhớ đệm dịch vụ — tất cả đều có thể tái tạo dễ dàng. Bài học thực sự: Thẻ SD không phù hợp để làm hệ thống tệp gốc lâu dài trên máy chủ.
Giảm thiểu ghi vào thẻ SD
Thiết lập mới sử dụng zram cho swap thay vì swap vào thẻ microSD. zram tạo một thiết bị khối nén trong RAM, nhanh hơn nhiều và tránh làm mòn thẻ. Tác giả cũng cấu hình /tmp như một đĩa RAM và đặt journald lưu trữ nhật ký trong bộ nhớ (storage = "volatile"). Hệ thống tệp gốc được gắn với noatime để ngăn các cập nhật thời gian truy cập gây ghi.
{
zramSwap.enable = true;
boot.tmp.useTmpfs = true;
services.journald.storage = "volatile";
fileSystems."/" = {
device = "/dev/disk/by-label/takodachi";
fsType = "ext4";
options = [ "noatime" ];
};
}Btrfs RAID1 trên các ổ thu gom
Thay vì mua phần cứng mới trong thị trường bị đẩy giá bởi nhu cầu AI, tác giả đã tận dụng hai ổ HDD 2.5" cũ — một 500GB và một 320GB — thành một pool btrfs RAID1. Pool được đặt tên là "ponkotsu" (tiếng Nhật có nghĩa là "đồ bỏ đi"). Btrfs được chọn vì tính linh hoạt: subvolume, mở rộng trực tuyến và hỗ trợ ổ có kích thước khác nhau.
sudo mkfs.btrfs --data raid1 --metadata raid1 --label ponkotsu /dev/sdX /dev/sdYQuản lý Subvolume khai báo với NixOS
Tác giả đã tạo một module NixOS tùy chỉnh có tên autosubvol để quản lý subvolume btrfs theo cách khai báo cho từng dịch vụ. Mỗi subvolume có đơn vị gắn systemd riêng, với các phụ thuộc gắn với dịch vụ mà nó hỗ trợ. Điều này giữ cho cấu hình sạch sẽ và đảm bảo subvolume được tạo tự động khi khởi động lần đầu.
{
services.autosubvol = {
enable = true;
disks.ponkotsu = {
device = "/dev/disk/by-uuid/<pool uuid>";
subvolumes.immich = {
mountPoint = "/var/lib/immich";
mountOptions = [ "noatime" ];
requiredBy = [ "immich-server.service" ];
};
};
};
}Sao lưu với Restic và sops-nix
Sao lưu được xử lý bởi một module Nix kết nối sops-nix (cho bí mật) với module restic nixpkgs. Thư mục dữ liệu của mỗi dịch vụ được sao lưu vào bucket S3, với các quy tắc cắt tỉa để giữ các ảnh chụp hàng ngày, hàng tuần và hàng tháng. Tác giả cũng tạo một subvolume cho /var/cache để giữ dữ liệu dễ bay hơi khỏi thẻ SD.
{
internal.backups.restic.immich = {
paths = [ "/var/lib/immich" ];
exclude = [
"/var/lib/immich/encoded-video"
"/var/lib/immich/thumbs"
];
pruneOpts = [
"--keep-daily 7"
"--keep-weekly 4"
"--keep-monthly 3"
];
};
}Cách tiếp cận mang tính thực dụng: sử dụng những gì bạn có, tự động hóa mọi thứ và coi thẻ SD như vật dụng có thể vứt bỏ. Cấu hình NixOS đầy đủ và module autosubvol có sẵn trong kho Git của tác giả.
Thảo luận
0 bình luận
Hãy là người đầu tiên thảo luận.