Saya menemukan jawaban ini secara tidak sengaja, tetapi jika ada orang yang penasaran, inilah jawaban yang didukung oleh eksperimen.
Versi Pendek
Pertanyaan Bonus: dapatkah saya membuat md(4)
array RAID dari perangkat blok dengan ukuran yang tidak sama? Ya, tetapi array RAID akan memiliki ukuran perangkat blok terkecil (ditambah beberapa overhead untuk housekeeping sendiri). Jika ukuran perangkat tidak dalam 1% dari satu sama lain, Anda mendapat peringatan.
Pertanyaan 1: dapatkah saya menambah md(4)
array RAID yang ada perangkat lebih kecil dari anggota terkecil saat ini? Tidak maaf. mdadm
akan menolak untuk melakukan itu untuk melindungi data Anda.
Pertanyaan 2: dapatkah Anda mengubah ukuran array md yang ada? Ya (baca mdadm
manpge!), Tetapi mungkin tidak sepadan dengan usaha. Anda harus mencadangkan semuanya, lalu mengubah ukuran konten perangkat RAID, lalu mengubah ukuran perangkat itu sendiri - semua ini cukup rentan terhadap kesalahan, kesalahan perhitungan, dan hal-hal lain yang akan dikenakan biaya data Anda (pengalaman berbicara yang menyakitkan) .
Itu tidak sepadan dengan risiko dan upaya. Jika Anda memiliki disk kosong baru, berikut ini cara mengubah ukurannya dan juga menyimpan antara satu dan dua salinan semua data Anda setiap saat (dengan asumsi Anda memiliki 2-disk RAID1):
- Buat
md(4)
array baru di atasnya (dengan satu disk hilang).
- Buat kembali struktur isi array (Crypto, LVM, tabel partisi, kombinasi apa saja, apa pun yang mengapung perahu Anda).
- Salin data dari disk yang ada ke yang baru.
- Mulai ulang, menggunakan disk baru.
- Bersihkan tabel partisi disk lama (atau nol
md(4)
superblok). Jika perlu, buat partisi yang diperlukan untuk mencocokkan skema pada disk baru.
- Tambahkan disk lama ke array baru.
- Tunggu anggota array disinkronkan. Minumlah kopi. Terbanglah ke Amerika Latin dan pilih biji kopi Anda sendiri. :) (Jika Anda tinggal di Amerika Latin, sebaliknya terbang ke Afrika).
Catatan: ya, ini adalah teknik yang sama 0xC0000022L yang dijelaskan dalam jawabannya.
Pertanyaan 3. Bagaimana jika drive pendek 1G? :) Jangan khawatir tentang itu. Kemungkinan drive pengganti Anda akan lebih besar. Bahkan, dengan strategi seperti di atas, membayar untuk mendapatkan drive yang lebih besar lebih murah setiap kali gagal (atau untuk upgrade yang lebih murah). Anda bisa mendapatkan peningkatan progresif.
Bukti Eksperimental
Pengaturan eksperimen
Pertama, mari kita palsu beberapa perangkat blokir. Kami akan menggunakan /tmp/sdx
dan /tmp/sdy
(masing-masing 100M), dan /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
Ini set up tiga file seperti tiga perangkat blok loopback: /dev/loop0
, /dev/loop1
dan /dev/loop2
, pemetaan untuk sdx
, sdy
dan sdz
masing-masing. Mari kita periksa ukurannya:
sudo grep loop[012] /proc/partitions
7 0 102400 loop0
7 1 102400 loop1
7 2 101376 loop2
Seperti yang diharapkan, kami memiliki dua perangkat loop persis 100M (102400 KiB = 100 MiB) dan satu dari 99M (tepat 99 × 1024 1K blok).
Membuat Array RAID dari Perangkat yang Berukuran identik
Ini dia:
sudo mdadm --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 /dev/loop1
mdadm: array /dev/md100 started.
Periksa ukuran:
sudo grep md100 /proc/partitions
9 100 102272 md100
Ini adalah precicely apa yang kita harapkan: satu melihat manual mdadm mengingatkan kita bahwa versi 1.2 metadata mengambil 128K: 128 + 102.272 = 102400. Sekarang mari kita menghancurkannya dalam persiapan untuk percobaan kedua.
sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop1
Membuat Array RAID dari Perangkat Tidak Berukuran
Kali ini kita akan menggunakan perangkat blok kecil.
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.
Yah, kami sudah diperingatkan, tetapi array dibuat. Mari kita periksa ukurannya:
sudo grep md100 /proc/partitions
9 100 101248 md100
Apa yang kita dapatkan di sini adalah 101.248 blok. 101248 + 128 = 101376 = 99 × 1024. Ruang yang dapat digunakan adalah perangkat terkecil (ditambah metadata RAID 128K). Mari kita turunkan semuanya untuk percobaan terakhir kami:
sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop2
Dan Akhirnya: Menambahkan Perangkat yang lebih kecil ke Lari Lari
Pertama, mari kita buat array RAID1 hanya dengan satu dari 100M disk. Array akan terdegradasi, tetapi kami tidak terlalu peduli. Kami hanya ingin array yang dimulai . Kata missing
kunci adalah placeholder yang mengatakan 'Saya belum memiliki perangkat untuk Anda, mulai dia susun sekarang dan saya akan menambahkannya nanti'.
sudo mdadm --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 missing
Sekali lagi, mari kita periksa ukurannya:
sudo grep md100 /proc/partitions
9 100 102272 md100
Benar saja, 128K kekurangan 102400 blok. Menambahkan disk yang lebih kecil:
sudo mdadm --add /dev/md100 /dev/loop2
mdadm: /dev/loop2 not large enough to join array
Ledakan! Itu tidak akan membiarkan kita, dan kesalahannya sangat jelas.
Ada beberapa cara untuk mengatur
mdX
perangkat. Metode ini akan menggunakangdisk
(atausgdisk
jika Anda lebih suka versi baris perintah saja) untuk mempartisi ini sebagai GPT. Jika Anda ingin mem-boot dari array, buat "BIOS Boot Partition", ketikkan kodeef02
. Ini hanya diperlukan jika Anda ingin mem-boot array ini, jika tidak tidak perlu peduli. Kemudian, buat partisi dengan ukuran yang sama atau lebih kecil dari disk terkecil yang akan ditambahkan ke array. Last but not least, salin data GPT ke disk lain (menu ahli digdisk
, menggunakanx
, dan kemudianu
dan tentukan perangkat target). Ini adalah proses yang merusak.Seharusnya dimungkinkan - jika sistem file memungkinkannya - untuk mengubah ukuran partisi yang ada menjadi sesuatu yang lebih kecil dan kemudian menggunakan metode yang sama untuk menyalin data GPT. Namun, ini membuat Anda menjadi sedikit keriting. Karena sekarang Anda memiliki dua disk, tetapi masih belum ada
mdX
perangkat. Salah satunya harus disiapkan sebagaimdX
, baik partisi-bijaksana (yang saya tersirat di atas) atau disk-bijaksana) dan kemudian data harus dipindahkan dari disk yang ada ke itu.Begitu:
/dev/sda
) berisi data, data lebih kecil dari 3001 GB, partisi tidak/dev/sdb
ditambahkan ke sistem/dev/sdb
dengangdisk
mdadm -C /dev/md2 -l 1 -n 1 /dev/sdb2
)/dev/sdb
ke/dev/sda
/dev/sda
ke dalam array yang ada/proc/mdstat
menunjukkan kepada Anda bahwa sinkronisasi telah dilakukanJika Anda mengikuti semua langkah, Anda sekarang bisa boot ke sistem baru dari array mdX. Namun, simpan CD penyelamatan atau opsi boot PXE untuk berjaga-jaga.
GRUB2 tidak akan dapat mengenali pengaturan begitu saja. Jadi, Anda perlu "sihir". Inilah satu kalimat:
Atau mari kita lebih bertele-tele:
Ini membuat (atau menimpa) default
/boot/grub/devicemap
dengan yang memberitahu GRUB2 di mana menemukan masing-masing disk. Hasilnya akan seperti daftar ini:Jika Anda menggunakan GRUB lawas, Anda juga harus membuat "BIOS Boot Partition" dengan meta-data versi 0.9, menggunakan
mdadm -e 0 ...
dan prosesnya akan berbeda. Saya belum melakukan itu.sumber
mdadm
akan menolak untuk membangun array di tempat pertama jika itu tidak kompatibel. Di RAID 5 Anda akan membutuhkan lebih banyak disk pada akhirnya dan di RAID 0 Anda tidak akan peduli, itulah sebabnya saya mengasumsikan RAID 1. Jadi ya, masuk akal untuk meninggalkan ruang.mdadm
mentolerir 1% perbedaan ukuran anggota array yang sewenang-wenang.