RAID (mdadm) - Điều gì xảy ra nếu các ổ đĩa không khớp về kích thước?


15

Câu hỏi 1 - Trước khi bạn trả lời với "nó chỉ mất đĩa nhỏ hơn", hãy nghe tôi nói nhanh. WD Reds 3TB của tôi có kích thước 3001 GB. Giả sử tôi đã thiết lập một máy nhân bản thông qua mdadm cho sdb1 và sdc1, trải dài 100% ổ đĩa. Nhưng đột nhiên, một trong những ổ đĩa thất bại. Thay thế là 3TB, nặng 3000 GB. Điều gì xảy ra khi tôi đặt vào một ổ đĩa nhỏ hơn ổ đĩa hiện có trên mảng? Tôi biết với một mảng mới sử dụng 3000 so với 3001, nó sẽ xây dựng mảng thành 3000. Nhưng như tôi đã nói, còn một mảng hiện tại @ 3001 và tôi thêm một ổ đĩa nhỏ thì sao? Liệu nó có cấu trúc lại chính nó trong quá trình xây dựng lại có kích thước 3000 GB?

Câu hỏi 2 - Trong trường hợp tôi không thể thêm 3000 GB vào mảng với 3001 GB hiện có và nó chỉ đơn giản là giảm xuống còn 3000 ... tôi có thể thay đổi kích thước 3001 xuống một chút không?

Câu hỏi 3 - Hoặc, một ý tưởng tốt hơn. Điều gì sẽ xảy ra nếu tôi giảm kích thước ổ 3TB của mình xuống còn 2999 GB. Bằng cách đó, cho dù ổ đĩa có ngắn 1 MB, 1 byte, 10 KB, không thành vấn đề, nó sẽ luôn chọn ổ đĩa "nhỏ hơn" @ 2999 GB.

Câu trả lời:


28

Tôi đã bắt gặp câu trả lời này do nhầm lẫn, nhưng trong trường hợp bất kỳ ai cũng tò mò, đây là câu trả lời được hỗ trợ bởi các thí nghiệm.

Phiên bản ngắn

Câu hỏi thưởng: tôi có thể tạo một md(4)mảng RAID từ các thiết bị khối có kích thước không đồng đều không? Có, nhưng mảng RAID sẽ có kích thước của thiết bị khối nhỏ nhất (cộng với một số chi phí chung cho việc vệ sinh riêng của nó). Nếu kích thước thiết bị không nằm trong phạm vi 1% của nhau, bạn sẽ nhận được cảnh báo.

Câu hỏi 1: Tôi có thể thêm vào md(4)mảng RAID hiện tại một thiết bị nhỏ hơn thành viên nhỏ nhất hiện tại không? Không, xin lỗi. mdadmsẽ từ chối làm điều đó để bảo vệ dữ liệu của bạn.

Câu hỏi 2: bạn có thể thay đổi kích thước một mảng md hiện có không? Vâng (đọcmdadm manpge!), Nhưng nó có thể không đáng nỗ lực. Bạn sẽ phải sao lưu mọi thứ, sau đó thay đổi kích thước nội dung của thiết bị RAID, sau đó thay đổi kích thước chính thiết bị - tất cả điều này khá dễ xảy ra lỗi, tính toán sai và những thứ khác sẽ khiến bạn mất dữ liệu (nói về trải nghiệm đau đớn) .

Nó không đáng để mạo hiểm và nỗ lực. Nếu bạn có một đĩa mới, trống, đây là cách thay đổi kích thước và cũng giữ nguyên từ một đến hai bản sao của tất cả dữ liệu của bạn (giả sử bạn có RAID1 2 đĩa):

  1. Tạo một md(4)mảng mới trên đó (thiếu một đĩa).
  2. Tái tạo cấu trúc của nội dung mảng (Crypto, LVM, bảng phân vùng, bất kỳ sự kết hợp nào của chúng, bất cứ thứ gì nổi lên thuyền của bạn).
  3. Sao chép dữ liệu từ đĩa hiện có sang đĩa mới.
  4. Khởi động lại, sử dụng đĩa mới.
  5. Xóa bảng phân vùng của đĩa cũ (hoặc không có md(4)siêu khối). Nếu cần, hãy tạo các phân vùng cần thiết để khớp với sơ đồ trên đĩa mới.
  6. Thêm đĩa cũ vào mảng mới.
  7. Chờ cho các thành viên mảng đồng bộ hóa. Uống cà phê Bay đến Mỹ Latinh và chọn hạt cà phê của riêng bạn, cho vấn đề đó. :) (Nếu bạn sống Mỹ Latinh, hãy bay đến Châu Phi thay thế).

Lưu ý: có, đây là kỹ thuật tương tự 0xC0000022L được mô tả trong câu trả lời của anh ấy.

Câu hỏi 3. Điều gì xảy ra nếu ổ đĩa ngắn 1G? :) Đừng lo lắng về nó. Rất có thể ổ đĩa thay thế của bạn sẽ lớn hơn. Trong thực tế, với một chiến lược như trên, nó trả tiền để có được các ổ đĩa lớn hơn rẻ hơn bất cứ khi nào thất bại (hoặc để nâng cấp rẻ hơn). Bạn có thể nhận được một bản nâng cấp lũy tiến.

Bằng chứng thực nghiệm

Thiết lập thử nghiệm

Đầu tiên, hãy giả mạo một số thiết bị khối. Chúng tôi sẽ sử dụng /tmp/sdx/tmp/sdy(mỗi 100M) và /tmp/sdz(99M).

cd /tmp
dd if=/dev/zero of=sdx bs=1M count=100
sudo losetup -f sdx
dd if=/dev/zero of=sdy bs=1M count=100
sudo losetup -f sdy
dd if=/dev/zero of=sdz bs=1M count=99  # Here's a smaller one!
sudo losetup -f sdz

Đây bộ lên ba tác phẩm như ba block device loopback: /dev/loop0, /dev/loop1/dev/loop2, lập bản đồ đến sdx, sdysdztương ứng. Hãy kiểm tra kích thước:

sudo grep loop[012] /proc/partitions
   7        0     102400 loop0
   7        1     102400 loop1
   7        2     101376 loop2

Theo dự kiến, chúng tôi có hai thiết bị vòng lặp chính xác 100M (102400 KiB = 100 MiB) và một trong 99M (chính xác là 99 × 1024 khối 1K).

Tạo một mảng RAID từ các thiết bị có kích thước giống hệt nhau

Đây là:

sudo mdadm  --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 /dev/loop1
mdadm: array /dev/md100 started.

Kiểm tra kích thước:

sudo grep md100 /proc/partitions
   9      100     102272 md100

Đây là precicely những gì chúng ta mong đợi: một cái nhìn tại hướng dẫn mdadm nhắc nhở chúng ta rằng phiên bản 1.2 Metadata mất 128K: 128 + 102.272 = 102400. Bây giờ chúng ta hãy tiêu diệt nó để chuẩn bị cho cuộc thử nghiệm thứ hai.

sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop1

Tạo một mảng RAID từ các thiết bị có kích thước không đồng đều

Lần này chúng ta sẽ sử dụng thiết bị khối nhỏ.

sudo mdadm  --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 /dev/loop2
mdadm: largest drive (/dev/loop0) exceeds size (101248K) by more than 1%
Continue creating array? y
mdadm: array /dev/md100 started.

Vâng, chúng tôi đã cảnh báo, nhưng mảng đã được thực hiện. Hãy kiểm tra kích thước:

sudo grep md100 /proc/partitions
   9      100     101248 md100

Những gì chúng tôi nhận được ở đây là 101.248 khối. 101248 + 128 = 101376 = 99 × 1024. Không gian có thể sử dụng là của thiết bị nhỏ nhất (cộng với siêu dữ liệu RAID 128K). Hãy đưa tất cả xuống một lần nữa cho thử nghiệm cuối cùng của chúng tôi:

sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop2

Và cuối cùng: Thêm một thiết bị nhỏ hơn vào một mảng đang chạy

Trước tiên, hãy tạo một mảng RAID1 chỉ với một trong các đĩa 100M. Mảng sẽ bị xuống cấp, nhưng chúng tôi không thực sự quan tâm. Chúng tôi chỉ muốn một mảng bắt đầu . Các missingtừ khóa là một trình giữ chỗ có nội dung 'Tôi chưa có thiết bị cho bạn, hãy bắt đầu sử dụng mảng này ngay bây giờ và tôi sẽ thêm một thiết bị sau'.

sudo mdadm  --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 missing

Một lần nữa, hãy kiểm tra kích thước:

sudo grep md100 /proc/partitions
   9      100     102272 md100

Chắc chắn, nó ngắn 128K với 102400 khối. Thêm đĩa nhỏ hơn:

sudo mdadm  --add /dev/md100 /dev/loop2
mdadm: /dev/loop2 not large enough to join array

Bùng nổ! Nó sẽ không cho phép chúng tôi, và lỗi rất rõ ràng.


Synology Hybrid RAID (SHR) giải quyết vấn đề này.
Denis Denisov

1

Có một số cách để thiết lập mdXthiết bị. Phương pháp sẽ là sử dụng gdisk(hoặc sgdisknếu bạn thích phiên bản chỉ dòng lệnh) để phân vùng này dưới dạng GPT. Nếu bạn muốn khởi động từ mảng, hãy tạo "Phân vùng khởi động BIOS", nhập mã ef02. Điều này chỉ cần thiết nếu bạn muốn khởi động mảng này, nếu không thì không cần phải quan tâm. Sau đó, tạo một phân vùng có cùng kích thước hoặc nhỏ hơn đĩa nhỏ nhất được thêm vào mảng. Cuối cùng nhưng không kém phần quan trọng, sao chép dữ liệu GPT sang đĩa khác (menu chuyên gia trong gdisk, sử dụng xvà sau đóu và chỉ định thiết bị đích). Đây là một quá trình phá hủy.

Nên có thể - nếu hệ thống tệp cho phép - thay đổi kích thước phân vùng hiện tại thành một cái gì đó nhỏ hơn và sau đó sử dụng cùng một phương pháp để sao chép dữ liệu GPT. Tuy nhiên, điều này sẽ đưa bạn vào một chút kerfuffle. Bởi vì bây giờ bạn có hai đĩa, nhưng vẫn không có mdXthiết bị. Một trong số chúng phải được chuẩn bị là mdX, thông minh phân vùng (mà tôi ngụ ý ở trên) hoặc khôn ngoan đĩa) và sau đó dữ liệu phải được chuyển từ đĩa hiện có sang đó.

Vì thế:

  1. đĩa lớn ( /dev/sda) chứa dữ liệu, dữ liệu nhỏ hơn 3001 GB, phân vùng không
  2. đĩa nhỏ hơn /dev/sdbđược thêm vào hệ thống
  3. bạn phân vùng /dev/sdbvớigdisk
  4. bạn tạo một mảng từ mỗi phân vùng tương ứng ( mdadm -C /dev/md2 -l 1 -n 1 /dev/sdb2)
  5. bạn tạo hệ thống tập tin trên mảng mới
  6. bạn sao chép tất cả dữ liệu, đảm bảo rằng hệ thống của bạn sẽ được chuẩn bị để chạy hết đĩa GPT và làm cho GRUB2 hiểu được ý nghĩa (xem bên dưới)
  7. bạn sao chép dữ liệu phân vùng GPT từ /dev/sdbsang/dev/sda
  8. bạn thêm các phân vùng "thô" từ /dev/sdavào các mảng hiện có
  9. bạn chờ đợi /proc/mdstatđể cho bạn thấy rằng việc đồng bộ đã xong

Nếu bạn đã làm theo tất cả các bước, bây giờ bạn sẽ có thể khởi động vào hệ thống mới ngoài mảng mdX. Tuy nhiên, hãy để sẵn một đĩa CD cứu hộ hoặc tùy chọn khởi động PXE, chỉ trong trường hợp.


GRUB2 sẽ không thể nhận ra thiết lập tắt. Vì vậy, bạn cần một số "ma thuật". Đây là một lót:

for i in /dev/disk/by-id/md-uuid-*; do DEV=$(readlink $i); echo "(${DEV##*/}) $i"; done|sort|tee /boot/grub/devicemap

Hoặc hãy dài dòng hơn:

for i in /dev/disk/by-id/md-uuid-*
do
  DEV=$(readlink $i)
  echo "(${DEV##*/}) $i"
done|sort|sudo tee /boot/grub/devicemap

Điều này tạo (hoặc ghi đè) mặc định /boot/grub/devicemapvới một cái cho GRUB2 biết nơi tìm từng đĩa tương ứng. Kết quả sẽ là một cái gì đó giống như danh sách này:

(md0) /dev/disk/by-id/md-uuid-...
(md2) /dev/disk/by-id/md-uuid-...
(md3) /dev/disk/by-id/md-uuid-...
(md4) /dev/disk/by-id/md-uuid-...

Nếu bạn sử dụng GRUB kế thừa, bạn cũng cần tạo "Phân vùng khởi động BIOS" với phiên bản dữ liệu meta 0.9, cách sử dụng mdadm -e 0 ...và quy trình sẽ khác nhau. Tôi đã không làm điều đó, mặc dù.


1
Cảm ơn vì đã trả lời. Mảng này thực sự chỉ dành cho lưu trữ thô trên máy chủ của tôi nên nó sẽ không xử lý việc khởi động hoặc bất cứ thứ gì tương tự. Tôi chỉ quan tâm đến việc trộn và kết hợp các ổ cứng kích thước khác nhau sau này trong trò chơi. Ý tôi là, điều gì sẽ xảy ra nếu tôi có sdb1 @ 3001 GB và sdc1 @ 3001 GB, nhưng sdc1 chết và thay thế là 3000 GB? Có sdb1 giảm kích thước xuống 3000? Mảng @ / dev / md0 có giảm kích thước xuống 3000 GB không? Tôi càng nghĩ về nó, càng có ý nghĩa khi rời khỏi phòng ở cuối, chẳng hạn như ví dụ 2999 ở trên - theo cách đó nó sẽ loại bỏ cơn đau đầu đó. Trừ khi tôi thiếu một cái gì đó?
JaSauder

1
Trên thực tế, giả sử RAID cấp 1 ở đây, mdadmsẽ từ chối xây dựng mảng ở vị trí đầu tiên nếu nó không tương thích. Trong RAID 5 cuối cùng bạn cần nhiều đĩa hơn và trong RAID 0, bạn sẽ không quan tâm đến nó, đó là lý do tại sao tôi giả định RAID 1. Vì vậy, có ý nghĩa khi rời khỏi phòng.
0xC0000022L

Tôi không có ý định đánh ngựa, nhưng tôi không chắc lắm về tuyên bố "không tương thích" mà bạn đã đưa ra. Điều gì sẽ không tương thích? Bạn có tham khảo sự khác biệt về kích thước trong điều khoản 3000 GB so với 3001 GB trong ví dụ của tôi không? Dù bằng cách nào, tôi chỉ chạy mảng của mình với mỗi phân vùng là 2999 GB, mặc dù mỗi đĩa là 3001 GB. Điều này sẽ giúp loại bỏ bất kỳ cơn đau đầu nào xảy ra trong trường hợp tôi không thể có được các ổ đĩa thay thế giống hệt nhau. Đánh giá cao cái nhìn sâu sắc của bạn!
JaSauder

@JaSauder: Tôi nghĩ rằng một GiB ít nhiều sẽ không tương thích. Nhưng thật lòng mà nói tôi không biết giới hạn ở đâu. Tôi biết, tuy nhiên, những thay đổi nhỏ về kích thước sẽ được dung thứ. Đối với mọi thứ khác, bạn phải di chuyển theo cách tương tự như những gì tôi đã vạch ra.
0xC0000022L

@ 0xC0000022L: mdadmchấp nhận chênh lệch kích thước 1% tùy ý trong các thành viên mảng.
Alexios
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.