lvm và mdadm là hai tiện ích có mục đích tương tự nhưng nguyên lý lại hoàn toàn khác nhau, được thiết kế để xử lý dữ liệu đĩa. Điểm giống nhau nằm ở chỗ cả lvm và mdadm đều phân phối dữ liệu giữa các ổ đĩa ở cấp độ phần mềm. Nghĩa là, chúng ta có thể tạo một mảng RAID phần mềm hoặc đĩa lvm chỉ bằng khả năng của hệ điều hành , không có phần cứng bổ sung. Để hiểu sự khác biệt, trước tiên chúng ta hãy tìm hiểu từng công nghệ một.
- LVM – logical volume manager
- RAID – Redundant Arrays of Independent Disks
- Có thể sử dụng mdadm và lvm cùng một lúc không?
- Tạo mảng RAID
- Kiểm tra trạng thái của mảng RAID
- Thêm/Bớt ổ đĩa/partition trong mảng RAID
- Mảng RAID đột nhiên không hoạt động
- Xóa mảng RAID
- Tự động dò tìm và ghép mảng RAID
- Mount ổ RAID qua fstab
- Nhận xét
LVM – logical volume manager ↑
LVM, ứng dụng là lvm2, là một lớp trừu tượng giữa bộ điều khiển đĩa và hệ điều hành. Trên thực tế, nó là một hệ thống con, theo đó người dùng có thể kết hợp không gian của nhiều đĩa thành một ổ đĩa, sau đó phân vùng nó thành nhiều đĩa logic.
LVM cho phép chúng ta tự động thêm các đĩa mới để tăng bộ nhớ khả dụng, quản lý linh hoạt các đĩa ở cấp độ vật lý (thêm đĩa mà không dừng máy chủ, NAS hoặc máy tính). Tuy LVM là một tính năng rất tiện dụng nhưng LVM không cung cấp bất kỳ dự phòng nào.
LVM có thể tương đồng với mảng RAID bằng cách sử dụng các giải pháp của nó, nhưng chúng sẽ kém hiệu suất nghiêm trọng hoặc sẽ chuyển các lệnh tới tiện ích md , tức là chính thiết bị mdrai.
RAID – Redundant Arrays of Independent Disks ↑
mdadm là một tiện ích hệ điều hành Linux đặc biệt với mục đích chính là tạo và quản lý các mảng RAID . Nghĩa là, mục đích chính của mdadm là cung cấp dự phòng, nghĩa là cứu dữ liệu nếu một hoặc nhiều đĩa bị lỗi (tùy thuộc vào loại RAID được chọn). Về nguyên tắc, mdadm giao tiếp với các đĩa và phân phối dữ liệu giữa chúng ở cấp độ vật lý, hoàn toàn không liên quan gì đến việc phân vùng logic của các đĩa, tuy nhiên raid mở rộng làm việc với các partition. Toàn bộ mảng RAID của một số đĩa được hiển thị trong hệ điều hành dưới dạng một ổ đĩa riêng biệt có thể được thao tác giống như một ổ đĩa thông thường.
Tóm tắt
Ưu điểm của LVM :
- phân bổ linh hoạt không gian đĩa;
- bổ sung đĩa động (không dừng máy chủ);
Nhược điểm của LVM :
- độ phức tạp của quản trị (yêu cầu biết nhiều lệnh và tiện ích);
- rất khó thay thế các đĩa trong một mảng;
- các mảng được tạo bằng LVM sẽ chậm hơn;
- không nên sử dụng chúng trên ổ SSD;
- cần phải biết hệ thống tệp nào có thể được sử dụng và hệ thống nào không mong muốn;
- nhiều hệ điều hành không hỗ trợ LVM;
Những lợi thế của mdadm :
- mảng RAID nhanh tối đa;
- bổ sung ổ đĩa động cho mảng RAID (sử dụng đĩa dự phòng nóng);
- thay thế đĩa bị lỗi nhanh chóng và dễ dàng;
- quản trị dễ dàng (nhờ trình bao đồ họa Webmin);
Nhược điểm của mdadm :
- người dùng không thể phân bổ linh hoạt dung lượng đĩa (thực tế bị giới hạn bởi dung lượng đĩa và loại RAID được sử dụng);
Có thể sử dụng mdadm và lvm cùng một lúc không? ↑
Cách tốt nhất để tạo mảng RAID là sử dụng tiện ích mdadm . Tuy nhiên, nếu muốn có sự linh hoạt trong việc tạo volume cũng như độ tin cậy, có thể sử dụng LVM over RAID . Nghĩa là, trước tiên tạo một RAID thuộc loại được yêu cầu (ví dụ: RAID 5) rồi sử dụng lvm để tạo một số ổ đĩa logic.
Nó sẽ cung cấp độ tin cậy và tốc độ, ngoài ra chúng ta có thể phân vùng không gian đĩa tùy ý. Hơn nữa, nếu cần thêm một đĩa mới vào hệ thống, chúng ta có thể làm điều đó với mdadm.
Chú ý: Nếu dùng kết hợp RAID với LVM chúng ta phải tạo RAID trước sau đó tạo LVM trên ổ đĩa RAID. Nếu làm ngược lại, chúng ta sẽ gặp vô vàn khó khăn để quản lý mảng RAID mà nó cũng không được nhanh; cuối cùng là rất khó thay đĩa.
Tạo mảng RAID ↑
Với mục đích lưu trữ dữ liệu an toàn và đơn giản, chúng ta có thể để OS ở ổ đĩa khác, mảng RAID chỉ chứa data. Tuy nhiên cũng không quá phức tạp khi chừa ra 2 partition cho boot và rootfs trên một ổ đĩa và chỉ RAID phần còn lại, khi đó không cần nạp phần mềm mdadm trước khi boot.
Có 2 cách tạo mảng RAID: không mất dữ liệu đã có hoặc ứng dụng cho các ổ đĩa mới.
Giả sứ sda có dữ liệu, sdb có thể xóa. Khởi động từ mmcblk0. Chúng ta tạo mảng RAID1 cho sda và sdb.
A. Tạo RAID1 không cần bảo toàn dữ liệu
lsblk -o NAME,SIZE,FSTYPE,TYPE,MOUNTPOINT
# Output
NAME SIZE FSTYPE TYPE MOUNTPOINT
sda 100G disk
sdb 100G disk
mmcblk0 29.4G disk
├─mmcblk0p1 256M vfat part /boot
└─mmcblk0p2 29.2G ext4 part /
sudo mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sda /dev/sdb
mdadm
sẽ cấu hình mảng, mất một ít thời gian. Chúng ta có thể theo dõi quá trình này qua file /proc/mdstat
. Khi quá trình nay hoàn tất, thực hiện các bước tiếp theo:
# Format ổ RAID
sudo mkfs.ext4 -F /dev/md0
# Mount ổ RAID
sudo mkdir -p /mnt/md0
sudo mount /dev/md0 /mnt/md0
# Xem dung lượng
df -h -x devtmpfs -x tmpfs
# Output
Filesystem Size Used Avail Use% Mounted on
/dev/root 29G 1.6G 26G 6% /
/dev/mmcblk0p1 255M 31M 225M 12% /boot
/dev/md0 196G 61M 186G 1% /mnt/md0
Để chắc là mảng RAID được tái tạo khi boot, chúng ta phải lưu cấu hình RAID vào file /etc/mdadm/mdadm.conf
Trước khi điều chỉnh file cấu hình, phải chắc là quá trình tạo mảng RAID hoàn tất. Ngoài ra còn phải cập nhật initramfs để mảng RAID sẳn sàng trong quá trình khởi động.
# Cập nhật cấu hình RAID
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
# Cập nhật initramfs
sudo update-initramfs -u
Để ổ đĩa RAID được mount khi khởi động, cần phải thêm vào file fstab:
echo '/dev/md0 /mnt/md0 ext4 defaults,nofail,discard 0 0' | sudo tee -a /etc/fstab
B. Tạo RAID không mất dữ liệu
Khi tạo RAID, cho dù 1 đĩa, sau đó cũng phải format ổ đĩa RAID. Vì vậy đĩa tạo RAID ban đầu phải không chứa dữ liệu cần bảo vệ. Sau khi tạo xong ổ đĩa RAID, dữ liệu được sao chép sang. Cuối cùng chúng ta ghép ổ đĩa thứ 2 vào mảng RAID. Ổ thứ 2 này sẽ được mdadm sync data từ ổ đĩa thứ nhất sang (quá trình recovery) vì vậy không cần có trước dữ liệu cần thiết. Quá trình recovery rất lâu, có thể chạy qua đêm, nên chúng ta cần lưu cấu trúc mảng RAID trước. Ngoài ra, trong quá trình recovery, ổ đĩa RAID vẫn được sử dụng bình thường.
Giả sử sda đã có dữ liệu. Chúng ta tạo RAID cho sdb trước, sao chép dữ liệu từ sda vào mảng RAID md0, rồi thêm sda vào sau. Tuy nhiên lần này chúng ta làm việc với partition chứ không phải toàn bộ đĩa.
Trước hết chúng ta chuyển cấu trúc đĩa của sda sang sdb. Quá trình này sẽ gặp lỗi nếu dung lượng sdb nhỏ hơn sda. Khi đó chúng ta phải co lại một chút partition cuối cùng trên sda cho vừa dung lượng sdb bằng cách dùng resize2fs hay các công cụ chỉnh sửa partition khác.
# 1. Chuyển cấu trúc đĩa từ sda sang sdb
sfdisk -d /dev/sda | sfdisk --force /dev/sdb
# Xem lại cấu trúc đĩa sda và sdb nếu cần
fdisk -l
Tạo mảng md0, md1, md2 tương ứng với sdb1, sdb2, sdb3. Chú ý là chỉ có sdbX trong mảng. Sau đó format mảng tương ứng.
# 2. Tạo RAID1 gồm 1 ổ đĩa
mdadm --create --verbose /dev/md0 --force --level=1 --raid-devices=1 /dev/sdb1
# 3. Định dạng md0
mkfs.ext4 /dev/md0
Mount sda1, md0 và copy dữ liệu sang
# 4. mount sda1, md0
mkdir /mnt/sda1
mount /dev/sda1 /mnt/sda1
mkdir /mnt/md0
mount /dev/md0 /mnt/dm0
# 5. sync data từ sda1 sang md0 (?)
rsync -axcHAWXS -delete --numeric-ids --info=progress2 /mnt/sda1/ /mnt/md0/
Nếu dữ liệu nhiều và đang làm việc trên remote console, để tránh quá trình sync bị ngắt giữa chừng có thể gọi lệnh rsync trong tmux.
Sau đó umount cả 2 để chuẩn bị thêm sda1 vào mảng md0
# 6. umount sda1 và md0
umount /dev/sda1
umount /dev/md0
# 7. Thêm sda1 vào mảng RAID md0
mdadm --grow /dev/md0 --raid-devices=2 --add /dev/sda1
# 8. Ghi lại cấu hình RAID
cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.bak
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
# 9. Cập nhật fstab để tự động mount md0 khi khởi động
echo '/dev/md0 /mnt/md0 ext4 defaults,nofail,discard 0 0' | sudo tee -a /etc/fstab
# >> Có thể theo dõi quá trình recovery mảng RAID md0 qua lệnh
watch cat /proc/mdstat
# >> Tuy nhiên recovery có thể rất lâu, nên cần để mdadm tự lo
=> Làm tương tự các partition khác. Kiểm tra từng bước với lệnh lsblk.
Sau cùng cập nhật initramfs
# 10. Cập nhật initramfs
update-initramfs -u
Khởi động lại để hoàn tất.
Kiểm tra trạng thái của mảng RAID ↑
Có một số cách để kiểm tra trạng thái mảng RAID :
1. Kiểm tra tệp mdstat
Đó là một tệp thay đổi liên tục hiển thị trạng thái của mảng RAID.
cat /proc/mdstat
Trạng thái bình thường của mảng được hiển thị dưới dạng [UU] nếu mảng 2 ổ đĩa . Nếu bất kỳ đĩa nào bị lỗi, chỉ định này sẽ thay đổi thành [_U] , số lượng đĩa đang hoạt động sẽ được hiển thị là 2/1 (nghĩa là chỉ một trong hai đĩa đang hoạt động) và dòng trạng thái sẽ hiển thị quá trình khôi phục theo tỷ lệ phần trăm. Một ví dụ về một mảng lỗi được hiển thị bên dưới:
2. Kiểm tra tính toàn vẹn của phần mềm RAID
# Kiểm tra
echo 'check' > /sys/block/mdX/md/sync_action && echo OK || echo FAILED
# Dừng kiểm tra
echo 'idle' > /sys/block/mdX/md/sync_action
Trong đó mdX là mảng cần kiểm tra. Khi đó mdadm sẽ làm việc tương tự như khi sync giữa các ổ đĩa, quá trình này có thể rất lâu và làm chậm hoạt động toàn hệ thống.
3. Hiển thị thông tin chi tiết về mảng RAID
mdadm -D /dev/mdX
Thêm/Bớt ổ đĩa/partition trong mảng RAID ↑
1. Thêm đĩa/partition
# Thêm sdc vào mảng md2
mdadm /dev/md2 --add /dev/sdc
# Làm cho đĩa hoạt động trong mảng gồm 3 ổ đĩa
mdadm --grow /dev/md2 --raid-devices=3
2. Gở bỏ đĩa/partition
# Đánh dấu đĩa bị lỗi
mdadm /dev/md2 --fail /dev/sdc
# Gỡ đĩa ra khỏi mảng
mdadm /dev/md2 --remove /dev/sdc
3. Trường hợp đĩa/partition bị lỗi cần thay thế
# Xem thông tin về RAID
cat /proc/mdstat
Đĩa bị lỗi được đánh dấu [U_], thay thế như mô tả bên trên.
# Tháo đĩa lỗi
mdadm /dev/md2 --remove /dev/sdc
# Thêm đĩa mới
mdadm /dev/md2 --add /dev/sdd
Mảng RAID đột nhiên không hoạt động (sau khi reboot?) ↑
Đôi khi có những tình huống khi người dùng đã xây dựng mảng RAID, lưu một số dữ liệu, tắt máy tính và sau đó mở máy lại thì thấy mảng không hoạt động hoặc chuyển sang trạng thái không hoạt động. Mảng cũng có thể không hoạt động nếu có lỗi phần cứng hoặc mất điện. Tất cả các đĩa được đánh dấu là không hoạt động, nhưng không có lỗi trên đĩa. Nghĩa là, mọi thứ được thiết lập chính xác, nhưng mảng không hoạt động – tất cả các yêu cầu I/O đều gặp sự cố.
Xử lý theo các bước sau:
#1 Dừng mảng RAID
mdadm --stop /dev/md2
#2 Xây dựng lại mảng RAID
mdadm --assemble --scan --force
#3 Mount mảng RAID
sudo mount -a
Sau các bước trên, /dev/md2 đã hoạt động lại. Nếu không, phải xem xét riêng lẻ từng ổ đĩa và xây dựng lại mảng RAID
#1 Xây dựng lại mảng RAID
mdadm --assemble --scan
#2 Hiển thị thông tin về các mảng RAID, chú ý thứ tự đĩa
watch cat /proc/mdstat
#3 Dừng mảng md2
mdadm --stop /dev/md2
#4 Lập lại lệnh cho mỗi ổ đĩa/partition trong mảng md2
mdadm -E /dev/sd?X
Nếu có ổ đĩa/partition nào báo missing thì vấn đề nằm ở đó!
Thay thế ổ đĩa/partition bị lỗi (tắt máy trước), sau đó xây dựng lại mảng RAID md2
mdadm --create --verbose /dev/md2 --assume-clean --level=raid1 --raid-devices=2 --spare-devices=0 /dev/sda1 /dev/sda1
Quan trọng: Phải ghi thứ tự đĩa/partition như đã xây dựng trước đó.
Xóa mảng RAID ↑
# Trước khi xóa RAID, cần ngưng các tiến trình có dùng đến
# ổ này hoặc gở bỏ các Volume group trên ổ này.
umount /mnt/md1
mdadm --stop /dev/md1
mdadm --remove /dev/md1
# Xóa superblock
mdadm --zero-superblock /dev/sd{a,b}
# Sửa fstab các dòng mount /dev/md1
# Có thể phải reboot
Tự động dò tìm và ghép mảng RAID ↑
Vì một lý do nào đó, mảng RAID bị phân rã thành các ổ đĩa/partition, thậm chí bị ẩn một vài ổ đĩa/partition. Chạy lệnh sau đây để tự động dò tìm và ghép mảng RAID đã thiết lập trước đó:
mdadm --assemble --scan
Mount ổ đĩa RAID qua fstab ↑
Lỗi rất mệt là mỗi khi mount ổ đĩa RAID qua fstab thì không khởi động được, máy bận kiểm tra thiết bị/mạng nhiều giờ vẫn không kết thúc qui trình boot. Bỏ các lệnh mount ổ RAID trong fstab thì khởi động bình thường.
Chỉnh sửa fstab, thêm option nofail
/dev/md0 /mnt/md0 ext4 defaults,auto,nofail 0 1
và khởi động lại.
Nhận xét ↑
1. Hài lòng với RAID-1
- RPi4B 8GB RAM + 2 HDD WD Black P10 Game Drive 5TB RAID-1
- Về lý thuyết, tốc độ đọc x 2, tốc độ ghi giống như trên 1 ổ. Cảm nhận thực tế máy nhanh hơn rõ.
Backup trên Google Drive (chưa biết khi nào bị thu hồi)
2. Tránh thêm ổ đĩa/thẻ nhớ mới khi khởi động lại. Sự sai lệch tên ổ đĩa có thể làm sai cấu hình RAID, dẫn đến phải khôi phục rất mất thời gian. Có thể software RAID sẽ khắc phục lỗi này trong tương lai.