Ubuntu가 시작될 때 장치를 조립하는 방법은 무엇입니까 md
? 여기에 실제로 /etc/mdadm/mdadm.conf
관련 요소가 있습니까?
내 mdadm.conf
시스템이 정상인데 복구 CD 환경에서 확인해 봤습니다. 실행되면 mdadm -A --scan
필요에 따라 장치 이름을 찾아 할당합니다. 여기에는 어레이 조립의 모든 자동화를 제거하는 것이 mdadm.conf
포함됩니다 .AUTO -all
내가 해야 할 일은 md
시작 시 장치를 자동으로 조립할 수 있거나 조립 시 0.9 배열과 (분명히 ) 1.2 배열 의 값을 mdadm.conf
존중하여 내가 놓친 퍼즐 조각 없이 작업을 수행할 수 있는 것입니다. ?super-minor
name
<hostname>:<super-minor>
mdadm.conf
다음과 같은 문제가 발생했습니다. md
RAID1을 사용하는 장치 2개( md0
및 md1
)와 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
sda1
둘sdb1
다 "BIOS 부팅 파티션"입니다.
GRUB2는 내가 제공한 내용에 만족하고 /boot/grub/devicemap
GRUB2에 미리 로드할 모듈에 , , 및 를 추가합니다.part_gpt
raid
mdraid09
ext2
내 루트 볼륨은 여전히 복구 환경에 있으므로 모든 것을 마운트하고 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-minor
on md0
(메타데이터 0.9 사용)과 name
on md1
및 off md2
도 작동하는지 확인했습니다 mdadm --detail ...
. 그 외에는 , /etc/default/grub
실행 update-grub
및 grub-install --no-floppy /dev/sda
on 도 조정했습니다 grub-install --no-floppy /dev/sdb
.
initramfs
그러나 이후 부팅 시 루트 파일 시스템을 마운트할 수 없기 때문에 항상 복구 쉘 에 들어가게 됩니다 . 점검 결과 /proc/mdstat
해당 md
장치가 조립 및 작동조차 되지 않은 것이 원인인 것으로 보입니다. 다른 두 개(메타데이터 버전 1.2) 드라이브는 125..127 범위의 장치 번호를 수신합니다.
노트:GRUB2는 부팅 디스크에서 나타납니다. 적어도 올바르게 삽입되었습니다. 문제는 rootfs
초기 루트 파일 시스템에서 올바른 루트 파일 시스템으로 변환하는 것입니다.
답변1
기본 시작 프로세스
애벌레
- Grub은 MBR에서 디스크, MD, 파일 시스템 등의 코드를 읽습니다.
- Grub은 /boot 파티션을 찾아 그 파티션에서 나머지 부분을 읽습니다. 구성과 구성이 로드해야 하는 모든 모듈을 포함합니다.
- 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이며, devicemap
GRUB2에서 정독할 수 있는 파일을 생성합니다. 따라서 위의 작업이 올바르게 수행되었다고 가정하면 이미 올바른 장치 이름이 있어야 합니다.
더 나아가:
# Edit the grub config
nano /etc/default/grub
다음이 포함되어 있는지 확인하세요.
GRUB_PRELOAD_MODULES="part_gpt raid mdraid09 ext2"
메타데이터 버전 1.2로 구성된 파티션이 있는 경우 /
대신 을 사용하세요 ./boot
mdraid1x
mdraid09
더 멀리:
# 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
하고 다시 시작하십시오.