Lưu trữ HomeLab linh hoạt: Triển khai SnapRAID và MergerFS trên Ubuntu Server

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

Nỗi phiền toái khi sử dụng các ổ cứng không đồng nhất về dung lượng

Hầu hết những người đam mê HomeLab đều bắt đầu theo cùng một cách: một ngăn kéo đầy những ổ cứng cũ. Bạn có thể có một ổ 2TB từ máy tính để bàn cũ, một ổ 4TB mua lúc giảm giá, và có lẽ là một ổ 10TB bạn vừa mới “mạnh tay” đầu tư.

Khi bạn quyết định xây dựng một máy chủ lưu trữ tập trung, bạn sẽ vấp phải một rào cản lớn. Các cấp độ RAID truyền thống như RAID 5 hoặc RAID 6 yêu cầu tất cả các ổ đĩa phải có cùng dung lượng. Nếu bạn lắp các ổ 2TB, 4TB và 10TB vào một mảng RAID 5 tiêu chuẩn, mọi ổ đĩa sẽ bị coi như là ổ 2TB, gây lãng phí một lượng không gian lưu trữ khổng lồ.

Tôi đã gặp đúng kịch bản này khi xây dựng máy chủ media đầu tiên của mình. Tôi có một tập hợp các ổ đĩa với độ tuổi và dung lượng khác nhau. Tôi muốn có cơ chế dự phòng dữ liệu, nhưng tôi không muốn phải mua năm ổ 10TB giống hệt nhau chỉ để bắt đầu. Tôi cần một hệ thống có thể mở rộng dần khi tôi tìm được các đợt giảm giá phần cứng, mà không bắt buộc tôi phải xóa sạch dữ liệu mỗi khi thêm một ổ đĩa mới.

Nguyên nhân gốc rễ: Tại sao RAID truyền thống không phù hợp cho người dùng HomeLab

Vấn đề cốt lõi nằm ở cơ chế phân mảnh dữ liệu ở cấp độ khối (block-level striping). Các hệ thống như ZFS hoặc các bộ điều khiển RAID phần cứng chia nhỏ dữ liệu thành các mảnh và phân tán chúng trên tất cả các đĩa. Điều này rất tuyệt vời cho các môi trường doanh nghiệp hiệu suất cao, nơi tốc độ là ưu tiên hàng đầu. Tuy nhiên, nó tạo ra ba vấn đề lớn cho môi trường gia đình:

  • Tính cứng nhắc: Bạn không thể dễ dàng thêm một ổ đĩa đơn lẻ vào vdev ZFS hiện có hoặc mảng RAID 5 mà không gặp phải sự phức tạp hoặc rủi ro đáng kể.
  • Tình trạng quay đĩa (Disk Spin-up): Trong một mảng RAID, mọi ổ đĩa đều phải quay để đọc ngay cả một tệp văn bản nhỏ. Điều này làm tăng mức tiêu thụ điện năng, nhiệt độ và độ hao mòn của ổ đĩa.
  • Lỗi mất trắng (All-or-Nothing Failure): Nếu bạn mất nhiều ổ đĩa hơn mức cho phép của cơ chế parity (ví dụ: hỏng hai ổ trong RAID 5), toàn bộ mảng dữ liệu sẽ bị mất. Dữ liệu trên các ổ đĩa còn lại sẽ trở thành rác không thể phục hồi vì chúng chỉ chứa các mảnh vụn của tệp tin.

So sánh các giải pháp

Trước khi chốt phương án hiện tại, tôi đã xem xét một vài lựa chọn thay thế. UnRAID là một lựa chọn phổ biến vì nó xử lý các ổ đĩa hỗn hợp rất tốt, nhưng nó là phần mềm mã nguồn đóng và yêu cầu trả phí bản quyền. TrueNAS (ZFS) cực kỳ ổn định và giàu tính năng, nhưng yêu cầu phần cứng và các quy tắc mở rộng cứng nhắc khiến nó không phù hợp với những người làm HomeLab có ngân sách hạn chế và sở hữu các ổ đĩa không đồng nhất.

Điều này dẫn tôi đến sự kết hợp giữa MergerFSSnapRAID. MergerFS đảm nhận việc “gộp ổ” (pooling – làm cho nhiều ổ đĩa trông như một ổ lớn duy nhất), trong khi SnapRAID đảm nhận việc tạo “mã kiểm tra” (parity – bảo vệ dữ liệu của bạn trước lỗi ổ cứng). Tôi đã áp dụng cách tiếp cận này trong thực tế và kết quả luôn ổn định, mang lại sự cân bằng hoàn hảo giữa tính linh hoạt và độ an toàn.

Cách tiếp cận tốt nhất: Ngăn xếp lưu trữ hai lớp

Chúng ta sẽ xây dựng một hệ thống nơi dữ liệu của bạn nằm trên các hệ thống tệp Linux tiêu chuẩn (như Ext4 hoặc XFS). Điều này có nghĩa là ngay cả khi hệ điều hành bị lỗi, bạn vẫn có thể cắm bất kỳ ổ đĩa nào vào một máy tính khác và đọc dữ liệu trực tiếp. Chúng ta sẽ sử dụng MergerFS để tạo một điểm gắn kết (mount point) thống nhất và SnapRAID để tính toán parity theo lịch trình.

Bước 1: Chuẩn bị các ổ đĩa

Trong hướng dẫn này, giả sử bạn có ba ổ đĩa dữ liệu và một ổ đĩa parity. Quan trọng: Ổ đĩa parity của bạn phải có dung lượng bằng hoặc lớn hơn ổ đĩa dữ liệu lớn nhất.

Xác định các ổ đĩa của bạn bằng lệnh lsblk. Giả sử chúng đã được định dạng và gắn kết tại:

  • /mnt/disk1 (4TB Dữ liệu)
  • /mnt/disk2 (4TB Dữ liệu)
  • /mnt/disk3 (8TB Dữ liệu)
  • /mnt/parity1 (8TB Parity)

Bước 2: Cài đặt và cấu hình MergerFS

MergerFS là một hệ thống tệp hợp nhất dựa trên FUSE. Nó không thay đổi dữ liệu của bạn; nó chỉ tạo ra một giao diện ảo cho chúng. Cài đặt trên Ubuntu:

sudo apt update
sudo apt install mergerfs

Bây giờ, chúng ta chỉnh sửa tệp /etc/fstab để tạo pool. Chúng ta muốn kết hợp tất cả các đĩa bắt đầu bằng “disk” vào một thư mục duy nhất có tên là /mnt/storage.

# Cấu hình /etc/fstab cho MergerFS
/mnt/disk* /mnt/storage fuse.mergerfs defaults,nonempty,allow_other,use_ino,cache.files=off,moveonenospc=true,dropcacheonclose=true,category.create=mfs 0 0

Tùy chọn category.create=mfs (Most Free Space) yêu cầu MergerFS ghi các tệp mới vào ổ đĩa có nhiều không gian trống nhất. Điều này giúp cân bằng việc sử dụng ổ đĩa của bạn một cách tự động.

Gắn kết (mount) pool:

sudo mkdir /mnt/storage
sudo mount -a

Bước 3: Cài đặt và cấu hình SnapRAID

SnapRAID không phải là RAID thời gian thực. Nó tính toán thông tin parity dựa trên các tệp của bạn và lưu trữ nó trên ổ đĩa parity. Điều này hoàn hảo cho các thư viện media nơi các tệp không thay đổi liên tục.

Cài đặt SnapRAID:

sudo apt install snapraid

Bây giờ, hãy cấu hình SnapRAID bằng cách chỉnh sửa /etc/snapraid.conf. Bạn cần xác định nơi đặt tệp parity, nơi đặt các tệp nội dung (database) và các ổ đĩa dữ liệu của bạn nằm ở đâu.

# Vị trí file parity
parity /mnt/parity1/snapraid.parity

# Vị trí file nội dung (Nên lưu nhiều bản sao trên các ổ đĩa khác nhau!)
content /var/snapraid/snapraid.content
content /mnt/disk1/.snapraid.content
content /mnt/disk2/.snapraid.content

# Các ổ đĩa dữ liệu
data d1 /mnt/disk1/
data d2 /mnt/disk2/
data d3 /mnt/disk3/

# Loại trừ các tệp tạm thời và thùng rác
exclude /lost+found/
exclude /tmp/
exclude .AppleDB
exclude .Thumbs.db

Bước 4: Chạy đồng bộ hóa lần đầu

Sau khi cấu hình xong, bạn cần tạo parity. Quá trình này sẽ mất thời gian tùy thuộc vào lượng dữ liệu bạn đã có trên các ổ đĩa.

snapraid sync

Nếu một ổ đĩa bị hỏng trong tương lai, bạn chỉ cần thay thế nó và chạy lệnh snapraid fix. Vì SnapRAID hoạt động ở cấp độ tệp, nếu bạn mất nhiều ổ đĩa hơn số lượng parity cho phép, bạn chỉ mất các tệp trên những ổ đĩa bị hỏng đó. Mọi thứ khác vẫn hoàn toàn nguyên vẹn.

Tự động hóa bảo trì

Nhược điểm duy nhất của SnapRAID là nó không tự động. Nếu bạn thêm tệp vào /mnt/storage, chúng sẽ không được bảo vệ cho đến khi bạn chạy lại snapraid sync. Tôi khuyên bạn nên thiết lập một cron job hoặc một systemd timer để chạy đồng bộ hóa hàng ngày.

Tạo một script đơn giản tại /usr/local/bin/snapraid-maintenance.sh:

#!/bin/bash
# Đồng bộ hóa mảng
snapraid sync
# Kiểm tra dữ liệu để phát hiện bit rot (kiểm tra 8% dữ liệu của mảng)
snapraid scrub -p 8 -o 10

Cấp quyền thực thi và thêm nó vào crontab của bạn:

sudo chmod +x /usr/local/bin/snapraid-maintenance.sh
(crontab -l ; echo "0 3 * * * /usr/local/bin/snapraid-maintenance.sh") | crontab -

Thiết lập này sẽ chạy mỗi đêm vào lúc 3:00 sáng, đảm bảo dữ liệu của bạn được bảo vệ và kiểm tra lỗi “bit rot” — một hiện tượng dữ liệu bị xuống cấp theo thời gian trên đĩa vật lý.

Tổng kết quy trình làm việc

Trải nghiệm của tôi với thiết lập này cực kỳ suôn sẻ. Khi tôi hết dung lượng vào năm ngoái, tôi chỉ cần mua một ổ đĩa 12TB mới, định dạng nó, gắn kết vào /mnt/disk4 và cập nhật tệp snapraid.conf. MergerFS tự động nhận diện nó nhờ ký tự đại diện (/mnt/disk*) trong fstab. Không cần xây dựng lại mảng, không áp lực và không có thời gian gián đoạn. Theo ý kiến của tôi, đây là giải pháp lưu trữ tối ưu cho bất kỳ HomeLab nào coi trọng tính linh hoạt hơn là hiệu suất thuần túy của doanh nghiệp.

Share: