Bug 48254

Summary: Если luks обнаруживается до запуска plymouth, то пароль спрашивается в консоли
Product: Sisyphus Reporter: Антон Мидюков <antohami>
Component: make-initrd-luksAssignee: Alexey Gladkov <legion>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: normal    
Priority: P5 CC: glebfm, ldv, legion, oleg, placeholder
Version: unstable   
Hardware: all   
OS: Linux   
Attachments:
Description Flags
0001-feature-plymouth-try-to-wait-plymouthd.patch
none
0001-feature-plymouth-Show-splash-in-synchronous-mode.patch none

Description Антон Мидюков 2023-10-30 17:11:18 MSK
Если luks обнаруживается до запуска plymouth, то пароль спрашивается в консоли.
При этом пользователь скорее всего не успеет увидеть текст с запросом пароля, но увидит plymouth, который никак не реагирует на ESC (ввод идёт в поле ввода пароля, которое никак не отображается). Пароль ввести можно и система загрузится. Но пользователь об этом должен догадаться.
Проблему удалось воспроизвести в virtualbox c накопителем NVME. Устанавливался образ http://nightly.altlinux.org/sisyphus/snapshots/20231025/regular-kde5-20231025-x86_64.iso
Установка в режиме UEFI на накопитель NVME, корень помещается на LUKS.

Решение проблемы видится в том, чтобы не предлагать вводить пароль от LUKS, пока plymouth не запустится или напротив не сможет запуститься.
Comment 1 Антон Мидюков 2023-10-30 17:48:26 MSK
Проблему пока получилось воспроизвести только, когда внутри luks файловая система btrfs c subvolumes. На nvme+luks+ext4 проблема не воспроизвелась.
Comment 2 Антон Мидюков 2023-10-30 19:16:47 MSK
(Ответ для Антон Мидюков на комментарий #1)
> Проблему пока получилось воспроизвести только, когда внутри luks файловая
> система btrfs c subvolumes. На nvme+luks+ext4 проблема не воспроизвелась.

Должно было повезти, чтобы нарваться на проблему. Но я научился воспроизводить проблему. Нужен медленный процессор и быстрый накопитель.
В virtualbox выставил 1 ядро на 50 % и проблема стала хорошо воспроизводиться. Изначально было 2 ядра на 100%.
Так что дело действительно в рейсе (я уже стал сомневаться).
Comment 3 Alexey Gladkov 2023-10-30 19:49:46 MSK
Это странно. сервис plymouth стартует раньше обработчика эвентов.
Comment 4 Alexey Gladkov 2023-10-30 19:58:01 MSK
Created attachment 14934 [details]
0001-feature-plymouth-try-to-wait-plymouthd.patch

luks делает plymouth --ping чтобы определить наличие запущенного plymouthd.

Можешь попробовать вот такой патч ?
Comment 5 Антон Мидюков 2023-10-30 19:59:06 MSK
(Ответ для Alexey Gladkov на комментарий #3)
> Это странно. сервис plymouth стартует раньше обработчика эвентов.

Он долго стартует на медленном процессоре.

(Ответ для Alexey Gladkov на комментарий #4)
> Создано вложение 14934 [details] [подробности]
> 0001-feature-plymouth-try-to-wait-plymouthd.patch
> 
> luks делает plymouth --ping чтобы определить наличие запущенного plymouthd.
> 
> Можешь попробовать вот такой патч ?

Сейчас попробую.
Comment 6 Alexey Gladkov 2023-10-30 20:04:50 MSK
Если долго, то таймаута может не хватить. С другой стороны я боюсь ожидать вечно т.к. можно завесить систему, если у plymouth будут проблемы.
Comment 7 Alexey Gladkov 2023-10-30 20:07:41 MSK
(In reply to Alexey Gladkov from comment #6)
> Если долго, то таймаута может не хватить. С другой стороны я боюсь ожидать
> вечно т.к. можно завесить систему, если у plymouth будут проблемы.

Можно добавить что-то типа вот такого для подстраховки:

[ "$timeout" -gt 0 ] ||                                                                                                                                                                                 
  plymouth --hide-splash
Comment 8 Антон Мидюков 2023-10-30 20:26:27 MSK
(Ответ для Антон Мидюков на комментарий #5)
> (Ответ для Alexey Gladkov на комментарий #3)
> > Это странно. сервис plymouth стартует раньше обработчика эвентов.
> 
> Он долго стартует на медленном процессоре.
> 
> (Ответ для Alexey Gladkov на комментарий #4)
> > Создано вложение 14934 [details] [подробности]
> > 0001-feature-plymouth-try-to-wait-plymouthd.patch
> > 
> > luks делает plymouth --ping чтобы определить наличие запущенного plymouthd.
> > 
> > Можешь попробовать вот такой патч ?
> 
> Сейчас попробую.

Не помогло. 40 мало оказалось. 70 поставил и помогло. Это, получается, 7 секунд стартует?
Comment 9 Alexey Gladkov 2023-10-30 20:53:21 MSK
(In reply to Антон Мидюков from comment #8)
> Не помогло. 40 мало оказалось. 70 поставил и помогло. Это, получается, 7
> секунд стартует?

этого цикла скрипт делает довольно сомнительную вещь:

udevadm settle --timeout=30 --exit-if-exists=/sys/class/drm/card0/dev
udevadm settle --timeout=30 --exit-if-exists=/sys/class/graphics/fb0/dev
plymouth show-splash

и всё это в асинхронном режиме. Мне кажется это очень странным подходом.

Можно убрать счётчик таймаута и надеяться, что раз "$RETVAL" = 0, то и plymouthd рано или поздно будет доступен.
Comment 10 Антон Мидюков 2023-10-31 04:13:34 MSK
(Ответ для Alexey Gladkov на комментарий #9)
> (In reply to Антон Мидюков from comment #8)
> > Не помогло. 40 мало оказалось. 70 поставил и помогло. Это, получается, 7
> > секунд стартует?
> 
> этого цикла скрипт делает довольно сомнительную вещь:
> 
> udevadm settle --timeout=30 --exit-if-exists=/sys/class/drm/card0/dev
> udevadm settle --timeout=30 --exit-if-exists=/sys/class/graphics/fb0/dev
> plymouth show-splash
> 
> и всё это в асинхронном режиме. Мне кажется это очень странным подходом.
> 
> Можно убрать счётчик таймаута и надеяться, что раз "$RETVAL" = 0, то и
> plymouthd рано или поздно будет доступен.

А если не будет? Общий тайм-аут? А если он не найдёт, куда ему выводиться, и не будет стартовать?(Ответ для Alexey Gladkov на комментарий #9)
> (In reply to Антон Мидюков from comment #8)
> > Не помогло. 40 мало оказалось. 70 поставил и помогло. Это, получается, 7
> > секунд стартует?
> 
> этого цикла скрипт делает довольно сомнительную вещь:
> 
> udevadm settle --timeout=30 --exit-if-exists=/sys/class/drm/card0/dev
> udevadm settle --timeout=30 --exit-if-exists=/sys/class/graphics/fb0/dev
> plymouth show-splash
> 
> и всё это в асинхронном режиме. Мне кажется это очень странным подходом.
> 
> Можно убрать счётчик таймаута и надеяться, что раз "$RETVAL" = 0, то и
> plymouthd рано или поздно будет доступен.

Т.е. убрать обе строки udevadm?
Я думаю, что эти тайм-ауты были введены, чтобы plymouth не стартанул слишком рано и не начал выводить тему "три точки" вместо нормальной графической заставки.
Comment 11 Alexey Gladkov 2023-10-31 15:41:22 MSK
(In reply to Антон Мидюков from comment #10)
> > Можно убрать счётчик таймаута и надеяться, что раз "$RETVAL" = 0, то и
> > plymouthd рано или поздно будет доступен.
> 
> А если не будет? Общий тайм-аут? А если он не найдёт, куда ему выводиться, и
> не будет стартовать?

Да, если $timeout убрать совсем и если plymouth так и не стартанёт, то сработает общий таймаут на initrd. Загрузка будет застревать на этом месте.

> > Можно убрать счётчик таймаута и надеяться, что раз "$RETVAL" = 0, то и
> > plymouthd рано или поздно будет доступен.
> 
> Т.е. убрать обе строки udevadm?
> Я думаю, что эти тайм-ауты были введены, чтобы plymouth не стартанул слишком
> рано и не начал выводить тему "три точки" вместо нормальной графической
> заставки.

Их убирать нельзя. Они нужны для синхронизации с udev и ожидания framebuffer.

Другое дело, что это делается асинхронно. То есть после того как plymouthd вроде как запустился и сервис завершился и загрузка пошла дальше на самом деле splash ещё не показан, потому что udevadm settle.

Кстати, в plymouth(1) написано:

--ping  Check if plymouthd is running.

то есть это тоже не гарантирует ожидаемый результат. Предложенным мной циклом мы дождёмся запуска plymouth, но не show-splash. Поэтому я не уверен, какой результат будет у ask-for-password.
Comment 12 Alexey Gladkov 2023-10-31 16:00:47 MSK
Created attachment 14941 [details]
0001-feature-plymouth-Show-splash-in-synchronous-mode.patch

Я бы попробовал что-то вот такое. Мы сначала ждём необходимых устройств, потом запускаем plymouthd и ждём его запуска, а уже потом делаем show-splash. Таким образом plymouthd должен быть полностью готов после завершения скрипта сервиса.
Comment 13 Антон Мидюков 2023-10-31 20:21:07 MSK
(Ответ для Alexey Gladkov на комментарий #12)
> Создано вложение 14941 [details] [подробности]
> 0001-feature-plymouth-Show-splash-in-synchronous-mode.patch
> 
> Я бы попробовал что-то вот такое. Мы сначала ждём необходимых устройств,
> потом запускаем plymouthd и ждём его запуска, а уже потом делаем
> show-splash. Таким образом plymouthd должен быть полностью готов после
> завершения скрипта сервиса.

Всё отлично, и даже решились некоторые другие проблемы.
У меня есть старенький ноутбук, на котором plymouth перестал запускаться в графическом режиме (тема три точки). Теперь запускается. На этом же ноутбуке make-initrd-bootchain вываливался в выбор с чего грузиться. Теперь нормально грузится.
Comment 14 Alexey Gladkov 2023-10-31 21:54:20 MSK
А вы там не можете потестировать этот патч на разных конфигурациях на тему есть ли заметная деградация в скорости загрузки и возможности зависания ?

Если всё будет нормально, то выкатим.
Comment 15 Антон Мидюков 2023-11-03 22:09:54 MSK
(Ответ для Alexey Gladkov на комментарий #14)
> А вы там не можете потестировать этот патч на разных конфигурациях на тему
> есть ли заметная деградация в скорости загрузки и возможности зависания ?
> 
> Если всё будет нормально, то выкатим.

На всём, что у меня есть, проверил, включая одноплатники aarch64. И проблем не обнаружил. Деградации в скорости загрузки не было. Зависания не поймал.
Comment 16 Repository Robot 2023-11-07 19:15:08 MSK
make-initrd-2.39.0-alt1 -> sisyphus:

 Tue Nov 07 2023 Alexey Gladkov <legion@altlinux.ru> 2.39.0-alt1
 - New version (2.39.0).
 - Feature plymouth:
   + Show splash in synchronous mode to avoid race with plymouth users (ALT#48254).
 - Feature fsck:
   + Fix typo in boot variable and fix the FASTBOOT parameter.
 - Utilities:
   + initrd-scanmod: Add support for kmod > v30-25-g5c004af.