Не удалось загрузиться с раздела mdadm raid 1

Вопрос или проблема

Окружение

  • Аппаратное обеспечение: обычный ПК X86_64. Есть два жестких диска по 4 ТБ, /dev/sda и /dev/sdb.
  • ОС: Anolis OS 23.1 (вариант CentOS Stream, как RockyLinux, поэтому поведение должно быть очень похожим).
  • Вывод lsblk -f:
NAME    FSTYPE            FSVER LABEL    UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sda                                                                                          
├─sda1  vfat              FAT16          3687-D3D5                             121.6M     5% /mnt/newraid/boot/efi
│                                                                                            /boot/efi
├─sda2  ext4              1.0            a8889be5-a5bf-4001-80fd-8cc5848b0f15    3.4T     0% /home
├─sda3  ext4              1.0            7ed59ca5-1062-4841-9eaf-5455de1ff527   16.3G    11% /
└─sda4  swap              1              7cb849cb-db1a-46da-a64b-5afffb1e7c4c                [SWAP]
sdb                                                                                          
├─sdb1  vfat              FAT16          75D0-F9B6                                           
├─sdb2  linux_raid_member 1.2   ZX-NAS:1 d2d58a60-b4fb-d792-5430-07603f85c090                
│ └─md1 ext4              1.0            24814373-7082-4290-986b-5f049e4d76dd    3.4T     0% /mnt/newraid/home
├─sdb3  linux_raid_member 1.2   ZX-NAS:0 ae686811-5489-4aa6-c48d-458fe0bbc232                
│ └─md0 ext4              1.0            d3984281-70f1-47fc-aaf0-8627d49ec68f   16.3G    11% /mnt/newraid
└─sdb4  swap              1              533b5b6a-5931-4fb0-b3ee-1152a62e6e11                

Что я хочу сделать

  1. Скопировать все файлы с /dev/sda на /dev/sdb (что я сделал с помощью rsync).
  2. Создать записи grub для ОС на /dev/sdb.
  3. Загрузиться в систему на /dev/sdb, чтобы наконец-то добавить /dev/sda в массив mdadm RAID1.

Что я сделал

  1. Смонтировал все разделы:
mount /dev/md0 newraid
mount /dev/md1 newraid/home
mount /dev/sda1 newraid/boot/efi
mount --bind /dev newraid/dev
mount --bind /dev/pts newraid/dev/pts
mount --bind /proc newraid/proc
mount --bind /sys newraid/sys
  1. chroot в смонтированный каталог и переустановил пакеты grub2:
chroot newraid/
rm /boot/grub2/grub.cfg
rm /boot/efi/EFI/anolis/grub.cfg
dnf reinstall shim-* grub2-efi-* grub2-common

Связанная информация (в chroot окружении)

  • Содержимое /etc/mdadm.conf:
DEVICE /dev/sda* /dev/sdb*
ARRAY /dev/md0 metadata=1.2 name=ZX-NAS:0 UUID=ae686811:54894aa6:c48d458f:e0bbc232
ARRAY /dev/md1 metadata=1.2 name=ZX-NAS:1 UUID=d2d58a60:b4fbd792:54300760:3f85c090
  • Вывод grubby --info DEFAULT показывает корректный UUID для /dev/md0:
index=0
kernel="/boot/vmlinuz-6.6.25-2.1.an23.x86_64"
args="ro resume=UUID=7cb849cb-db1a-46da-a64b-5afffb1e7c4c rhgb quiet"
root="UUID=d3984281-70f1-47fc-aaf0-8627d49ec68f"
initrd="/boot/initramfs-6.6.25-2.1.an23.x86_64.img $tuned_initrd"
title="Anolis OS (6.6.25-2.1.an23.x86_64) 23"
id="1e06d08a379c4b8eb7c36745cd33b690-6.6.25-2.1.an23.x86_64"
  • Содержимое /boot/efi/EFI/anolis/grub.cfg:
search --no-floppy --fs-uuid --set=dev d3984281-70f1-47fc-aaf0-8627d49ec68f
set prefix=($dev)/boot/grub2
export $prefix
configfile $prefix/grub.cfg
  • Содержимое /boot/grub2/grub.cfg:
#
# НЕ РЕДАКТИРУЙТЕ ЭТОТ ФАЙЛ
#
# Он автоматически создается с помощью grub2-mkconfig с использованием шаблонов
# из /etc/grub.d и настроек из /etc/default/grub
#

### НАЧАЛО /etc/grub.d/00_header ###
set pager=1

if [ -f ${config_directory}/grubenv ]; then
  load_env -f ${config_directory}/grubenv
elif [ -s $prefix/grubenv ]; then
  load_env
fi
if [ "${next_entry}" ] ; then
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
else
   set default="${saved_entry}"
fi

if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
else
  menuentry_id_option=""
fi

export menuentry_id_option

if [ "${prev_saved_entry}" ]; then
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
fi

function savedefault {
  if [ -z "${boot_once}" ]; then
    saved_entry="${chosen}"
    save_env saved_entry
  fi
}

function load_video {
  if [ x$feature_all_video_module = xy ]; then
    insmod all_video
  else
    insmod efi_gop
    insmod efi_uga
    insmod ieee1275_fb
    insmod vbe
    insmod vga
    insmod video_bochs
    insmod video_cirrus
  fi
}

terminal_output console
if [ x$feature_timeout_style = xy ] ; then
  set timeout_style=menu
  set timeout=5
# Код нормального таймаута в случае, если функция timeout_style недоступна.
else
  set timeout=5
fi
### КОНЕЦ /etc/grub.d/00_header ###

### НАЧАЛО /etc/grub.d/00_tuned ###
set tuned_params=""
set tuned_initrd=""
### КОНЕЦ /etc/grub.d/00_tuned ###

### НАЧАЛО /etc/grub.d/01_users ###
if [ -f ${prefix}/user.cfg ]; then
  source ${prefix}/user.cfg
  if [ -n "${GRUB2_PASSWORD}" ]; then
    set superusers="root"
    export superusers
    password_pbkdf2 root ${GRUB2_PASSWORD}
  fi
fi
### КОНЕЦ /etc/grub.d/01_users ###

### НАЧАЛО /etc/grub.d/08_fallback_counting ###
insmod increment
# Проверьте, существует ли boot_counter и boot_success=0 для активации этого поведения.
if [ -n "${boot_counter}" -a "${boot_success}" = "0" ]; then
  # если обратный отсчет закончился, выберите запуск откатного развертывания,
  # т.е. default=1 на системах на основе OSTree.
  if  [ "${boot_counter}" = "0" -o "${boot_counter}" = "-1" ]; then
    set default=1
    set boot_counter=-1
  # иначе уменьшить boot_counter
  else
    decrement boot_counter
  fi
  save_env boot_counter
fi
### КОНЕЦ /etc/grub.d/08_fallback_counting ###

### НАЧАЛО /etc/grub.d/10_linux ###
insmod part_gpt
insmod diskfilter
insmod mdraid1x
insmod ext2
set root="mduuid/ae68681154894aa6c48d458fe0bbc232"
if [ x$feature_platform_search_hint = xy ]; then
  search --no-floppy --fs-uuid --set=root --hint="mduuid/ae68681154894aa6c48d458fe0bbc232"  d3984281-70f1-47fc-aaf0-8627d49ec68f
else
  search --no-floppy --fs-uuid --set=root d3984281-70f1-47fc-aaf0-8627d49ec68f
fi
insmod part_gpt
insmod fat
set boot="hd0,gpt1"
if [ x$feature_platform_search_hint = xy ]; then
  search --no-floppy --fs-uuid --set=boot --hint-bios=hd0,gpt1 --hint-efi=hd0,gpt1 --hint-baremetal=ahci0,gpt1  3687-D3D5
else
  search --no-floppy --fs-uuid --set=boot 3687-D3D5
fi

# Этот раздел был сгенерирован с помощью скрипта. Не изменяйте сгенерированный файл - все изменения
# будут потеряны в следующий раз, когда файл будет сгенерирован. Вместо этого редактируйте файлы BootLoaderSpec.
#
# Команда blscfg разбирает файлы BootLoaderSpec, хранящиеся в /boot/loader/entries, и
# заполняет меню загрузки. Пожалуйста, ознакомьтесь с документацией спецификации загрузчика для формата файлов: https://systemd.io/BOOT_LOADER_SPECIFICATION/.

# Переменная kernelopts должна быть определена в файле grubenv. Но чтобы гарантировать, что меню
# записи, заполненные из файлов BootLoaderSpec, использующих эту переменную, работали правильно даже
# без файла grubenv, определите переменную резервной kernelopts, если она не была установлена.
#
# Переменная kernelopts в файле grubenv может быть изменена с помощью инструмента grubby или путем
# выполнения инструмента grub2-mkconfig. Для последнего значения параметров GRUB_CMDLINE_LINUX
# и GRUB_CMDLINE_LINUX_DEFAULT из файла /etc/default/grub используются для задания как
# переменной kernelopts в файле grubenv, так и резервной переменной kernelopts.
if [ -z "${kernelopts}" ]; then
  set kernelopts="root=UUID=d3984281-70f1-47fc-aaf0-8627d49ec68f ro resume=UUID=7cb849cb-db1a-46da-a64b-5afffb1e7c4c rhgb quiet "
fi

insmod blscfg
blscfg
### КОНЕЦ /etc/grub.d/10_linux ###

### НАЧАЛО /etc/grub.d/10_reset_boot_success ###
# Скрытие меню допустимо, если последний загрузка прошла успешно или если это первая попытка загрузки записи
if [ "${boot_success}" = "1" -o "${boot_indeterminate}" = "1" ]; then
  set menu_hide_ok=1
else
  set menu_hide_ok=0 
fi
# Сброс boot_indeterminate после успешной загрузки
if [ "${boot_success}" = "1" ] ; then
  set boot_indeterminate=0
# Избегайте boot_indeterminate, вызывая скрытие меню более одного раза
elif [ "${boot_indeterminate}" = "1" ]; then
  set boot_indeterminate=2
fi
# Сброс boot_success для текущей загрузки 
set boot_success=0
save_env boot_success boot_indeterminate
### КОНЕЦ /etc/grub.d/10_reset_boot_success ###

### НАЧАЛО /etc/grub.d/12_menu_auto_hide ###
if [ x$feature_timeout_style = xy ] ; then
  if [ "${menu_show_once}" ]; then
    unset menu_show_once
    save_env menu_show_once
    set timeout_style=menu
    set timeout=60
  elif [ "${menu_auto_hide}" -a "${menu_hide_ok}" = "1" ]; then
    set orig_timeout_style=${timeout_style}
    set orig_timeout=${timeout}
    if [ "${fastboot}" = "1" ]; then
      # timeout_style=menu + timeout=0 избегает проверки нажатий клавиш для отсчета
      set timeout_style=menu
      set timeout=0
    else
      set timeout_style=hidden
      set timeout=1
    fi
  fi
fi
### КОНЕЦ /etc/grub.d/12_menu_auto_hide ###

### НАЧАЛО /etc/grub.d/14_menu_show_once ###
if [ x$feature_timeout_style = xy ]; then
  if [ "${menu_show_once_timeout}" ]; then
    set timeout_style=menu
    set timeout="${menu_show_once_timeout}"
    unset menu_show_once_timeout
    save_env menu_show_once_timeout
  fi
fi
### КОНЕЦ /etc/grub.d/14_menu_show_once ###

### НАЧАЛО /etc/grub.d/20_linux_xen ###
### КОНЕЦ /etc/grub.d/20_linux_xen ###

### НАЧАЛО /etc/grub.d/20_ppc_terminfo ###
### КОНЕЦ /etc/grub.d/20_ppc_terminfo ###

### НАЧАЛО /etc/grub.d/25_bli ###
if [ "$grub_platform" = "efi" ]; then
  insmod bli
fi
### КОНЕЦ /etc/grub.d/25_bli ###

### НАЧАЛО /etc/grub.d/30_os-prober ###
    menuentry 'Anolis OS 23 (на /dev/sda3)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-6.6.25-2.1.an23.x86_64--7ed59ca5-1062-4841-9eaf-5455de1ff527' {
        insmod part_gpt
        insmod ext2
        set root="hd0,gpt3"
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt3 --hint-efi=hd0,gpt3 --hint-baremetal=ahci0,gpt3  7ed59ca5-1062-4841-9eaf-5455de1ff527
        else
          search --no-floppy --fs-uuid --set=root 7ed59ca5-1062-4841-9eaf-5455de1ff527
        fi
        linux /boot/vmlinuz-6.6.25-2.1.an23.x86_64 root=/dev/sda3
        initrd /boot/initramfs-6.6.25-2.1.an23.x86_64.img
    }
    menuentry 'Anolis OS 23 (на /dev/sda3)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-0-rescue-1e06d08a379c4b8eb7c36745cd33b690--7ed59ca5-1062-4841-9eaf-5455de1ff527' {
        insmod part_gpt
        insmod ext2
        set root="hd0,gpt3"
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt3 --hint-efi=hd0,gpt3 --hint-baremetal=ahci0,gpt3  7ed59ca5-1062-4841-9eaf-5455de1ff527
        else
          search --no-floppy --fs-uuid --set=root 7ed59ca5-1062-4841-9eaf-5455de1ff527
        fi
        linux /boot/vmlinuz-0-rescue-1e06d08a379c4b8eb7c36745cd33b690 root=/dev/sda3
        initrd /boot/initramfs-0-rescue-1e06d08a379c4b8eb7c36745cd33b690.img
    }

# Другие ОС найдены, отмените автоматическое скрытие меню, если menu_auto_hide=2
if [ "${orig_timeout_style}" -a "${menu_auto_hide}" != "2" ]; then
  set timeout_style=${orig_timeout_style}
  set timeout=${orig_timeout}
fi
### КОНЕЦ /etc/grub.d/30_os-prober ###

### НАЧАЛО /etc/grub.d/30_uefi-firmware ###
if [ "$grub_platform" = "efi" ]; then
    fwsetup --is-supported
    if [ "$?" = 0 ]; then
        menuentry 'Настройки прошивки UEFI' $menuentry_id_option 'uefi-firmware' {
            fwsetup
        }
    fi
fi
### КОНЕЦ /etc/grub.d/30_uefi-firmware ###

### НАЧАЛО /etc/grub.d/40_custom ###
# Этот файл предоставляет простой способ добавить пользовательские записи меню. Просто введите
# записи меню, которые вы хотите добавить после этого комментария. Будьте осторожны, чтобы не изменять
# строку 'exec tail' выше.
### КОНЕЦ /etc/grub.d/40_custom ###

### НАЧАЛО /etc/grub.d/41_custom ###
if [ -f  ${config_directory}/custom.cfg ]; then
  source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
  source $prefix/custom.cfg
fi
### КОНЕЦ /etc/grub.d/41_custom ###

Какую ошибку я получил

Что я пытался

  • Изменение путей разделов mdadm в /etc/fstab с UUID на /dev/md0(1) не работает.
  • dracut --regenerate-all -f не работает.
  • Поскольку невозможно успешно загрузиться, логи dmesg или journalctl недоступны.

Ответ или решение

Неудачная загрузка с раздела RAID 1, созданного с помощью mdadm

Введение

Вы столкнулись с проблемой загрузки системы с RAID 1, созданным с использованием mdadm на Anolis OS 23.1. В этом ответе мы рассмотрим шаги, которые вы предприняли, и предложим решения, которые могут помочь вам успешно загрузить систему.

Описание проблемы

Вы описали, что процесс загрузки зависает на установлении связи с /dev/md0. Это происходит после попыток установки и настройки GRUB на новом устройстве, /dev/sdb. Вы выполнили копирование файлов с /dev/sda на /dev/sdb, а затем прошли процесс установки GRUB. Однако теперь система не может найти нужный RAID-устройство, что приводит к бесконечному ожиданию.

Анализ окружения

По предоставленной информации мы можем выделить несколько важных аспектов:

  • Вы используете два HDD по 4TB, которые объединены в массив mdadm.
  • Убедитесь, что RAID-устройство правильно настроено и доступно для системы при загрузке.
  • Вы используете EFI загрузчик, что требует правильной настройки GRUB и конфигурации загрузчика.

Возможные причины проблемы

  1. Неправильная настройка MDADM: Убедитесь, что массив правильно инициализирован и доступен перед загрузкой.
  2. Конфликт между параметрами BIOS и UEFI: Иногда системы могут загрузиться неправильно, если вы пытаетесь загрузиться с UEFI, но конфигурация не поддерживается.
  3. Ошибки в конфигурации GRUB: Параметры в /boot/grub2/grub.cfg могут указывать на неправильные UUID. Вам нужно убедиться, что все UUID в конфигурации корректны и соответствуют действующим устройствам.

Рекомендации по устранению проблемы

  1. Проверка и исправление конфигурации mdadm:

    • Используйте команду mdadm --assemble --scan, чтобы убедиться, что RAID-устройства правильно собираются и обнаруживаются.
    • Также убедитесь, что файл /etc/mdadm.conf содержит правильную информацию о ваших устройствах RAID.
  2. Переустановка GRUB:

    • Заходите в chroot и попытайтесь снова переустановить GRUB:
      grub2-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=anolis
      grub2-mkconfig -o /boot/grub2/grub.cfg
    • Убедитесь, что GRUB настроен на загрузку с md0 и что его конфигурации корректны.
  3. Проверка приоритетов загрузки:

    • Убедитесь, что в BIOS/UEFI установлено правильное устройство для загрузки, чтобы система загружалась с /dev/sdb.
  4. Обновление initramfs:

    • Выполните команду dracut --force, чтобы обновить initramfs и удостовериться, что все необходимые модули (включая mdadm) включены.
    • Это гарантирует, что загрузчик сможет найти ваше RAID-устройство на этапе загрузки.
  5. Логирование и диагностика:

    • Поскольку у вас нет доступа к dmesg или журналам, попытайтесь подключить устройство к другой системе или использовать rescue-mode, чтобы получить доступ к логам и диагностировать текущие ошибки.

Заключение

Проблема с загрузкой из RAID 1 массива, созданного с помощью mdadm, может быть решена с помощью проверки конфигураций, установки GRUB, правильной инициализации массивов и обновления initramfs. Отправляясь по каждому из предоставленных шагов, вы увеличиваете вероятность успешной загрузки. Не забывайте, что в случае возникновения дополнительных трудностей, доступ к официальной документации и форумам может дать дополнительные идеи и помощь.

Оцените материал
Добавить комментарий

Капча загружается...