Энтузиаст разработал самый удобный способ переключения между Windows и Linux
Разработчик программного обеспечения (ПО) в Weta Digital Стивен Холдэуэй создал физический переключатель между операционными системами (ОС) Windows и Linux при включении компьютера. По словам автора, его утомила постоянная двойная загрузка, чтобы изменить выбор ОС в загрузчике GRUB, поэтому разработал переключатель, который выполнил на микроконтроллере STM32.

Переключатель выбора аппаратной ОС
Доступ к USB-устройству в GRUB
Сначала автор хотел создать USB-устройство с настраиваемым интерфейсом для считывания положение переключателя, но не был уверен, справится ли с этой задачей GRUB. Загрузчик настроен с помощью упрощенного языка сценариев. Под ним находится система модулей, написанных на C.
GRUB реализует встроенную поддержку USB в модулях ehci
, uhci
и ohci
, но загрузка любого из них отключает обычный механизм, используемый для доступа к дискам через BIOS. В качестве альтернативы мог бы использоваться модуль nativedisk
для доступа к дискам независимо от BIOS, но он не позволяет GRUB загружать Windows по цепочке, что делает данный подход не подходящим.
Вместо того, чтобы создавать пользовательский интерфейс USB, автор использовал наличие у GRUB доступа ко всем подключенным устройствам хранения. Для этого он определил переключатель ОС как хранилище, содержащее файл с информацией о положении переключателя Windows/Linux.
Сборка чипа
Для сборки физической оболочки чипа были использованы:
- Тумблер;
- Микроконтроллер STM32 с поддержкой USB;
- Программатор ST-Link;
- Классическая плата разработчика «синяя таблетка» STM32F103;
- «Черная таблетка» STM32F4xx;
- Макетная плата Adafruit Feather.
Прошивка чипа
Программная часть и инструкция по прошивке находятся в коде и доступны на GitHub.
Прошивка действует как запоминающее устройство USB, содержащая динамический скрипт загрузчика GRUB, который устанавливает переменную для указания положения физического переключателя.
В Linux нужен установленный gcc-arm-none-eabi
для сборки чипа и openocd
для прошивки.
# Pull in libopencm3 git submodule init git submodule update # Build libopencm3 (only needed once) make -C libopencm3 -j8 # Build the firmware make # Flash with a J-Link programmer connected by SWD make flash # Flash with an ST-Link programmer connected by SWD make flash PROGRAMMER=stlink
Положение переключателя считывается с контакта A6. Подключите тумблер между этим контактом и GND для управления сообщаемым состоянием.
Чтобы искать и читать файлы с устройства, нужно изменить конфигурацию GRUB системы. В системах на основе Debian и Arch это спровоцирует включение редактирования скрипта в etc/grub.d/
, а затем запуск update-grub
для создания и проверки файла /boot/grub/grub.cfg
, исполняемого при загрузке. Чтобы узнать, как это делается в конкретной ОС, нужно посмотреть документацию дистрибутива.
Ниже пример того, как переключатель можно использовать в скрипте GRUB.
# Look for hardware switch device by its hard-coded filesystem ID search --no-floppy --fs-uuid --set hdswitch 55AA-6922 # If found, read dynamic config file and select appropriate entry for each position if [ "${hdswitch}" ] ; then source ($hdswitch)/switch_position_grub.cfg if [ "${os_hw_switch}" == 0 ] ; then # Boot Linux set default="0" elif [ "${os_hw_switch}" == 1 ] ; then # Boot Windows set default="2" else # Fallback to default set default="${GRUB_DEFAULT}" fi else set default="${GRUB_DEFAULT}" fi
Возможные проблемы и их решение
- Устройство недоступно в GRUB. Для решения проблемы убедитесь, что BIOS настроен на перечисления USB-накопителей. На некоторых материнских платах для этого требуется переключиться с режима «fast boot» на «normal boot». Если получается загрузиться с флешки, получится получить доступ к устройству и из GRUB.
- Чтение из операционной системы. Чтобы получить доступ к состоянию переключателя из операционной системы необходимо реализовать второй интерфейс USB на устройстве или работать с отключенным блочным устройство.
Полная запись процесса доступна в журнале проекта.
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: