Ubuntu: Bagaimana perangkat md bisa dirakit saat bootup?

8

Bagaimana cara mdperangkat berkumpul saat boot di Ubuntu? Benarkah /etc/mdadm/mdadm.conffaktor yang relevan di sini?

Saya mdadm.confadalah suara dan saya memeriksa bahwa sementara aku berada di lingkungan CD rescue. Saat menjalankannya mdadm -A --scanmenemukan dan menetapkan nama perangkat yang diinginkan. The mdadm.confberisi AUTO -alluntuk mengambil semua otomatisme dari merakit array.

Apa yang perlu saya lakukan adalah untuk dapat merakit mdperangkat secara otomatis sebagaimana dijelaskan pada mdadm.confsaat boot atau ketika merakitnya menghargai super-minornilai untuk array 0,9 dan name(tampaknya <hostname>:<super-minor>) untuk array 1.2 dan melakukan hal yang benar tanpa mdadm.conf. Potongan puzzle apa yang saya lewatkan?


Saya memiliki masalah berikut. Ada dua mdperangkat dengan RAID1 ( md0dan md1) dan satu dengan RAID6 ( md2). Saya merujuk mereka dengan nama perangkat yang diinginkan . md0memiliki meta-data versi 0.9, dua lainnya memiliki versi 1.2. md0peta ke /dan dua lainnya tidak relevan untuk booting .

Boot drive dipartisi dengan GPT. Ada lem "BIOS Boot Partition" ( sda1) di atasnya. grub-install --no-floppy /dev/sdamelaporkan kesuksesan.

  • md0 == sda3 + sdb3
  • md1 == sda2 + sdb2
  • md2 == sdc + sdd + sde + sdf + sdg + sdh
  • sda1dan sdb1merupakan "BIOS Boot Partition" masing-masing

GRUB2 senang dengan /boot/grub/devicemapsaya memberikannya dan saya menambahkan part_gpt, raid, mdraid09dan ext2untuk modul untuk preload di GRUB2.

Karena saya masih memiliki volume root di lingkungan penyelamatan, saya cukup memasang semuanya dan kemudian chrootmemasukkannya:

mkdir /target
mount /dev/md0 /target
mount -o bind /dev /target/dev
mount -o bind /dev/pts /target/dev/pts
mount -o bind /sys /target/sys
mount -o bind /proc /target/proc
chroot /target /bin/bash

Dari sana saya mereset super-minoron md0(dengan meta-data 0.9) dan nameon md1dan md2. Saya juga memverifikasi bahwa itu berfungsi menggunakan mdadm --detail .... Selain itu saya menyesuaikan /etc/default/grub, menjalankan update-grubdan juga grub-install --no-floppy /dev/sdadan grub-install --no-floppy /dev/sdb.

Setelah itu, ketika boot, saya selalu jatuh ke initramfsshell penyelamatan, karena sistem file root tidak dapat dipasang. Alasannya, setelah memeriksa /proc/mdstattampaknya mdperangkat yang bersangkutan bahkan tidak dapat dirakit dan dijalankan. Belum lagi dua drive lainnya (meta-data versi 1.2) menerima nomor perangkat di suatu tempat dalam kisaran 125..127.

Catatan: GRUB2 muncul dari disk boot. Jadi setidaknya sudah tertanam dengan benar. Masalahnya adalah transisi dari awal rootfske sistem file root yang tepat.

0xC0000022L
sumber
1
Jangan gunakan /dev/mdXuntuk alasan ini. Gunakan /dev/md/NAMEsebagai gantinya. Itu tidak akan pernah berubah.
Patrick
@ Patrick: Saya tidak mengerti apa yang ingin Anda katakan. Masalahnya bukan nama per-se. Itu kurang lebih kosmetik. Masalahnya adalah bahwa volume root tidak akan dirakit, oleh karena itu tidak tersedia untuk boot dan karenanya saya tidak bisa boot. Saya menggunakan UUID untuk memberi tahu GRUB2 perangkat apa itu dan saya menggunakan UUID di /etc/fstab. Pengaturan tidak bergantung pada nama, saya masih ingin mereka menjadi seperti itu;)
0xC0000022L
Saya harus mengklarifikasi. Itu hanya disarankan sebagai resolusi untuk komentar Anda Not to mention that the other two (meta-data version 1.2) drives receive a device number somewhere in the 125..127 range. Saya tidak cukup tahu tentang bagaimana ubuntu mengumpulkan volume serangan untuk menjawab masalah yang lebih besar.
Patrick

Jawaban:

17

Proses Boot Dasar

Grub

  1. Grub membaca kode disk, md, sistem file, dll. Dari MBR.
  2. Grub menemukan partisi / boot-nya, dan membaca sisanya dengan sendirinya. Termasuk konfigurasi, dan modul apa pun yang ditentukan konfigurasi perlu dimuat.
  3. Grub mengikuti instruksi dalam konfigurasi, yang biasanya memerintahkannya untuk memuat kernel dan initramfs ke dalam memori, dan menjalankan kernel.

Ada mode fallback, ketika Grub tidak bisa benar-benar membaca sistem file — baik karena tidak ada cukup ruang untuk menanamkan semua kode itu dalam catatan boot, atau karena tidak mengetahui sistem file atau lapisan di bawahnya. Dalam hal ini, GRUB menyematkan daftar sektor, dan membaca kode dari mereka. Ini jauh kurang kuat, dan sebaiknya dihindari. Bahkan mungkin dapat melakukan kernel dan initramf seperti itu (tidak yakin).

Inti

Kernel kemudian mengambil kendali, dan melakukan banyak init hardware dasar. Tahap ini cukup cepat. Selanjutnya, kernel membongkar initramfs ke tmpfs, dan mencari a /initdi tmpfs. Kemudian dieksekusi (dalam arti normal, kernel sedang berjalan pada saat ini) /init. Omong-omong, ini adalah skrip shell lama yang sederhana.

Initramfs

Anda dapat mengekstrak initramfs dengan tangan dengan melakukan sesuatu seperti mkdir /tmp/foo; cd /tmp/foo; zcat /boot/initrd.img-3.8-trunk-amd64 | cpio -idmv.

Initramfs bertanggung jawab untuk memuat semua driver, memulai udev, dan menemukan sistem file root. Ini adalah langkah yang gagal bagi Anda — ia tidak dapat menemukan sistem file root, jadi ia menyelamatkan.

Setelah initramfs selesai, ia memiliki sistem file root yang terpasang, dan menyerahkan kontrol ke / sbin / init.

Boot sistem

Pada titik ini, init Anda mengambil alih — saya pikir Ubuntu saat ini menggunakan pemula.

Apa yang rusak

Saya tidak sepenuhnya yakin apa yang rusak (sebagian, saya akui, karena saya jauh lebih akrab dengan cara kerjanya di Debian daripada Ubuntu, meskipun serupa), tetapi saya punya beberapa saran:

  • Initramfs memiliki salinannya sendiri mdadm.conf. Anda mungkin hanya perlu menjalankannya update-initramfs -uuntuk memperbaikinya.
  • Lihatlah pesan-pesan boot. Mungkin ada kesalahan. Singkirkan 'quiet' dan 'splash' dan mungkin tambahkan 'verbose' ke baris kernel Anda untuk benar-benar melihatnya.
  • Bergantung pada penyimpanan yang digunakan, Anda mungkin perlu mengatur parameter rootdelay.
  • Ketika Anda dibuang ke shell prompt, Anda tidak memiliki banyak perintah, tetapi Anda memiliki mdadm. Cobalah untuk mencari tahu apa yang salah. Jika Anda memperbaiki masalah, boot dapat dilanjutkan.
derobert
sumber
2
saran pertama Anda tepat. Jawaban Anda datang saat saya menulis sendiri. Terima kasih telah meluangkan waktu untuk menjawab. Sangat dihargai. Saya pikir pertanyaan Anda memberikan wawasan tambahan. +1 plus accept.
0xC0000022L
2

Oke, saya tahu bahwa saya hanya kehilangan satu potong. The initrdgambar tidak diperbarui setelah mengutak-atik mdadm.conf.

Jadi apa yang saya lakukan?

Saya boot ke Ubuntu Server menginstal sistem penyelamatan CD. Memilih untuk mengeksekusi shell dari lingkungan installer dan tidak menggunakan sistem file root. Kemudian (komentar diawali dengan #):

cat /proc/mdstat
# It showed me md125, md126 and md127
# Stop those:
mdadm -S /dev/md125
mdadm -S /dev/md126
mdadm -S /dev/md127
# Assemble the root volume (meta-data version 0.9)
mdadm -Av --update=super-minor --run /dev/md0 /dev/sda3 /dev/sdb3
# Assemble the other two arrays, updating the names (meta-data version 1.2)
mdadm -Av --update=name --run /dev/md1 /dev/sda2 /dev/sdb2
mdadm -Av --update=name --run /dev/md2 /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh
# Check the outcome:
cat /proc/mdstat
# See preferred minor and names:
mdadm --detail /dev/md0
mdadm --detail /dev/md1
mdadm --detail /dev/md2
# All is fine, so proceed ...
# Create directory for the chroot:
mkdir /target
# Mount root volume on it
mount /dev/md0 /target
mount -o bind /dev /target/dev
mount -o bind /proc /target/proc
mount -o bind /sys /target/sys
mount -o bind /dev/pts /target/dev/pts
# Now chroot into it:
chroot /target /bin/bash
# Fix up the GRUB device map to match what 'mdadm --detail' gives as UUID:
nano /boot/grub/devicemap

nano

Saya menggunakan nanokarena vimmembuat saya sakit kepala karena terminal bodoh, secara harfiah. Anda dapat menggunakan Ctrl+ xuntuk keluar (akan meminta untuk menyimpan, Ctrl+ kuntuk memotong garis saat ini, Ctrl+ uuntuk menempelkan garis potong, Ctrl+ ountuk menyimpan buffer.

Ini terdengar rumit, tetapi dapat dilakukan juga dengan bashsatu-liner (meskipun panjang):

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

Ini menggunakan saat ini nama-nama mdperangkat dan UUIDs mereka dan menciptakan devicemapuntuk teliti GRUB2 ini. Jadi dengan anggapan hal di atas dilakukan dengan benar, Anda harus sudah memiliki nama perangkat yang benar.

Lebih lanjut tentang:

# Edit the grub config
nano /etc/default/grub

Pastikan itu mengandung:

GRUB_PRELOAD_MODULES="part_gpt raid mdraid09 ext2"

jika Anda telah mengonfigurasi /atau /bootpartisi Anda menjadi meta-data versi 1.2, gunakan mdraid1xsebagai gantinya mdraid09.

Lebih lanjut:

# Update the initrd images
update-initramfs -c -k all

Langkah di atas adalah tautan yang hilang . Ini rupanya memastikan bahwa mulai mdadm.confberlaku saat boot.

# Install GRUB2 on the two drives eligible for booting, just to be sure
grub-install --no-floppy /dev/sda
grub-install --no-floppy /dev/sdb
# Make the latest config take effect
update-grub

Setelah itu tinggalkan chrootdan reboot.

0xC0000022L
sumber