Перейти к содержимому

Builder: Техническая документация

Builder — это интеллектуальная система автоматической установки и настройки дистрибутива meowrch, написанная на Python. Система проводит интерактивный опрос пользователя и выполняет полную настройку системы согласно выбранным параметрам.

Builder состоит из нескольких ключевых модулей:

  • install.py — главный модуль, координирующий весь процесс
  • question.py — система интерактивного опроса пользователя
  • packages.py — определения пакетов и их категорий
  • managers/ — специализированные менеджеры для различных аспектов установки
  • utils/ — утилиты и схемы данных
  • PackageManager — управление установкой пакетов через pacman и AUR
  • FileSystemManager — работа с файловой системой и dotfiles
  • DriversManager — автоматическое определение и установка драйверов
  • AppsManager — настройка специфичных приложений
  • ChaoticAurManager — управление репозиторием Chaotic AUR
  • PostInstallManager — финальные настройки после установки

Интерактивный опрос пользователя:

self.build_options: BuildOptions = Question.get_answers()

Система задает следующие вопросы:

  1. Создание резервной копии — сохранение существующих конфигураций
  2. Выбор оконных менеджеров — Hyprland и/или BSPWM
  3. AUR Helper — выбор между yay, paru и их -bin версиями
  4. Chaotic AUR — использование предкомпилированных AUR пакетов
  5. Драйверы — автоопределение и установка NVIDIA/Intel/AMD
  6. Firefox расширения — Dark Reader, uBlock Origin, TWP, Unpaywall, Tampermonkey
  7. Командная оболочка — fish или zsh
  8. Пользовательские пакеты — интерактивный выбор по категориям
if self.build_options.make_backup:
FileSystemManager.make_backup()

Сохраняются следующие конфигурации:

  • ~/.config/ — пользовательские конфигурации
  • ~/.local/bin/ — пользовательские скрипты
  • ~/.local/share/nemo/ — настройки файлового менеджера
  • Dotfiles: .bashrc, .env, .Xresources, .xinitrc
  • ~/.icons/default/index.theme — тема курсора
FileSystemManager.create_default_folders()
FileSystemManager.copy_dotfiles(
exclude_bspwm=not self.build_options.install_bspwm,
exclude_hyprland=not self.build_options.install_hyprland,
)

Создание стандартных директорий:

Окно терминала
mkdir -p ~/.config ~/.themes Desktop Downloads Templates Public Documents Music Pictures Videos

Копирование dotfiles с условными исключениями:

  • Если не устанавливается BSPWM — исключаются bspwm, polybar
  • Если не устанавливается Hyprland — исключаются hypr, waybar
  • Установка прав chmod -R 700 для ~/.config и ~/.local/bin
PackageManager.update_pacman_conf(enable_multilib=True)
PackageManager.update_database()

Модификация /etc/pacman.conf:

# Включение опций производительности
ParallelDownloads = 5
VerbosePkgLists
ILoveCandy
Color
# Включение multilib репозитория
[multilib]
Include = /etc/pacman.d/mirrorlist

Обновление базы данных пакетов:

Окно терминала
sudo pacman -Sy
if self.build_options.use_chaotic_aur:
ChaoticAurManager.install()

Если выбран Chaotic AUR, устанавливается репозиторий с предкомпилированными AUR пакетами для ускорения установки.

PackageManager.install_aur_helper(self.build_options.aur_helper)

Процесс установки:

  1. Установка зависимостей: git, base-devel
  2. Клонирование соответствующего репозитория из AUR
  3. Сборка и установка через makepkg -si --noconfirm

Поддерживаемые AUR Helpers:

  • yay — классический helper
  • paru — современная альтернатива на Rust
  • yay-bin — предкомпилированная версия yay
  • paru-bin — предкомпилированная версия paru
self.packages_installation()

Пример системы классификации пакетов:

# Общие пакеты для всех конфигураций
BASE.pacman.common = [
# Базовые инструменты
"base-devel", "git", "networkmanager", "libnotify",
# Звуковая подсистема
"pipewire", "pipewire-pulse", "pipewire-alsa", "wireplumber",
# CLI инструменты
"jq", "fastfetch", "lsd", "bat", "micro", "btop", "yazi",
# GUI приложения
"sddm", "plymouth", "firefox", "kitty", "nemo", "vlc",
# Шрифты
"ttf-hack-nerd", "noto-fonts", "ttf-jetbrains-mono-nerd"
]
# Пакеты для BSPWM
BASE.pacman.bspwm_packages = [
"xorg", "bspwm", "sxhkd", "polybar", "dunst", "feh"
]
# Пакеты для Hyprland
BASE.pacman.hyprland_packages = [
"hyprland", "waybar", "hyprlock", "swww", "swaync", "uwsm"
]
CUSTOM = {
"useful": {"timeshift": PackageInfo("Утилита восстановления системы")},
"development": {"obsidian": PackageInfo("База знаний", recommended=True)},
"social_media": {"telegram-desktop": PackageInfo("Мессенджер", selected=True)},
"games": {"steam": PackageInfo("Игровая платформа", selected=True)},
"entertainment": {"yandex-music": PackageInfo("Музыкальный сервис", aur=True)},
"office": {"onlyoffice-bin": PackageInfo("Офисный пакет", aur=True)}
}

Алгоритм установки пакетов:

  1. Формирование списков pacman и AUR пакетов
  2. Добавление пакетов в зависимости от выбранных WM
  3. Установка в батчах по 5 пакетов для оптимизации
  4. При неудаче батча — индивидуальная установка с повторными попытками
  5. Ведение списка неустановленных пакетов для финального отчета
self.drivers_installation()

Автоматическое определение оборудования:

@staticmethod
def auto_detection() -> List[str]:
drivers = []
# Определение по PCI ID и другим методам
if "intel" in lspci_output.lower():
drivers.append("Intel")
if "nvidia" in lspci_output.lower():
drivers.append("Nvidia")
if "amd" in lspci_output.lower() or "ati" in lspci_output.lower():
drivers.append("AMD")
return drivers

Драйверные пакеты по производителям:

"intel": [
"lib32-mesa", "vulkan-intel", "lib32-vulkan-intel",
"intel-media-driver", "libva-intel-driver", "xf86-video-intel"
]
"amd": [
"lib32-mesa", "vulkan-radeon", "lib32-vulkan-radeon"
]
"nvidia": [
"nvidia-dkms", "nvidia-utils", "lib32-nvidia-utils",
"nvidia-settings", "libva-nvidia-driver"
]

Настройка модулей GPU для ранней загрузки:

DriversManager.setup_gpu_modules_for_early_boot()

Обновление /etc/mkinitcpio.conf для корректной работы Plymouth с графическими драйверами.

AppsManager.configure_grub()

Установка кастомной темы meowrch и обновление конфигурации.

AppsManager.configure_sddm()

Настройка темы Sugar-Dark и конфигурации автозапуска.

AppsManager.configure_plymouth()

Установка анимированного загрузочного экрана.

AppsManager.configure_firefox(
darkreader=self.build_options.ff_darkreader,
ublock=self.build_options.ff_ublock,
# ... другие расширения
)

Автоматическая установка выбранных расширений и настроек.

AppsManager.configure_code()

Установка тем и базовых расширений для разработки.

AppsManager.configure_pawlette()

Интеграция системы управления темами.

if self.build_options.install_hyprland:
AppsManager.configure_mewline()

Настройка кастомного статус-бара для Hyprland.

self.daemons_setting()

Управление systemd службами:

daemons = {
"disable": ["sddm.service"], # Отключение для ручного управления
"enable": ["NetworkManager", "bluetooth.service"],
"start": ["bluetooth.service"]
}
PostInstallation.apply(self.build_options.terminal_shell)

Конфигурация командной оболочки:

  • Fish: Установка кастомных функций и алиасов
  • Zsh: Настройка Oh My Zsh с темой Powerlevel10k

Финальные операции:

  • Обновление базы данных шрифтов
  • Настройка XDG директорий
  • Применение пользовательских настроек
  • Генерация финального отчета
logger.add(
sink="build_debug.log",
format="{time} | {level} | {message}",
level="DEBUG",
encoding="utf-8",
)

Весь процесс установки логируется с детальной информацией в файл build_debug.log.

  1. Установка пакетов: При неудаче батча — индивидуальная установка
  2. Повторные попытки: До 3 попыток для критичных операций
  3. Продолжение работы: Система продолжает работу при некритичных ошибках
  4. Детальное логирование: Сохранение информации об ошибках для диагностики
logger.warning("Pacman: " + ", ".join(self.not_installed_packages.pacman))
logger.warning("Aur: " + ", ".join(self.not_installed_packages.aur))

В конце установки Builder предоставляет отчет о пакетах, которые не удалось установить автоматически.

is_reboot = inquirer.confirm("Do you want to reboot?")
if is_reboot:
subprocess.run("sudo reboot", shell=True)

После успешной установки система предлагает перезагрузку для применения всех изменений.

  • Параллельная загрузка: ParallelDownloads = 5 в pacman
  • Батчевая установка: Установка пакетов группами по 5 штук
  • Chaotic AUR: Использование предкомпилированных пакетов
  • Кэширование: Повторное использование загруженных пакетов
  • Резервное копирование: Автоматическое сохранение существующих настроек
  • Валидация: Проверка целостности пакетов через pacman
  • Логирование: Детальное ведение журнала всех операций
  • Права доступа: Корректная установка прав на пользовательские файлы
  • Модульность: Независимые менеджеры для различных компонентов
  • Конфигурируемость: Широкие возможности кастомизации через опросы
  • Расширяемость: Простое добавление новых пакетов и функций
  • Совместимость: Поддержка различных конфигураций оборудования

Примечание: Для информации о том, как запустить установку, см. Полное руководство по установке.