К сожалению, в том, как EFI справляются с подобными вещами, нет стандартизации, но, по моему опыту, поведение, которое вы описываете, довольно распространено. Проблема в том, что EFI намного "умнее" идентифицируют загрузочные устройства, чем BIOS, и многие EFI удаляют недопустимые загрузочные записи, когда они идентифицируются как таковые. Таким образом, когда вы отключите USB-накопитель и снова включите компьютер, он заметит, что есть неправильная загрузочная запись для USB-накопителя, и удалит его из списка загрузки. Я не знаю никакого решения EFI для такого рода проблем.
Это не значит, что обходных путей нет. В частности, вы можете установить менеджер загрузки EFI на свой внутренний диск, который делает то, что вы хотите - то есть загружать Windows, когда USB-накопитель не подключен, и загружать Ubuntu с USB-накопителя, когда он подключен. Затем вы оставили бы этот менеджер загрузки установленным как загрузочную программу по умолчанию.
К сожалению, GRUB AFAIK Ubuntu не может быть настроен таким образом, поэтому вам нужно искать в другом месте. Правило, которому вы хотите следовать, достаточно просто, чтобы можно было написать действительно простую программу для выполнения этой работы, но то, что я знаю, может сделать это гораздо сложнее: мой собственный менеджер загрузки rEFInd. Я рекомендую вам попробовать установить и настроить его следующим образом:
- Загрузиться в Ubuntu.
- Проверьте, что (если что-то) смонтировано в
/boot/efi
. (Набрав df -h
, вы увидите смонтированные в данный момент разделы.)
- Если
/boot/efi
соответствует разделу на USB-накопителе, размонтируйте его и смонтируйте системный раздел EFI (ESP) с жесткого диска. (Как отмечено в ссылке, ESP является разделом FAT с определенным кодом типа. Вы , возможно , придется отслеживать его вниз с gdisk
parted
или GParted.)
- Установите пакет Debian rEFInd со страницы загрузок rEFInd. Не устанавливайте PPA; установите пакет Debian (или используйте файл
.zip
и запустите refind-install
вручную).
- Отредактируйте
/boot/efi/EFI/refind/refind.conf
и внесите следующие изменения:
- При желании установите время
timeout -1
. Если этот параметр установлен, меню rEFInd не появится, если вы не нажмете клавишу при запуске rEFInd. Возможно, вы захотите отложить установку до тех пор, пока вы не протестируете установку.
- Установите
default_selection "vmlinuz,Microsoft"
. Это приводит к тому, что rEFInd загружает Linux, если находит ядро Linux, и Windows, если ядро Linux отсутствует, то есть если USB-диск Linux отключен. Замена vmlinuz
на grub
также должна работать, и стоит попробовать, если vmlinuz
не работает.
- Перезагрузите и протестируйте систему.
Если вы попробуете это без установки значения времени timeout
, вы должны увидеть появившееся меню rEFInd и выделить опцию Windows (которая может быть единственной опцией), если USB-накопитель отключен; но опция Ubuntu должна быть выделена по умолчанию, если USB-накопитель подключен. Если это работает, установка времени timeout -1
приведет к прямой загрузке нужной ОС.
Если rEFInd не обнаруживает установку Ubuntu с подключенным USB-накопителем, попробуйте нажать Esc. Если появляется опция Ubuntu, попробуйте установить scan_delay 1
(или, возможно, какое-то более высокое значение).
Самая большая проблема с использованием rEFInd таким образом заключается в том, что при запуске будет происходить задержка, сканирование ОС и так далее. Это должно быть всего секунда или две, когда USB-накопитель не подключен, и, может быть, еще две или три секунды, когда USB-накопитель подключен. Более специализированный менеджер загрузки, способный справиться с этой конкретной задачей, мог бы выполнять работу с меньшей задержкой, но я не знаю ни одной такой программы.