Compare commits

..

5 Commits

Author SHA1 Message Date
Lennart Poettering 16a4a2f8cc update TODO 2020-07-14 15:06:29 +02:00
Lennart Poettering 08ef688656 analyze: make testing ConditionPathExistsGlob= work
Fixes: #16439
Alternative-To: #16440
2020-07-14 14:59:18 +02:00
Lennart Poettering 4519c7c706 update TODO 2020-07-14 14:57:19 +02:00
Lennart Poettering 77ee1783eb udevadm: beef up deprecation log warning
Let's add a catalog entry explaining further details.

Most importantly though: talk to PID 1 directly, via the private D-Bus
socket, so that this actually works correctly during early boot, where
D-Bus is not around.
2020-07-14 14:57:19 +02:00
Zbigniew Jędrzejewski-Szmek a18c7865be meson: do not install testdata when -Dinstall-tests=false
Fixes #16447.
2020-07-14 14:57:04 +02:00
6 changed files with 147 additions and 86 deletions

7
TODO
View File

@ -17,6 +17,10 @@ Janitorial Clean-ups:
Features:
* complement root=, rootflags=, rootfstype= with rootsubdir= which allows
mounting a subdir of the root fs as actual root. This can be used as
fstype-agnostic version of btrfs' rootflags=subvol=foobar.
* add --copy-from and --copy-to command to systemd-dissect which copies stuff
in and out of a disk image
@ -24,9 +28,6 @@ Features:
* if /usr/bin/swapoff fails due to OOM, log a friendly explanatory message about it
* add loud warning to the logs (with catalog entry) if systemd-udev-settle is
pulled into the boot process
* build short web pages out of each catalog entry, build them along with man
pages, and include hyperlinks to them in the journal output

View File

@ -484,3 +484,36 @@ It is strongly recommended to avoid running services under this user identity,
in particular on systems using NFS or running containers. Allocate a user ID
specific to this service, either statically via systemd-sysusers or dynamically
via the DynamicUser= service setting.
-- 1c0454c1bd2241e0ac6fefb4bc631433
Subject: systemd-udev-settle.service is deprecated.
Defined-By: systemd
Support: %SUPPORT_URL%
Usage of the systemd service unit systemd-udev-settle.service is deprecated. It
inserts artificial delays into the boot process without providing the
guarantees other subsystems traditionally assumed it provides. Relying on this
service is racy, and it is generally a bug to make use of it and depend on it.
Traditionally, this service's job was to wait until all devices a system
possesses have been fully probed and initialized, delaying boot until this
phase is completed. However, today's systems and hardware generally don't work
this way anymore, hardware today may show up any time and take any time to be
probed and initialized. Thus, in the general case, it's no longer possible to
correctly delay boot until "all devices" have been processed, as it is not
clear what "all devices" means and when they have been found. This is in
particular the case if USB hardware or network-attached hardware is used.
Modern software that requires some specific hardware (such as a network device
or block device) to operate should only wait for the specific devices it needs
to show up, and otherwise operate asynchronously initializing devices as they
appear during boot and during runtime without delaying the boot process.
It is a defect of the software in question if it doesn't work this way, and
still pulls systemd-udev-settle.service into the boot process.
Please file a bug report against the following units, with a request for it to
be updated to operate in a hotplug fashion without depending on
systemd-udev-settle.service:
@OFFENDING_UNITS@

View File

@ -85,11 +85,14 @@ static int parse_condition(Unit *u, const char *line) {
p = startswith(line, c->name);
if (!p)
continue;
p += strspn(p, WHITESPACE);
if (*p != '=')
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Expected \"=\" in \"%s\".", line);
p += 1 + strspn(p + 1, WHITESPACE);
p += strspn(p, WHITESPACE);
if (*p != '=')
continue;
p++;
p += strspn(p, WHITESPACE);
return c->parser(NULL, "(stdin)", 0, NULL, 0, c->name, c->type, p, target, u);
}

View File

@ -170,6 +170,11 @@ _SD_BEGIN_DECLARATIONS;
#define SD_MESSAGE_NOBODY_USER_UNSUITABLE_STR \
SD_ID128_MAKE_STR(b4,80,32,5f,9c,39,4a,7b,80,2c,23,1e,51,a2,75,2c)
#define SD_MESSAGE_SYSTEMD_UDEV_SETTLE_DEPRECATED \
SD_ID128_MAKE(1c,04,54,c1,bd,22,41,e0,ac,6f,ef,b4,bc,63,14,33)
#define SD_MESSAGE_SYSTEMD_UDEV_SETTLE_DEPRECATED_STR \
SD_ID128_MAKE_STR(1c,04,54,c1,bd,22,41,e0,ac,6f,ef,b4,bc,63,14,33)
_SD_END_DECLARATIONS;
#endif

View File

@ -14,7 +14,9 @@
#include "sd-bus.h"
#include "sd-login.h"
#include "sd-messages.h"
#include "bus-util.h"
#include "io-util.h"
#include "libudev-util.h"
#include "string-util.h"
@ -87,19 +89,25 @@ static int parse_argv(int argc, char *argv[]) {
static int emit_deprecation_warning(void) {
_cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
_cleanup_free_ char *unit = NULL, *unit_path = NULL;
_cleanup_strv_free_ char **a = NULL, **b = NULL;
_cleanup_strv_free_ char **a = NULL;
_cleanup_free_ char *unit = NULL;
int r;
r = sd_pid_get_unit(0, &unit);
if (r < 0 || !streq(unit, "systemd-udev-settle.service"))
if (r < 0) {
log_debug_errno(r, "Failed to determine unit we run in, ignoring: %m");
return 0;
}
if (!streq(unit, "systemd-udev-settle.service"))
return 0;
log_notice("systemd-udev-settle.service is deprecated.");
r = sd_bus_open_system(&bus);
r = bus_connect_system_systemd(&bus);
if (r < 0)
return log_debug_errno(r, "Failed to open system bus, skipping dependency queries: %m");
log_debug_errno(r, "Failed to open connection to systemd, skipping dependency queries: %m");
else {
_cleanup_strv_free_ char **b = NULL;
_cleanup_free_ char *unit_path = NULL;
unit_path = unit_dbus_path_from_name("systemd-udev-settle.service");
if (!unit_path)
@ -126,15 +134,24 @@ static int emit_deprecation_warning(void) {
r = strv_extend_strv(&a, b, true);
if (r < 0)
return r;
}
if (!strv_isempty(a)) {
if (strv_isempty(a))
/* Print a simple message if we cannot determine the dependencies */
log_notice("systemd-udev-settle.service is deprecated.");
else {
/* Print a longer, structured message if we can acquire the dependencies (this should be the
* common case). This is hooked up with a catalog entry and everything. */
_cleanup_free_ char *t = NULL;
t = strv_join(a, ", ");
if (!t)
return -ENOMEM;
log_notice("Hint: please fix %s not to pull it in.", t);
log_struct(LOG_NOTICE,
"MESSAGE=systemd-udev-settle.service is deprecated. Please fix %s not to pull it in.", t,
"OFFENDING_UNITS=%s", t,
"MESSAGE_ID=" SD_MESSAGE_SYSTEMD_UDEV_SETTLE_DEPRECATED_STR);
}
return 0;

View File

@ -1,5 +1,6 @@
# SPDX-License-Identifier: LGPL-2.1+
if install_tests
testdata_dir = testsdir + '/testdata/'
install_subdir('journal-data',
@ -51,6 +52,7 @@ endif
install_data('create-busybox-container',
install_mode : 'rwxr-xr-x',
install_dir : testdata_dir)
endif
test_network_generator_conversion_sh = find_program('test-network-generator-conversion.sh')