Bug 32358

Summary: миграция на symlinks /var/run -> /run, /var/lock -> /run/lock
Product: Sisyphus Reporter: Alexey Shabalin <shaba>
Component: filesystemAssignee: placeholder <placeholder>
Status: CLOSED WORKSFORME QA Contact: qa-sisyphus
Severity: normal    
Priority: P3 CC: evg, glebfm, imz, iv, lav, ldv, legion, mike, placeholder, sem, shaba
Version: unstable   
Hardware: all   
OS: Linux   
Bug Depends on:    
Bug Blocks: 32364, 32444, 32642, 32659    

Description Alexey Shabalin 2016-08-04 17:16:32 MSK
День добрый.
Хотелось бы осуществить миграцию на симлинки /var/run -> /run, /var/lock -> /run/lock, вместо "mount -o bind".

Эти симлинки могут создаваться из tmpfiles (/var/run в /lib/tmpfiles.d/var.conf, /var/lock в /lib/tmpfiles.d/legacy.conf) и под systemd и под sysV.
Наличие этих директорий мешает созданию симлинков.

PS: как правильно удалить эти директории и точки монтирования(мигрировать) - я не знаю.
Comment 1 Ivan Zakharyaschev 2016-08-29 02:58:02 MSK
Если думать в этом напрвалении, мне сейчас подумалось, что лучше миграцию осуществить каким-то одноразовым скриптом во время загрузки (вот как раз в тот момент, когда эти все монтирования возводится).

А в пакет положить ghost-symlink. После того, как скрипт сработает, он будет пакету принадлежать.

Что должен делать стартовый миграционный скрипт?

1. (необязательно) переместить то, что есть в ... /run/? ну это всё скорее и не нужно, потому что там ничего ценного нет. По смыслу похоже на одноразовую работу tmpfiles .
2. удалить директорию /var/run и создать такой симлинк.

ну и всё, очень простой скрипт на самом деле. Одноразовасть даже не принципиальна. 

У меня ещё возник такой гипотетический вопрос: а как rpm отнесётся к конфликтам по файлам один из которых заявлен как /run/a, а другой /var/run/a . Поймёт ли, что это кнфликт, или как-то тихо перепишет?

(А вообще rpm же не зачем класть файлы в /run/ , они временные. Т.е. таких ситуаций быть не должно. Можно запретить такие пакеты, если ещё не запрещено.)
Comment 2 Ivan Zakharyaschev 2016-08-30 13:16:03 MSK
Только в этой схеме со стартовым скриптом, который будет делать эту ссылку, я не подумал о тех, кто ставится с нуля: у них сразу после установки пакета оно должно работать.

Наверное, для этого нужен похожий %post-скрипт. Нет, скорее %pre, потому что во время исполнения %post могли поставиться другие пакеты и положить что-то внутрь /var/run/, тем самым создав директорию, которая будет опять мешаться при создании симлинка %post-скриптом.

Однако, filesystem такой базовый пакет, который ставится на начальном этапе инсталляции. Не уверен, что %pre-скрипты смогут сработать в таком окружении.

Так что у меня пока нет окончательной идеи, как делать такую миграцию.
Comment 3 Ivan Zakharyaschev 2016-11-01 20:39:30 MSK
sem@ сделал такое замечание про копирование всего подряд из /var/run/ в /run/ в работающей системе: в /var/run/ может лежать старый несипользуемый мусор, который перепишет/начнёт использоваться из /run/ .

Также sem@ у себя сделал запись в /etc/fstab про  bind-монтирование /run/ в /var/run/ и испытал проблемы от того, что это происходит слшком поздно при закгрузке (с SysV init). Что-то ценное в /var/run/ скрывается.

Возникла ещё такая идея миграции:

кладём в пакет filesystem symlink, а в preinstall-скрипте перемещаем старый /var/run в какой-нибудь /var/run.rpmsave.XXXXXX (т.к. glebfm@ заметил, что у людей могут лежат какие-то ценнные файлы там), а в postinstall-скрипте делаем mount -o bind /var/run.rpmsave.XXXXXX /var/run (если это можно поверх симлинка).

В работающей системе всё останется по-прежнему, а после перезагрузки будет уже виден симлинк.

Есть ли замечания? Может, попробовать такой сценарий реализовать?
Comment 4 Mikhail Efremov 2016-11-15 19:27:57 MSK
(In reply to comment #3)
> Также sem@ у себя сделал запись в /etc/fstab про  bind-монтирование /run/ в
> /var/run/ и испытал проблемы от того, что это происходит слшком поздно при
> закгрузке (с SysV init). Что-то ценное в /var/run/ скрывается.

При ближайшем рассмотрении это не так, у меня /var монтируется строчкой выше в том же fstab. Я вообще не понимаю почему возникают проблемы, похоже это где-то в районе NetworkManager/wpa_supplicant.
Comment 5 Alexey Shabalin 2018-05-16 14:09:16 MSK
- реализовать в rpm-пакете эту миграцию не получится. Ни в %pre ни в %post пакета filesystem.
- для существующих инсталяций сделать эту миграцию надо на раннем этапе загрузки единоразово.
- Как совместить это с новыми инсталяциями?

Я пока вижу два варианта:
1) в initrd, как например в fedora
https://git.kernel.org/pub/scm/boot/dracut/dracut.git/tree/modules.d/30convertfs/convertfs.sh#n22
2) с помощью tmpfiles
в /lib/tmpfiles.d/legacy.conf
L /var/lock - - - - ../run/lock
заменить на
L+ /var/lock - - - - ../run/lock

А в /lib/tmpfiles.d/var.conf
L /var/run - - - - ../run
заменить на 
L+ /var/run - - - - ../run

L+ означает удалить файл или директорию и создать симлинк.
Comment 6 Alexey Shabalin 2018-05-16 14:42:31 MSK
К сожалению, эксперимент с L+ в tmpfiles закончился неудачно.
Так что остаётся только один способ мигрировать - в initrd.
Как оставить существующие системы жить по-старому (с mount -o bind), а новые установки на симлинках я не знаю.
Comment 7 Michael Shigorin 2020-11-01 18:20:23 MSK
Написал на коленке рекомендации напролом: http://altlinux.org/переход_на_/run
Comment 8 Vitaly Lipatov 2020-11-01 21:10:14 MSK
(Ответ для Michael Shigorin на комментарий #7)
> Написал на коленке рекомендации напролом: http://altlinux.org/переход_на_/run

Набор команд называется скриптом,и его лучше разместить в пакете в репозитории, а не на вики.
Никто же не думает, что можно напечатать 10 одинаковых команд с экрана и не ошибиться?

Делать сложные post-скрипты неправильно, логика должна быть в отдельном скрипте, который бы и вызывался в нужный момент.

(Ответ для Ivan Zakharyaschev на комментарий #1)
...
> (А вообще rpm же не зачем класть файлы в /run/ , они временные. Т.е. таких
> ситуаций быть не должно. Можно запретить такие пакеты, если ещё не
> запрещено.)
Я насчитал 169 пакетов, которые что-то кладут в /var/run, и 12 пакетов, которые кладут что-то в /run.
Comment 9 Michael Shigorin 2020-11-01 21:38:56 MSK
(Ответ для Vitaly Lipatov на комментарий #8)
> Набор команд называется скриптом, и его лучше разместить в пакете
> в репозитории, а не на вики.
Разумеется, но для начала лучше обсудить в баге, разместив на вики. :)
Comment 10 Vitaly Lipatov 2023-05-05 16:17:32 MSK
Ничего не обсудили, не решили и все так и живут без миграции или уже всё давно хорошо и бага неактуальна?
Comment 11 Alexey Shabalin 2023-05-05 22:11:38 MSK
(Ответ для Vitaly Lipatov на комментарий #10)
> Ничего не обсудили, не решили и все так и живут без миграции или уже всё
> давно хорошо и бага неактуальна?

Новые инсталяции с симлинками, в старых остается постарому, миграция не делается.
На этом и успокоились.