기본 시작 프로세스

기본 시작 프로세스

Ubuntu가 시작될 때 장치를 조립하는 방법은 무엇입니까 md? 여기에 실제로 /etc/mdadm/mdadm.conf관련 요소가 있습니까?

mdadm.conf시스템이 정상인데 복구 CD 환경에서 확인해 봤습니다. 실행되면 mdadm -A --scan필요에 따라 장치 이름을 찾아 할당합니다. 여기에는 어레이 조립의 모든 자동화를 제거하는 것이 mdadm.conf포함됩니다 .AUTO -all

내가 해야 할 일은 md시작 시 장치를 자동으로 조립할 수 있거나 조립 시 0.9 배열과 (분명히 ) 1.2 배열 의 값을 mdadm.conf존중하여 내가 놓친 퍼즐 조각 없이 작업을 수행할 수 있는 것입니다. ?super-minorname<hostname>:<super-minor>mdadm.conf


다음과 같은 문제가 발생했습니다. mdRAID1을 사용하는 장치 2개( md0md1)와 RAID6을 사용하는 장치 1개( ) 가 있습니다 md2. 내 말은, 그 사람들 말이야원하다장치 이름. md0메타데이터 버전은 0.9이고 나머지 두 버전은 1.2입니다. 다른 두 개와 md0매핑되지만 관련이 없습니다./시작하다.

부팅 드라이브는 GPT로 분할되어 있습니다. sda1그 위에 접착제 "BIOS 부팅 파티션"( )이 있습니다. grub-install --no-floppy /dev/sda성공을 보고합니다.

  • md0 == sda3 + sdb3
  • md1 == sda2 + sdb2
  • md2 == sdc + sdd + sde + sdf + sdg + sdh
  • sda1sdb1다 "BIOS 부팅 파티션"입니다.

GRUB2는 내가 제공한 내용에 만족하고 /boot/grub/devicemapGRUB2에 미리 로드할 모듈에 , , 및 를 추가합니다.part_gptraidmdraid09ext2

내 루트 볼륨은 여전히 ​​복구 환경에 있으므로 모든 것을 마운트하고 chroot여기에 씁니다.

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

거기에서 super-minoron md0(메타데이터 0.9 사용)과 nameon md1및 off md2도 작동하는지 확인했습니다 mdadm --detail .... 그 외에는 , /etc/default/grub실행 update-grubgrub-install --no-floppy /dev/sdaon 도 조정했습니다 grub-install --no-floppy /dev/sdb.

initramfs그러나 이후 부팅 시 루트 파일 시스템을 마운트할 수 없기 때문에 항상 복구 쉘 에 들어가게 됩니다 . 점검 결과 /proc/mdstat해당 md장치가 조립 및 작동조차 되지 않은 것이 원인인 것으로 보입니다. 다른 두 개(메타데이터 버전 1.2) 드라이브는 125..127 범위의 장치 번호를 수신합니다.

노트:GRUB2는 부팅 디스크에서 나타납니다. 적어도 올바르게 삽입되었습니다. 문제는 rootfs초기 루트 파일 시스템에서 올바른 루트 파일 시스템으로 변환하는 것입니다.

답변1

기본 시작 프로세스

애벌레

  1. Grub은 MBR에서 디스크, MD, 파일 시스템 등의 코드를 읽습니다.
  2. Grub은 /boot 파티션을 찾아 그 파티션에서 나머지 부분을 읽습니다. 구성과 구성이 로드해야 하는 모든 모듈을 포함합니다.
  3. Grub은 일반적으로 커널과 initramfs를 메모리에 로드하고 커널을 실행하도록 지시하는 구성의 지침을 따릅니다.

Grub은 실제로 파일 시스템을 읽을 수 없을 때 대체 모드를 사용합니다. 이는 모든 코드를 부트 레코드에 포함할 공간이 충분하지 않거나 파일 시스템이나 그 아래의 레이어에 대해 알지 못하기 때문입니다. 이 경우 GRUB는 섹터 목록을 포함하고 여기에서 코드를 읽습니다. 이것은많은매우 강력하지 않으므로 피하는 것이 가장 좋습니다. 커널과 initramfs도 실행할 수 있습니다(확실하지는 않습니다).

핵심

그런 다음 커널은 제어권을 갖고 많은 기본 하드웨어 초기화를 수행합니다. 이 단계는 꽤 빠릅니다. 다음으로 커널은 initramfs를 tmpfs로 압축을 풀고 /init해당 tmpfs를 찾습니다. 그런 다음 실행됩니다(일반적인 의미에서는 현재 커널이 완전히 실행 중입니다) /init. 그건 그렇고, 이것은 평범한 오래된 쉘 스크립트입니다.

파일 시스템 초기화

다음과 같은 작업을 수행하여 initramfs를 수동으로 추출할 수 있습니다 mkdir /tmp/foo; cd /tmp/foo; zcat /boot/initrd.img-3.8-trunk-amd64 | cpio -idmv.

initramfs는 모든 드라이버를 로드하고, udev를 시작하고, 루트 파일 시스템을 찾는 일을 담당합니다. 이 단계는 실패합니다. 루트 파일 시스템을 찾을 수 없으므로 종료됩니다.

initramfs가 완료되면 루트 파일 시스템을 마운트하고 제어권을 /sbin/init로 전송합니다.

시스템 시작

이 시점에서 귀하의 초기화가 인계될 것입니다. 현재 우분투는 upstart를 사용하고 있는 것 같습니다.

뭐가 고장났어?

나는 무엇이 잘못되었는지 완전히 확신하지 못합니다(유사하지만 Ubuntu보다 Debian에서 작동하는 방식에 더 익숙하기 때문에 부분적으로 문제라는 것을 인정합니다). 그러나 몇 가지 제안이 있습니다.

  • initramfs 에는 자체적인 mdadm.conf.update-initramfs -u
  • 시작 메시지를 봅니다. 오류가 있을 수 있습니다. "quiet"과 "splash"를 제거하고 실제로 확인하려면 커널 줄에 "verbose"를 추가하세요.
  • 사용된 스토리지에 따라 rootdelay 매개변수를 설정해야 할 수도 있습니다.
  • 쉘 프롬프트에 덤프하면 명령이 많지 않지만 mdadm이 있습니다. 문제가 무엇인지 알아보십시오. 문제가 해결되면 부팅을 계속할 수 있습니다.

답변2

글쎄, 나는 단 한 가지를 놓치고 있다는 것을 깨달았습니다. 패치된 이미지는 initrd아직 업데이트되지 않았습니다 mdadm.conf.

그래서 내가 무엇을 했나요?

Ubuntu Server 설치 CD에서 복구 시스템으로 부팅했습니다. 설치 프로그램 환경에서 셸을 실행하도록 선택하고아니요루트 파일 시스템을 사용하십시오. 그런 다음 (이전 설명 #):

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때문에 나는 그것을 사용한다 . + 종료(저장하라는 메시지가 표시됨, + 현재 줄 잘라내기, + 잘라낸 줄 붙여넣기, + 버퍼 저장)를 vim사용할 수 있습니다 .CtrlxCtrlkCtrluCtrlo

복잡해 보이지만 bash한 줄의 코드(길기는 하지만)로도 수행할 수 있습니다.

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

이는 다음을 사용합니다.현재의장치의 이름 md과 해당 UUID이며, devicemapGRUB2에서 정독할 수 있는 파일을 생성합니다. 따라서 위의 작업이 올바르게 수행되었다고 가정하면 이미 올바른 장치 이름이 있어야 합니다.

더 나아가:

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

다음이 포함되어 있는지 확인하세요.

GRUB_PRELOAD_MODULES="part_gpt raid mdraid09 ext2"

메타데이터 버전 1.2로 구성된 파티션이 있는 경우 /대신 을 사용하세요 ./bootmdraid1xmdraid09

더 멀리:

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

위 단계는 누락된 링크입니다.. 이는 분명히 mdadm.conf시작 시 적용되도록 보장합니다.

# 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

그런 다음 종료 chroot하고 다시 시작하십시오.

관련 정보