Summary: | миграция на symlinks /var/run -> /run, /var/lock -> /run/lock | ||
---|---|---|---|
Product: | Sisyphus | Reporter: | Alexey Shabalin <shaba> |
Component: | filesystem | Assignee: | 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
Если думать в этом напрвалении, мне сейчас подумалось, что лучше миграцию осуществить каким-то одноразовым скриптом во время загрузки (вот как раз в тот момент, когда эти все монтирования возводится). А в пакет положить 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) > Ничего не обсудили, не решили и все так и живут без миграции или уже всё > давно хорошо и бага неактуальна? Новые инсталяции с симлинками, в старых остается постарому, миграция не делается. На этом и успокоились. |