Загрузка данных
По вашему выводу схема теперь определена точно:
* `/dev/sda2`, ext4, UUID `b6776460-1449-44dd-9ef5-daf8a04dc889` — корень Fedora `/`;
* отдельного раздела `/boot` нет: каталог `/boot` находится внутри `/dev/sda2`;
* `/dev/sda4`, vfat, UUID `03C7-F581` — раздел `/boot/efi`;
* параметр `rootflags=subvol=root` использовать нельзя, потому что система находится на ext4, а не Btrfs.
Ниже инструкция **с текущего момента**. В интерактивной консоли `grub>` ничего делать не потребуется.
Fedora формирует пункты своих ядер из BLS-файлов в `/boot/loader/entries`, а основной конфиг находится в `/boot/grub2/grub.cfg`. EFI-файл `/boot/efi/EFI/fedora/grub.cfg` на современных Fedora является коротким перенаправляющим файлом. ([fedoraproject.org][1])
---
## 1. Проверьте, что корень всё ещё смонтирован
Сейчас вы находитесь под `root` в Live Fedora.
```bash
findmnt /mnt/fedora
```
Должен отображаться `/dev/sda2`.
Если вывода нет:
```bash
mkdir -p /mnt/fedora
mount UUID=b6776460-1449-44dd-9ef5-daf8a04dc889 /mnt/fedora
```
Проверка:
```bash
cat /mnt/fedora/etc/fedora-release
```
---
## 2. Подключите EFI-раздел в правильное место
```bash
mkdir -p /mnt/fedora/boot/efi
```
```bash
mountpoint -q /mnt/fedora/boot/efi || \
mount UUID=03C7-F581 /mnt/fedora/boot/efi
```
Проверьте:
```bash
findmnt -R /mnt/fedora
```
Должно быть примерно:
```text
/dev/sda2 /mnt/fedora ext4
/dev/sda4 /mnt/fedora/boot/efi vfat
```
Проверьте EFI-файлы:
```bash
ls -lah /mnt/fedora/boot/efi/EFI/fedora
```
Там должны быть `shim.efi`, `shimx64.efi`, `grubx64.efi` и `grub.cfg`.
---
## 3. Сделайте резервную копию загрузочной конфигурации
```bash
STAMP=$(date +%F-%H%M%S)
BACKUP="/mnt/fedora/root/boot-repair-$STAMP"
mkdir -p "$BACKUP"
```
```bash
cp -a /mnt/fedora/boot/grub2 "$BACKUP/" 2>/dev/null || true
cp -a /mnt/fedora/boot/loader "$BACKUP/" 2>/dev/null || true
cp -a /mnt/fedora/boot/efi/EFI/fedora "$BACKUP/efi-fedora"
```
Покажите путь копии:
```bash
echo "$BACKUP"
```
---
## 4. Подготовьте повторный вход в chroot
```bash
for dir in dev proc sys run; do
mount --rbind "/$dir" "/mnt/fedora/$dir"
mount --make-rslave "/mnt/fedora/$dir"
done
```
Войдите в установленную Fedora:
```bash
chroot /mnt/fedora /bin/bash
```
Все последующие команды до команды `exit` выполняются **внутри chroot**.
Для надёжности установите PATH:
```bash
export PATH=/usr/sbin:/usr/bin:/sbin:/bin
```
Проверьте систему:
```bash
cat /etc/fedora-release
```
Проверьте монтирование:
```bash
findmnt -T /
findmnt -T /boot
findmnt -T /boot/efi
```
Для `/` и `/boot` должен отображаться `/dev/sda2`, а для `/boot/efi` — `/dev/sda4`.
---
## 5. Проверьте ядро и initramfs
```bash
KVER=6.17.1-300.fc43.x86_64
```
```bash
ls -lh \
"/boot/vmlinuz-$KVER" \
"/boot/initramfs-$KVER.img"
```
Оба файла должны существовать и иметь ненулевой размер.
Также проверьте модули:
```bash
test -d "/usr/lib/modules/$KVER" \
&& echo "Модули ядра найдены" \
|| echo "Модули ядра НЕ найдены"
```
Если `vmlinuz`, `initramfs` или каталог модулей отсутствует, не переходите к перезагрузке.
---
## 6. Подготовьте правильные параметры ядра
Будем использовать параметры из `/etc/kernel/cmdline`, но принудительно укажем правильный ext4-корень.
```bash
EXTRA=""
```
```bash
if [ -s /etc/kernel/cmdline ]; then
for arg in $(cat /etc/kernel/cmdline); do
case "$arg" in
root=*|rootflags=*|ro|rw|BOOT_IMAGE=*)
;;
*)
EXTRA="$EXTRA $arg"
;;
esac
done
fi
```
```bash
CMDLINE="root=UUID=b6776460-1449-44dd-9ef5-daf8a04dc889 ro$EXTRA"
echo "$CMDLINE"
```
В строке не должно быть:
```text
rootflags=subvol=root
```
---
## 7. Попробуйте штатно создать BLS-запись через `grubby`
`grubby` поддерживает создание записи с указанием ядра, initramfs и аргументов командной строки. ([Документация Red Hat][2])
Создайте каталог:
```bash
mkdir -p /boot/loader/entries
```
Проверьте наличие утилиты:
```bash
command -v grubby
```
Затем:
```bash
grubby \
--add-kernel="/boot/vmlinuz-$KVER" \
--initrd="/boot/initramfs-$KVER.img" \
--title="Fedora Linux ($KVER)" \
--args="$CMDLINE"
```
Посмотрите результат:
```bash
ls -lah /boot/loader/entries
```
Найдите созданную запись:
```bash
ENTRY=$(grep -l "$KVER" /boot/loader/entries/*.conf 2>/dev/null | head -n 1)
echo "$ENTRY"
```
Если переменная содержит путь, покажите файл:
```bash
cat "$ENTRY"
```
Ожидаются строки вида:
```text
title Fedora Linux (...)
version 6.17.1-300.fc43.x86_64
linux ...
initrd ...
options ...
```
### Если файл `.conf` появился
Переходите к шагу 8.
### Если `grubby` завершился ошибкой или каталог остался пустым
Переходите к разделу **«Резервный вариант»** ниже.
---
## 8. Проверьте `kernelopts`
Некоторые Fedora BLS-записи содержат прямые параметры, другие используют:
```text
options $kernelopts
```
Создайте `grubenv`, только если его нет:
```bash
if [ ! -f /boot/grub2/grubenv ]; then
grub2-editenv /boot/grub2/grubenv create
fi
```
Если созданная запись использует `$kernelopts`:
```bash
if grep -qE '^[[:space:]]*options[[:space:]]+\$kernelopts' "$ENTRY"; then
grub2-editenv /boot/grub2/grubenv set "kernelopts=$CMDLINE"
fi
```
Покажите окружение:
```bash
grub2-editenv /boot/grub2/grubenv list
```
Если там присутствует строка `blsdir=...`, удалите только её:
```bash
if grub2-editenv /boot/grub2/grubenv list | grep -q '^blsdir='; then
grub2-editenv /boot/grub2/grubenv unset blsdir
fi
```
Fedora по умолчанию ищет BLS-файлы в `loader/entries` относительно загрузочной файловой системы; переменная `blsdir` может перенаправить поиск в другое, ошибочное место. ([fedoraproject.org][1])
---
## 9. Включите обработку BLS
```bash
if grep -q '^GRUB_ENABLE_BLSCFG=' /etc/default/grub; then
sed -i 's/^GRUB_ENABLE_BLSCFG=.*/GRUB_ENABLE_BLSCFG=true/' /etc/default/grub
else
printf '\nGRUB_ENABLE_BLSCFG=true\n' >> /etc/default/grub
fi
```
Проверьте:
```bash
grep '^GRUB_ENABLE_BLSCFG=' /etc/default/grub
```
Должно быть:
```text
GRUB_ENABLE_BLSCFG=true
```
---
## 10. Пересоздайте основной конфиг GRUB
```bash
grub2-mkconfig -o /boot/grub2/grub.cfg
```
Выполнять нужно именно эту команду. Не записывайте результат в `/boot/efi/EFI/fedora/grub.cfg`: на Fedora 34 и новее это короткий файл-перенаправление. ([fedoraproject.org][3])
Проверьте наличие вызова BLS:
```bash
grep -nE 'insmod blscfg|^[[:space:]]*blscfg' /boot/grub2/grub.cfg
```
Проверьте запись ядра:
```bash
grubby --info=ALL
```
И ещё раз:
```bash
cat "$ENTRY"
```
---
## 11. Проверьте EFI-файл, но не изменяйте его
```bash
cat /boot/efi/EFI/fedora/grub.cfg
```
Согласно вашему предыдущему выводу, он уже правильный и должен выглядеть примерно так:
```text
search --no-floppy --root-dev-only --fs-uuid --set=dev b6776460-1449-44dd-9ef5-daf8a04dc889
set prefix=($dev)/boot/grub2
export $prefix
configfile $prefix/grub.cfg
```
Почему именно `/boot/grub2`: отдельного `/boot` у вас нет, поэтому каталог расположен внутри корневого ext4-раздела.
Если содержимое совпадает, ничего с этим файлом не делайте.
---
# Резервный вариант: если `grubby` не создал BLS-файл
Этот вариант создаёт обычный постоянный пункт Fedora через конфигурацию установленной системы. В консоли `grub>` вводить ничего не придётся.
Создайте отдельный генератор меню:
```bash
cat > /etc/grub.d/41_fedora_repair <<EOF
#!/bin/sh
cat <<'GRUB_EOF'
menuentry 'Fedora Linux $KVER (repair)' --class fedora --class gnu-linux --class os {
insmod part_gpt
insmod ext2
search --no-floppy --fs-uuid --set=root b6776460-1449-44dd-9ef5-daf8a04dc889
linux /boot/vmlinuz-$KVER root=UUID=b6776460-1449-44dd-9ef5-daf8a04dc889 ro
initrd /boot/initramfs-$KVER.img
}
GRUB_EOF
EOF
```
Сделайте файл исполняемым:
```bash
chmod 755 /etc/grub.d/41_fedora_repair
```
Пересоздайте конфиг:
```bash
grub2-mkconfig -o /boot/grub2/grub.cfg
```
Убедитесь, что пункт добавлен:
```bash
grep -n "Fedora Linux $KVER (repair)" /boot/grub2/grub.cfg
```
Если строка найдена, этот пункт должен появиться в меню GRUB.
После успешной загрузки установленной Fedora можно будет отдельно разобраться, почему `grubby`/`kernel-install` не создают BLS-файлы, а временный файл удалить:
```bash
sudo rm /etc/grub.d/41_fedora_repair
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
```
Но удалять его нужно только после восстановления штатных записей.
---
## 12. Финальная проверка перед перезагрузкой
Для штатного варианта с BLS:
```bash
test -s "/boot/vmlinuz-$KVER" \
&& echo "OK: ядро"
test -s "/boot/initramfs-$KVER.img" \
&& echo "OK: initramfs"
test -s /boot/grub2/grub.cfg \
&& echo "OK: основной grub.cfg"
test -s /boot/efi/EFI/fedora/grub.cfg \
&& echo "OK: EFI grub.cfg"
test -n "$ENTRY" -a -s "$ENTRY" \
&& echo "OK: BLS-запись"
```
Если применялся резервный вариант:
```bash
test -x /etc/grub.d/41_fedora_repair \
&& echo "OK: резервная запись"
grep -q "Fedora Linux $KVER (repair)" /boot/grub2/grub.cfg \
&& echo "OK: резервный пункт включён в GRUB"
```
---
## 13. Выйдите из chroot и перезагрузитесь
Сначала синхронизируйте изменения:
```bash
sync
```
Выйдите из chroot:
```bash
exit
```
Теперь вы снова в терминале Live Fedora.
Размонтируйте систему:
```bash
umount -R /mnt/fedora
```
Если команда завершилась без ошибок:
```bash
reboot
```
После начала перезагрузки извлеките флешку.
В меню GRUB должен появиться либо обычный пункт:
```text
Fedora Linux (6.17.1-300.fc43.x86_64)
```
либо резервный:
```text
Fedora Linux 6.17.1-300.fc43.x86_64 (repair)
```
Не выполняйте `grub2-install`, `mkfs`, `wipefs`, `fdisk` или `parted`. Для UEFI-систем Fedora не рекомендует `grub2-install`; ваши EFI-файлы уже существуют и GRUB запускается. ([fedoraproject.org][3])
[1]: https://fedoraproject.org/wiki/Changes/BootLoaderSpecByDefault?utm_source=chatgpt.com "Changes/BootLoaderSpecByDefault - Fedora Project Wiki"
[2]: https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.1_release_notes/known-issue_boot-loader?utm_source=chatgpt.com "11.9. ブートローダー | 9.1 Release Notes | Red Hat Enterprise Linux | 9 | Red Hat Documentation"
[3]: https://fedoraproject.org/wiki/GRUB_2?utm_source=chatgpt.com "GRUB 2 - Fedora Project Wiki"