4

efibootmgr создает недопустимые записи в меню загрузки EFI. Например, efibootmgr -c -d /dev/sdX -p Y -l /EFI/refind/refind_x64.efi -L "rEFInd Boot Manager" добавляет не загружаемые японские символы в меню загрузки.

С другой стороны, bcfg boot add 3 fs0:\EFI\refind\refind_x64.efi "rEFInd" работает просто отлично.

Теперь я хотел бы загружаться непосредственно на vmlinuz-linux а не проходить через refind . У кого-нибудь есть идеи как передать параметры в ядро? Без параметров это: bcfg boot add 3 fs0:\vmlinuz-linux "linux" но какую опцию мне нужно использовать для добавления initrd=\initramfs-linux.img root=/dev/sda2 ?

Спасибо

5 ответов5

1

Я сталкиваюсь с той же ситуацией. Я полагаю, что решение будет включать использование параметра -opt либо в строке с add, либо в качестве дополнительной команды. Пока что мне не удалось поместить все параметры в строку в кавычках. Моя следующая попытка будет создать файл с использованием edit и передать имя файла с помощью -opt.

Если вам это удастся, пожалуйста, обновите эту тему.

Итак, в оболочке uefi я использовал edit для создания файла opt на носителе в том же месте, что и ядро. В нем я поместил параметры ядра в одну строку. Затем я использовал команду bcfg boot -opt 0 FS0:\filename. Возможно, вам потребуется использовать другой номер FS, -opt номер и имя файла, чтобы соответствовать вашей конфигурации.

1

У меня были похожие проблемы на одной конкретной (Supermicro) материнской плате, и, хотя предложение Стива об использовании текстового файла работает, есть немного больше нюансов. Я попытался задокументировать процесс ниже:

  1. Если у вас нет bcfg , вам сначала нужно получить копию оболочки EFI 2.x. Прошивка материнской платы, вероятно, имеет 1.x. Arch wiki содержит больше подробностей, но для большинства современных 64-битных систем вы захотите взять Shell.efi отсюда, переименовать его в shellx64.efi и поместить его прямо в корень системного раздела EFI. Если ваша материнская плата предоставляет Launch EFI Shell from filesystem device , используйте его. В противном случае вы можете использовать встроенную оболочку для запуска обновленной оболочки. Смотрите вики для получения дополнительной информации.

  2. Попав в оболочку 2.x, вы захотите убедиться, что ваш вариант загрузки существует. Вы можете перечислить параметры с помощью bcfg boot dump -b (-b включает пейджер, как и more). Если он не существует, вам нужно добавить его, желательно в верхнюю часть списка. Вы можете просматривать список файловых систем с помощью map -b , искать записи, начинающиеся с fs например, fs0: а затем использовать ls например, ls fs0:\ , ls fs0:\EFI\ и т.д., Для изучения каталогов.

    Как только вы найдете путь к загрузчику (и правильное устройство fs), добавьте его (как в оригинальном вопросе):

    bcfg boot add 3 fs0:\EFI\refind\refind_x64.efi "rEFInd"
    

    Это добавляет его как 4-ую загрузочную запись (считая от 0, 1, 2, 3)

  3. После добавления опции загрузки (проверьте с помощью bcfg boot dump -b), вам нужно добавить дополнительные данные (параметры загрузки). Как кратко упомянул Стив, самый надежный способ сделать это - сохранить эти параметры в файл, а затем импортировать их с помощью bcfg -opt . Однако, насколько я могу судить, это добавляет опции, так что лучше всего сначала загрузиться с bcfg boot rm опцию загрузки и прочитав ее, как описано в шаге 2. Если у вас есть чистая запись, вы можете добавить дополнительные данные. Например:

    edit fs0:\EFI\refind\options.txt
    

    Это откроет редактор файлов. Введите свои параметры (в одну строку) и нажмите F2 для сохранения. Нажмите F3 для выхода. Вы также можете редактировать этот файл изнутри ОС, но вы должны сохранить его как UTF-16 (LE, little-endian). Редактор EFI Shell делает это автоматически.

    Следующим шагом является импорт параметров:

    bcfg boot -opt 3 fs0:\EFI\refind\options.txt
    

    Опять же, 3 указывает загрузочную запись. Это должно соответствовать тому, что вы добавили. Не запускать эту команду несколько раз - вы должны rm и повторно add запись , прежде чем вы можете изменить параметры.

  4. Проверьте параметры загрузки и дополнительные данные с помощью bcfg boot dump -v -b .

0

Первая введенная вами команда верна. Вы добавляете опции с другой командой. Для вашего конкретного случая это:

Shell> bcfg boot -opt 3 "initrd=\initramfs-linux.img root=/dev/sda2"
0

Моя документация для efibootmgr показывает, что -p предназначен для указания номера раздела, но в вашем вопросе похоже, что вы используете Y для значения. Если это не опечатка, это может объяснить, почему в меню появляются странные символы и возникают проблемы с загрузкой.

Что касается передачи параметров, есть переключатель -@ который ускользнул от моего внимания первые пару раз, когда я читал документы. Если вы укажете имя файла, он будет читать строку параметров из этого файла.

Документы также говорят, что вы можете использовать - как имя файла, но когда я попробовал это, я не смог заставить его продолжить после ввода текста; казалось, что нажатие клавиши enter или ^D дает никакого эффекта, в то время как ^C завершает работу программы без внесения изменений.


Если вы хотите поэкспериментировать на виртуальной машине, прежде чем связываться с вашим оборудованием, может быть полезно следующее - хотя вам необходимо настроить пути OVMF для вашего дистрибутива:

  • Установите qemu и пакет прошивки ovmf.
  • Скопируйте /usr/share/edk2-ovmf/OVMF_VARS.fd в текущий каталог - qemu запишет изменения конфигурации EFI в этот файл.
  • Создайте каталог для qemu для использования в качестве виртуального VFAT (vvfat). Я буду называть это как hda с этого момента .
  • Скопируйте ядро с заглушкой EFI в hda .
  • Если в этом ядре нет встроенного initrd с оболочкой и efibootmgr , найдите или соберите initrd, который есть, и поместите его в hda . (Общий initrd может работать, так как те, как правило, позволяют вам войти в аварийный режим, если они не могут найти корневой том.)
  • начать QEMU; Я использую следующую команду:

    qemu-system-x86_64 -drive if=pflash,format=raw,unit=0,readonly=on,file=/usr/share/edk2-ovmf/OVMF_CODE.fd -drive if=pflash,format=raw,unit=1,readonly=off,file=OVMF_VARS.fd -enable-kvm -cpu host -m 1024 -usb -device usb-tablet -netdev user,id=mynet -device virtio-net-pci,netdev=mynet -hda fat:rw:hda -boot menu=on
    
    • После загрузки не изменяйте hda извне ВМ - см. Предупреждение здесь .
    • Обратите внимание на -boot menu=on части. При необходимости вы можете нажать ESC во время загрузки, и вы попадете в конфигурацию uefi. Оттуда вы можете загружать определенные записи или создавать / удалять / редактировать.
  • Вы попадете в EFI Shell, если он не найдет файл для загрузки.

    • Оттуда вы можете использовать bcfg для просмотра / редактирования записей.
    • Или вы можете загрузить ядро Linux:

      fs0:
      bzImage.efi initrd=\absolute\path\to\initrd arg arg arg
      
    • ... в этот момент ядро должно загрузиться и загрузиться с предоставленными initrd и args. Обратите внимание, что абсолютный путь является обязательным при использовании initrd - см. Efi-stub.txt
    • Теперь вы можете покопаться в файлах efi в /sys/firmware/ , попробовать efibootmgr и т.д., И все это, не рискуя своим настоящим оборудованием. Наслаждайтесь!
0

Вы должны использовать это вместо этого /dev/sda вы также должны использовать partuuid или uuid следующим образом:

--disk /dev/sdX --part Y --create --label "Arch Linux" --loader /vmlinuz-linux --unicode 'root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw initrd=\initramfs-linux.img' --verbose

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .