Open bluca opened 1 year ago
A first bunch, starting with a minimal OS running containers.
APT and dpkg both don't support it. I haven't figured out the behavior for APT yet, tbh, it's weird because essentially everything is drop-ins for apt.conf these days.
glibc for /etc/services (used by getservbyname/getservbyport, which make little sense and are not widely used, but there still are some applications which do). It should be moved under /usr.
getservbyname/getservbyport
are using NSS as backend. There are NSS modules for nearly every location, not only /etc/services
, NIS or LDAP, but also for /usr
. There is e.g. https://github.com/openSUSE/libnss_usrfiles, which, with the /etc/nsswitch.conf
option services: files usrfiles
looks at first for entries in /etc/services
and afterwards in /usr/etc/services
. More such modules exists, so in my opinion, this task is solved, it's just in the responsibility of the Linux distributior to package the best fitting variant and configure it. openSUSE Tumbleweed/MicroOS are doing this since many years.
So this is solved for aliases, ethers, protocols, rpc and services.
/etc/shells
is not handled by NSS, so solving that will be more complicated.
I dare to add to the list :
There's currently https://github.com/systemd/systemd/pull/28919 to address this issue by giving the possibility to downstream to ship the config files in /usr/lib but for some reasons the idea has not been well received.
@fbuihuu systemd's config files in /etc/ are just decoration. Entirely redundant, they are pretty much just helpful hints to people who want to sue traditional populated /etc/. If you delete them for modern systems that come up without /etc/ then behaviour is not changed whatsoever.
All options listed in them just give users hints on the available settings and their defaults, and those options are fully commented, hence these files are NOPs.
Next package list:
For glibc I missed yesterday:
This are now all packages from our minimal installation of MicroOS as ContainerHost beside openssh.
I spoke already with the openssh developers about this some time ago, they rejected all ideas to modify configuration file handling. So we (openSUSE) reconfigured the configuration file setup to mimic hermetic-usr as far as possible, open issue is AcceptEnv
, which you cannot overwrite.
Question is how far do we want to go with that list? I could go as next through a typical server installation and desktop system, but I don't know if this would be really helpful, as the list is already long and it would mix up packages with different priority.
This are now all packages from our minimal installation of MicroOS as ContainerHost beside openssh. I spoke already with the openssh developers about this some time ago, they rejected all ideas to modify configuration file handling. So we (openSUSE) reconfigured the configuration file setup to mimic hermetic-usr as far as possible, open issue is
AcceptEnv
, which you cannot overwrite.
Yeah I had the same experience some years past, openssh as a project is just not interested in anything that doesn't directly benefit BSD. Should we set up a Linux-focused fork, where we can co-maintain patches?
Question is how far do we want to go with that list? I could go as next through a typical server installation and desktop system, but I don't know if this would be really helpful, as the list is already long and it would mix up packages with different priority.
I think this is a good starting point, being core packages they are the highest value to fix. Once we have made a dent in the current list, then we could start looking at a server installation.
nscd (/etc/nscd.conf)
nscd is on its way out: https://fedoraproject.org/wiki/Changes/RemoveNSCD. IIRC, the intent was to also propose the same from glibc upstream if the experiment in Fedora is successful.
Apparmor is another one that doesn't support any kind of vendordir at the moment.
/etc/rsyncd.conf should be solved with: https://github.com/WayneD/rsync/pull/551
util-linux (/etc/blkid.conf): https://github.com/util-linux/util-linux/pull/2616
I have fixed mailx (/etc/mail.rc) in SUSE OBS: https://build.opensuse.org/request/show/1131341 I would like to do it upstream too, but I do not find the code stream to which I can make a PR. Does anyone know where mailx is hosted upstream ? I know, it is really old code :-)
In Debian we ship bsd-mailx: https://tracker.debian.org/pkg/bsd-mailx which according to package metadata comes from https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/mail/
In Debian we ship bsd-mailx: https://tracker.debian.org/pkg/bsd-mailx which according to package metadata comes from https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/mail/
Thanks for hint ! I have sent a patch to tech@openbsd.org .
I filed this bug against Fedora's authselect now:
I have made a PR for fcoe-utils: https://github.com/openSUSE/fcoe-utils/pull/24
I have submitted a patch for selinux: https://github.com/SELinuxProject/selinux/pull/415
DNF 5 supports hermetic configuration since 5.1.4.
https://github.com/rpm-software-management/dnf5/pull/813 https://github.com/rpm-software-management/dnf5/pull/820 https://github.com/rpm-software-management/dnf5/pull/882
What about ca-certificates? That one seems to be prominently missing from the list? Debian already seems to put certificates in /usr/share/ca-certificates, whereas Fedora uses /etc/pki and OpenSUSE /var/lib/ca-certificates? It'd be great if we could standardize on /usr/share/ca-certificates in some form (not familiar with the details)
I have submitted a patch for open-iscsi: https://github.com/open-iscsi/open-iscsi/pull/437
What about ca-certificates? That one seems to be prominently missing from the list? Debian already seems to put certificates in /usr/share/ca-certificates, whereas Fedora uses /etc/pki and OpenSUSE /var/lib/ca-certificates? It'd be great if we could standardize on /usr/share/ca-certificates in some form (not familiar with the details)
A /usr/share/pki
hierarchy as an equivalent to the one in /etc/pki
would allow moving most of this stuff.
Another one that seems to be missing is openssl
Since dnf5 gained support, I filed the following: https://src.fedoraproject.org/rpms/systemd/c/bedc0270e72071dd027f998629f6d633700c5b89 https://src.fedoraproject.org/rpms/setup/pull-request/12 https://src.fedoraproject.org/rpms/sudo/pull-request/29
I marked those as fixed:
systemd "empty" main config files in /etc/systemd udev "empty" main config files in /etc/udev
https://github.com/systemd/systemd/commit/6495361c7d added the functionality to systemd. https://src.fedoraproject.org/rpms/systemd/c/29eb35530b and https://src.fedoraproject.org/rpms/systemd/c/4c7acded2a make use of this in Fedora.
I posted patches to glibc mailing list that teaches glibc NSS to look in /usr/share/ for its various database files, such as /etc/protocols (which will now be looked for in /usr/share/protocols too):
https://sourceware.org/pipermail/libc-alpha/2024-September/160190.html
Let's see if this has any chance to get in.
@poettering No nsswitch.conf?
Two notes:
@poettering No nsswitch.conf?
For now, not. This one only moves the NSS databases. If this works out I'll look into moving non-database files too, i.e. nsswitch.conf, ld.so.conf, resolv.conf, host.conf, shells. (Won't bother with nscd.conf, because nscd is obsolete, and /etc/rpc is not a concept i grok)
Two notes:
- The nss-altfiles model is additive with /etc, which is a different thing (and often desirable)
Ah, interesting. Weirdly, /etc/aliases (and only that) in glibc's enumeration logic contains an "include" logic. if /etc/passwd had that you could use that i guess..
But I guess people who have both sets of files and want them merged should just continue to use nss-altfiles. I'll mention this in an updated commit msg, should i need to update the patch.
- There is also /usr/lib/passwd vs /usr/share/passwd here too (which is fine, I think we actually need to do that to be compatible with systems using nss-altfiles today)
In my view of the world, stuff private to some package should be in /usr/lib/<package>
, and stuff shared between packages should be in /usr/share/
, hence I picked the latter here, because these files have various stakeholders I guess.
One thing I'd known for a while, but came up as part of the glibc patch is that there's a conflict between what OpenSUSE has been doing and what ostree has been doing. Basically that conflict is that ostree unconditionally has /usr/etc
be what was installed by project as /etc
- it's somewhat of an implementation detail (and yes arguably it should have been /usr/lib/ostree/default-etc
or something, but I had also hoped to make it a standard but never drove that well...a lack of will for coordination on my part, also long predates uapi etc).
The conflict is that in the ostree model we can't have both /etc
and /usr/etc
in the image, because it's ostree that owns merging /usr/etc
with /etc
.
Anyways, let me summarize this briefly here (but we should file a dedicated tracker here perhaps?); there are basically at least 4-5 major approaches to /etc I know of:
/etc
starts out empty (let's call this the "uapi ideal", though I'm not entirely sure it's truly my ideal, but that's an aside)/etc
with the lower being the defaults as installed by upstream, and /etc
is a mutable persistent overlayfs upper)/usr/etc
)/usr/share/factory/etc
with systemd-tmpfiles and a C
directive to copy it on first install. I personally think this is Not Viable and anyone doing it is going to get badly bitten by "oh yeah this system has a 3 year old config file because that's when it was installed". IMO an important principle of image based updates is to avoid hysteresis and this has that problem badly. Upstream software authors that put stuff in /etc
are just going to expect it to get upgraded as users upgrade their code .The first observation I will make is that the "uapi ideal" is generally compatible with the other 3. The other 3 are attempts to deal with the fact that we don't live in that "uapi ideal" (and honestly, I doubt my use cases will before I retire...).
What I think we really need to resolve here is the conflict between the OpenSUSE approach and the ostree one because we are giving upstreams conflicting guidance. It seems to me that both should change. I think OpenSUSE should stop encouraging people to put /etc/foo.conf
in /usr/etc/foo.conf
because when we're doing a move and patching upstreams anyways, let's clean up the name spacing here and have it be /usr/lib/foo/foo.conf
or so.
I may also change ostree...I need to dig in some but the flatcar model seems appealing. Or in the short term (it may be painful) I could try to change ostree to use /usr/lib/ostree/default-etc
or so.
For example https://github.com/uapi-group/specifications/issues/100 making things conditional to move to /usr/etc
are too crude IMO.
On Fri, Sep 27, 2024 at 1:51 PM Colin Walters @.***> wrote:
One thing I'd known for a while, but came up as part of the glibc patch is that there's a conflict between what OpenSUSE has been doing and what ostree has been doing. Basically that conflict is that ostree unconditionally has /usr/etc be what was installed by project as /etc - it's somewhat of an implementation detail (and yes arguably it should have been /usr/lib/ostree/default-etc or something, but I had also hoped to make it a standard but never drove that well...a lack of will for coordination on my part, also long predates uapi etc).
The conflict is that in the ostree model we can't have both /etc and /usr/etc in the image, because it's ostree that owns merging /usr/etc with /etc.
Anyways, let me summarize this briefly here (but we should file a dedicated tracker here perhaps?); there are basically at least 4 major approaches to /etc I know of:
- What is promoted here, /etc starts out empty (let's call this the "uapi ideal", though I'm not entirely sure it's truly my ideal, but that's an aside)
- What flatcar is doing (overlayfs for /etc with the lower being the defaults as installed by upstream, and /etc is a mutable persistent overlayfs upper)
- What ostree is doing; a userspace 3 way merge; I think this is equivalent or almost equivalent to the flatcar approach (gotta remember, ostree long predates overlayfs, the ubiquitous Swiss Army knife for filesystem tricks we do today)
- What OpenSUSE is doing (I don't quite know exactly, but it seems to rely on having upstreams install stuff in /usr/etc)
We follow https://uapi-group.org/specifications/specs/configuration_files_specification/ if the format of the configuration file allows it. If not, we only provide a fallback config if there is none in /etc. In which case admins have to manually merge changes. /usr/etc is only used for configuration files where no upstream really exists, like "services" or" protocols" or so. I personally don't like /usr/etc, too, and I had it never on the list of options, but this is what everybody did propose to accept this change. Everything like /usr/share/... or similar got vetoed.
Message ID: @.***>
Thorsten
-- Thorsten Kukuk, Distinguished Engineer, Senior Architect, Future Technologies SUSE Software Solutions Germany GmbH, Frankenstraße 146, 90461 Nuernberg, Germany Managing Director: Ivo Totev, Andrew McDonald, Werner Knoblich (HRB 36809, AG Nürnberg)
/etc/resolv.conf
Any DNS caching service except systemd-resolved expects configuration in /etc/ only. With more often configured fixed DNS over TLS (or similar) service, they may have mostly static configuration, at least in some situation. But I think DNS service configuration should deserve separate issue. Especially when podman and libvirt might want to register local machine instance names to running service and not to support just single specific implementation.
But I expect they are not considered as an good alternative by systemd people, who favour their own systemd-resolved.
Here are some more where I currently need tmpfile definitions to establish symlinks from /etc
to /usr/share/factory
for them to work properly:
/etc/crypto-policies
- Fedora crypto-policies)/etc/environment.conf
and /etc/security/pam_env.conf
(pam_env
)/etc/security/limits.conf
(pam_limits
)/etc/security/namespace
(pam_namespace
)/etc/security/limits.conf
(pam_limits
)/etc/security/sepermit.conf
(pam_sepermit
)/etc/pki
- used by, well, a lot of stuff/etc/ssh/sshd_config
- used by ssh serverLots of PAM stuff
linux-pam supports libeconf, so pam_env
j, pam_limits
, and pam_namespace
should work if you have the --enable-vendordir
flag with the configure script. We do that on Solus and it works fine. Not sure about pam_sepermit
, but if it doesn't work I imagine some of the econf code can be reused with it as well.
Lots of PAM stuff
linux-pam supports libeconf, so
pam_env
j,pam_limits
, andpam_namespace
should work if you have the--enable-vendordir
flag with the configure script
It seems like Fedora had it enabled at some point but removed it again later
Fontconfig is another contender
Fontconfig is another contender
Fontconfig is particularly problematic as it's often built and then statically linked into various applications (Chromium/Electron does this commonly) and will have sandboxes mount the /etc/fonts
directory to be read by yet another build of fontconfig outside of the distributions control.
Just making fontconfig hermetic-usr compatible will lead to fairly broken experiences for end-users (we tried it on Solus). I was able to make it work but it took creating a "stub" fontconfig config file in /usr
which tmpfiles then creates a symlink at /etc/fonts/fonts.conf
to.
References:
Fontconfig is particularly problematic as it's often built and then statically linked into various applications (Chromium/Electron does this commonly) and will have sandboxes mount the
/etc/fonts
directory to be read by yet another build of fontconfig outside of the distributions control.
Yes, updates to fontconfig might take a while to trickle into projects which vendor their own copy. However, I do not think the sandbox is too large of a problem in itself as /usr
is generally also included in the sandbox (or at least /usr/share/fontconfig
) as most files from /etc/fonts/conf.d/
are symlinks to it.
Here are a few more from my Arch machine:
Maybe not that vital but WSL: https://github.com/microsoft/WSL/issues/12299
This issue will be used to track Linux projects that do not currently support hermetic-usr configuration style (ie: /usr/lib/foo as default, /run/foo as ephemeral local override, /etc/foo as persistent local override). The purpose is to have a cross-distribution list of items to slowly work through, to be able to have a bootable and working minimal Linux image-based system with only /usr.
This list is not definitive and will get updated as we go.
/etc/shells
(ref: https://github.com/linux-pam/linux-pam/issues/498#issuecomment-1288457808)/etc/services
(used bygetservbyname
/getservbyport
, which make little sense and are not widely used, but there still are some applications which do). It should be moved under/usr
./etc/dnf/dnf.conf
/etc/systemd
/etc/udev
/etc/X11/xinit/xinitrc.d/50-systemd-user.sh