On Tue, Jul 04, 2023 at 04:09:40PM +0300, Arseny Maslennikov wrote: > On Thu, Jun 22, 2023 at 02:35:37PM +0300, Arseny Maslennikov wrote: > > Ждём ваших конструктивных ответов и встречных вопросов. > > Одним из самых трудоёмких изменений, если не самым, станет usrmerge. > В следующем письме я предложу предварительный план действий. Предварительный план действий, выработанный с учётом реалий нашей пакетной системы, выглядит так: 1) Определить, что слиянию с аналогами внутри /usr подлежат: /bin /lib /lib64 /libx32 /sbin Надеюсь, я никого не забыл. 2) Тем или иным образом научить rpm создавать симлинк вида /bin/x -> ../usr/bin/x ..., если в пакете существует /usr/bin/x и Provides: /bin/x. Аналогично для всех каталогов из списка 1. Таким образом, на переходном этапе будет не нужно указывать в %files пакетов все эти симлинки, чтобы потом их убирать, и пакеты продолжат удовлетворять зависимостям на такие файлы. Важно, чтобы сначала удалялся старый путь, как обычно при установке пакета, а симлинк возникал после этой фазы. 2.1) Бекпортировать поддержку в p10. 3) Подготовить пакет filesystem версии 3: поместить в нём файлтриггер, который проверяет, не состоят ли каталоги из списка 1 целиком из симлинков внутрь /usr, и превращает такой каталог с симлинками в симлинк на каталог. Сценарий файлтриггера должен будет давать предельно ясную информацию и диагностические сообщения на стандартные потоки. Нужно будет либо положиться на static coreutils, либо очень осторожно обращаться с обычными и dynamic linker. 4) Этот пункт, видимо, потребует содействия мейнтейнеров. Заменить макросы, использующие старые каталоги (%_udevrulesdir, %_tmpfilesdir и другие), и пересобрать с ними пакеты, что-либо помещающие в эти каталоги. Приближённое число затрагиваемых бинарных пакетов: % grep -E '^/(bin|lib[^/]*|sbin)/[a-z0-9_-]+' contents-index | grep -vE '^/lib/(systemd|udev|sysusers.d|modules[^/]*|modprobe.d|security|tmpfiles.d)' | # exclude known places cut -f2 -d$'\t' | grep -v '^/' | # exclude path provides sort | uniq | wc -l 528 Оценка дана по x86_64 + noarch. Исходных, конечно, будет меньше. При обновлении на эти пакеты будет действовать правило 2, поэтому их содержимое будет доступно. Некоторые пакеты, например, vim-common, сейчас упаковывают разные файловые объекты в /bin и /usr/bin; другие пакеты ставят файлы прямо в %buildroot/bin. Их потребуется исправить руками. (Справедливости ради, многие из них и так стоит обновить) 5) Этот пункт вступает в действие на каждой машине индивидуально при обновлении её пакетов. Файлтриггер из пункта 3 обнаруживает, что можно ввести симлинки, и делает это, завершая процесс usrmerge на данной системе. ---- На текущий момент непонятно: — есть ли не обозначенные выше пакеты, требующие пристального внимания; — нужен ли особый подход к системам, применяющим overlayfs вблизи охваченных путей /* и /usr/*.