День добрый. Хотелось бы осуществить миграцию на симлинки /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: как правильно удалить эти директории и точки монтирования(мигрировать) - я не знаю.
Если думать в этом напрвалении, мне сейчас подумалось, что лучше миграцию осуществить каким-то одноразовым скриптом во время загрузки (вот как раз в тот момент, когда эти все монтирования возводится). А в пакет положить ghost-symlink. После того, как скрипт сработает, он будет пакету принадлежать. Что должен делать стартовый миграционный скрипт? 1. (необязательно) переместить то, что есть в ... /run/? ну это всё скорее и не нужно, потому что там ничего ценного нет. По смыслу похоже на одноразовую работу tmpfiles . 2. удалить директорию /var/run и создать такой симлинк. ну и всё, очень простой скрипт на самом деле. Одноразовасть даже не принципиальна. У меня ещё возник такой гипотетический вопрос: а как rpm отнесётся к конфликтам по файлам один из которых заявлен как /run/a, а другой /var/run/a . Поймёт ли, что это кнфликт, или как-то тихо перепишет? (А вообще rpm же не зачем класть файлы в /run/ , они временные. Т.е. таких ситуаций быть не должно. Можно запретить такие пакеты, если ещё не запрещено.)
Только в этой схеме со стартовым скриптом, который будет делать эту ссылку, я не подумал о тех, кто ставится с нуля: у них сразу после установки пакета оно должно работать. Наверное, для этого нужен похожий %post-скрипт. Нет, скорее %pre, потому что во время исполнения %post могли поставиться другие пакеты и положить что-то внутрь /var/run/, тем самым создав директорию, которая будет опять мешаться при создании симлинка %post-скриптом. Однако, filesystem такой базовый пакет, который ставится на начальном этапе инсталляции. Не уверен, что %pre-скрипты смогут сработать в таком окружении. Так что у меня пока нет окончательной идеи, как делать такую миграцию.
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 (если это можно поверх симлинка). В работающей системе всё останется по-прежнему, а после перезагрузки будет уже виден симлинк. Есть ли замечания? Может, попробовать такой сценарий реализовать?
(In reply to comment #3) > Также sem@ у себя сделал запись в /etc/fstab про bind-монтирование /run/ в > /var/run/ и испытал проблемы от того, что это происходит слшком поздно при > закгрузке (с SysV init). Что-то ценное в /var/run/ скрывается. При ближайшем рассмотрении это не так, у меня /var монтируется строчкой выше в том же fstab. Я вообще не понимаю почему возникают проблемы, похоже это где-то в районе NetworkManager/wpa_supplicant.
- реализовать в 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+ означает удалить файл или директорию и создать симлинк.
К сожалению, эксперимент с L+ в tmpfiles закончился неудачно. Так что остаётся только один способ мигрировать - в initrd. Как оставить существующие системы жить по-старому (с mount -o bind), а новые установки на симлинках я не знаю.
Написал на коленке рекомендации напролом: http://altlinux.org/переход_на_/run
(Ответ для Michael Shigorin на комментарий #7) > Написал на коленке рекомендации напролом: http://altlinux.org/переход_на_/run Набор команд называется скриптом,и его лучше разместить в пакете в репозитории, а не на вики. Никто же не думает, что можно напечатать 10 одинаковых команд с экрана и не ошибиться? Делать сложные post-скрипты неправильно, логика должна быть в отдельном скрипте, который бы и вызывался в нужный момент. (Ответ для Ivan Zakharyaschev на комментарий #1) ... > (А вообще rpm же не зачем класть файлы в /run/ , они временные. Т.е. таких > ситуаций быть не должно. Можно запретить такие пакеты, если ещё не > запрещено.) Я насчитал 169 пакетов, которые что-то кладут в /var/run, и 12 пакетов, которые кладут что-то в /run.
(Ответ для Vitaly Lipatov на комментарий #8) > Набор команд называется скриптом, и его лучше разместить в пакете > в репозитории, а не на вики. Разумеется, но для начала лучше обсудить в баге, разместив на вики. :)
Ничего не обсудили, не решили и все так и живут без миграции или уже всё давно хорошо и бага неактуальна?
(Ответ для Vitaly Lipatov на комментарий #10) > Ничего не обсудили, не решили и все так и живут без миграции или уже всё > давно хорошо и бага неактуальна? Новые инсталяции с симлинками, в старых остается постарому, миграция не делается. На этом и успокоились.