tmpfiles.d: switch to stacked config dirs in /lib, /etc, /run
This commit is contained in:
parent
db1413d738
commit
772f83719e
|
@ -31,7 +31,7 @@ bashcompletiondir=$(sysconfdir)/bash_completion.d
|
||||||
# Our own, non-special dirs
|
# Our own, non-special dirs
|
||||||
pkgsysconfdir=$(sysconfdir)/systemd
|
pkgsysconfdir=$(sysconfdir)/systemd
|
||||||
userunitdir=$(prefix)/lib/systemd/user
|
userunitdir=$(prefix)/lib/systemd/user
|
||||||
tmpfilesdir=$(sysconfdir)/tmpfiles.d
|
tmpfilesdir=$(prefix)/lib/tmpfiles.d
|
||||||
usergeneratordir=$(pkglibexecdir)/user-generators
|
usergeneratordir=$(pkglibexecdir)/user-generators
|
||||||
|
|
||||||
# And these are the special ones for /
|
# And these are the special ones for /
|
||||||
|
@ -1286,12 +1286,13 @@ CLEANFILES += \
|
||||||
install-data-hook:
|
install-data-hook:
|
||||||
$(MKDIR_P) -m 0755 \
|
$(MKDIR_P) -m 0755 \
|
||||||
$(DESTDIR)$(tmpfilesdir) \
|
$(DESTDIR)$(tmpfilesdir) \
|
||||||
$(DESTDIR)$(sysconfdir)/modules-load.d \
|
$(DESTDIR)$(sysconfdir)/tmpfiles.d \
|
||||||
$(DESTDIR)$(prefix)/lib/modules-load.d \
|
$(DESTDIR)$(prefix)/lib/modules-load.d \
|
||||||
$(DESTDIR)$(sysconfdir)/sysctl.d \
|
$(DESTDIR)$(sysconfdir)/modules-load.d \
|
||||||
$(DESTDIR)$(prefix)/lib/sysctl.d \
|
$(DESTDIR)$(prefix)/lib/sysctl.d \
|
||||||
$(DESTDIR)$(sysconfdir)/binfmt.d \
|
$(DESTDIR)$(sysconfdir)/sysctl.d \
|
||||||
$(DESTDIR)$(prefix)/lib/binfmt.d \
|
$(DESTDIR)$(prefix)/lib/binfmt.d \
|
||||||
|
$(DESTDIR)$(sysconfdir)/binfmt.d \
|
||||||
$(DESTDIR)$(systemshutdowndir) \
|
$(DESTDIR)$(systemshutdowndir) \
|
||||||
$(DESTDIR)$(systemgeneratordir) \
|
$(DESTDIR)$(systemgeneratordir) \
|
||||||
$(DESTDIR)$(usergeneratordir)
|
$(DESTDIR)$(usergeneratordir)
|
||||||
|
|
|
@ -57,9 +57,7 @@
|
||||||
<para><command>systemd</command> uses
|
<para><command>systemd</command> uses
|
||||||
files from the above directories to configure
|
files from the above directories to configure
|
||||||
additional binary formats to register during boot in
|
additional binary formats to register during boot in
|
||||||
the kernel. Each configuration file is named in the
|
the kernel.</para>
|
||||||
style of
|
|
||||||
<filename><program>.conf</filename>.</para>
|
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
|
||||||
<refsect1>
|
<refsect1>
|
||||||
|
@ -75,7 +73,9 @@
|
||||||
ignored. Note that this means you may not use ; and #
|
ignored. Note that this means you may not use ; and #
|
||||||
as delimiter in binary format rules.</para>
|
as delimiter in binary format rules.</para>
|
||||||
|
|
||||||
<para>Files in <filename>/etc/</filename> overwrite
|
<para>Each configuration file is named in the style of
|
||||||
|
<filename><program>.conf</filename>.
|
||||||
|
Files in <filename>/etc/</filename> overwrite
|
||||||
files with the same name in <filename>/usr/lib/</filename>.
|
files with the same name in <filename>/usr/lib/</filename>.
|
||||||
Files in <filename>/run</filename> overwrite files with
|
Files in <filename>/run</filename> overwrite files with
|
||||||
the same name in <filename>/etc/</filename> and
|
the same name in <filename>/etc/</filename> and
|
||||||
|
|
|
@ -74,7 +74,9 @@
|
||||||
newlines. Empty lines and lines whose first
|
newlines. Empty lines and lines whose first
|
||||||
non-whitespace character is # or ; are ignored.</para>
|
non-whitespace character is # or ; are ignored.</para>
|
||||||
|
|
||||||
<para>Files in <filename>/etc/</filename> overwrite
|
<para>Each configuration file is named in the style of
|
||||||
|
<filename><program>.conf</filename>.
|
||||||
|
Files in <filename>/etc/</filename> overwrite
|
||||||
files with the same name in <filename>/usr/lib/</filename>.
|
files with the same name in <filename>/usr/lib/</filename>.
|
||||||
Files in <filename>/run</filename> overwrite files with
|
Files in <filename>/run</filename> overwrite files with
|
||||||
the same name in <filename>/etc/</filename> and
|
the same name in <filename>/etc/</filename> and
|
||||||
|
|
|
@ -54,12 +54,10 @@
|
||||||
<refsect1>
|
<refsect1>
|
||||||
<title>Description</title>
|
<title>Description</title>
|
||||||
|
|
||||||
<para><command>systemd</command> uses
|
<para><command>systemd</command> uses configuration files
|
||||||
<filename>/etc/sysctl.d/</filename> to configure
|
from the above directories to configure
|
||||||
<citerefentry><refentrytitle>sysctl</refentrytitle><manvolnum>8</manvolnum></citerefentry>
|
<citerefentry><refentrytitle>sysctl</refentrytitle><manvolnum>8</manvolnum></citerefentry>
|
||||||
kernel parameters to load during boot. Each
|
kernel parameters to load during boot.</para>
|
||||||
configuration file is named in the style of
|
|
||||||
<filename>/etc/sysctl.d/<program>.conf</filename>.</para>
|
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
|
||||||
<refsect1>
|
<refsect1>
|
||||||
|
@ -73,7 +71,9 @@
|
||||||
<para>Note that both / and . are accepted as
|
<para>Note that both / and . are accepted as
|
||||||
separators in sysctl variable names.</para>
|
separators in sysctl variable names.</para>
|
||||||
|
|
||||||
<para>Files in <filename>/etc/</filename> overwrite
|
<para>Each configuration file is named in the style of
|
||||||
|
<filename><program>.conf</filename>.
|
||||||
|
Files in <filename>/etc/</filename> overwrite
|
||||||
files with the same name in <filename>/usr/lib/</filename>.
|
files with the same name in <filename>/usr/lib/</filename>.
|
||||||
Files in <filename>/run</filename> overwrite files with
|
Files in <filename>/run</filename> overwrite files with
|
||||||
the same name in <filename>/etc/</filename> and
|
the same name in <filename>/etc/</filename> and
|
||||||
|
|
|
@ -47,26 +47,41 @@
|
||||||
</refnamediv>
|
</refnamediv>
|
||||||
|
|
||||||
<refsynopsisdiv>
|
<refsynopsisdiv>
|
||||||
|
<para><filename>/usr/lib/tmpfiles.d/*.conf</filename></para>
|
||||||
<para><filename>/etc/tmpfiles.d/*.conf</filename></para>
|
<para><filename>/etc/tmpfiles.d/*.conf</filename></para>
|
||||||
|
<para><filename>/run/tmpfiles.d/*.conf</filename></para>
|
||||||
</refsynopsisdiv>
|
</refsynopsisdiv>
|
||||||
|
|
||||||
<refsect1>
|
<refsect1>
|
||||||
<title>Description</title>
|
<title>Description</title>
|
||||||
|
|
||||||
<para><command>systemd-tmpfiles</command> uses the
|
<para><command>systemd-tmpfiles</command> uses the
|
||||||
configuration files in
|
configuration files from the above directories to describe the
|
||||||
<filename>/etc/tmpfiles.d/</filename> to describe the
|
|
||||||
creation, cleaning and removal of volatile and
|
creation, cleaning and removal of volatile and
|
||||||
temporary files and directories which usually reside
|
temporary files and directories which usually reside
|
||||||
in directories such as <filename>/run</filename>
|
in directories such as <filename>/run</filename>
|
||||||
or <filename>/tmp</filename>. Each configuration file
|
or <filename>/tmp</filename>.</para>
|
||||||
is named in the style of
|
|
||||||
<filename>/etc/tmpfiles.d/<program>.conf</filename>.</para>
|
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
|
||||||
<refsect1>
|
<refsect1>
|
||||||
<title>Configuration Format</title>
|
<title>Configuration Format</title>
|
||||||
|
|
||||||
|
<para>Each configuration file is named in the style of
|
||||||
|
<filename><program>.conf</filename>.
|
||||||
|
Files in <filename>/etc/</filename> overwrite
|
||||||
|
files with the same name in <filename>/usr/lib/</filename>.
|
||||||
|
Files in <filename>/run</filename> overwrite files with
|
||||||
|
the same name in <filename>/etc/</filename> and
|
||||||
|
<filename>/usr/lib/</filename>. Packages should install their
|
||||||
|
configuration files in <filename>/usr/lib/</filename>, files
|
||||||
|
in <filename>/etc/</filename> are reserved for the local
|
||||||
|
administration, which possibly decides to overwrite the
|
||||||
|
configurations installed from packages. All files are sorted
|
||||||
|
by filename in alphabetical order, regardless in which of the
|
||||||
|
directories they reside, to ensure that a specific
|
||||||
|
configuration file takes precedence over another file with
|
||||||
|
an alphabetically later name.</para>
|
||||||
|
|
||||||
<para>The configuration format is one line per path
|
<para>The configuration format is one line per path
|
||||||
containing action, mode, ownership and age
|
containing action, mode, ownership and age
|
||||||
fields:</para>
|
fields:</para>
|
||||||
|
@ -181,10 +196,12 @@ d /run/user 0755 root root 10d</programlisting>
|
||||||
<term><varname>us</varname></term></varlistentry>
|
<term><varname>us</varname></term></varlistentry>
|
||||||
</variablelist>
|
</variablelist>
|
||||||
|
|
||||||
<para>If multiple integers and units are specified the time values are summed up.</para>
|
<para>If multiple integers and units are specified the time
|
||||||
|
values are summed up.</para>
|
||||||
<para>The age field only applies to lines starting with d, D and x. If omitted or set to - no automatic clean-up is done.</para>
|
|
||||||
|
|
||||||
|
<para>The age field only applies to lines starting with
|
||||||
|
d, D and x. If omitted or set to - no automatic clean-up
|
||||||
|
is done.</para>
|
||||||
</refsect2>
|
</refsect2>
|
||||||
|
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
|
|
@ -804,20 +804,6 @@ finish:
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int scandir_filter(const struct dirent *d) {
|
|
||||||
assert(d);
|
|
||||||
|
|
||||||
if (ignore_file(d->d_name))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (d->d_type != DT_REG &&
|
|
||||||
d->d_type != DT_LNK &&
|
|
||||||
d->d_type != DT_UNKNOWN)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return endswith(d->d_name, ".conf");
|
|
||||||
}
|
|
||||||
|
|
||||||
static int help(void) {
|
static int help(void) {
|
||||||
|
|
||||||
printf("%s [OPTIONS...] [CONFIGURATION FILE...]\n\n"
|
printf("%s [OPTIONS...] [CONFIGURATION FILE...]\n\n"
|
||||||
|
@ -912,6 +898,7 @@ static int read_config_file(const char *fn, bool ignore_enoent) {
|
||||||
return -errno;
|
return -errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log_debug("apply: %s\n", fn);
|
||||||
for (;;) {
|
for (;;) {
|
||||||
char line[LINE_MAX], *l;
|
char line[LINE_MAX], *l;
|
||||||
int k;
|
int k;
|
||||||
|
@ -974,40 +961,23 @@ int main(int argc, char *argv[]) {
|
||||||
r = EXIT_FAILURE;
|
r = EXIT_FAILURE;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
int n, j;
|
char **files, **f;
|
||||||
struct dirent **de = NULL;
|
|
||||||
|
|
||||||
if ((n = scandir("/etc/tmpfiles.d/", &de, scandir_filter, alphasort)) < 0) {
|
files = conf_files_list(".conf",
|
||||||
|
"/run/tmpfiles.d",
|
||||||
|
"/etc/tmpfiles.d",
|
||||||
|
"/usr/lib/tmpfiles.d",
|
||||||
|
NULL);
|
||||||
|
|
||||||
if (errno != ENOENT) {
|
STRV_FOREACH(f, files) {
|
||||||
log_error("Failed to enumerate /etc/tmpfiles.d/ files: %m");
|
if (read_config_file(*f, true) < 0)
|
||||||
r = EXIT_FAILURE;
|
r = EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
goto finish;
|
strv_free(files);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (j = 0; j < n; j++) {
|
|
||||||
int k;
|
|
||||||
char *fn;
|
|
||||||
|
|
||||||
k = asprintf(&fn, "/etc/tmpfiles.d/%s", de[j]->d_name);
|
|
||||||
free(de[j]);
|
|
||||||
|
|
||||||
if (k < 0) {
|
|
||||||
log_error("Failed to allocate file name.");
|
|
||||||
r = EXIT_FAILURE;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (read_config_file(fn, true) < 0)
|
|
||||||
r = EXIT_FAILURE;
|
|
||||||
|
|
||||||
free(fn);
|
|
||||||
}
|
|
||||||
|
|
||||||
free(de);
|
|
||||||
}
|
|
||||||
|
|
||||||
HASHMAP_FOREACH(i, globs, iterator)
|
HASHMAP_FOREACH(i, globs, iterator)
|
||||||
if (process_item(i) < 0)
|
if (process_item(i) < 0)
|
||||||
|
|
Loading…
Reference in a new issue