Not sure if SELinux policy needs to learn about the merge as well. Currently, `sudo semanage fcontext -l | rg bin.*=` shows:
``` /sbin = /usr/sbin /bin = /usr/bin ``` And there are executables in both /usr/bin and /usr/sbin with specific labels, e.g. `sudo semanage fcontext -l | rg bin/.*virt` ``` /usr/bin/imagefactory regular file system_u:object_r:virtd_exec_t:s0 /usr/bin/imgfac\.py regular file system_u:object_r:virtd_exec_t:s0 /usr/bin/nova-compute regular file system_u:object_r:virtd_exec_t:s0 /usr/bin/qemu-ga regular file system_u:object_r:virt_qemu_ga_exec_t:s0 /usr/bin/qemu-pr-helper regular file system_u:object_r:virtd_exec_t:s0 /usr/bin/qemu-storage-daemon regular file system_u:object_r:virtd_exec_t:s0 /usr/bin/vios-proxy-guest regular file system_u:object_r:virtd_exec_t:s0 /usr/bin/vios-proxy-host regular file system_u:object_r:virtd_exec_t:s0 /usr/bin/virt-who regular file system_u:object_r:virtd_exec_t:s0 /usr/sbin/condor_vm-gahp regular file system_u:object_r:virtd_exec_t:s0 /usr/sbin/fence_virtd regular file system_u:object_r:fenced_exec_t:s0 /usr/sbin/libvirt-qmf regular file system_u:object_r:virt_qmf_exec_t:s0 /usr/sbin/libvirtd regular file system_u:object_r:virtd_exec_t:s0 /usr/sbin/virtinterfaced regular file system_u:object_r:virtinterfaced_exec_t:s0 /usr/sbin/virtlockd regular file system_u:object_r:virtlogd_exec_t:s0 /usr/sbin/virtlogd regular file system_u:object_r:virtlogd_exec_t:s0 /usr/sbin/virtlxcd regular file system_u:object_r:virtd_lxc_exec_t:s0 /usr/sbin/virtnetworkd regular file system_u:object_r:virtnetworkd_exec_t:s0 /usr/sbin/virtnodedevd regular file system_u:object_r:virtnodedevd_exec_t:s0 /usr/sbin/virtnwfilterd regular file system_u:object_r:virtnwfilterd_exec_t:s0 /usr/sbin/virtproxyd regular file system_u:object_r:virtproxyd_exec_t:s0 /usr/sbin/virtqemud regular file system_u:object_r:virtqemud_exec_t:s0 /usr/sbin/virtsecretd regular file system_u:object_r:virtsecretd_exec_t:s0 /usr/sbin/virtstoraged regular file system_u:object_r:virtstoraged_exec_t:s0 /usr/sbin/virtvboxd regular file system_u:object_r:virtvboxd_exec_t:s0 /usr/sbin/virtvzd regular file system_u:object_r:virtvzd_exec_t:s0 /usr/sbin/virtxend regular file system_u:object_r:virtxend_exec_t:s0 ``` (should Fedora SELinux policy also drop historical paths for simplicity's sake if/when RPMs don't use them anymore?) On Thu, Apr 11, 2024 at 3:39 PM Zbigniew Jędrzejewski-Szmek < zbys...@in.waw.pl> wrote: > Hi! > > I'm trying to get > https://fedoraproject.org/wiki/Changes/Unify_bin_and_sbin implemented. > It was approved for F40, but only a few days before the mass rebuild, > so there wasn't time to do much, so it was retargeted to F41. > We now have some time before the F41 mass rebuild, so I want to push > all the changes required in various packages so that we have time to > work out any kinks before the mass rebuild commences. > > When I started looking at individual packages, I discovered that we > have an old rule that packages are SUPPOSED to use "historical paths" > to list their files. This rule was introduced to make the transition > easier when UsrMove was implemented for F17. For example, mount.nfs > was historically installed as /sbin/mount.nfs, so nfs-utils must use > %files:/sbin/mount.nfs, even though /sbin is a symlink to /usr/sbin, > meaning that the real path after installation is /usr/sbin/mount.nfs. > And packages using a file path dependency on mount.nfs must use > /sbin/mount.nfs too. > > To implement this rule, packages must use %buildroot/sbin during > installation and use literal "/sbin/" in the files section. This idea > made sense at the time, but now it seems overcomplicated and > unecessary. It requires additional work from packagers who create the > packages that provide the files, but also additional work from > packagers that want to refer to those files. In fact, I only found > three packages that implement the rule correctly: nfs-utils, glibc, > and ocfs2-tools. So step 0. is to drop the packaging rule: > https://pagure.io/packaging-committee/pull-request/1355 > > As to the actual sbin merge: > > Currently, we have %_bindir==/usr/bin, %_sbindir==/usr/sbin, > and /sbin->/usr/sbin, /bin->/usr/sbin. > > In the end state, we will have %_bindir==%_sbindir==/usr/bin, > and /bin,/sbin,/usr/sbin -> /usr/bin. This end state is simple: > _any_ path will works for any binary. > > It's the transition, as we rebuild packages with the new definition, > that requires some careful handling. > > After experimenting with a few different ways to handle this, the > following approach seems to work best: > > 1. rpm is patched to provide %_sbindir==/usr/bin. > (This affects what paths packages will list after being rebuilt.) > > 2. filesystem is patched to not contain /usr/sbin in %files, > but instead symlink /usr/sbin -> bin in %pretrans. > > On fresh installations, this will succeed, so the merge is in place. > On upgrades, this will fail, meaning that /usr/sbin remains a dir. > There is also a %posttrans scriptlet to attempt a merge on upgrades, > more about this below. > > In particular, since buildroots are created afresh for each build, > package builds will get merged-sbin. > > 3. We need to handle the case where package foo had /usr/sbin/foo, but > this file will be in /usr/bin/foo after rebuild. After the merge is > done, /usr/sbin/foo and /usr/bin/foo will point to the same > location, no problem, but during the transition, users or scripts > might call /usr/sbin/foo. To make this work, filesystem rpm gets a > scriptlet that will create symlinks from /usr/sbin to /usr/bin, for > any files which were installed by packages in /usr/sbin. (A list > was obtained using repoquery.) > > Initially, I wanted to put those scriptlets in individual packages, > but that turns out to be a lot of duplicate work. Some packages > have multiple subpackages with files (currently) in /usr/sbin, so > we'd end up with a lot of churn. Doing it once in filesystem turns > out to be fairly easy. > > 4. We also need to handle the case where other package bar has > Requires:/usr/sbin/foo. Once foo has been rebuilt, it has only an > automatic provides for /usr/bin/foo. We could adjust bar for the > new path, but then bar would not be installable on old systems. > Instead, a compat virtual Provides:/usr/sbin/foo is added to foo. > We know that either /usr/sbin will be a symlink, or that filesystem > will create the /usr/sbin/foo symlink. > > We need to ensure that the filesystem package that is installed is > actually new enough so that the Provides is not a lie. > filesystem.rpm gets a virtual > Provides:filesystem(unmerged-sbin-symlinks)=1 which is used as > Requires:filesystem(unmerged-sbin-symlinks) by foo. > > (An explicit Provides/Requires allows us to adjust or rescind the > mechanism in the future.) > > 5. After this preparatory work is done, we can rebuild > various packages with updated rpm and filesystem. > > Packages which don't use %_sbindir generally don't care. > Some packages which use %_sbindir need small adjustments. > There are some common failure modes: > > a. 'mv %buildroot/%_bindir/foo %buildroot/%_sbindir/' > b. 'ln -s ../bin/foo %buildroot/%_sbindir/foo' > c. Listing both %_bindir/foo and %_sbindir/foo in %files > d. 'ln -sf ../bin/foo %buildroot/%_sbindir/foo.alt' > e. 'ln -sf ../sbin/foo %buildroot/%_bindir/foo.alt' > > To make builds work both before and after the merge, a-c should be > conditionalized on '%if "%{_sbindir}" != "%{_bindir}"'. > > d-e are fixed by using > 'ln -sf --relative %{buildroot}/%_bindir/foo > %buildroot/%_sbindir/foo.alt' > or > 'ln -sf --relative %{buildroot}/%_sbindir/foo > %buildroot/%_bindir/foo.alt' > > I submitted / will submit a bunch of pull requests for various packages, > but not all, so I'm describing this here so that packagers can use this > as a hint. > > 6. As we rebuild packages in merged buildroots, and those packages are > deployed on user systems, in completely new installations, > /usr/sbin will be created as a symlink. On upgraded installations, > /usr/sbin is a directory and will contain a mix of files and symlinks. > > filesystem.rpm also has a scriptlet to check if /usr/sbin contains > symlinks only, and once that's true, it will nuke /usr/sbin and > replace it by a symlink to /usr/bin. This will finalize the merge > on upgraded systems. > > The plan: > > I. Merge https://pagure.io/packaging-committee/pull-request/1355. > This isn't stricly necessary, but makes things simpler. > > II. I've been doing test rebuilds of packages and filing pull requests > as described in 1–4. above. Those should be merged before the other > things, changes are conditionalized on '"%{_sbindir}"=="%{_bindir}"'. > > Some pull requests have already been merged. If you get a pull > request, please review and/or merge. > > https://src.fedoraproject.org/rpms/rpm/pull-request/56 > https://src.fedoraproject.org/rpms/filesystem/pull-request/11 > > https://src.fedoraproject.org/rpms/chkconfig/pull-request/13 > https://src.fedoraproject.org/rpms/coreutils/pull-request/15 > https://src.fedoraproject.org/rpms/cyrus-sasl/pull-request/11 MERGED > https://src.fedoraproject.org/rpms/dmidecode/pull-request/8 > https://src.fedoraproject.org/rpms/exim/pull-request/16 MERGED > https://src.fedoraproject.org/rpms/exim/pull-request/17 > https://src.fedoraproject.org/rpms/glibc/pull-request/91 > https://src.fedoraproject.org/rpms/kmod/pull-request/12 > https://src.fedoraproject.org/rpms/libcap/pull-request/29 MERGED > https://src.fedoraproject.org/rpms/nfs-utils/pull-request/15 > https://src.fedoraproject.org/rpms/ocfs2-tools/pull-request/2 > https://src.fedoraproject.org/rpms/opensmtpd/pull-request/1 > https://src.fedoraproject.org/rpms/policycoreutils/pull-request/42 > https://src.fedoraproject.org/rpms/procps-ng/pull-request/7 > https://src.fedoraproject.org/rpms/rpcbind/pull-request/4 > https://src.fedoraproject.org/rpms/shadow-utils/pull-request/22 > https://src.fedoraproject.org/rpms/systemd/pull-request/131 > https://src.fedoraproject.org/rpms/util-linux/pull-request/17 > > III. I have two coprs: > https://copr.fedorainfracloud.org/coprs/zbyszek/merged-sbin/builds/ > https://copr.fedorainfracloud.org/coprs/zbyszek/unmerged-sbin/builds/ > > The first one has rpm and filesystem with the changes, so the builds > done there get %{_sbindir}==%{_bindir}. Other packages are > rebuilt with the patches from pull requests. > > The second has old rpm and filesystem, and it serves as a check > that the same srpms as from the first copr still build fine without > the merge. > > It should be possible to install the packages from the first copr > onto a system and either end up with a system with some links and > files in /usr/sbin, or /usr/sbin being a symlink. > > I still need to do more builds in the coprs. If it all turns out to > work as expected, I think we're ready to execute the merge. > > IV. After the pull requests for rpm and filesystem are accepted, > I'll build those in a side tag so that they appear in the > buildroots at the same time. (Things would be even more confusing > with just one of those.) > [rpm, filesystem] > > There is a bunch of packages which do 5c in the list above. > Those will FTI until they have been rebuilt. I'll build those > in the same side tag so that the buildroot is not broken and > we don't get cascading build failures. > [rpcbind, systemd-udev, policycoreutils] > > Once that's done, the side tag can be merged and packages > will see the new buildroot layout as they are rebuilt. > > V. Other packages will need to rebuild to change the layout. > I think it'll make sense to rebuild any packages which have had > patches applied. There is no "flag day", but it'd be great if > we rebuild most packages with files in /usr/sbin, so that we can > actually test if the full transition works as expected. > > VI. A special case of V. is packages using usermode helper with files > in /usr/bin and /usr/sbin. Here, each package is different and > input from maitainers will be needed. > > As long as those packages are not rebuilt, they will continue to > function in the old state, but as point they'll need to be fixed or > retired. > > I looked into setuptool, and AFAICT, the package is absolete and > doesn't actually work. A candidate for retirement. > > I'm sure that I missed some corner cases. In case something breaks, > let me know, I'll try to fix or help to fix. > > I want to finish working on rpm, filesystem, and other packages > soon (hopefully this week), and merge everything about a week later. > > Zbyszek > -- > _______________________________________________ > devel mailing list -- devel@lists.fedoraproject.org > To unsubscribe send an email to devel-le...@lists.fedoraproject.org > Fedora Code of Conduct: > https://docs.fedoraproject.org/en-US/project/code-of-conduct/ > List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines > List Archives: > https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org > Do not reply to spam, report it: > https://pagure.io/fedora-infrastructure/new_issue >
-- _______________________________________________ devel mailing list -- devel@lists.fedoraproject.org To unsubscribe send an email to devel-le...@lists.fedoraproject.org Fedora Code of Conduct: https://docs.fedoraproject.org/en-US/project/code-of-conduct/ List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines List Archives: https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org Do not reply to spam, report it: https://pagure.io/fedora-infrastructure/new_issue