2019-01-03 06:16:34 +08:00
|
|
|
|
---
|
2020-01-15 04:25:52 +08:00
|
|
|
|
title: Users, Groups, UIDs and GIDs on systemd Systems
|
2020-04-12 00:03:24 +08:00
|
|
|
|
category: Users, Groups and Home Directories
|
2019-12-12 00:01:46 +08:00
|
|
|
|
layout: default
|
2021-09-14 22:05:21 +08:00
|
|
|
|
SPDX-License-Identifier: LGPL-2.1-or-later
|
2019-01-03 06:16:34 +08:00
|
|
|
|
---
|
|
|
|
|
|
2020-01-15 04:25:52 +08:00
|
|
|
|
# Users, Groups, UIDs and GIDs on systemd Systems
|
2017-12-02 19:49:22 +08:00
|
|
|
|
|
|
|
|
|
Here's a summary of the requirements `systemd` (and Linux) make on UID/GID
|
|
|
|
|
assignments and their ranges.
|
|
|
|
|
|
2024-02-26 21:35:36 +08:00
|
|
|
|
Note that while in theory UIDs and GIDs are orthogonal concepts they really aren't IRL.
|
|
|
|
|
With that in mind, when we discuss UIDs below it should be assumed
|
|
|
|
|
that whatever we say about UIDs applies to GIDs in mostly the same way,
|
|
|
|
|
and all the special assignments and ranges for UIDs always have mostly the same validity for GIDs too.
|
2017-12-02 19:49:22 +08:00
|
|
|
|
|
|
|
|
|
## Special Linux UIDs
|
|
|
|
|
|
2023-07-02 05:33:20 +08:00
|
|
|
|
In theory, the range of the C type `uid_t` is 32-bit wide on Linux,
|
2017-12-02 19:49:22 +08:00
|
|
|
|
i.e. 0…4294967295. However, four UIDs are special on Linux:
|
|
|
|
|
|
2024-01-09 19:10:18 +08:00
|
|
|
|
1. 0 → The `root` super-user.
|
2017-12-02 19:49:22 +08:00
|
|
|
|
|
2024-02-26 21:35:36 +08:00
|
|
|
|
2. 65534 → The `nobody` UID, also called the "overflow" UID or similar.
|
|
|
|
|
It's where various subsystems map unmappable users to, for example file systems
|
|
|
|
|
only supporting 16-bit UIDs, NFS or user namespacing.
|
|
|
|
|
(The latter can be changed with a sysctl during runtime, but that's not supported on
|
|
|
|
|
`systemd`. If you do change it you void your warranty.)
|
|
|
|
|
(Also, some distributions call the `nobody` group `nogroup`. I wish they didn't.)
|
2017-12-02 19:49:22 +08:00
|
|
|
|
|
2023-07-02 05:33:20 +08:00
|
|
|
|
3. 4294967295, aka "32-bit `(uid_t) -1`" → This UID is not a valid user ID, as
|
2018-01-11 20:08:57 +08:00
|
|
|
|
`setresuid()`, `chown()` and friends treat -1 as a special request to not
|
2024-02-26 21:35:36 +08:00
|
|
|
|
change the UID of the process/file.
|
|
|
|
|
This UID is hence not available for assignment to users in the user database.
|
2017-12-02 19:49:22 +08:00
|
|
|
|
|
2023-07-02 05:33:20 +08:00
|
|
|
|
4. 65535, aka "16-bit `(uid_t) -1`" → Before Linux kernel 2.4 `uid_t` used to be
|
|
|
|
|
16-bit, and programs compiled for that would hence assume that `(uid_t) -1`
|
2018-01-11 20:08:57 +08:00
|
|
|
|
is 65535. This UID is hence not usable either.
|
2017-12-02 19:49:22 +08:00
|
|
|
|
|
|
|
|
|
The `nss-systemd` glibc NSS module will synthesize user database records for
|
2024-02-26 21:35:36 +08:00
|
|
|
|
the UIDs 0 and 65534 if the system user database doesn't list them.
|
|
|
|
|
This means that any system where this module is enabled works to some minimal level
|
2017-12-02 19:49:22 +08:00
|
|
|
|
without `/etc/passwd`.
|
|
|
|
|
|
|
|
|
|
## Special Distribution UID ranges
|
|
|
|
|
|
|
|
|
|
Distributions generally split the available UID range in two:
|
|
|
|
|
|
|
|
|
|
1. 1…999 → System users. These are users that do not map to actual "human"
|
|
|
|
|
users, but are used as security identities for system daemons, to implement
|
|
|
|
|
privilege separation and run system daemons with minimal privileges.
|
|
|
|
|
|
|
|
|
|
2. 1000…65533 and 65536…4294967294 → Everything else, i.e. regular (human) users.
|
|
|
|
|
|
2024-01-09 19:10:18 +08:00
|
|
|
|
Some older systems placed the boundary at 499/500, or even 99/100,
|
2024-02-26 21:35:36 +08:00
|
|
|
|
and some distributions allow the boundary between system and regular users to be changed via local configuration.
|
2024-01-09 19:10:18 +08:00
|
|
|
|
In `systemd`, the boundary is configurable during compilation time
|
|
|
|
|
and is also queried from `/etc/login.defs` at runtime,
|
|
|
|
|
if the `-Dcompat-mutable-uid-boundaries=true` compile-time setting is used.
|
|
|
|
|
We strongly discourage downstreams from changing the boundary from the upstream default of 999/1000.
|
2017-12-02 19:49:22 +08:00
|
|
|
|
|
|
|
|
|
Also note that programs such as `adduser` tend to allocate from a subset of the
|
2024-01-09 19:10:18 +08:00
|
|
|
|
available regular user range only, usually 1000..60000.
|
|
|
|
|
This range can also be configured using `/etc/login.defs`.
|
2017-12-02 19:49:22 +08:00
|
|
|
|
|
|
|
|
|
Note that systemd requires that system users and groups are resolvable without
|
2024-02-26 21:35:36 +08:00
|
|
|
|
network — a requirement that is not made for regular users.
|
|
|
|
|
This means regular users may be stored in remote LDAP or NIS databases,
|
|
|
|
|
but system users may not (except when there's a consistent local cache kept, that is
|
2022-09-23 21:10:06 +08:00
|
|
|
|
available during earliest boot, including in the initrd).
|
2017-12-02 19:49:22 +08:00
|
|
|
|
|
|
|
|
|
## Special `systemd` GIDs
|
|
|
|
|
|
2024-02-26 21:35:36 +08:00
|
|
|
|
`systemd` defines no special UIDs beyond what Linux already defines (see above).
|
|
|
|
|
However, it does define some special group/GID assignments,
|
|
|
|
|
which are primarily used for `systemd-udevd`'s device management.
|
|
|
|
|
The precise list of the currently defined groups is found in this `sysusers.d` snippet:
|
2021-12-24 04:25:31 +08:00
|
|
|
|
[basic.conf](https://raw.githubusercontent.com/systemd/systemd/main/sysusers.d/basic.conf.in)
|
2017-12-02 19:49:22 +08:00
|
|
|
|
|
|
|
|
|
It's strongly recommended that downstream distributions include these groups in
|
|
|
|
|
their default group databases.
|
|
|
|
|
|
|
|
|
|
Note that the actual GID numbers assigned to these groups do not have to be
|
2024-02-26 21:35:36 +08:00
|
|
|
|
constant beyond a specific system.
|
|
|
|
|
There's one exception however: the `tty` group must have the GID 5.
|
|
|
|
|
That's because it must be encoded in the `devpts` mount parameters during earliest boot, at a time where NSS lookups are not
|
|
|
|
|
possible.
|
|
|
|
|
(Note that the actual GID can be changed during `systemd` build time, but downstreams are strongly advised against doing that.)
|
2017-12-02 19:49:22 +08:00
|
|
|
|
|
|
|
|
|
## Special `systemd` UID ranges
|
|
|
|
|
|
|
|
|
|
`systemd` defines a number of special UID ranges:
|
|
|
|
|
|
2019-08-26 21:31:17 +08:00
|
|
|
|
1. 60001…60513 → UIDs for home directories managed by
|
2024-02-26 21:35:36 +08:00
|
|
|
|
[`systemd-homed.service(8)`](https://www.freedesktop.org/software/systemd/man/systemd-homed.service.html).
|
|
|
|
|
UIDs from this range are automatically assigned to any home directory discovered,
|
|
|
|
|
and persisted locally on first login.
|
|
|
|
|
On different systems the same user might get different UIDs assigned in case of conflict, though it is
|
2019-08-26 21:31:17 +08:00
|
|
|
|
attempted to make UID assignments stable, by deriving them from a hash of
|
|
|
|
|
the user name.
|
|
|
|
|
|
|
|
|
|
2. 61184…65519 → UIDs for dynamic users are allocated from this range (see the
|
2017-12-02 19:49:22 +08:00
|
|
|
|
`DynamicUser=` documentation in
|
2024-02-26 21:35:36 +08:00
|
|
|
|
[`systemd.exec(5)`](https://www.freedesktop.org/software/systemd/man/systemd.exec.html)).
|
|
|
|
|
This range has been chosen so that it is below the 16-bit boundary
|
|
|
|
|
(i.e. below 65535), in order to provide compatibility with container environments that
|
|
|
|
|
assign a 64K range of UIDs to containers using user namespacing.
|
|
|
|
|
This range is above the 60000 boundary, so that its allocations are unlikely to be
|
|
|
|
|
affected by `adduser` allocations (see above).
|
|
|
|
|
And we leave some room upwards for other purposes.
|
|
|
|
|
(And if you wonder why precisely these numbers: if you write them in hexadecimal, they might make more sense: 0xEF00 and 0xFFEF).
|
|
|
|
|
The `nss-systemd` module will synthesize user records implicitly
|
|
|
|
|
for all currently allocated dynamic users from this range.
|
|
|
|
|
Thus, NSS-based user record resolving works correctly without those users being in `/etc/passwd`.
|
2017-12-02 19:49:22 +08:00
|
|
|
|
|
2019-08-26 21:31:17 +08:00
|
|
|
|
3. 524288…1879048191 → UID range for `systemd-nspawn`'s automatic allocation of
|
2024-02-26 21:35:36 +08:00
|
|
|
|
per-container UID ranges.
|
|
|
|
|
When the `--private-users=pick` switch is used (or `-U`) then it will automatically find a so far unused 16-bit subrange of this
|
|
|
|
|
range and assign it to the container.
|
|
|
|
|
The range is picked so that the upper 16-bit of the 32-bit UIDs are constant for all users of the container,
|
|
|
|
|
while the lower 16-bit directly encode the 65536 UIDs assigned to the container.
|
|
|
|
|
This mode of allocation means that the upper 16-bit of any UID
|
2023-07-02 05:33:20 +08:00
|
|
|
|
assigned to a container are kind of a "container ID", while the lower 16-bit
|
2024-02-26 21:35:36 +08:00
|
|
|
|
directly expose the container's own UID numbers.
|
|
|
|
|
If you wonder why precisely these numbers, consider them in hexadecimal: 0x00080000…0x6FFFFFFF.
|
|
|
|
|
This range is above the 16-bit boundary.
|
|
|
|
|
Moreover it's below the 31-bit boundary, as some broken code (specifically: the kernel's `devpts` file system)
|
|
|
|
|
erroneously considers UIDs signed integers, and hence can't deal with values above 2^31.
|
|
|
|
|
The `systemd-machined.service` service will synthesize user database records for all UIDs assigned to a running container from this range.
|
2017-12-02 19:49:22 +08:00
|
|
|
|
|
2023-07-06 17:54:02 +08:00
|
|
|
|
Note for both allocation ranges: when a UID allocation takes place NSS is
|
2024-02-26 21:35:36 +08:00
|
|
|
|
checked for collisions first, and a different UID is picked if an entry is found.
|
|
|
|
|
Thus, the user database is used as synchronization mechanism to ensure
|
|
|
|
|
exclusive ownership of UIDs and UID ranges.
|
|
|
|
|
To ensure compatibility with other subsystems allocating from the same ranges it is hence essential that they
|
2017-12-02 19:49:22 +08:00
|
|
|
|
ensure that whatever they pick shows up in the user/group databases, either by
|
2024-02-26 21:35:36 +08:00
|
|
|
|
providing an NSS module, or by adding entries directly to `/etc/passwd` and `/etc/group`.
|
|
|
|
|
For performance reasons, do note that `systemd-nspawn` will only
|
|
|
|
|
do an NSS check for the first UID of the range it allocates, not all 65536 of them.
|
|
|
|
|
Also note that while the allocation logic is operating,
|
|
|
|
|
the glibc `lckpwdf()` user database lock is taken, in order to make this logic race-free.
|
2017-12-02 19:49:22 +08:00
|
|
|
|
|
|
|
|
|
## Figuring out the system's UID boundaries
|
|
|
|
|
|
|
|
|
|
The most important boundaries of the local system may be queried with
|
|
|
|
|
`pkg-config`:
|
|
|
|
|
|
2024-02-26 21:35:36 +08:00
|
|
|
|
```sh
|
2024-01-09 19:14:54 +08:00
|
|
|
|
$ pkg-config --variable=system_uid_max systemd
|
2017-12-02 19:49:22 +08:00
|
|
|
|
999
|
2024-01-09 19:14:54 +08:00
|
|
|
|
$ pkg-config --variable=dynamic_uid_min systemd
|
2017-12-02 19:49:22 +08:00
|
|
|
|
61184
|
2024-01-09 19:14:54 +08:00
|
|
|
|
$ pkg-config --variable=dynamic_uid_max systemd
|
2017-12-02 19:49:22 +08:00
|
|
|
|
65519
|
2024-01-09 19:14:54 +08:00
|
|
|
|
$ pkg-config --variable=container_uid_base_min systemd
|
2017-12-02 19:49:22 +08:00
|
|
|
|
524288
|
2024-01-09 19:14:54 +08:00
|
|
|
|
$ pkg-config --variable=container_uid_base_max systemd
|
2017-12-02 19:49:22 +08:00
|
|
|
|
1878982656
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
(Note that the latter encodes the maximum UID *base* `systemd-nspawn` might
|
|
|
|
|
pick — given that 64K UIDs are assigned to each container according to this
|
|
|
|
|
allocation logic, the maximum UID used for this range is hence
|
|
|
|
|
1878982656+65535=1879048191.)
|
|
|
|
|
|
2024-02-26 21:35:36 +08:00
|
|
|
|
Systemd has compile-time default for these boundaries.
|
|
|
|
|
Using those defaults is recommended.
|
|
|
|
|
It will nevertheless query `/etc/login.defs` at runtime, when compiled with `-Dcompat-mutable-uid-boundaries=true` and that file is present.
|
2020-09-25 22:31:42 +08:00
|
|
|
|
Support for this is considered only a compatibility feature and should not be
|
2022-01-27 02:42:49 +08:00
|
|
|
|
used except when upgrading systems which were created with different defaults.
|
2017-12-02 19:49:22 +08:00
|
|
|
|
|
|
|
|
|
## Considerations for container managers
|
|
|
|
|
|
|
|
|
|
If you hack on a container manager, and wonder how and how many UIDs best to
|
|
|
|
|
assign to your containers, here are a few recommendations:
|
|
|
|
|
|
2024-02-26 21:35:36 +08:00
|
|
|
|
1. Definitely, don't assign less than 65536 UIDs/GIDs.
|
|
|
|
|
After all the `nobody` user has magic properties, and hence should be available in your container,
|
|
|
|
|
and given that it's assigned the UID 65534, you should really cover the full 16-bit range in your container.
|
|
|
|
|
Note that systemd will — as mentioned — synthesize user records for the `nobody` user,
|
|
|
|
|
and assumes its availability in various other parts of its codebase, too, hence assigning fewer users means you lose
|
|
|
|
|
compatibility with running systemd code inside your container.
|
|
|
|
|
And most likely other packages make similar restrictions.
|
2017-12-02 19:49:22 +08:00
|
|
|
|
|
|
|
|
|
2. While it's fine to assign more than 65536 UIDs/GIDs to a container, there's
|
|
|
|
|
most likely not much value in doing so, as Linux distributions won't use the
|
|
|
|
|
higher ranges by default (as mentioned neither `adduser` nor `systemd`'s
|
2024-02-26 21:35:36 +08:00
|
|
|
|
dynamic user concept allocate from above the 16-bit range).
|
|
|
|
|
Unless you actively care for nested containers, it's hence probably a good idea to allocate exactly
|
|
|
|
|
65536 UIDs per container, and neither less nor more.
|
|
|
|
|
A pretty side-effect is that by doing so, you expose the same number of UIDs per container as Linux 2.2
|
2017-12-02 19:49:22 +08:00
|
|
|
|
supported for the whole system, back in the days.
|
|
|
|
|
|
2024-02-26 21:35:36 +08:00
|
|
|
|
3. Consider allocating UID ranges for containers so that the first UID you assign has the lower 16-bits all set to zero.
|
|
|
|
|
That way, the upper 16-bits become a container ID of some kind,
|
|
|
|
|
while the lower 16-bits directly encode the internal container UID.
|
|
|
|
|
This is the way `systemd-nspawn` allocates UID ranges(see above).
|
|
|
|
|
Following this allocation logic ensures best compatibility with `systemd-nspawn`
|
|
|
|
|
and all other container managers following the scheme, as it
|
|
|
|
|
is sufficient then to check NSS for the first UID you pick regarding conflicts, as that's what they do, too.
|
|
|
|
|
Moreover, it makes `chown()`ing container file system trees nicely robust to interruptions: as the external UID encodes the
|
2017-12-02 19:49:22 +08:00
|
|
|
|
internal UID in a fixed way, it's very easy to adjust the container's base UID
|
|
|
|
|
without the need to know the original base UID: to change the container base,
|
2024-02-26 21:35:36 +08:00
|
|
|
|
just mask away the upper 16-bit, and insert the upper 16-bit of the new container base instead.
|
|
|
|
|
Here are the easy conversions to derive the internal UID, the external UID, and the container base UID from each other:
|
2017-12-02 19:49:22 +08:00
|
|
|
|
|
2024-02-26 21:35:36 +08:00
|
|
|
|
```sh
|
|
|
|
|
INTERNAL_UID = EXTERNAL_UID & 0x0000FFFF
|
|
|
|
|
CONTAINER_BASE_UID = EXTERNAL_UID & 0xFFFF0000
|
|
|
|
|
EXTERNAL_UID = INTERNAL_UID | CONTAINER_BASE_UID
|
|
|
|
|
```
|
2017-12-02 19:49:22 +08:00
|
|
|
|
|
|
|
|
|
4. When picking a UID range for containers, make sure to check NSS first, with
|
|
|
|
|
a simple `getpwuid()` call: if there's already a user record for the first UID
|
2024-02-26 21:35:36 +08:00
|
|
|
|
you want to pick, then it's already in use: pick a different one.
|
|
|
|
|
Wrap that call in a `lckpwdf()` + `ulckpwdf()` pair, to make allocation race-free.
|
|
|
|
|
Provide an NSS module that makes all UIDs you end up taking show up
|
2017-12-02 19:49:22 +08:00
|
|
|
|
in the user database, and make sure that the NSS module returns up-to-date
|
|
|
|
|
information before you release the lock, so that other system components can
|
2024-02-26 21:35:36 +08:00
|
|
|
|
safely use the NSS user database as allocation check, too.
|
|
|
|
|
Note that if you follow this scheme no changes to `/etc/passwd` need to be made, thus minimizing
|
2017-12-02 19:49:22 +08:00
|
|
|
|
the artifacts the container manager persistently leaves in the system.
|
|
|
|
|
|
2024-02-26 21:35:36 +08:00
|
|
|
|
5. `systemd-homed` by default mounts the home directories it manages with UID mapping applied.
|
|
|
|
|
It will map four UID ranges into that uidmap, and leave everything else unmapped:
|
|
|
|
|
the range from 0…60000, the user's own UID,
|
|
|
|
|
the range 60514…65534, and the container range 524288…1879048191.
|
|
|
|
|
This means files/directories in home directories managed by `systemd-homed` cannot be
|
2022-02-16 05:40:29 +08:00
|
|
|
|
owned by UIDs/GIDs outside of these four ranges (attempts to `chown()` files to
|
2024-02-26 21:35:36 +08:00
|
|
|
|
UIDs outside of these ranges will fail).
|
|
|
|
|
Thus, if container trees are to be placed within a home directory managed by `systemd-homed` they should take
|
|
|
|
|
these ranges into consideration and either place the trees at base UID 0
|
|
|
|
|
(and then map them to a higher UID range for use in user namespacing via another
|
|
|
|
|
level of UID mapped mounts, at *runtime*) or at a base UID from the container UID range.
|
|
|
|
|
That said, placing container trees (and in fact any files/directories not owned by the home directory's user) in home directories
|
2022-02-16 05:40:29 +08:00
|
|
|
|
is generally a questionable idea (regardless of whether `systemd-homed` is used
|
|
|
|
|
or not), given this typically breaks quota assumptions, makes it impossible for
|
|
|
|
|
users to properly manage all files in their own home directory due to
|
|
|
|
|
permission problems, introduces security issues around SETUID and severely
|
2024-02-26 21:35:36 +08:00
|
|
|
|
restricts compatibility with networked home directories.
|
|
|
|
|
Typically, it's a much better idea to place container images outside of the home directory,
|
2022-02-16 05:40:29 +08:00
|
|
|
|
i.e. somewhere below `/var/` or similar.
|
|
|
|
|
|
2017-12-02 19:49:22 +08:00
|
|
|
|
## Summary
|
|
|
|
|
|
|
|
|
|
| UID/GID | Purpose | Defined By | Listed in |
|
|
|
|
|
|-----------------------|-----------------------|---------------|-------------------------------|
|
|
|
|
|
| 0 | `root` user | Linux | `/etc/passwd` + `nss-systemd` |
|
|
|
|
|
| 1…4 | System users | Distributions | `/etc/passwd` |
|
|
|
|
|
| 5 | `tty` group | `systemd` | `/etc/passwd` |
|
|
|
|
|
| 6…999 | System users | Distributions | `/etc/passwd` |
|
|
|
|
|
| 1000…60000 | Regular users | Distributions | `/etc/passwd` + LDAP/NIS/… |
|
2021-05-07 17:44:26 +08:00
|
|
|
|
| 60001…60513 | Human users (homed) | `systemd` | `nss-systemd` |
|
2023-07-02 05:33:20 +08:00
|
|
|
|
| 60514…60577 | Host users mapped into containers | `systemd` | `systemd-nspawn` |
|
2021-05-07 17:44:26 +08:00
|
|
|
|
| 60578…61183 | Unused | | |
|
2017-12-02 19:49:22 +08:00
|
|
|
|
| 61184…65519 | Dynamic service users | `systemd` | `nss-systemd` |
|
|
|
|
|
| 65520…65533 | Unused | | |
|
|
|
|
|
| 65534 | `nobody` user | Linux | `/etc/passwd` + `nss-systemd` |
|
2023-07-02 05:33:20 +08:00
|
|
|
|
| 65535 | 16-bit `(uid_t) -1` | Linux | |
|
2017-12-02 19:49:22 +08:00
|
|
|
|
| 65536…524287 | Unused | | |
|
2020-07-08 03:58:12 +08:00
|
|
|
|
| 524288…1879048191 | Container UID ranges | `systemd` | `nss-systemd` |
|
2019-10-07 01:05:57 +08:00
|
|
|
|
| 1879048192…2147483647 | Unused | | |
|
2019-05-13 21:23:47 +08:00
|
|
|
|
| 2147483648…4294967294 | HIC SVNT LEONES | | |
|
2023-07-02 05:33:20 +08:00
|
|
|
|
| 4294967295 | 32-bit `(uid_t) -1` | Linux | |
|
2017-12-02 19:49:22 +08:00
|
|
|
|
|
2024-02-26 21:35:36 +08:00
|
|
|
|
Note that "Unused" in the table above doesn't mean that these ranges are really unused.
|
|
|
|
|
It just means that these ranges have no well-established
|
|
|
|
|
pre-defined purposes between Linux, generic low-level distributions and `systemd`.
|
|
|
|
|
There might very well be other packages that allocate from theseranges.
|
2018-05-07 20:49:16 +08:00
|
|
|
|
|
2024-02-26 21:35:36 +08:00
|
|
|
|
Note that the range 2147483648…4294967294 (i.e. 2^31…2^32-2) should be handled with care.
|
|
|
|
|
Various programs (including kernel file systems — see `devpts` — or
|
2022-03-18 18:49:05 +08:00
|
|
|
|
even kernel syscalls – see `setfsuid()`) have trouble with UIDs outside of the
|
2024-02-26 21:35:36 +08:00
|
|
|
|
signed 32-bit range, i.e any UIDs equal to or above 2147483648.
|
|
|
|
|
It is thus strongly recommended to stay away from this range in order to avoid complications.
|
|
|
|
|
This range should be considered reserved for future, special purposes.
|
2019-05-13 21:23:47 +08:00
|
|
|
|
|
2018-05-07 20:49:16 +08:00
|
|
|
|
## Notes on resolvability of user and group names
|
|
|
|
|
|
|
|
|
|
User names, UIDs, group names and GIDs don't have to be resolvable using NSS
|
2024-02-26 21:35:36 +08:00
|
|
|
|
(i.e. getpwuid() and getpwnam() and friends) all the time.
|
|
|
|
|
However, systemd makes the following requirements:
|
2018-05-07 20:49:16 +08:00
|
|
|
|
|
2024-02-26 21:35:36 +08:00
|
|
|
|
System users generally have to be resolvable during early boot already.
|
|
|
|
|
This means they should not be provided by any networked service (as those usually
|
2018-05-07 20:49:16 +08:00
|
|
|
|
become available during late boot only), except if a local cache is kept that
|
2024-02-26 21:35:36 +08:00
|
|
|
|
makes them available during early boot too (i.e. before networking is up).
|
|
|
|
|
Specifically, system users need to be resolvable at least before
|
|
|
|
|
`systemd-udevd.service` and `systemd-tmpfiles-setup.service` are started,
|
|
|
|
|
as both need to resolve system users — but note that there might be more services
|
2018-05-07 20:49:16 +08:00
|
|
|
|
requiring full resolvability of system users than just these two.
|
|
|
|
|
|
|
|
|
|
Regular users do not need to be resolvable during early boot, it is sufficient
|
2024-02-26 21:35:36 +08:00
|
|
|
|
if they become resolvable during late boot.
|
|
|
|
|
Specifically, regular users need to be resolvable at the point in time the `nss-user-lookup.target` unit is reached.
|
|
|
|
|
This target unit is generally used as synchronization point between
|
|
|
|
|
providers of the user database and consumers of it.
|
|
|
|
|
Services that require that the user database is fully available (for example, the login service
|
2018-05-07 20:49:16 +08:00
|
|
|
|
`systemd-logind.service`) are ordered *after* it, while services that provide
|
2024-02-26 21:35:36 +08:00
|
|
|
|
parts of the user database (for example an LDAP user database client) are ordered *before* it.
|
|
|
|
|
Note that `nss-user-lookup.target` is a *passive* unit: in
|
2018-05-07 20:49:16 +08:00
|
|
|
|
order to minimize synchronization points on systems that don't need it the unit
|
|
|
|
|
is pulled into the initial transaction only if there's at least one service
|
|
|
|
|
that really needs it, and that means only if there's a service providing the
|
2024-02-26 21:35:36 +08:00
|
|
|
|
local user database somehow through IPC or suchlike.
|
|
|
|
|
Or in other words: if you hack on some networked user database project, then make sure you order your
|
|
|
|
|
service `Before=nss-user-lookup.target` and that you pull it in with `Wants=nss-user-lookup.target`.
|
|
|
|
|
However, if you hack on some project that needs the user database to be up in full, then order your service
|
|
|
|
|
`After=nss-user-lookup.target`, but do *not* pull it in via a `Wants=` dependency.
|