Если ты пользуешься dual-boot системой, то знаком с этой проблемой

Представь ситуацию: ты работаешь в Linux, при этом слушая музыку через любимые Bluetooth-наушники. Всё работает идеально. Заканчивается рабочий день и ты перезагружаешься на Windows для того чтобы расслабиться и поиграть. Хочешь подключить те-же самые наушники, но, внезапно... Они не работают...

Естественно ты начинаешь разбираться в проблеме, открываешь настройки Bluetooth и нажимаешь на кнопку "Подключить". Но после 10-ти секунд ожидания ничего не происходит. Система видит наушники в Bluetooth, они сопряжены, но ты не можешь к ним подключиться. Приходится удалять устройство и сопрягать его заново.

На следующий день возвращаешься в Linux. И... та же самая история. Снова удаление, снова сопряжение.

Dual boot frustration
Dual boot frustration

Это повторяется каждый чёртов раз.

С наушниками Sony WH-1000XM5. С AirPods Pro. С Xbox-геймпадом. С каждым грёбаным Bluetooth-устройством.

Давай немного посчитаем

Переподключение одного устройства занимает примерно 1-3 минуты твоего времени:

  • Открыть настройки Bluetooth → 10 сек

  • Найти устройство → 10 сек

  • Удалить старое сопряжение → 5 сек

  • Перевести устройство в режим сопряжения → 15 сек

  • Подключить заново → 30 сек

  • Проверить работоспособность → 20 сек

Итого: ~90 секунд на одно устройство.

У меня в работе - 3 Bluetooth-устройства (наушники, мышь, клавиатура). Переключаюсь между ОС 3 раза в день.

3 устройства × 90 секунд × 3 переключения = 13.5 минут в день
13.5 минут × 250 рабочих дней = 3375 минут в год
3375 минут = 56.25 часов = 2.3 полных дня

Больше двух суток в год я тратил на переподключение Bluetooth-устройств!!!

Почему так происходит?

Проблема кроется в том, как работает Bluetooth-шифрование:

При первом сопряжении устройства обмениваются криптографическими ключами:

  • LTK (Long Term Key) — основной ключ шифрования

  • IRK (Identity Resolving Key) — ключ для приватности (случайные MAC-адреса)

  • CSRK (Connection Signature Resolving Key) — ключ для подписи данных

Эти ключи сохраняются в OC:

  • Windows: в реестре HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys

  • Linux: в файлах BlueZ /var/lib/bluetooth/[MAC]/[DEVICE]/info

Но подвох в том, что каждая ОС генерирует свои собственные ключи.

Когда происходит переключение между Windows и Linux:

  1. Устройство находит твой компьютер по MAC-адресу Bluetooth-адаптера

  2. Пытается установить зашифрованное соединение с сохранённым ключом

  3. Ключ не совпадает с тем, что хранится в текущей ОС

  4. Соединение отклоняется

  5. Устройство требует повторного сопряжения

Bluetooth-устройство может хранить только один ключ для одного хоста. Поэтому каждое новое сопряжение перезаписывает предыдущий ключ.

Существующие "решения"

Вариант 1: Ручная синхронизация

Технически продвинутые пользователи копируют ключи вручную:

  1. Загружаются в Windows

  2. Экспортируют ключи из реестра

  3. Перезагружаются в Linux

  4. Конвертируют формат ключей

  5. Вставляют в конфигурационные файлы BlueZ

  6. Перезапускают Bluetooth-службу

Но этот способ несёт в себе некоторые риски и неудобства:

  • Нужно делать после каждого нового сопряжения

  • Требует доступа к разделу Windows из Linux (и наоборот)

  • Легко ошибиться в формате или расположении ключей

  • Существует риск повредить системный реестр Windows

Вариант 2: bt-dualboot

Существует утилита bt-dualboot, которая пытается автоматизировать процесс.

Но в ней не всё так идеально:

  1. Требует ручного запуска после каждого сопряжения. Автоматизации нет.

  2. Нет поддержки двухсторонней синхронизации. Работает только из под Linux.

  3. Требует монтирования раздела Windows с правами на запись.

  4. Использует хакерские методы (chntpw) для модификации реестра Windows. Chntpw изначально создан для взлома систем.

  5. Проект заброшен с 2022 года. Существующие проблемы в разделе issues остаются без ответа.

BlueVein — моё решение

После очередного раза, когда я потратил 10 минут на переподключение всех устройств, — мне надоело. Я решил что проблема должна решаться автоматически.

Я потратил месяц на разработку BlueVein — кросс-платформенного инструмента для автоматической синхронизации Bluetooth-ключей между Linux и Windows.

Главные принципы

  • Полная автоматизация — установил и забыл

  • Синхронизация в реальном времени — изменения применяются мгновенно

  • Двусторонняя работа — неважно, в какой ОС ты сопрягаешь устройство

  • Поддержка BLE — все типы ключей (LTK, IRK, CSRK)

  • Безопасность — работа на системном уровне с привилегиями администратора

  • Zero configuration — не нужно указывать пути, разделы или настраивать что-либо

Как это работает?

Система состоит из трёх компонентов:

1. Мониторинг на каждой ОС

Linux systemd service:

  • Следит за изменениями в /var/lib/bluetooth/

  • Отслеживает события D-Bus от BlueZ

  • Применяет обновления к локальным устройствам

Windows service:

  • Следит за реестром BTHPORT\Parameters\Keys

  • Использует WinAPI для получения событий Bluetooth

  • Обновляет ключи в реестре

2. Общее хранилище в EFI

Ключи сохраняются в JSON-файл на EFI-разделе: /EFI/BlueVein/bluevein.json

Почему EFI?

  • Доступен из любой ОС без монтирования

  • Не зависит от BitLocker/LUKS шифрования

  • Защищён правами доступа (только root/admin)

  • Стандартное расположение на всех современных системах

3. Прямой доступ к FAT32

Для работы с EFI я написал собственную библиотеку fat32-raw, которая читает/записывает FAT32 напрямую, без монтирования.

Преимущества:

  • Не требует прав на монтирование

  • Работает даже если EFI не в /etc/fstab

  • Быстрее стандартного I/O

  • Кросс-платформенность (Windows тоже может читать EFI)

Архитектурная схема

Алгоритм синхронизации

Сценарий 1: Загрузка системы

diagram 2 - system boot
diagram 2 - system boot

Простыми словами:

  1. BlueVein запускается как системная служба

  2. Читает ключи из bluevein.json

  3. Проверяет локальные Bluetooth-устройства

  4. Если ключ в EFI новее — обновляет локальный

  5. Если в системе есть новое устройство — добавляет в EFI

Сценарий 2: Новое сопряжение

diagram 3 - new pairing
diagram 3 - new pairing

Простыми словами:

  1. Ты сопрягаешь новое устройство в любой ОС

  2. BlueVein получает событие о новом устройстве

  3. Извлекает ключи шифрования

  4. Сохраняет в bluevein.json

  5. При следующей загрузке другой ОС устройство работает автоматически

Технические детали реализации

Поддержка Bluetooth LE

BlueVein полностью поддерживает Bluetooth Low Energy с всеми типами ключей:

Тип ключа

Назначение

Поддержка

LTK

Long Term Key — основной ключ шифрования

Полная

Peripheral LTK

LTK для устройства в роли периферии

Полная

IRK

Identity Resolving Key — для приватности (случайные MAC)

Полная

CSRK

Connection Signature Resolving Key — для подписи данных

Полная

AddressType

Тип адреса (public/random)

Полная

Где хранятся ключи?

Ключи шифрования хранятся в EFI-разделе: /EFI/BlueVein/bluevein.json

Конечно у тебя возникнет вопрос, — безопасно ли это?
И я скажу — да. И вот почему:

  • EFI доступен только с правами root/admin

  • Файл имеет ограниченные права доступа (600)

  • BlueVein запускается как системная служба с повышенными привилегиями

  • Исходный код открыт — вы можете проверить сами

Что насчёт шифрования диска?

BlueVein работает независимо от BitLocker (Windows) или LUKS (Linux).

EFI-раздел обычно не шифруется и доступен до загрузки ОС. Это необходимо для работы загрузчика (GRUB, systemd-boot).

Можно ли взломать?

Теоретически, если у злоумышленника есть физический доступ к твоему компьютеру и права root/admin, он может:

  1. Прочитать bluevein.json

  2. Извлечь Bluetooth-ключи

  3. Подключиться к вашим устройствам

НО: для этого ему уже нужны права администратора на твоём компьютере. Если у него есть такой доступ — Bluetooth-ключи это наименьшая из твоих проблем :)

Как установить?

Arch Linux

# Установка через AUR
yay -S bluevein-bin

# Запуск службы
sudo systemctl enable --now bluevein

# Проверка статуса
sudo systemctl status bluevein

Другие дистрибутивы Linux

# Сборка из исходников
git clone https://github.com/meowrch/BlueVein.git
cd BlueVein
cargo build --release

# Установка
sudo cp target/release/bluevein /usr/local/bin/
sudo cp ./systemd/bluevein.service /etc/systemd/system/

# Запуск
sudo systemctl daemon-reload
sudo systemctl enable --now bluevein

Windows

# Скачайте bluevein.exe с GitHub Releases
# Поместите файл в корень диска (или в любое другое надёжное место)
# Откройте PowerShell от имени администратора

# Установка и запуск
.\bluevein.exe install
.\bluevein.exe start

# Проверка
Get-Service BlueVeinService

Сравнение с аналогами

Параметр

BlueVein

bt-dualboot

Ручная синхронизация

Автоматизация

✅ Полная

⚠️ Требует ручного запуска

❌ Полностью ручная

Поддержка BLE

✅ Все ключи

⚠️ Частичная

✅ Возможна

Множественные адаптеры

✅ Да

❌ Нет

✅ Да

Безопасность методов

✅ Официальные API

⚠️ chntpw (хак)

⚠️ Риск ошибок

Монтирование разделов

✅ Не требуется

❌ Требуется

❌ Требуется

Поддержка

✅ Активная разработка

❌ На данный момент заброшен

N/A

Заключение

Три месяца назад я тратил 2.3 дня в год на переподключение Bluetooth-устройств. Это раздражало, отвлекало, портило настроение.

Теперь я переключаюсь между Windows и Linux без боли. Без геморроя с bluetooth...

Я забыл о проблеме. Надеюсь и ты забудешь :)

Ссылки