Ubuntu: Làm thế nào để các thiết bị md được lắp ráp khi khởi động?


8

Làm thế nào để các mdthiết bị được lắp ráp khi khởi động trong Ubuntu? Có /etc/mdadm/mdadm.confthực sự là yếu tố liên quan ở đây?

Tôi mdadm.conflà âm thanh và tôi đã kiểm tra rằng trong khi tôi đang ở trong môi trường đĩa CD cứu hộ. Khi chạy, mdadm -A --scannó tìm và gán tên thiết bị như mong muốn. Có mdadm.confchứa AUTO -allđể loại bỏ tất cả chủ nghĩa tự động từ lắp ráp các mảng.

Điều tôi cần làm là có thể tự động lắp ráp các mdthiết bị như đã nêu trong mdadm.conflúc khởi động hoặc khi lắp ráp nó sẽ tôn vinh super-minorgiá trị cho mảng 0,9 và name(rõ ràng <hostname>:<super-minor>) cho mảng 1,2 và thực hiện đúng mà không cần mdadm.conf. Tôi đang thiếu mảnh ghép nào?


Tôi có vấn đề sau đây. Có hai mdthiết bị có RAID1 ( md0md1) và một có RAID6 ( md2). Tôi đang đề cập đến họ bằng tên thiết bị mong muốn . md0có phiên bản dữ liệu meta 0.9, hai phiên bản còn lại có phiên bản 1.2. md0bản đồ đến /và hai cái kia không liên quan để khởi động .

Ổ đĩa khởi động được phân vùng GPT. Có một keo "Phân vùng khởi động BIOS" ( sda1) trên đó. grub-install --no-floppy /dev/sdabáo cáo thành công.

  • md0 == sda3 + sdb3
  • md1 == sda2 + sdb2
  • md2 == sdc + sdd + sde + sdf + sdg + sdh
  • sda1sdb1là "Phân vùng khởi động BIOS" mỗi

GRUB2 là hạnh phúc với /boot/grub/devicemaptôi đã cho nó và tôi đã thêm part_gpt, raid, mdraid09ext2các mô-đun để tải trước trong GRUB2.

Vì tôi vẫn có khối lượng gốc trong môi trường cứu hộ, tôi chỉ cần gắn mọi thứ và sau đó chỉnh sửa chrootnó:

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

Từ đó tôi đặt lại super-minorbật md0(với siêu dữ liệu 0,9) và namebật md1md2. Tôi cũng xác minh rằng nó hoạt động bằng cách sử dụng mdadm --detail .... Khác hơn là tôi điều chỉnh /etc/default/grub, chạy update-grubvà cũng grub-install --no-floppy /dev/sdagrub-install --no-floppy /dev/sdb.

Sau đó, khi khởi động, tôi luôn bị rơi vào trình initramfscứu hộ, tuy nhiên, vì hệ thống tập tin gốc không thể được gắn kết. Lý do, sau khi kiểm tra /proc/mdstatdường như là mdthiết bị tương ứng thậm chí không được lắp ráp và chạy. Chưa kể rằng hai ổ đĩa khác (phiên bản siêu dữ liệu 1.2) nhận được số thiết bị ở đâu đó trong phạm vi 125..127.

Lưu ý: GRUB2 đi lên từ đĩa khởi động. Vì vậy, ít nhất nó đã được nhúng chính xác. Vấn đề là sự chuyển đổi từ ban đầu rootfssang hệ thống tập tin gốc thích hợp.


1
Đừng sử dụng /dev/mdXcho chính xác lý do này. Sử dụng /dev/md/NAMEthay thế. Điều đó sẽ không bao giờ thay đổi.
Patrick

@Patrick: Tôi không hiểu những gì bạn đang cố nói. Vấn đề không phải là tên mỗi người. Đó là ít nhiều mỹ phẩm. Vấn đề khối lượng gốc sẽ không được lắp ráp, do đó không có sẵn để khởi động và do đó tôi không thể khởi động. Tôi đang sử dụng UUID để nói với GRUB2 là thiết bị nào và tôi đang sử dụng UUID /etc/fstab. Việc thiết lập không phụ thuộc vào tên, tôi vẫn muốn chúng theo cách đó;)
0xC0000022L

Tôi nên đã làm rõ. Điều đó chỉ được khuyên là một giải pháp cho nhận xét của bạn Not to mention that the other two (meta-data version 1.2) drives receive a device number somewhere in the 125..127 range. Tôi không biết đủ về cách ubfox lắp ráp các khối đột kích để trả lời vấn đề lớn hơn.
Patrick

Câu trả lời:


17

Quá trình khởi động cơ bản

Grub

  1. Grub đọc mã đĩa, md, hệ thống tập tin, v.v. từ MBR.
  2. Grub tìm phân vùng / boot của nó và đọc phần còn lại của chính nó. Bao gồm cấu hình và bất kỳ mô-đun nào cấu hình chỉ định cần tải.
  3. Grub làm theo các hướng dẫn trong cấu hình, thường bảo nó tải kernel và initramfs vào bộ nhớ và thực thi kernel.

Có một chế độ dự phòng, vì khi Grub thực sự không thể đọc hệ thống tập tin, vì không có đủ không gian để nhúng tất cả mã đó vào bản ghi khởi động hoặc vì nó không biết hệ thống tệp hoặc các lớp bên dưới nó. Trong trường hợp này, GRUB nhúng một danh sách các lĩnh vực và đọc mã từ chúng. Đây là nhiều ít mạnh mẽ, và tốt nhất nên tránh. Nó thậm chí có thể làm kernel và initramfs như thế (không chắc chắn).

Hạt nhân

Nhân sau đó kiểm soát và thực hiện nhiều init phần cứng cơ bản. Giai đoạn này khá nhanh. Tiếp theo, kernel giải nén initramfs thành một tmpfs và tìm kiếm một /inittmpfs đó. Sau đó, nó thực thi (theo nghĩa thông thường, kernel đang chạy đầy đủ tại thời điểm này) /init. Nhân tiện, đây là một kịch bản shell cũ đơn giản.

Ban đầu

Bạn có thể trích xuất các initramfs bằng tay bằng cách làm một cái gì đó như mkdir /tmp/foo; cd /tmp/foo; zcat /boot/initrd.img-3.8-trunk-amd64 | cpio -idmv.

Các initramfs chịu trách nhiệm tải tất cả các trình điều khiển, bắt đầu udev và tìm hệ thống tập tin gốc. Đây là bước thất bại đối với bạn, nó không thể tìm thấy hệ thống tập tin gốc, vì vậy nó giải cứu.

Khi initramfs kết thúc, nó có hệ thống tập tin gốc được gắn kết và trao quyền kiểm soát cho / sbin / init.

Khởi động hệ thống

Tại thời điểm này, init của bạn chiếm quyền điều khiển, tôi nghĩ Ubuntu hiện đang sử dụng.

Cái gì vỡ

Tôi không hoàn toàn chắc chắn những gì đã bị hỏng (một phần, tôi thú nhận, vì tôi quen thuộc hơn với cách nó hoạt động trên Debian so với Ubuntu, mặc dù tương tự như vậy), nhưng tôi có một vài gợi ý:

  • Các initramfs có bản sao riêng của nó mdadm.conf. Bạn có thể chỉ cần chạy update-initramfs -uđể sửa nó.
  • Nhìn vào các thông điệp khởi động. Có thể có một lỗi. Loại bỏ 'yên tĩnh' và 'giật gân' và có thể thêm 'dài dòng' vào dòng nhân của bạn để thực sự nhìn thấy chúng.
  • Tùy thuộc vào bộ nhớ được sử dụng, bạn có thể cần đặt tham số rootdelay.
  • Khi bạn bị đổ vào dấu nhắc shell, bạn không có nhiều lệnh, nhưng bạn có mdadm. Hãy cố gắng tìm ra những gì đã đi sai. Nếu bạn khắc phục vấn đề, khởi động có thể tiếp tục.

2
đề nghị đầu tiên của bạn là tại chỗ. Câu trả lời của bạn đến trong khi tôi đang viết lên của riêng tôi. Cảm ơn đã dành thời gian trả lời. Nhiều đánh giá cao. Tôi nghĩ rằng câu hỏi của bạn cung cấp những hiểu biết bổ sung. +1 cộng chấp nhận.
0xC0000022L

2

Được rồi, tôi phát hiện ra rằng tôi đã mất chỉ đơn giản là một mảnh. Các initrdhình ảnh đã không được cập nhật sau khi mày mò mdadm.conf.

Vậy tôi đã làm gì?

Tôi đã khởi động vào Ubuntu Server cài đặt hệ thống cứu hộ của CD. Chọn để thực thi một shell từ môi trường trình cài đặt và không sử dụng hệ thống tập tin gốc. Sau đó (ý kiến ​​được chuẩn bị trước #):

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

Tôi đang sử dụng nanovimkhiến tôi đau đầu vì thiết bị đầu cuối câm, theo nghĩa đen. Bạn có thể sử dụng Ctrl+ xđể thoát (sẽ nhắc lưu, Ctrl+ kđể cắt dòng hiện tại, Ctrl+ uđể dán một dòng cắt, Ctrl+ ođể lưu bộ đệm.

Điều này nghe có vẻ phức tạp, nhưng cũng có thể được thực hiện với một bashlớp lót (mặc dù dài):

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

Điều này sử dụng tên hiện tại của mdthiết bị và UUID của chúng và tạo ra sự devicemapphù hợp cho GRUB2. Vì vậy, giả sử ở trên đã được thực hiện chính xác, bạn nên có tên thiết bị chính xác.

Hơn nữa về:

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

Hãy chắc chắn rằng nó chứa:

GRUB_PRELOAD_MODULES="part_gpt raid mdraid09 ext2"

nếu bạn đã cấu hình /hoặc /bootphân vùng của bạn thành siêu dữ liệu phiên bản 1.2, hãy sử dụng mdraid1xthay vì mdraid09.

Thêm nữa:

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

Bước trên là liên kết bị thiếu . Điều này rõ ràng đảm bảo rằng mdadm.confcó hiệu lực khi khởi động.

# 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

Sau đó rời khỏi chrootvà khởi động lại.

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.