Или ещё один способ показать своё превосходство над «average Windows fan».
Дружим современный мем со старым и почти забытым инструментом.
Предыстория
Если девушки после сложного этапа в жизни делают причёску каре, то программные инженеры переустанавливают операционную систему на домашнем ПК.
Сложного этапа в жизни не случилось, но систему в очередной раз переустановить захотелось. И так как в качестве системы я выбрал Arch Linux, то решил настроить его максимально «по фэншую». Стандартный логотип Gigabyte при загрузке системы моим понятиям «фэншуя» не отвечал, поэтому я занялся поиском решения и наткнулся на Plymouth.
Что такое Plymouth и с чем его едят?
Согласно ArchWiki:
Plymouth — это проект Fedora и один из официальных проектов freedesktop.org, реализующий графический экран загрузки системы без бегущих надписей (логов) на экране
Plymouth добавляет в вашу систему 2 бинарных файла:
-
/sbin/plymouthd— «backend» Plymouth, пишет логи, показывает заставку; -
/bin/plymouth— «frontend» Plymouth, через него можно вызывать различные действия plymouthd;
и позволяет изменять графический экран загрузки системы с помощью механизма «тем».
Тема Plymouth — это директория в /usr/share/plymouth/themes/, которая содержит следующие файлы:
-
.plymouth(обязательный) — главный файл темы, через него plymouth понимает, как называется тема, где хранится файл .script (если есть) и директория с изображениями. -
.script— здесь описывается вся логика работы темы (если она есть) на специальном языке [8]. -
.grub— дополнительный скрипт загрузчика. -
Вспомогательные файлы, обычно изображения в формате
.png
То есть с помощью темы Plymouth можно установить любую картинку/анимацию на процесс загрузки. Звучит как ровно то, что нам нужно, погнали устанавливать!
Устанавливаем!
Процесс установки покажу только для Arch + GRUB2 + GDM/GNOME. Установка на другие дистрибутивы и конфигурации будет аналогичной, либо он вообще будет доступен «из коробки» (например, Ubuntu).
-
Устанавливаем пакет
yay -S plymouth-gitПочему AUR-версия?
Вы можете попробовать использовать версию из официальных репозиториев (
pacman -S plymouth), однако с ней у меня не получилось заставить тему запускаться во время загрузки. -
Настраиваем параметры загрузки:
-
Добавляем параметр
splashв параметры ядра для отображения графического экрана загрузки -
Добавляем параметр
quietдля тихой загрузки
/boot/grub/grub.cfg
... menuentry "Arch Linux" { ... linux ... quiet splash ... } ... -
-
Добавляем хук
plymouthв initramfs/etc/mkinitcpio.conf
... HOOKS = (... plymouth ...) ... -
Собираем образ initramfs и перезагружаем систему
# Запускать с правами root mkinitcpio -P && reboot -
???
-
PROFIT!
Если бы всё было так просто… (a.k.a Troubleshooting)
Обычно установка Plymouth проходит гладко, но при возникновении проблем могу посоветовать следующие действия:
-
Включить отладочные логи Plymouth
/boot/grub/grub.cfg
... menuentry "Arch Linux" { ... linux ... quiet splash plymouth:debug ... } ...После перезагрузки логи появятся в файле
/var/log/plymouth-debug.log(обновляется после каждого перезапуска) -
Внимательно прочитать секции Tips&Tricks и Troubleshooting на ArchWiki
-
Проверить, что вы корректно настроили проприетарные драйвера NVIDIA
-
Замедляем загрузку, чтобы анимация успела отрисоваться
Действие, которое помогло мне запустить свою кастомную тему (о ней будет дальше).
Если доступен systemd во время запуска Plymouth (как я понял, достаточно в/etc/mkinitcpio.confзаменить хукudevнаsystemd), то можно сделать сервис, который придержит загрузку системы на n секунд, чтобы анимация успела отрисоваться./etc/systemd/system/plymouth-wait-for-animation.service
[Unit] Description=Waits for Plymouth animation to finish Before=plymouth-quit.service display-manager.service [Service] Type=oneshot ExecStart=/usr/bin/sleep animation_duration_in_secs [Install] WantedBy=plymouth-start.serviceНе забудьте включить сервис:
systemctl enable plymouth-wait-for-animation.service
Customization Time!
Фух, самая сложная часть выполнена, теперь можно приступать к творческому процессу.
Мне пришла в голову идея добавить в процесс загрузки танцующего малыша енота (да, я фанат енотов) из популярного в этих ваших тиках токах мема.
Итак, начинаем начинать! (Исходный код)
-
Создаём директорию нашей новой темы и её основные файлы
# Запускать с правами root mkdir /usr/share/plymouth/themes/pedro-raccoon cd /usr/share/plymouth/themes/pedro-raccoon touch pedro-raccoon.plymouth pedro-raccoon.script -
Описываем
pedro-raccoon.plymouthpedro-raccoon.plymouth
[Plymouth Theme] Name=Pedro Raccoon Plymouth Description=Pedro Raccoon Meme Plymouth ModuleName=script [script] ImageDir=/usr/share/plymouth/themes/pedro-raccoon ScriptFile=/usr/share/plymouth/themes/pedro-raccoon/pedro-raccoon.script[Plymouth Theme]— Секция, в которой описывается метаинформация темы
ModuleName — Не нашёл какие ещё могут быть вариантыModuleName, но обычно все ставят script[script]— Секция, в которой описывается метаинформация для работы скрипта PlymouthImageDir— Корневая директория с изображениями (почему-то все используют корневую директорию, не уверен, что Plymouth умеет нормально работать с вложенными директориями) -
Подготовим раскадровку анимации нашего енота
В качестве базового изображения подойдёт
.gifили видео-файл, я использовал .gif отсюда. Делаем раскадровку, например, черезffmpeg:ffmpeg -i pedro-raccoon.gif animation-%d.pngПолученные картинки необходимо поместить в корневую директорию изображений (по пути, указанному в
ImageDir) -
Пишем скрипт:
pedro-raccoon.script
// Получаем настройки экрана screen.w = Window.GetWidth(); screen.h = Window.GetHeight(); screen.half.w = screen.w / 2; screen.half.h = screen.h / 2; // Подгружаем изображения для анимации images_count = 198; for (i = 0; i < images_count; ++i) { images[i] = Image("animation-" + (i + 1) + ".png"); } // Plymouth рисует изображения, обёрнутые в объект Sprite // Готовим его и помещаем в центр экрана cur_sprite = Sprite(); cur_sprite.SetX(screen.half.w - images[0].GetWidth() / 2); cur_sprite.SetY(screen.half.h - images[0].GetHeight() / 2); // Timestamp процесса отрисовки анимации ts = 0; // Объявляем функцию для обновления экрана // Она будет вызываться до 50 раз в секунду fun update() { // Оборачиваем подгруженные изображения в Sprite // Цикл реализуем с помощью операции mod // Обратите внимания на костыль для замедления анимации (ts / 1.6) // Он нужен для того, чтобы наш енот танцевал не так быстро (значение подобрано эмпирически) cur_sprite.SetImage(images[Math.Int(ts / 1.6) % images_count]); ts++; } Plymouth.SetRefreshFunction(update); -
Проверяем, что всё работает
# Запускать с правами root plymouth-set-default-theme -l bgrt details fade-in glow pedro-raccoon # <- Созданная нами тема script solar spinfinity spinner text tribar# Запускать с правами root plymouth-set-default-theme -R pedro-raccoonВажно после установки темы пересобирать образ initramfs (флаг
-Rделает это автоматически)Теперь запустим отладку Plymouth в текущем tty:
# Запускать с правами root plymouthd --debug --debug-file=/tmp/plymouth-debug-out ; plymouth --show-splash ; for ((I=0;I<10;I++)); do sleep 1 ; plymouth --update=event$I ; done ; plymouth --quitПосле запуска этой команды, вы должны увидеть установленную тему Plymouth. Если что-то пошло не так, то это можно увидеть либо в консоли, либо в файле
/tmp/plymouth-debug-out -
Перезагружаем систему и наблюдаем красоту
Заметки по Plymouth Script
-
Язык во многом похож на C и JS.
-
Поддерживает картинки (как минимум .png), но не поддерживает .gif, видео, звуки.
-
Низкая популярность не добавляет удобства к использованию, однако язык достаточно простой.
-
Язык достаточно мощный для того, чтобы, например, написать на нём тетрис.
-
Обратите внимания на костыли для анимации (замедляем анимацию)
Заключение
С распространением быстрых SSD-накопителей процесс загрузки системы на большинстве устройств занимает несколько секунд, что сильно снижает актуальность Plymouth. Несмотря на это я все равно решил пожертвовать парой секунд загрузки для того, чтобы сделать свою систему чуть более дружелюбной и чуть менее скучной.
К сожалению, я не смог вместить в эту статью всех тех «прелестей», с которыми мне пришлось столкнуться, пока я настраивал Plymouth и разрабатывал эту тему, но бОльшая часть из них была связана с моей неполнотой знаний о Plymouth и об Arch Linux в целом.
В общем, я доволен получившимся результатом, и надеюсь, что данная статья привлечёт внимание к Plymouth, вдохновит кого-то на создание интересных тем и вариантов использования этого инструмента и ему подобных.
Источники и ссылки
UPD: По просьбам в комментариях — видосы с результатом!
Сам процесс загрузки системы (на меня и пыльный монитор не смотрите). Противный монитор немножко всё портит своими информационными сообщениями о разрешении, пока не нашёл, можно ли это выключить.
Обратите внимание на то, что анимация проигрывается не сначала. Могу сделать вывод, что Plymouth некоторое время тупит и рендерит анимацию без показа на экран.
Ну и ниже демка через прямой запуск plymouthd && plymouth --splash-screen
ссылка на оригинал статьи https://habr.com/ru/articles/809849/
Добавить комментарий