tmpfiles.d: switch to stacked config dirs in /lib, /etc, /run

This commit is contained in:
Kay Sievers 2011-04-25 21:38:21 +02:00
parent db1413d738
commit 772f83719e
6 changed files with 55 additions and 65 deletions

View file

@ -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)

View file

@ -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>&lt;program&gt;.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>&lt;program&gt;.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

View file

@ -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>&lt;program&gt;.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

View file

@ -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/&lt;program&gt;.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>&lt;program&gt;.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

View file

@ -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/&lt;program&gt;.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>&lt;program&gt;.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>

View file

@ -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,41 +961,24 @@ 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;
} }
for (j = 0; j < n; j++) { strv_free(files);
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)
r = EXIT_FAILURE; r = EXIT_FAILURE;