102 lines
8.2 KiB
Markdown
102 lines
8.2 KiB
Markdown
|
|
# MontanaOS — Дорожная карта
|
|||
|
|
|
|||
|
|
Дата: 2026-05-06
|
|||
|
|
Привязка к спецификации: MontanaOS v0.2
|
|||
|
|
Целевой первый релиз: подписанный образ под Pixel 9 Pro XL
|
|||
|
|
|
|||
|
|
Список поддерживаемых устройств — раздел 4 спецификации, не дублируется здесь.
|
|||
|
|
|
|||
|
|
## Фаза 0. Скаффолдинг проекта
|
|||
|
|
|
|||
|
|
Текущая фаза.
|
|||
|
|
|
|||
|
|
- [x] Структура репозитория
|
|||
|
|
- [x] Спецификация версии 0.2 (после прохода критика)
|
|||
|
|
- [x] Карта Безопасности процесса узла
|
|||
|
|
- [x] Файлы ролей: архитектор, критик
|
|||
|
|
- [x] Эскизы патчей ядра и сервисных файлов
|
|||
|
|
- [x] Скелеты скриптов сборки
|
|||
|
|
- [ ] Окружение сборки на отдельной машине Debian 12
|
|||
|
|
- [ ] Зеркало GrapheneOS source
|
|||
|
|
|
|||
|
|
Длительность: один день.
|
|||
|
|
|
|||
|
|
## Фаза 1. Ванильная сборка GrapheneOS
|
|||
|
|
|
|||
|
|
Цель: собрать неизменённый образ GrapheneOS из исходников и прошить на тестовое устройство.
|
|||
|
|
|
|||
|
|
- [ ] Определение действующей ветки GrapheneOS под целевое устройство (через `git ls-remote` upstream)
|
|||
|
|
- [ ] Запись зафиксированных хэшей в [MONTANAOS_VERSIONS.lock](MONTANAOS_VERSIONS.template) (создание из шаблона)
|
|||
|
|
- [ ] Полная синхронизация дерева исходников
|
|||
|
|
- [ ] Полная сборка образов: загрузчик, vendor, system
|
|||
|
|
- [ ] Прошивка через fastboot на тестовое устройство
|
|||
|
|
- [ ] Проверка цепочки проверенной загрузки с пользовательским ключом
|
|||
|
|
- [ ] Закрытие открытого вопроса 8.3 (стратегия повторной синхронизации после применения патчей)
|
|||
|
|
|
|||
|
|
Длительность: одна-две недели.
|
|||
|
|
|
|||
|
|
## Фаза 2. Патчи ядра и системы инициализации
|
|||
|
|
|
|||
|
|
- [ ] Эмпирическая проверка: достаточно ли подъёма жёсткого лимита блокировки памяти через систему инициализации
|
|||
|
|
- [ ] Закрытие открытого вопроса 8.1 (нужен ли патч ядра пользовательской блокировки памяти)
|
|||
|
|
- [ ] При необходимости — применение патча ядра, создание SELinux-политики `montana_node.te`
|
|||
|
|
- [ ] Тест-критерий: непривилегированный процесс класса montana_main блокирует восемь мегабайт памяти под нагрузкой час без подкачки
|
|||
|
|
- [ ] Тест-критерий: попытка `ptrace` на процесс узла из любого другого домена завершается отказом доступа
|
|||
|
|
- [ ] Закрытие требований Карты Безопасности процесса узла, пункты 3 и 5
|
|||
|
|
|
|||
|
|
Длительность: две-четыре недели.
|
|||
|
|
|
|||
|
|
## Фаза 3. Встраивание узла Монтаны
|
|||
|
|
|
|||
|
|
- [ ] Сборка двоичного файла узла под целевую платформу aarch64-linux-android (закрытие открытого вопроса 8.10)
|
|||
|
|
- [ ] Упаковка двоичного файла в системный образ MontanaOS
|
|||
|
|
- [ ] Сервисная запись в системе инициализации с правильным классом, capabilities, oom_score_adj, rlimit core
|
|||
|
|
- [ ] Сторожевой таймер с проверкой Dumpable и VmLck
|
|||
|
|
- [ ] Тест-критерий: узел стартует автоматически, переживает принудительное убийство процесса, не вытесняется системой при нехватке памяти
|
|||
|
|
- [ ] Закрытие требований Карты Безопасности, пункты 1, 2, 4, 6, 7
|
|||
|
|
|
|||
|
|
Длительность: две-три недели.
|
|||
|
|
|
|||
|
|
## Фаза 4. Первичная настройка туннеля
|
|||
|
|
|
|||
|
|
- [ ] Чтение списка генезис-серверов из основной спецификации Монтаны (без дублирования адресов в MontanaOS)
|
|||
|
|
- [ ] Мастер первой загрузки: выбор точки выхода + явное согласие на публикацию устройства в сети
|
|||
|
|
- [ ] Семантика смены сети согласно разделу 5.5 спецификации
|
|||
|
|
- [ ] Закрытие открытого вопроса 8.6 (смена генезис-сервера после первой загрузки)
|
|||
|
|
- [ ] Тест-критерий: входящие соединения на порт восемь тысяч четыреста сорок четыре проходят к узлу через выбранный генезис-сервер
|
|||
|
|
|
|||
|
|
Длительность: одна-две недели.
|
|||
|
|
|
|||
|
|
## Фаза 5. Приложение статуса и батарейная диагностика
|
|||
|
|
|
|||
|
|
- [ ] Системное приложение «Статус Монтаны» по разделу 5.6 спецификации
|
|||
|
|
- [ ] Пороги предупреждений по температуре процессора: жёлтый 70°C, красный 80°C (закрывает дефект 7-1 критика v0.1)
|
|||
|
|
- [ ] Лимит зарядки восемьдесят процентов как рекомендуемая настройка GrapheneOS, не как требование MontanaOS
|
|||
|
|
- [ ] Закрытие открытого вопроса 8.8 (минимальный образ или среда исполнения Android)
|
|||
|
|
|
|||
|
|
Длительность: три-четыре недели.
|
|||
|
|
|
|||
|
|
## Фаза 6. Релизный конвейер
|
|||
|
|
|
|||
|
|
- [ ] Воспроизводимая сборка: два независимых билда дают побайтово идентичный образ, включая имя файла
|
|||
|
|
- [ ] Генерация корневого релизного ключа на изолированной машине (раздел 7.3 спецификации)
|
|||
|
|
- [ ] Генерация первого промежуточного релизного ключа, подпись корневым
|
|||
|
|
- [ ] Заполнение файлов [MONTANAOS_RELEASE_KEY.pub](MONTANAOS_RELEASE_KEY.pub) и [MONTANAOS_RELEASE_KEY.history](MONTANAOS_RELEASE_KEY.history)
|
|||
|
|
- [ ] Публикация подписанных образов на хабе Монтаны
|
|||
|
|
- [ ] Канал обновлений по воздуху через стандартный движок GrapheneOS
|
|||
|
|
- [ ] Закрытие открытого вопроса 8.4 (поведение цепочки подписи после ротации ключа)
|
|||
|
|
- [ ] Закрытие открытого вопроса 8.7 (минимальный объём постоянной памяти после первого тестнета)
|
|||
|
|
- [ ] Документация прошивки для конечных пользователей
|
|||
|
|
|
|||
|
|
Длительность: две недели.
|
|||
|
|
|
|||
|
|
## Фаза 7. Защищённый элемент Titan M2 как аппаратный модуль безопасности
|
|||
|
|
|
|||
|
|
Опциональная фаза, не входит в первый релиз. Использование Titan M2 для прямого подписания блоков. Требует драйвера в пользовательском пространстве.
|
|||
|
|
|
|||
|
|
- [ ] Закрытие открытого вопроса 8.2 (фаза, начиная с которой Titan M2 обязателен)
|
|||
|
|
|
|||
|
|
## Итог по срокам
|
|||
|
|
|
|||
|
|
Реалистичная оценка для команды из одного-двух разработчиков с опытом AOSP: примерно три-четыре месяца от запуска проекта до первого подписанного публичного релиза.
|