Plymouth: делаем загрузку Linux веселее
Надеюсь, вам ещё не надоел этот танцующий пупс
Или ещё один способ показать своё превосходство над «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).
Устанавливаем пакет
Почему AUR-версия?yay -S plymouth-git
Вы можете попробовать использовать версию из официальных репозиториев (
pacman -S plymouth
), однако с ней у меня не получилось заставить тему запускаться во время загрузки.Настраиваем параметры загрузки:
Добавляем параметр
splash
в параметры ядра для отображения графического экрана загрузкиДобавляем параметр
quiet
для тихой загрузки
... menuentry "Arch Linux" { ... linux ... quiet splash ... } ...
Добавляем хук
/etc/mkinitcpio.confplymouth
в initramfs... 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
Замедляем загрузку, чтобы анимация успела отрисоваться
Действие, которое помогло мне запустить свою кастомную тему (о ней будет дальше).
/etc/systemd/system/plymouth-wait-for-animation.service
Если доступен systemd во время запуска Plymouth (как я понял, достаточно в/etc/mkinitcpio.conf
заменить хукudev
наsystemd
), то можно сделать сервис, который придержит загрузку системы на n секунд, чтобы анимация успела отрисоваться.[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, вдохновит кого-то на создание интересных тем и вариантов использования этого инструмента и ему подобных.
Источники и ссылки
Статья про Plymouth на ArchWiki
Гайд по установке проприетарных драйверов NVIDIA на Arch Linux
Гайд по созданию своих тем Plymouth (Часть 1)
Гайд по созданию своих тем Plymouth (Часть 2)
Гайд по созданию своих тем Plymouth (Часть 3)
Гайд по созданию своих тем Plymouth (Часть 4)
Тетрис на Plymouth
Введение в язык скриптов Plymouth
Исходный код Pedro Raccoon Plymouth
Pedro Raccoon Plymouth на pling