Thay thế ổ đĩa bị lỗi trong mảng mdadm trên Ubuntu
Đã xuất bản: lúc 22:03:13 UTC 15 tháng 2, 2025
Nếu bạn đang trong tình huống đáng sợ là ổ đĩa trong mảng RAID mdadm bị lỗi, bài viết này sẽ giải thích cách thay thế ổ đĩa đúng cách trên hệ thống Ubuntu.
Replacing a Failed Drive in an mdadm Array on Ubuntu
Thông tin trong bài đăng này dựa trên Ubuntu 18.04 và phiên bản mdadm có trong kho lưu trữ của nó; tại thời điểm viết bài này là v4.1-rc1. Thông tin này có thể hoặc không hợp lệ với các phiên bản khác.
Gần đây, máy chủ tệp tại nhà của tôi đột nhiên bị hỏng ổ đĩa, bao gồm chín ổ đĩa trong một mảng mdadm RAID-6. Điều đó luôn đáng sợ, nhưng may mắn thay, tôi có thể nhanh chóng tìm được ổ đĩa thay thế đã được giao vào ngày hôm sau để tôi có thể bắt đầu xây dựng lại.
Tôi thừa nhận là mình hơi keo kiệt khi thiết lập máy chủ tệp ban đầu; chỉ có hai ổ đĩa là ổ NAS thực sự (Seagate IronWolf), trong khi những ổ còn lại là ổ đĩa để bàn (Seagate Barracuda). Không có gì ngạc nhiên khi đó là một trong những ổ đĩa để bàn đã hỏng (mặc dù sau gần ba năm sử dụng). Nó đã hỏng hoàn toàn; sau khi chuyển nó sang hộp USB để bàn, tất cả những gì tôi nhận được là tiếng kêu lách cách khó chịu và cả Ubuntu 20.04 lẫn Windows 10 đều không phát hiện ra.
Ồ, đến phần thay thế (và đúng vậy, ổ đĩa mới tôi mua là IronWolf, bài học rút ra) - cũng đáng sợ như việc mất ổ đĩa trong một mảng đang chạy, thậm chí còn đáng sợ hơn nếu bạn không biết quy trình thay thế đúng. Đây không phải là lần đầu tiên tôi phải thay thế ổ đĩa bị hỏng trong một mảng mdadm, nhưng may mắn là trường hợp này rất hiếm nên tôi thường phải tra cứu các lệnh thích hợp. Lần này, tôi quyết định tự biên soạn một hướng dẫn nhỏ để tham khảo trong tương lai.
Vì vậy, trước hết, khi bạn nhận được email sự kiện fail đáng sợ từ mdadm, bạn cần xác định ổ đĩa nào đã bị lỗi. Chắc chắn, nó sẽ cho bạn biết tên thiết bị (trong trường hợp của tôi là /dev/sdf), nhưng có lẽ không rõ ràng ổ đĩa vật lý nào thực sự là vì những tên đó có thể thay đổi khi máy được khởi động.
Nếu bạn thậm chí không chắc tên thiết bị nào bị lỗi, bạn có thể sử dụng lệnh sau để tìm hiểu (thay thế /dev/md0 bằng thiết bị RAID của bạn):
Như đã đề cập, trong trường hợp của tôi là /dev/sdf, vậy chúng ta hãy tiếp tục với đường dẫn đó.
Sau đó, bạn có thể thử tìm số sê-ri của ổ đĩa bị lỗi bằng cách đưa ra lệnh này:
(nếu không tìm thấy smartctl, bạn cần cài đặt gói smartmontools trên Ubuntu)
Sau đó, có thể so sánh số sê-ri với số sê-ri trên nhãn vật lý của ổ đĩa để tìm ra ổ đĩa nào bị lỗi.
Tuy nhiên, lần này tôi không may mắn như vậy. Ổ đĩa đã chết hoàn toàn và thậm chí còn từ chối cung cấp dữ liệu SMART hoặc dữ liệu khác, bao gồm cả số sê-ri.
Vì tôi có quyền truy cập vật lý vào máy chủ (điều mà bạn thực sự cần nếu bạn định tự thay ổ đĩa vật lý, tôi cho là vậy ;-)) và máy chủ thực sự đang chạy khi đĩa bị hỏng (và tiếp tục chạy tốt nhờ dự phòng RAID-6), tôi đã sử dụng phương pháp thực sự thô sơ, nhưng thực sự hiệu quả và rõ ràng, chỉ cần sao chép một tệp lớn vào máy chủ và xem đèn HDD nào không nhấp nháy. Trong vòng vài giây, tôi đã xác định được thủ phạm.
Bây giờ, trước khi tháo ổ đĩa vật lý, bạn nên thông báo chính thức cho mdadm về ý định này bằng cách đưa ra lệnh này (thay thế tên thiết bị bằng tên của bạn nếu thích hợp):
Nếu thành công, mdadm sẽ trả lời bằng thông báo cho biết ổ đĩa đã được "xóa nóng", rõ ràng là vì thiết bị RAID ảo thực sự đang chạy tại thời điểm đó.
Nếu không thành công với thông báo lỗi tương tự như "thiết bị hoặc tài nguyên đang bận", có thể là mdadm thực tế không đăng ký ổ đĩa đã hoàn toàn bị lỗi. Để thực hiện điều đó, hãy đưa ra lệnh này (một lần nữa, hãy nhớ thay thế tên thiết bị bằng tên của riêng bạn nếu phù hợp):
Sau đó, bạn có thể xóa thiết bị khỏi mảng bằng lệnh trước đó.
Bây giờ là lúc thực sự thay ổ đĩa. Nếu bạn thực sự, thực sự - như, thực sự - chắc chắn rằng máy và bộ điều khiển của bạn hỗ trợ hoán đổi nóng, bạn có thể thực hiện việc này mà không cần tắt máy. Đó sẽ là cách thực hiện trên các hệ thống sản xuất quan trọng chạy trên phần cứng máy chủ thực sự, phù hợp mà bạn biết chắc chắn có thể xử lý được. Tuy nhiên, máy chủ tệp tại nhà của tôi dựa trên bo mạch chủ máy tính để bàn dành cho người tiêu dùng với một vài bộ điều khiển SATA bán vô danh trong các khe cắm PCIe để cung cấp nhiều cổng SATA hơn.
Mặc dù SATA thường hỗ trợ hoán đổi nóng, nhưng tôi không muốn mạo hiểm bất cứ điều gì trong thiết lập này, vì vậy tôi đã chọn tắt máy trong khi thay ổ đĩa.
Trước khi thực hiện, bạn nên chú thích thiết bị raid trong tệp /etc/fstab để Ubuntu không cố gắng tự động gắn nó vào lần khởi động tiếp theo, vì nó có thể bị treo và buộc bạn phải vào chế độ phục hồi do mảng RAID bị suy giảm. Điều đó có thể không phải là vấn đề lớn nếu đó là hệ thống máy tính để bàn, nhưng tôi chạy máy chủ này mà không có màn hình hoặc bàn phím được kết nối, vì vậy điều này sẽ hơi rắc rối.
Sau khi khởi động máy với ổ đĩa mới sáng bóng được cài đặt, hãy sử dụng lsblk hoặc một số phương tiện khác để xác định nó. Nếu bạn chưa thay đổi bất kỳ thứ gì khác, nó có thể (nhưng không nhất thiết ) sẽ có cùng tên với ổ đĩa bạn đã thay thế. Trong trường hợp của tôi, nó đã có, vì vậy ổ đĩa mới cũng được gọi là /dev/sdf.
Vì mảng của tôi dựa trên phân vùng chứ không phải thiết bị vật lý, tôi cần sao chép bảng phân vùng từ ổ đĩa đang hoạt động sang ổ đĩa mới để đảm bảo chúng giống hệt nhau. Nếu bạn chạy mảng của mình trên thiết bị vật lý, bạn có thể bỏ qua bước này.
Tôi đã sử dụng sgdisk cho mục đích này, sao chép bảng phân vùng từ /dev/sdc sang /dev/sdf. Đảm bảo thay thế tên thiết bị cho phù hợp với tên của bạn.
Lưu ý thứ tự ở đây: bạn liệt kê ổ đĩa "đến" trước! Điều này hơi trái ngược với trực giác của tôi, nhưng hãy đảm bảo bạn làm đúng để không gặp lỗi ổ đĩa khác trong mảng ;-)
Sau đó, để tránh xung đột UUID, hãy tạo UUID mới cho ổ đĩa mới:
Và cuối cùng thì đã đến lúc thêm ổ đĩa mới vào mảng và bắt đầu bữa tiệc xây dựng lại! (Được rồi, thực ra đây không phải là một bữa tiệc, mà là một quá trình khá chậm và đáng sợ vì bạn thực sự, thực sự không muốn một ổ đĩa khác bị hỏng vào lúc này. Tuy nhiên, bia có thể giúp ích)
Dù sao đi nữa, để thêm ổ đĩa mới vào mảng, hãy đưa ra lệnh này (một lần nữa, hãy đảm bảo thay thế tên thiết bị bằng tên của bạn nếu cần):
Nếu mọi việc diễn ra tốt đẹp, ổ đĩa sẽ được thêm vào mảng mà không gặp trục trặc. Tôi tin rằng nó thực sự được thêm vào như một "ổ đĩa dự phòng nóng" theo mặc định, nhưng vì mảng này thiếu một đĩa (là đĩa bị lỗi), nên nó sẽ được đưa vào sử dụng ngay lập tức và quá trình xây dựng lại sẽ bắt đầu.
Bạn có thể theo dõi nó như thế này:
Có lẽ sẽ mất một thời gian; trên máy chủ yếu của tôi (chủ yếu dựa trên phần cứng dành cho người tiêu dùng và ổ đĩa máy tính để bàn, bạn lưu ý nhé) nó có thể đạt tới gần 100 MB/giây. Hãy nhớ rằng đây là RAID-6, vì vậy có rất nhiều phép tính chẵn lẻ liên quan đến việc xây dựng lại; RAID-10 sẽ nhanh hơn nhiều. Máy cụ thể này có CPU lõi tứ AMD A10 9700E (chữ "E" có nghĩa là đây là mẫu tiết kiệm năng lượng có xung nhịp thấp, tức là không siêu nhanh), chỉ để bạn biết những gì mong đợi. Với chín ổ đĩa 8 TB trong thiết lập của tôi, việc xây dựng lại hoàn toàn chỉ mất hơn 24 giờ.
Trong quá trình xây dựng lại, bạn có thể gắn hệ thống tệp vào mảng và sử dụng như bình thường nếu muốn, nhưng tôi thích để nó tự xây dựng lại cho đến khi hoàn tất. Hãy nhớ rằng nếu một ổ đĩa bị lỗi, ổ đĩa khác có thể sớm bị lỗi theo, vì vậy bạn muốn xây dựng lại được thực hiện nhanh nhất có thể vì bạn thực sự không muốn ổ đĩa khác bị lỗi trong quá trình đó. Do đó, đừng làm nó trở nên nặng nề với các IO khác không thực sự cần thiết.
Khi hoàn tất, hãy thêm lại vào tệp /etc/fstab, khởi động lại và tận hưởng các tệp của bạn :-)