[systemd-commits] 6 commits - Makefile.am man/kernel-install.xml man/os-release.xml man/systemd-nspawn.xml src/bootchart src/core src/hostname src/journal src/kernel-install src/nspawn src/shared src/sysusers tmpfiles.d/etc.conf units/systemd-sysusers.service.in
Lennart Poettering
lennart at kemper.freedesktop.org
Fri Jun 13 11:12:13 PDT 2014
Makefile.am | 2 -
man/kernel-install.xml | 17 +++++++++----
man/os-release.xml | 38 ++++++++++++++++++++++--------
man/systemd-nspawn.xml | 5 ++-
src/bootchart/bootchart.c | 8 +++---
src/core/dbus-manager.c | 2 -
src/core/macros.systemd.in | 34 ++++++++++++++++++--------
src/core/main.c | 32 +++++++++++++++++--------
src/hostname/hostnamed.c | 7 +++++
src/journal/journal-gatewayd.c | 3 +-
src/kernel-install/90-loaderentry.install | 2 +
src/nspawn/nspawn.c | 2 -
src/shared/path-util.c | 10 ++++++-
src/sysusers/sysusers.c | 14 +++++------
tmpfiles.d/etc.conf | 2 -
units/systemd-sysusers.service.in | 2 -
16 files changed, 125 insertions(+), 55 deletions(-)
New commits:
commit 5b4c0131214cd99b7b4936b97c728ce0c5d9af32
Author: Lennart Poettering <lennart at poettering.net>
Date: Fri Jun 13 20:04:31 2014 +0200
core: don't complain at early boot if /etc/mtab is not the right symlink
When we boot up with an empty /etc it's ok if the symlink doesn't exist.
We will create it later with tmpfiles.
diff --git a/src/core/main.c b/src/core/main.c
index 29f2d5a..3aac5d1 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -1151,19 +1151,25 @@ static int bump_rlimit_nofile(struct rlimit *saved_rlimit) {
}
static void test_mtab(void) {
- char *p;
- /* Check that /etc/mtab is a symlink */
+ static const char ok[] =
+ "/proc/self/mounts\0"
+ "/proc/mounts\0"
+ "../proc/self/mounts\0"
+ "../proc/mounts\0";
- if (readlink_malloc("/etc/mtab", &p) >= 0) {
- bool b;
+ _cleanup_free_ char *p = NULL;
+ int r;
- b = streq(p, "/proc/self/mounts") || streq(p, "/proc/mounts");
- free(p);
+ /* Check that /etc/mtab is a symlink to the right place or
+ * non-existing. But certainly not a file, or a symlink to
+ * some weird place... */
- if (b)
- return;
- }
+ r = readlink_malloc("/etc/mtab", &p);
+ if (r == -ENOENT)
+ return;
+ if (r >= 0 && nulstr_contains(ok, p))
+ return;
log_warning("/etc/mtab is not a symlink or not pointing to /proc/self/mounts. "
"This is not supported anymore. "
commit 6d1d50f0811a8d80d010cce521570446245f47cc
Author: Lennart Poettering <lennart at poettering.net>
Date: Fri Jun 13 19:56:12 2014 +0200
tmpfiles: always use relative symlinks from tmpfiles snippets
diff --git a/tmpfiles.d/etc.conf b/tmpfiles.d/etc.conf
index e8368f5..37a2ef8 100644
--- a/tmpfiles.d/etc.conf
+++ b/tmpfiles.d/etc.conf
@@ -9,4 +9,4 @@
L /etc/os-release - - - - ../usr/lib/os-release
L /etc/localtime - - - - ../usr/share/zoneinfo/UTC
-L /etc/mtab - - - - /proc/self/mounts
+L /etc/mtab - - - - ../proc/self/mounts
commit 5ae4d543cb9b45ad6c6b82b78da1d6abc2291cdb
Author: Lennart Poettering <lennart at poettering.net>
Date: Fri Jun 13 19:45:52 2014 +0200
os-release: define /usr/lib/os-release as fallback for /etc/os-release
The file should have been in /usr/lib/ in the first place, since it
describes the OS container in /usr (and not the configuration in /etc),
hence, let's support os-release files in /usr/lib as fallback if no
version in /etc exists, following the usual override logic.
A prior commit already enabled tmpfiles to create /etc/os-release as a
symlink to /usr/lib/os-release should it be missing, thus providing nice
compatibility with applications only checking in /etc.
While it's probably a good idea if all apps check both locations via a
fallback logic, it is only necessary in the early boot process, as long
as the /etc/os-release symlink has not been restored, in case we boot
with an empty /etc.
diff --git a/man/kernel-install.xml b/man/kernel-install.xml
index 3612b7d..178ad1d 100644
--- a/man/kernel-install.xml
+++ b/man/kernel-install.xml
@@ -95,14 +95,20 @@ along with systemd; If not, see <http://www.gnu.org/licenses/>.
<para>The kernel-install plugin <filename>50-depmod.install</filename> runs depmod for the <replaceable>KERNEL-VERSION</replaceable>.</para>
- <para>The kernel-install plugin <filename>90-loaderentry.install</filename> copies
+ <para>The kernel-install plugin
+ <filename>90-loaderentry.install</filename> copies
<replaceable>KERNEL-IMAGE</replaceable> to
<filename>/boot/<replaceable>MACHINE-ID</replaceable>/<replaceable>KERNEL-VERSION</replaceable>/linux</filename>.
- It also creates a boot loader entry according to the boot loader specification in
+ It also creates a boot loader entry according to the boot
+ loader specification in
<filename>/boot/loader/entries/<replaceable>MACHINE-ID</replaceable>-<replaceable>KERNEL-VERSION</replaceable>.conf</filename>.
- The title of the entry is the <replaceable>PRETTY_NAME</replaceable> parameter specified in <filename>/etc/os-release</filename>,
- or "Linux <replaceable>KERNEL-VERSION</replaceable>", if unset.
- If the file <filename>initrd</filename> is found next to the
+ The title of the entry is the
+ <replaceable>PRETTY_NAME</replaceable> parameter specified
+ in <filename>/etc/os-release</filename> or
+ <filename>/usr/lib/os-release</filename> (if the former is
+ missing), or "Linux
+ <replaceable>KERNEL-VERSION</replaceable>", if unset. If
+ the file <filename>initrd</filename> is found next to the
<filename>linux</filename> file, the initrd will be added to
the configuration.</para>
</listitem>
@@ -165,6 +171,7 @@ along with systemd; If not, see <http://www.gnu.org/licenses/>.
<varlistentry>
<term>
<filename>/etc/os-release</filename>
+ <filename>/usr/lib/os-release</filename>
</term>
<listitem>
<para>The content of the file specifies the operating system title <replaceable>PRETTY_NAME</replaceable>.</para>
diff --git a/man/os-release.xml b/man/os-release.xml
index c1dd62f..1144363 100644
--- a/man/os-release.xml
+++ b/man/os-release.xml
@@ -49,13 +49,15 @@
<refsynopsisdiv>
<para><filename>/etc/os-release</filename></para>
+ <para><filename>/usr/lib/os-release</filename></para>
</refsynopsisdiv>
<refsect1>
<title>Description</title>
- <para>The <filename>/etc/os-release</filename> file
- contains operating system identification data.</para>
+ <para>The <filename>/etc/os-release</filename> and
+ <filename>/usr/lib/os-release</filename> files contain
+ operating system identification data.</para>
<para>The basic file format of
<filename>os-release</filename> is a newline-separated
@@ -78,20 +80,38 @@
strings. Lines beginning with "#" shall be ignored as
comments.</para>
- <para><filename>/etc/os-release</filename> contains
- data that is defined by the operating system vendor
- and should not be changed by the administrator.</para>
+ <para>The file <filename>/etc/os-release</filename>
+ takes precedence over
+ <filename>/usr/lib/os-release</filename>. Applications
+ should check for the former, and exclusively use its
+ data if it exists, and only fall back to
+ <filename>/usr/lib/os-release</filename> if it is
+ missing. Applications should not read data from both
+ files at the same
+ time. <filename>/usr/lib/os-release</filename> is the
+ recommended place to store OS release information as
+ part of vendor trees. Frequently
+ <filename>/etc/os-release</filename> is simply a
+ symlink to <filename>/usr/lib/os-release</filename>,
+ to provide compatibility with applications only
+ looking at <filename>/etc</filename>.</para>
+
+ <para><filename>os-release</filename> contains data
+ that is defined by the operating system vendor and
+ should generally not be changed by the
+ administrator.</para>
<para>As this file only encodes names and identifiers
it should not be localized.</para>
- <para>The file <filename>/etc/os-release</filename> might
- be a symlink to another file, but it is important that
+ <para>The <filename>/etc/os-release</filename> and
+ <filename>/usr/lib/os-release</filename> files might
+ be symlinks to other files, but it is important that
the file is available from earliest boot on, and hence
must be located on the root file system.</para>
<para>For a longer rationale for
- <filename>/etc/os-release</filename> please refer to
+ <filename>os-release</filename> please refer to
the <ulink
url="http://0pointer.de/blog/projects/os-release">Announcement of <filename>/etc/os-release</filename></ulink>.</para>
</refsect1>
@@ -100,7 +120,7 @@
<title>Options</title>
<para>The following OS identifications parameters may be set using
- <filename>/etc/os-release</filename>:</para>
+ <filename>os-release</filename>:</para>
<variablelist>
diff --git a/man/systemd-nspawn.xml b/man/systemd-nspawn.xml
index d668703..950558f 100644
--- a/man/systemd-nspawn.xml
+++ b/man/systemd-nspawn.xml
@@ -136,8 +136,9 @@
<para>As a safety check
<command>systemd-nspawn</command> will verify the
- existence of <filename>/etc/os-release</filename> in
- the container tree before starting the container (see
+ existence of <filename>/usr/lib/os-release</filename>
+ or <filename>/etc/os-release</filename> in the
+ container tree before starting the container (see
<citerefentry><refentrytitle>os-release</refentrytitle><manvolnum>5</manvolnum></citerefentry>). It
might be necessary to add this file to the container
tree manually if the OS of the container is too old to
diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c
index 958a668..01a5bf1 100644
--- a/src/bootchart/bootchart.c
+++ b/src/bootchart/bootchart.c
@@ -386,10 +386,10 @@ int main(int argc, char *argv[]) {
if (sysfd < 0)
sysfd = open("/sys", O_RDONLY|O_CLOEXEC);
- if (!build)
- parse_env_file("/etc/os-release", NEWLINE,
- "PRETTY_NAME", &build,
- NULL);
+ if (!build) {
+ if (parse_env_file("/etc/os-release", NEWLINE, "PRETTY_NAME", &build, NULL) == -ENOENT)
+ parse_env_file("/usr/lib/os-release", NEWLINE, "PRETTY_NAME", &build, NULL);
+ }
/* wait for /proc to become available, discarding samples */
if (graph_start <= 0.0)
diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c
index 333c1d4..68a68a2 100644
--- a/src/core/dbus-manager.c
+++ b/src/core/dbus-manager.c
@@ -1191,7 +1191,7 @@ static int method_switch_root(sd_bus *bus, sd_bus_message *message, void *userda
/* Safety check */
if (isempty(init)) {
if (! path_is_os_tree(root))
- return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Specified switch root path %s does not seem to be an OS tree. /etc/os-release is missing.", root);
+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Specified switch root path %s does not seem to be an OS tree. os-release file is missing.", root);
} else {
_cleanup_free_ char *p = NULL;
diff --git a/src/core/main.c b/src/core/main.c
index d5d1ee2..29f2d5a 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -1251,9 +1251,15 @@ static int status_welcome(void) {
"PRETTY_NAME", &pretty_name,
"ANSI_COLOR", &ansi_color,
NULL);
+ if (r == -ENOENT) {
+ r = parse_env_file("/usr/lib/os-release", NEWLINE,
+ "PRETTY_NAME", &pretty_name,
+ "ANSI_COLOR", &ansi_color,
+ NULL);
+ }
if (r < 0 && r != -ENOENT)
- log_warning("Failed to read /etc/os-release: %s", strerror(-r));
+ log_warning("Failed to read os-release file: %s", strerror(-r));
return status_printf(NULL, false, false,
"\nWelcome to \x1B[%sm%s\x1B[0m!\n",
diff --git a/src/hostname/hostnamed.c b/src/hostname/hostnamed.c
index a350490..241d296 100644
--- a/src/hostname/hostnamed.c
+++ b/src/hostname/hostnamed.c
@@ -108,6 +108,13 @@ static int context_read_data(Context *c) {
"PRETTY_NAME", &c->data[PROP_OS_PRETTY_NAME],
"CPE_NAME", &c->data[PROP_OS_CPE_NAME],
NULL);
+ if (r == -ENOENT) {
+ r = parse_env_file("/usr/lib/os-release", NEWLINE,
+ "PRETTY_NAME", &c->data[PROP_OS_PRETTY_NAME],
+ "CPE_NAME", &c->data[PROP_OS_CPE_NAME],
+ NULL);
+ }
+
if (r < 0 && r != -ENOENT)
return r;
diff --git a/src/journal/journal-gatewayd.c b/src/journal/journal-gatewayd.c
index 9a88676..c682666 100644
--- a/src/journal/journal-gatewayd.c
+++ b/src/journal/journal-gatewayd.c
@@ -767,7 +767,8 @@ static int request_handler_machine(
if (r < 0)
return mhd_respondf(connection, MHD_HTTP_INTERNAL_SERVER_ERROR, "Failed to determine disk usage: %s\n", strerror(-r));
- parse_env_file("/etc/os-release", NEWLINE, "PRETTY_NAME", &os_name, NULL);
+ if (parse_env_file("/etc/os-release", NEWLINE, "PRETTY_NAME", &os_name, NULL) == -ENOENT)
+ parse_env_file("/usr/lib/os-release", NEWLINE, "PRETTY_NAME", &os_name, NULL);
get_virtualization(&v);
diff --git a/src/kernel-install/90-loaderentry.install b/src/kernel-install/90-loaderentry.install
index a6a8abc..c17b8a9 100644
--- a/src/kernel-install/90-loaderentry.install
+++ b/src/kernel-install/90-loaderentry.install
@@ -32,6 +32,8 @@ fi
if [[ -f /etc/os-release ]]; then
. /etc/os-release
+elif [[ -f /usr/lib/os-release ]]; then
+ . /usr/lib/os-release
fi
if ! [[ $PRETTY_NAME ]]; then
diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
index 29ddfbb..8270348 100644
--- a/src/nspawn/nspawn.c
+++ b/src/nspawn/nspawn.c
@@ -2799,7 +2799,7 @@ int main(int argc, char *argv[]) {
if (arg_boot) {
if (path_is_os_tree(arg_directory) <= 0) {
- log_error("Directory %s doesn't look like an OS root directory (/etc/os-release is missing). Refusing.", arg_directory);
+ log_error("Directory %s doesn't look like an OS root directory (os-release file is missing). Refusing.", arg_directory);
goto finish;
}
} else {
diff --git a/src/shared/path-util.c b/src/shared/path-util.c
index 5863429..efe464d 100644
--- a/src/shared/path-util.c
+++ b/src/shared/path-util.c
@@ -526,12 +526,18 @@ int path_is_os_tree(const char *path) {
char *p;
int r;
- /* We use /etc/os-release as flag file if something is an OS */
+ /* We use /usr/lib/os-release as flag file if something is an OS */
+ p = strappenda(path, "/usr/lib/os-release");
+ r = access(p, F_OK);
+
+ if (r >= 0)
+ return 1;
+ /* Also check for the old location in /etc, just in case. */
p = strappenda(path, "/etc/os-release");
r = access(p, F_OK);
- return r < 0 ? 0 : 1;
+ return r >= 0;
}
int find_binary(const char *name, char **filename) {
commit b0284aba93e8ccd415da5bbee86d84c12b1b9856
Author: Lennart Poettering <lennart at poettering.net>
Date: Fri Jun 13 19:24:11 2014 +0200
sysusers: always treat ENOENT as entry-not-found when doing NSS calls
For most NSS calls it is documented that they return NULL + errno=0 when
an entry is not found. However, in reality it appears to be common to
return NULL + errno=ENOENT, instead. Handle that correctly, and don't
consider ENOENT a systematic error.
diff --git a/src/sysusers/sysusers.c b/src/sysusers/sysusers.c
index 514e77e..d549969 100644
--- a/src/sysusers/sysusers.c
+++ b/src/sysusers/sysusers.c
@@ -481,7 +481,7 @@ static int uid_is_ok(uid_t uid, const char *name) {
p = getpwuid(uid);
if (p)
return 0;
- if (errno != 0)
+ if (!IN_SET(errno, 0, ENOENT))
return -errno;
errno = 0;
@@ -489,7 +489,7 @@ static int uid_is_ok(uid_t uid, const char *name) {
if (g) {
if (!streq(g->gr_name, name))
return 0;
- } else if (errno != 0)
+ } else if (!IN_SET(errno, 0, ENOENT))
return -errno;
}
@@ -595,7 +595,7 @@ static int add_user(Item *i) {
i->description = strdup(p->pw_gecos);
return 0;
}
- if (errno != 0) {
+ if (!IN_SET(errno, 0, ENOENT)) {
log_error("Failed to check if user %s already exists: %m", i->name);
return -errno;
}
@@ -607,7 +607,7 @@ static int add_user(Item *i) {
log_error("User %s already exists in shadow database, but not in user database.", i->name);
return -EBADMSG;
}
- if (errno != 0) {
+ if (!IN_SET(errno, 0, ENOENT)) {
log_error("Failed to check if user %s already exists in shadow database: %m", i->name);
return -errno;
}
@@ -720,14 +720,14 @@ static int gid_is_ok(gid_t gid) {
g = getgrgid(gid);
if (g)
return 0;
- if (errno != 0)
+ if (!IN_SET(errno, 0, ENOENT))
return -errno;
errno = 0;
p = getpwuid((uid_t) gid);
if (p)
return 0;
- if (errno != 0)
+ if (!IN_SET(errno, 0, ENOENT))
return -errno;
}
@@ -761,7 +761,7 @@ static int add_group(Item *i) {
i->gid_set = true;
return 0;
}
- if (errno != 0) {
+ if (!IN_SET(errno, 0, ENOENT)) {
log_error("Failed to check if group %s already exists: %m", i->name);
return -errno;
}
commit b532bdeae9b13fe93a54850f5e7f99c753bda6fa
Author: Lennart Poettering <lennart at poettering.net>
Date: Fri Jun 13 19:18:55 2014 +0200
rpm: add RPM macros to apply sysusers, sysctl, and binfmt drop-ins
With this in place RPMs can make sure that whatever they drop in is
immeidately applied, and not delayed until next reboot.
This also moves systemd-sysusers back to /usr/bin, since hardcoding the
path to /usr/lib in the macros would mean compatibility breaks in
future, should we turn sysusers into a command that is actually OK for
people to call directly. And given that that is quite likely to happen
(since it is useful to prepare images with its --root= switch), let's
just prepare for it.
diff --git a/Makefile.am b/Makefile.am
index 2ceee2a..8af619c 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1782,7 +1782,7 @@ systemd_sysusers_LDADD = \
libsystemd-internal.la \
libsystemd-shared.la
-rootlibexec_PROGRAMS += \
+rootbin_PROGRAMS += \
systemd-sysusers
nodist_systemunit_DATA += \
diff --git a/src/core/macros.systemd.in b/src/core/macros.systemd.in
index 167016a..0d5f894 100644
--- a/src/core/macros.systemd.in
+++ b/src/core/macros.systemd.in
@@ -26,7 +26,9 @@
%_udevrulesdir @udevrulesdir@
%_journalcatalogdir @catalogdir@
%_tmpfilesdir @tmpfilesdir@
+%_sysusersdir @sysusersdir@
%_sysctldir @sysctldir@
+%_binfmtdir @binfmtdir@
%systemd_requires \
Requires(post): systemd \
@@ -76,3 +78,15 @@ journalctl --update-catalog >/dev/null 2>&1 || : \
%tmpfiles_create() \
systemd-tmpfiles --create %{?*} >/dev/null 2>&1 || : \
%{nil}
+
+%sysusers_create() \
+systemd-sysusers %{?*} >/dev/null 2>&1 || : \
+%{nil}
+
+%sysctl_apply() \
+ at rootlibexecdir@/systemd-sysctl %{?*} >/dev/null 2>&1 || : \
+%{nil}
+
+%binfmt_apply() \
+ at rootlibexecdir@/systemd-binfmt %{?*} >/dev/null 2>&1 || : \
+%{nil}
diff --git a/units/systemd-sysusers.service.in b/units/systemd-sysusers.service.in
index e123f39..a4c7714 100644
--- a/units/systemd-sysusers.service.in
+++ b/units/systemd-sysusers.service.in
@@ -19,4 +19,4 @@ ConditionNeedsUpdate=/etc
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart=@rootlibexecdir@/systemd-sysusers
+ExecStart=@rootbindir@/systemd-sysusers
commit 8cf7c96517c3688d29b30651adcda9e71e7fcb07
Author: Lennart Poettering <lennart at poettering.net>
Date: Fri Jun 13 19:05:22 2014 +0200
rpm: don't hardcode the binary paths in the macros, rely on $PATH
this gives us a little bit more freedom to move things around later on,
as we don't hardcode the systemd paths in old RPMs that shall work with
new systemds.
diff --git a/src/core/macros.systemd.in b/src/core/macros.systemd.in
index 89b4825..167016a 100644
--- a/src/core/macros.systemd.in
+++ b/src/core/macros.systemd.in
@@ -37,42 +37,42 @@ Requires(postun): systemd \
%systemd_post() \
if [ $1 -eq 1 ] ; then \
# Initial installation \
- @rootbindir@/systemctl preset %{?*} >/dev/null 2>&1 || : \
+ systemctl preset %{?*} >/dev/null 2>&1 || : \
fi \
%{nil}
%systemd_preun() \
if [ $1 -eq 0 ] ; then \
# Package removal, not upgrade \
- @rootbindir@/systemctl --no-reload disable %{?*} > /dev/null 2>&1 || : \
- @rootbindir@/systemctl stop %{?*} > /dev/null 2>&1 || : \
+ systemctl --no-reload disable %{?*} > /dev/null 2>&1 || : \
+ systemctl stop %{?*} > /dev/null 2>&1 || : \
fi \
%{nil}
%systemd_postun() \
- at rootbindir@/systemctl daemon-reload >/dev/null 2>&1 || : \
+systemctl daemon-reload >/dev/null 2>&1 || : \
%{nil}
%systemd_postun_with_restart() \
- at rootbindir@/systemctl daemon-reload >/dev/null 2>&1 || : \
+systemctl daemon-reload >/dev/null 2>&1 || : \
if [ $1 -ge 1 ] ; then \
# Package upgrade, not uninstall \
- @rootbindir@/systemctl try-restart %{?*} >/dev/null 2>&1 || : \
+ systemctl try-restart %{?*} >/dev/null 2>&1 || : \
fi \
%{nil}
%udev_hwdb_update() \
- at rootbindir@/udevadm hwdb --update >/dev/null 2>&1 || : \
+udevadm hwdb --update >/dev/null 2>&1 || : \
%{nil}
%udev_rules_update() \
- at rootbindir@/udevadm control --reload >/dev/null 2>&1 || : \
+udevadm control --reload >/dev/null 2>&1 || : \
%{nil}
%journal_catalog_update() \
- at rootbindir@/journalctl --update-catalog >/dev/null 2>&1 || : \
+journalctl --update-catalog >/dev/null 2>&1 || : \
%{nil}
%tmpfiles_create() \
- at rootbindir@/systemd-tmpfiles --create %{?*} >/dev/null 2>&1 || : \
+systemd-tmpfiles --create %{?*} >/dev/null 2>&1 || : \
%{nil}
More information about the systemd-commits
mailing list