Bug 35350

Summary: Нет директории /var/lock/subsys/ на sysV
Product: Sisyphus Reporter: Антон Мидюков <antohami>
Component: systemd-utilsAssignee: Alexey Shabalin <shaba>
Status: CLOSED NOTABUG QA Contact: qa-sisyphus
Severity: critical    
Priority: P3 CC: aen, evg, glebfm, klark.devel, ldv, mike, sem, shaba, zxwarior
Version: unstableKeywords: regression
Hardware: all   
OS: Linux   
See Also: https://bugzilla.altlinux.org/show_bug.cgi?id=35881
Attachments:
Description Flags
Исправление скрипта cleanup пакета startup
none
патч для m-p none

Description Антон Мидюков 2018-09-05 18:20:26 MSK
После последнего обновления filesystem в регулярках на sysV нет директории /var/lock/subsys/ В результате многие службы жалуются, что не могут создать lock файл в этой директории. Проблема вызвана вот этим коммитом ориентировочно:
http://git.altlinux.org/people/ldv/packages/?p=filesystem.git;a=commitdiff;h=ab242a12ddb4d29fbc6523d0bb5bdf584c31ef12

Я так понимаю, что директории должны создаваться в tmpfs, на на sysV создаётся только /var/lock/ а директорий:

%attr(0700,root,root) %dir /var/lock/subsys %ghost
%attr(0770,root,uucp) %dir /var/lock/uucp %ghost
%attr(0770,root,uucp) %dir /var/lock/serial %ghost

нет.

Проблема, как на live, так и установленной системе.
Comment 1 Michael Shigorin 2018-09-05 18:23:34 MSK
...и это ещё одна проблема, которую можно было поймать на тестовых регулярках,
а не разломав мне сизиф в самый неудобный для того по нагрузке момент.
Просьба в будущем не стесняться запросить сборку/проверку.
Comment 2 Alexey Shabalin 2018-09-05 21:13:43 MSK
Хотелось бы понять, почему у вас не отрабатывает tmpfiles?
В конфиге /lib/tmpfiles.d/legacy.conf присутствует:

d /run/lock/subsys 0700 root root -

Точнее, хотелось бы понять, почему у вас /run не тоже самое что и /var/run
Comment 3 Alexey Shabalin 2018-09-05 21:14:35 MSK
извиняюсь, почему /var/lock не тоже самое что /run/lock
Comment 4 Антон Мидюков 2018-09-06 07:41:24 MSK
(В ответ на комментарий №3)
> извиняюсь, почему /var/lock не тоже самое что /run/lock

/run/lock отсутствует совсем в rescue (какого-то пакета в сборке не хватает? или директории в /run создаются по требованию?)
А в остальных (icewm, wmaker, gnustep, jeos) /run/lock отличается от /var/lock содержимым, т.е. да, не тоже самое.
Также не тоже самое /var/run и /run

Какой пакет отвечает за отработку правил /lib/tmpfiles.d/ ?

Конфиг /lib/tmpfiles.d/legacy.conf присутствует, принадлежит пакету systemd-utils.
Comment 5 Антон Мидюков 2018-09-08 10:42:47 MSK
(В ответ на комментарий №4)
> Какой пакет отвечает за отработку правил /lib/tmpfiles.d/ ?

systemd-tmpfiles из пакета systemd-utils. Для sysV нужен инит-скрипт для него.
Comment 6 Dmitry V. Levin 2018-09-08 10:58:24 MSK
(In reply to comment #5)
> (В ответ на комментарий №4)
> > Какой пакет отвечает за отработку правил /lib/tmpfiles.d/ ?
> 
> systemd-tmpfiles из пакета systemd-utils. Для sysV нужен инит-скрипт для него.

Этот скрипт традиционно называется /etc/rc.d/scripts/cleanup, вызывается из /etc/rc.d/rc.sysinit; так что перевешиваю на systemd-utils.
Comment 7 Антон Мидюков 2018-09-08 15:44:36 MSK
(В ответ на комментарий №6)
> (In reply to comment #5)
> > (В ответ на комментарий №4)
> > > Какой пакет отвечает за отработку правил /lib/tmpfiles.d/ ?
> > 
> > systemd-tmpfiles из пакета systemd-utils. Для sysV нужен инит-скрипт для него.
> 
> Этот скрипт традиционно называется /etc/rc.d/scripts/cleanup, вызывается из
> /etc/rc.d/rc.sysinit; так что перевешиваю на systemd-utils.

Спасибо за информацию. Но так как на systemd всё работает, а на sysV нет, то логично предположить, что дело всё-таки в /etc/rc.d/scripts/cleanup из пакета startup. Проблема то похоже давнишняя. На sysV отличаются директории /var/run/ и /run/ уже очень давно. На июньском стартеркитe (p8) директории также не одно и тоже.

Может из /etc/rc.d/scripts/cleanup как-то неправильно вызывает systemd-tmpfiles? Или не тогда, когда надо?
Comment 8 Dmitry V. Levin 2018-09-11 03:44:16 MSK
(In reply to comment #7)
> (В ответ на комментарий №6)
> > (In reply to comment #5)
> > > (В ответ на комментарий №4)
> > > > Какой пакет отвечает за отработку правил /lib/tmpfiles.d/ ?
> > > 
> > > systemd-tmpfiles из пакета systemd-utils. Для sysV нужен инит-скрипт для него.
> > 
> > Этот скрипт традиционно называется /etc/rc.d/scripts/cleanup, вызывается из
> > /etc/rc.d/rc.sysinit; так что перевешиваю на systemd-utils.
> 
> Спасибо за информацию. Но так как на systemd всё работает, а на sysV нет, то
> логично предположить, что дело всё-таки в /etc/rc.d/scripts/cleanup из пакета
> startup. Проблема то похоже давнишняя. На sysV отличаются директории /var/run/
> и /run/ уже очень давно. На июньском стартеркитe (p8) директории также не одно
> и тоже.

Дело, конечно, не в /etc/rc.d/scripts/cleanup; /var/run в /lib/tmpfiles.d/legacy.conf вообще нет, а почему правило для /var/lock не выполняется, это тоже к systemd-utils.  Мне кажется, что systemd c некоторых пор обрабатывает /var/run и /var/lock особым образом, что ломает наши правила в /lib/tmpfiles.d/legacy.conf
> 
> Может из /etc/rc.d/scripts/cleanup как-то неправильно вызывает
> systemd-tmpfiles? Или не тогда, когда надо?
Comment 9 Антон Мидюков 2018-09-30 18:59:12 MSK
Причина нашлась:
https://forum.altlinux.org/index.php?topic=36177.msg330926#msg330926

Коротко. В /lib/tmpfiles.d/legacy.conf строка

L /var/lock - - - - ../run/lock

не отрабатывает, но зато отрабатывает, если добавить плюсик:
L+ /var/lock - - - - ../run/lock

Плюсик означает, что каталог заменяется на симлинк даже, если внутри него есть файлы.

Другой вопрос почему не отрабатывает именно на sysV, а на systemd всё отрабатывает?

В initrd, кстати, есть /var/lock/subsys. Наверное он нужен для udev в самом initrd. Изменит ли как-то ситуацию удаление директории /var/lock/subsys из initrd?

Ещё одна версия, что какой-то демон чего-то успел записать в /var/lock, также не нашла подтверждения у меня. В этом случае должны были остаться какие-то следы от него, чего нет в /var/lock.

Может добавим плюсик? Проблема с /var/run также решается добавлением плюсика в /lib/tmpfiles.d/var.conf в строку:
L /var/run - - - - ../run
Comment 10 Speccyfighter 2018-10-01 11:56:57 MSK
(В ответ на комментарий №9)
> Причина нашлась:
> https://forum.altlinux.org/index.php?topic=36177.msg330926#msg330926
> 
> Коротко. В /lib/tmpfiles.d/legacy.conf строка
> 
> L /var/lock - - - - ../run/lock
> 
> не отрабатывает, но зато отрабатывает, если добавить плюсик:
> L+ /var/lock - - - - ../run/lock
> 
> ...
> 
> Может добавим плюсик? Проблема с /var/run также решается добавлением плюсика в
> /lib/tmpfiles.d/var.conf в строку:
> L /var/run - - - - ../run

Оттестировал перевод лайва (лайв-режим)
http://nightly.altlinux.org/sisyphus/snapshots/20180926/regular-xfce-20180926-i586.iso
с systemd на sysvinit.

Последовательность действий:

Сменить L на L+

$ grep ^L /lib/tmpfiles.d/legacy.conf 
L+ /var/lock - - - - ../run/lock


Установить пакеты для перевода регулярного лайва xfce с systemd на sysvinit

# apt-get install \
sysvinit \
pm-utils \
nm-sysvinit \
polkit-sysvinit \
systemd- \
systemd-services- \
systemd-sysvinit- \
apt-conf-ignore-systemd \
syslog-ng 


Перезагрузиться по SysRq

Alt+Fn+SysRq+SUB


После перезагрузки получаем в лайве

# ls -l /proc/1/exe 
lrwxrwxrwx 1 root root 0 окт  1 14:27 /proc/1/exe -> /sbin/init


# ls -l /{var,run} | grep lock
drwxr-xr-x 6 root   root        120 окт  1 14:27 lock
lrwxrwxrwx 1 root root     11 окт  1 14:27 lock -> ../run/lock


# find /{var,run}/lock -type f -print
/run/lock/subsys/plymouth
/run/lock/subsys/alteratord
/run/lock/subsys/ntpd
/run/lock/subsys/spice-vdagentd
/run/lock/subsys/avahi
/run/lock/subsys/autofs
/run/lock/subsys/dm
/run/lock/subsys/keytable
/run/lock/subsys/fbsetfont
/run/lock/subsys/udevd-final
/run/lock/subsys/sensors
/run/lock/subsys/random
/run/lock/subsys/bluetooth
/run/lock/subsys/NetworkManager
/run/lock/subsys/network
/run/lock/subsys/messagebus
/run/lock/subsys/acpid
/run/lock/subsys/udevd


# ls -l /{var,run}/lock 
lrwxrwxrwx 1 root root  11 окт  1 14:27 /var/lock -> ../run/lock

/run/lock:
итого 0
drwx------ 2 root root  40 окт  1 14:27 lvm
drwxr-xr-x 2 root root  40 окт  1 14:27 sepermit
drwxrwx--- 2 root uucp  40 окт  1 14:27 serial
drwx------ 2 root root 400 окт  1 14:27 subsys


Плюс получаем отсутствие ошибки 
No such file or directory 
на загрузке на предмет subsys, при создании lock-файла.
Comment 11 Alexey Shabalin 2018-10-03 17:59:34 MSK
(В ответ на комментарий №9)
> L /var/lock - - - - ../run/lock
> 
> не отрабатывает, но зато отрабатывает, если добавить плюсик:
> L+ /var/lock - - - - ../run/lock
> 
> Плюсик означает, что каталог заменяется на симлинк даже, если внутри него есть
> файлы.
> 
> Другой вопрос почему не отрабатывает именно на sysV, а на systemd всё
> отрабатывает?
> 
> В initrd, кстати, есть /var/lock/subsys. Наверное он нужен для udev в самом
> initrd. Изменит ли как-то ситуацию удаление директории /var/lock/subsys из
> initrd?
> 
> Ещё одна версия, что какой-то демон чего-то успел записать в /var/lock, также
> не нашла подтверждения у меня. В этом случае должны были остаться какие-то
> следы от него, чего нет в /var/lock.
> 
> Может добавим плюсик? Проблема с /var/run также решается добавлением плюсика в
> /lib/tmpfiles.d/var.conf в строку:
> L /var/run - - - - ../run


Нет, плюсик использовать нельзя.
Так же смотрите
https://bugzilla.altlinux.org/show_bug.cgi?id=32358

Удивляет то, как вам удаётся получить разные /var/run и /run, /var/lock и /run/lock.
Раньше они должны были бить одинаковы, потому что были соответствующие mount -o bind, сейчас это нужно добиться симлинком.
Возможно кто-то успевает записать что-то в /var/run или в /var/lock до начала работы tmpfiles. Надо найти это место и научить писать в /run.
Comment 12 Speccyfighter 2018-10-04 21:55:45 MSK
(В ответ на комментарий №0)
> После последнего обновления filesystem в регулярках на sysV нет директории
> /var/lock/subsys/ В результате многие службы жалуются, что не могут создать
> lock файл в этой директории. Проблема вызвана вот этим коммитом ориентировочно:
> http://git.altlinux.org/people/ldv/packages/?p=filesystem.git;a=commitdiff;h=ab242a12ddb4d29fbc6523d0bb5bdf584c31ef12
> 
> Я так понимаю, что директории должны создаваться в tmpfs, на на sysV создаётся
> только /var/lock/ а директорий:
> 
> %attr(0700,root,root) %dir /var/lock/subsys %ghost
> %attr(0770,root,uucp) %dir /var/lock/uucp %ghost
> %attr(0770,root,uucp) %dir /var/lock/serial %ghost
> 
> нет.
> 
> Проблема, как на _live_, так и установленной системе.

Антон, всё гораздо хитрее и запутаннее :-)

В squashfs:

# ls -l /.ro/var/ | grep 'lock\|run'
drwxr-xr-x  3 root root    46 окт  3 08:36 lock
drwxr-xr-x 17 root root   250 окт  3 08:36 run

# mount | grep '/\.ro'
/dev/loop0 on /.ro type squashfs (ro,relatime)

Помнишь ман про L,L+?
А теперь ложка соли на этот торт:

subsys создаётся только для /run/lock, но не для /var/lock:

# grep . /lib/tmpfiles.d/* | grep 'subsys\|uucp\|serial' | grep -v \#
/lib/tmpfiles.d/legacy.conf:d /run/lock/subsys 0700 root root -
/lib/tmpfiles.d/legacy.conf:d /run/lock/serial 0770 root uucp -

В результате сервисы sysv требующие /var/lock/subsys обламываются на загрузке sysv с огромной руганью.
И если принудительно не линковать через L+, эта ругань в tty1 будет продолжаться бесконечно.

Как вариант, можно в 

/lib/tmpfiles.d/legacy.conf

прописать

d /var/lock/subsys 0700 root root -

Но содержимое каталогов будет разным:
- Часть sysv сервисов создаёт lock-и в /var/lock/subsys,
  а другие в /run/lock/subsys
  И без линковки через L+, они будут разными.
Comment 13 Speccyfighter 2018-10-04 22:11:08 MSK
(В ответ на комментарий №12)
> 
> ...
> 
> Как вариант, можно в 
> 
> /lib/tmpfiles.d/legacy.conf
> 
> прописать
> 
> d /var/lock/subsys 0700 root root -
> 
> Но содержимое каталогов будет разным:
> - Часть sysv сервисов создаёт lock-и в /var/lock/subsys,
>   а другие в /run/lock/subsys
>   И без линковки через L+, они будут разными.

Но при этом нужно помнить, что systemd-tmpfiles работает подобно 'mkdir -p' и обрабатывает *.conf в лексикографическом порядке вне зависимости от того в каком каталоге */*tmpfiles.d они находятся. Это упоминает man tmpfiles.d
Comment 14 Антон Мидюков 2018-10-08 14:37:41 MSK
Created attachment 7801 [details]
Исправление скрипта cleanup пакета startup

Предлагаю решить проблему вот таким образом.
Т.е. при каждом запуске дропать /var/run и /var/lock, если это не симлинки, после чего будет происходить успешное создание симлинков. Пришлось переместить создание tmpfiles вверх, так как иначе utmp писать некуда. Это принципиальной момент, что 

systemd-tmpfiles --remove --create --boot --exclude-prefix=/dev

выполняется после? Я проверил, так работает.
Comment 15 Michael Shigorin 2018-10-15 20:51:10 MSK
2 ldv@ и shaba@: коллеги, исправьте всё-таки сломанное в августе.

У нас всё это время http://altlinux.org/rescue грузится так, что я бы сам испугался и поискал какой-нибудь менее сломанный на вид инструмент.
Comment 16 Alexey Shabalin 2018-10-16 19:33:29 MSK
(В ответ на комментарий №15)
> 2 ldv@ и shaba@: коллеги, исправьте всё-таки сломанное в августе.
> 
> У нас всё это время http://altlinux.org/rescue грузится так, что я бы сам
> испугался и поискал какой-нибудь менее сломанный на вид инструмент.

В rescue свой rc.sysinit.rescue, который совсем не использует cleanup, и соответственно не запускает systemd-tmpfiles.
Для rescue тебе надо где-то самостоятельно создать симлинки.
Comment 17 Alexey Shabalin 2018-10-31 19:50:52 MSK
(В ответ на комментарий №14)
> Created an attachment (id=7801) [details]
> Исправление скрипта cleanup пакета startup
> 
> Предлагаю решить проблему вот таким образом.
> Т.е. при каждом запуске дропать /var/run и /var/lock, если это не симлинки,
> после чего будет происходить успешное создание симлинков. Пришлось переместить
> создание tmpfiles вверх, так как иначе utmp писать некуда. Это принципиальной
> момент, что 
> 
> systemd-tmpfiles --remove --create --boot --exclude-prefix=/dev
> 
> выполняется после? Я проверил, так работает.

Это изменение в задании #215964
Comment 18 Антон Мидюков 2018-10-31 20:01:04 MSK
(В ответ на комментарий №17)
> (В ответ на комментарий №14)
> > Created an attachment (id=7801) [details] [details]
> > Исправление скрипта cleanup пакета startup
> > 
> > Предлагаю решить проблему вот таким образом.
> > Т.е. при каждом запуске дропать /var/run и /var/lock, если это не симлинки,
> > после чего будет происходить успешное создание симлинков. Пришлось переместить
> > создание tmpfiles вверх, так как иначе utmp писать некуда. Это принципиальной
> > момент, что 
> > 
> > systemd-tmpfiles --remove --create --boot --exclude-prefix=/dev
> > 
> > выполняется после? Я проверил, так работает.
> 
> Это изменение в задании #215964

Если сами директории /var/run и /var/lock не удалять, толку не будет же. Симлинки вместо них не создадутся, а потому нужные директории не появятся в них.
Comment 19 Alexey Shabalin 2018-10-31 20:25:50 MSK
На существующих инсталяциях миграцию делать никто не планирует.
А на вновь устанавливаемых системах инстолятор должен позаботиться об их отсутствии на установленной системе.
Comment 20 Speccyfighter 2018-11-01 04:25:57 MSK
(В ответ на комментарий №18)
> Если сами директории /var/run и /var/lock не удалять, толку не будет же.
> Симлинки вместо них не создадутся, а потому нужные директории не появятся в
> них.

Антон, на миграции лайва xfce с systemd на sysv, всё ещё хуже:
После миграции с перезагрузкой через SysRq (systemd же грохнули), /var/{lock,run}, /run/lock/{serial,subsys}, как были каталогами, так и остались каталогами, а вот /var/lock/{serial,subsys}, исчезли после перезагрузки. А кто их исчез,кто его знает. Они просто исчезли в /.rw/*
https://forum.altlinux.org/index.php?topic=36177.msg331931#msg331931
Как себе представляю:
Если каталог /var/lock не грохнуть, то и симлинк не создастся, и serial с subsys исчезнут. Логгирования не будет, а отследить это можно только через tty1 на загрузке. Смотрел это на сборке xfce от 24.10.
Comment 21 Антон Мидюков 2018-11-01 07:35:26 MSK
(В ответ на комментарий №19)
> На существующих инсталяциях миграцию делать никто не планирует.
> А на вновь устанавливаемых системах инстолятор должен позаботиться об их
> отсутствии на установленной системе.

Ок. Буду репу чесать в этом направлении.

(В ответ на комментарий №20)
> (В ответ на комментарий №18)
> > Если сами директории /var/run и /var/lock не удалять, толку не будет же.
> > Симлинки вместо них не создадутся, а потому нужные директории не появятся в
> > них.
> 
> Антон, на миграции лайва xfce с systemd на sysv, всё ещё хуже:
> После миграции с перезагрузкой через SysRq (systemd же грохнули),
> /var/{lock,run}, /run/lock/{serial,subsys}, как были каталогами, так и остались
> каталогами, а вот /var/lock/{serial,subsys}, исчезли после перезагрузки. А кто
> их исчез,кто его знает. Они просто исчезли в /.rw/*
> https://forum.altlinux.org/index.php?topic=36177.msg331931#msg331931
> Как себе представляю:
> Если каталог /var/lock не грохнуть, то и симлинк не создастся, и serial с
> subsys исчезнут. Логгирования не будет, а отследить это можно только через tty1
> на загрузке. Смотрел это на сборке xfce от 24.10.

Никаких чудес. /run/lock/{serial,subsys} создаются динамически в tmpfiles. systemd просто выдаёт предупреждение, что /var/lock это директория, а сам монтирует туда /run/lock. Директория /var/lock при этом жива и здорова, но без поддиректорий /var/lock/{serial,subsys}, так как они ни кем не созданы (их нет более в пакете filesystem). Их нужно либо создать, либо превратить в симлинк /var/lock
Comment 22 Антон Мидюков 2018-11-01 18:16:24 MSK
(В ответ на комментарий №17)
> (В ответ на комментарий №14)
> > Created an attachment (id=7801) [details] [details]
> > Исправление скрипта cleanup пакета startup
> > 
> > Предлагаю решить проблему вот таким образом.
> > Т.е. при каждом запуске дропать /var/run и /var/lock, если это не симлинки,
> > после чего будет происходить успешное создание симлинков. Пришлось переместить
> > создание tmpfiles вверх, так как иначе utmp писать некуда. Это принципиальной
> > момент, что 
> > 
> > systemd-tmpfiles --remove --create --boot --exclude-prefix=/dev
> > 
> > выполняется после? Я проверил, так работает.
> 
> Это изменение в задании #215964

Сборка regular-jeos с этим заданием не устанавливается. Жалуется на отсутствие пакета installer-feature-powerbutton-stage2. Где тут связь так сразу и не пойму...
Comment 23 Speccyfighter 2018-11-01 18:40:13 MSK
(В ответ на комментарий №21)
> Никаких чудес. /run/lock/{serial,subsys} создаются динамически в tmpfiles.
> systemd просто выдаёт предупреждение, что /var/lock это директория, а сам
> монтирует туда /run/lock. Директория /var/lock при этом жива и здорова, но без
> поддиректорий /var/lock/{serial,subsys}, так как они ни кем не созданы (их нет
> более в пакете filesystem). Их нужно либо создать, либо превратить в симлинк
> /var/lock

Спасибо Антон, вижу:

var-lock.mount следует алгоритму
Если /var/lock каталог, то bind-ить /run/lock в /var/run.
Если /var/lock симлинк, то не биндить.

А поскольку systemd при миграции на sysv выносится
$ rpm -qf /lib/systemd/system/var-lock.mount
systemd-239-alt3.i586

то ломается bind и /var/lock пустой.
Comment 24 Антон Мидюков 2018-11-01 18:50:56 MSK
(В ответ на комментарий №23)
> (В ответ на комментарий №21)
> > Никаких чудес. /run/lock/{serial,subsys} создаются динамически в tmpfiles.
> > systemd просто выдаёт предупреждение, что /var/lock это директория, а сам
> > монтирует туда /run/lock. Директория /var/lock при этом жива и здорова, но без
> > поддиректорий /var/lock/{serial,subsys}, так как они ни кем не созданы (их нет
> > более в пакете filesystem). Их нужно либо создать, либо превратить в симлинк
> > /var/lock
> 
> Спасибо Антон, вижу:
> 
> var-lock.mount следует алгоритму
> Если /var/lock каталог, то bind-ить /run/lock в /var/run.
> Если /var/lock симлинк, то не биндить.
> 
> А поскольку systemd при миграции на sysv выносится
> $ rpm -qf /lib/systemd/system/var-lock.mount
> systemd-239-alt3.i586
> 
> то ломается bind и /var/lock пустой.

Alexey Shabalin, может перенести /lib/systemd/system/var-lock.mount в systemd-utils?
Comment 25 Антон Мидюков 2018-11-01 18:51:52 MSK
(В ответ на комментарий №22)
> (В ответ на комментарий №17)
> > (В ответ на комментарий №14)
> > > Created an attachment (id=7801) [details] [details] [details]
> > > Исправление скрипта cleanup пакета startup
> > > 
> > > Предлагаю решить проблему вот таким образом.
> > > Т.е. при каждом запуске дропать /var/run и /var/lock, если это не симлинки,
> > > после чего будет происходить успешное создание симлинков. Пришлось переместить
> > > создание tmpfiles вверх, так как иначе utmp писать некуда. Это принципиальной
> > > момент, что 
> > > 
> > > systemd-tmpfiles --remove --create --boot --exclude-prefix=/dev
> > > 
> > > выполняется после? Я проверил, так работает.
> > 
> > Это изменение в задании #215964
> 
> Сборка regular-jeos с этим заданием не устанавливается. Жалуется на отсутствие
> пакета installer-feature-powerbutton-stage2. Где тут связь так сразу и не
> пойму...

извиняюсь, installer-feature-powerbutton-stage3
Comment 26 Антон Мидюков 2018-11-01 18:56:59 MSK
(В ответ на комментарий №24)
> (В ответ на комментарий №23)
> > (В ответ на комментарий №21)
> > > Никаких чудес. /run/lock/{serial,subsys} создаются динамически в tmpfiles.
> > > systemd просто выдаёт предупреждение, что /var/lock это директория, а сам
> > > монтирует туда /run/lock. Директория /var/lock при этом жива и здорова, но без
> > > поддиректорий /var/lock/{serial,subsys}, так как они ни кем не созданы (их нет
> > > более в пакете filesystem). Их нужно либо создать, либо превратить в симлинк
> > > /var/lock
> > 
> > Спасибо Антон, вижу:
> > 
> > var-lock.mount следует алгоритму
> > Если /var/lock каталог, то bind-ить /run/lock в /var/run.
> > Если /var/lock симлинк, то не биндить.
> > 
> > А поскольку systemd при миграции на sysv выносится
> > $ rpm -qf /lib/systemd/system/var-lock.mount
> > systemd-239-alt3.i586
> > 
> > то ломается bind и /var/lock пустой.
> 
> Alexey Shabalin, может перенести /lib/systemd/system/var-lock.mount в
> systemd-utils?

Хотя оно же systemd вызывается. Я проверял, наличие пакета systemd в системе на sysV проблему не решает.
Comment 27 Speccyfighter 2018-11-01 20:59:40 MSK
(В ответ на комментарий №26)
> (В ответ на комментарий №24)
> > (В ответ на комментарий №23)
> > > (В ответ на комментарий №21)
> > > > Никаких чудес. /run/lock/{serial,subsys} создаются динамически в tmpfiles.
> > > > systemd просто выдаёт предупреждение, что /var/lock это директория, а сам
> > > > монтирует туда /run/lock. Директория /var/lock при этом жива и здорова, но без
> > > > поддиректорий /var/lock/{serial,subsys}, так как они ни кем не созданы (их нет
> > > > более в пакете filesystem). Их нужно либо создать, либо превратить в симлинк
> > > > /var/lock
> > > 
> > > Спасибо Антон, вижу:
> > > 
> > > var-lock.mount следует алгоритму
> > > Если /var/lock каталог, то bind-ить /run/lock в /var/run.
> > > Если /var/lock симлинк, то не биндить.
> > > 
> > > А поскольку systemd при миграции на sysv выносится
> > > $ rpm -qf /lib/systemd/system/var-lock.mount
> > > systemd-239-alt3.i586
> > > 
> > > то ломается bind и /var/lock пустой.
> > 
> > Alexey Shabalin, может перенести /lib/systemd/system/var-lock.mount в
> > systemd-utils?
> 
> Хотя оно же systemd вызывается. Я проверял, наличие пакета systemd в системе на
> sysV проблему не решает.

В systemd там хитро заморочено:

L /var/lock - - - - ../run/lock

в /lib/tmpfiles.d/legacy.conf
отработает, если это новая инсталляция, где /var/lock, это призрак в filesystem.
Но в regulsr-xfce не отработает, поскольку /var/lock, это каталог и он существует.

/lib/systemd/system/var-lock.mount
проверяет:
Если /var/lock не симлинк, то биндить /run/lock в /var/lock.

Как себе представляю в sysv:
Где-то в rc.sysinit, до старта всех сервисов делать проверку скриптом:

Если /var/lock не существует, то сделать симлинк /var/lock на /run/lock
иначе если
/var/lock это каталог и не bind, то удалить /var/lock и сделать симлинк /var/lock на /run/lock

В devuan например, идёт проверка через файл функций mount-functions.sh на 676 строк.
Comment 28 Speccyfighter 2018-11-02 03:59:12 MSK
(В ответ на комментарий №26)
> (В ответ на комментарий №24)
...
> > Alexey Shabalin, может перенести /lib/systemd/system/var-lock.mount в
> > systemd-utils?
> 
> Хотя оно же systemd вызывается. Я проверял, наличие пакета systemd в системе на
> sysV проблему не решает.

Более того, одна функция миграции /var/* на tmpfs, в systemd размазана по всей системе:

/lib/systemd/system/var-lock.mount
отвечающий за bind, привязан к systemd и без него работать не будет.

а systemd-линковка через /lib/tmpfiles.d/*, привязана к системе в целом:

# grep systemd-tmpfiles /etc/rc.d/scripts/cleanup
systemd-tmpfiles --clean
systemd-tmpfiles --remove --create --boot --exclude-prefix=/dev

# grep -i cleanup /etc/rc.d/rc.sysinit
# Cleanup everything :)
action "Cleaning up temporary files from previous boot:" /etc/rc.d/scripts/cleanup

и без этого пакета в sysv, линковка работать не будет:

# rpm -qf /sbin/systemd-tmpfiles
systemd-utils-239-alt3.i586

Но в целом, systemd следует алгоритму:
- или bind или линк
в зависимости от наличия или отсутствия /var/lock

В лайве regular-xfce будет bind.
Comment 29 Антон Мидюков 2018-11-02 19:17:19 MSK
(В ответ на комментарий №22)
> (В ответ на комментарий №17)
> > (В ответ на комментарий №14)
> > > Created an attachment (id=7801) [details] [details] [details]
> > > Исправление скрипта cleanup пакета startup
> > > 
> > > Предлагаю решить проблему вот таким образом.
> > > Т.е. при каждом запуске дропать /var/run и /var/lock, если это не симлинки,
> > > после чего будет происходить успешное создание симлинков. Пришлось переместить
> > > создание tmpfiles вверх, так как иначе utmp писать некуда. Это принципиальной
> > > момент, что 
> > > 
> > > systemd-tmpfiles --remove --create --boot --exclude-prefix=/dev
> > > 
> > > выполняется после? Я проверил, так работает.
> > 
> > Это изменение в задании #215964
> 
> Сборка regular-jeos с этим заданием не устанавливается. Жалуется на отсутствие
> пакета installer-feature-powerbutton-stage2. Где тут связь так сразу и не
> пойму...

Проблема у моей локальной сборочницы. rpm пакеты вообще в образ перестали попадать. Собрал на сервере basalt, тяну себе, чтобы проверить сборку с заданием и сегодняшними правками m-p.
Comment 30 Антон Мидюков 2018-11-05 19:12:16 MSK
В задании 216049 подготовлены новые версии пакетов startup-rescue и installer. Изменения:
1. В startup-rescue и installer добавлено выполнение systemd-tmpfiles во время инициализации. Без этого миграция на симлинки невозможна.
2. В installer добавлен постинсталл скрипт, который:
2.1 создаёт симлинки /var/run -> ../run; /var/lock -> ../run/lock
2.2 Исправляет /var/run на /run в конфигах /{etc,lib}/tmpfiles.d/*.conf (Иначе получаем предупреждения, что конфиги устарели). Надо бы все эти конфиги исправить, а этот хак убрать.

Также я думаю, что можно было бы убрать хак 2.1, если бы при первой установке пакета filesystem создавались симлинки: /var/run -> ../run; /var/lock -> ../run/lock При обновлениях скрипт отрабатывать не должен. Такое сделать же можно?

Также подготовил коммит для m-p, который делает тоже, что и 2.1 с 2.2, но для live. Если сможем решить проблему через filesystem, то он будет также не нужен.

Изменения  m-p, а также задания 216049 и 215964 проверял на сборке образов: regular-{jeos, rescue, lxde, icewm}

Ещё заметил, что при миграции на симлинки udev, который запускается до systemd-tmpfiles жалуется на отсутствие /var/lock/subsys/, а потому желательно, чтобы udev свой lock файл хранил в /run (речь об init-скрипте).
Comment 31 Dmitry V. Levin 2018-11-05 19:27:40 MSK
(In reply to comment #30)
> Также я думаю, что можно было бы убрать хак 2.1, если бы при первой установке
> пакета filesystem создавались симлинки: /var/run -> ../run; /var/lock ->
> ../run/lock При обновлениях скрипт отрабатывать не должен. Такое сделать же
> можно?

Нет, нельзя, во время установки пакета filesystem ничего ещё нет.

Вообще, поскольку объекты /var/run, /var/lock, и /var/lock/* в пакете filesystem указаны именно как каталоги, а не как симлинки, попытка превратить их в симлинки приведёт к неприятностям.
Comment 32 Антон Мидюков 2018-11-08 18:10:45 MSK
Created attachment 7848 [details]
патч для m-p
Comment 33 Антон Мидюков 2018-11-08 18:13:12 MSK
(В ответ на комментарий №31)
> (In reply to comment #30)
> > Также я думаю, что можно было бы убрать хак 2.1, если бы при первой установке
> > пакета filesystem создавались симлинки: /var/run -> ../run; /var/lock ->
> > ../run/lock При обновлениях скрипт отрабатывать не должен. Такое сделать же
> > можно?
> 
> Нет, нельзя, во время установки пакета filesystem ничего ещё нет.

В таком случае прошу высказать свои замечания по таску 216049 и черновому патчу к m-p.
Comment 34 Leonid Krivoshein 2019-01-09 18:36:57 MSK
(В ответ на комментарий №31)
> (In reply to comment #30)
> > Также я думаю, что можно было бы убрать хак 2.1, если бы при первой установке
> > пакета filesystem создавались симлинки: /var/run -> ../run; /var/lock ->
> > ../run/lock При обновлениях скрипт отрабатывать не должен. Такое сделать же
> > можно?
> 
> Нет, нельзя, во время установки пакета filesystem ничего ещё нет.

Почему нельзя? С учётом того, что говорит rpm -qf и FHS 3.0 (#3.15) можно в том же filesystem сделать каталог /run/lock, принадлежащим этому же пакету, да и оба симлинка тоже.

> Вообще, поскольку объекты /var/run, /var/lock, и /var/lock/* в пакете
> filesystem указаны именно как каталоги, а не как симлинки, попытка превратить
> их в симлинки приведёт к неприятностям.

Тогда вопрос превращения в симлинки, наверное, решается при обновлении через %pre. Или наш rpm вообще на такое не рассчитан?
Comment 35 Leonid Krivoshein 2019-01-09 20:10:14 MSK
(В ответ на комментарий №34)
> Тогда вопрос превращения в симлинки, наверное, решается при обновлении через
> %pre. Или наш rpm вообще на такое не рассчитан?

В общем случае силами RPM, скорее всего, не решается (в RedHat RPM 4.14.2 ситуация аналогична), но в конкретном случае через %pre решить можно по аналогии, как мне кажется:

https://docs.fedoraproject.org/en-US/packaging-guidelines/Directory_Replacement/
https://bugzilla.redhat.com/show_bug.cgi?id=447156
Comment 36 Michael Shigorin 2019-01-09 20:12:12 MSK
%pre исполняется шеллом, его при установке filesystem может ещё и не быть.
Попробуй проверить предложения практически, проверяя hsh --ini со своим репо.
Comment 37 Mikhail Efremov 2019-03-14 21:20:08 MSK
Эта проблема присутствует еще и в инсталляторе, там тоже нет каталогов в /var/lock. Сделаю объезд с удалением /var/lock и запуском systemd-tmpfiles.
Comment 38 Антон Мидюков 2019-03-15 06:02:47 MSK
(В ответ на комментарий №37)
> Эта проблема присутствует еще и в инсталляторе, там тоже нет каталогов в
> /var/lock. Сделаю объезд с удалением /var/lock и запуском systemd-tmpfiles.

На прошлой неделе сделал объезд наоборот с созданием ghost директорий: git.altlinux.org/people/antohami/packages/mkimage-profiles.git commit 147964b05f50281fc2c2f4c278275638e4548531
Добавляется пакет installer-feature-create-ghost-directories

Проблему в инсталлируемых регулярках решило.
Comment 39 Mikhail Efremov 2019-03-15 19:33:13 MSK
Я думаю это лучше делать в самом инсталляторе, т.к. нужно для всех дистрибутивов без исключения.
Comment 40 Антон Мидюков 2019-03-15 19:39:24 MSK
(В ответ на комментарий №39)
> Я думаю это лучше делать в самом инсталляторе, т.к. нужно для всех
> дистрибутивов без исключения.

Я для всех и добавил в m-p этот пакет. Во все сборки, которые используют use/install2, попадёт пакет installer-feature-create-ghost-directories
Comment 41 Michael Shigorin 2019-03-16 21:27:29 MSK
(В ответ на комментарий №40)
> > Я думаю это лучше делать в самом инсталляторе, т.к. нужно для всех
> > дистрибутивов без исключения.
> Я для всех и добавил в m-p этот пакет. Во все сборки, которые используют
> use/install2, попадёт пакет installer-feature-create-ghost-directories
Миша явно про пакет installer.
Comment 42 Mikhail Efremov 2019-03-22 20:12:14 MSK
(В ответ на комментарий №41)
> > Я для всех и добавил в m-p этот пакет. Во все сборки, которые используют
> > use/install2, попадёт пакет installer-feature-create-ghost-directories

В инталлер-фичах создавать поздно, udevd стартует раньше.

> Миша явно про пакет installer.

У меня в гите фиксы, но я пока не собираю, может еще что найдется исправить.
Comment 43 Антон Мидюков 2019-04-12 12:58:01 MSK
На заметку. При переходе на симлинки /var/run -> ../run и /var/lock -> ../run/lock NetworkManager не может подхватить управление интерфейсом eth0 (пишет, что устройство не управляется). Помогает перезапуск NetworkManager.
Comment 44 Антон Мидюков 2019-04-12 13:05:38 MSK
(В ответ на комментарий №43)
> На заметку. При переходе на симлинки /var/run -> ../run и /var/lock ->
> ../run/lock NetworkManager не может подхватить управление интерфейсом eth0
> (пишет, что устройство не управляется). Помогает перезапуск NetworkManager.

На sysvinit
Comment 45 Alexey Shabalin 2019-05-21 22:11:06 MSK
(В ответ на комментарий №28)
> В лайве regular-xfce будет bind.

Но зачем? Специально делаем что бы можно было перейти на симлинки и не мучаться больше с mount. А у вас опять двадцатьпять.
Comment 46 Антон Мидюков 2019-09-02 19:42:07 MSK
Мне пришла в голову идея создавать симлинки при установке пакета systemd-utils.
Сделал это в задании
#236987 EPERM #1 [test-only] sisyphus systemd.git=242-alt12

Сборка образов и rootfs проходит успешно. Но есть проблемы на sysVinit:

(В ответ на комментарий №43)
> На заметку. При переходе на симлинки /var/run -> ../run и /var/lock ->
> ../run/lock NetworkManager не может подхватить управление интерфейсом eth0
> (пишет, что устройство не управляется). Помогает перезапуск NetworkManager.

В ЦУС значится, что интерфейс не управляется.

Если бы не эта проблема, я был бы за этот вариант, так как делать симлинки при сборке live не так просто. Если я просто удаляю директории /var/run и /var/lock, создаю симлинки, то при установке получаю ошибку от инсталлятора на этапе установки загрузчика: не найдены канонические пути overlayfs. Помогает копирование содержимого /var/run и /var/lock в /run и /run/lock соответсвенно.
Comment 47 Антон Мидюков 2019-09-02 19:43:27 MSK
>Мне пришла в голову идея создавать симлинки при установке пакета systemd-utils.

При установке пакета в первый раз.
Comment 48 Антон Мидюков 2019-12-16 04:57:34 MSK
Проблема решается при сборке (rootfs, live) или установке (классический инсталятор) дистрибутивов.