]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
man: document the new .component files
authorLennart Poettering <lennart@amutable.com>
Wed, 1 Jul 2026 16:22:13 +0000 (18:22 +0200)
committerLennart Poettering <lennart@amutable.com>
Wed, 15 Jul 2026 11:27:48 +0000 (13:27 +0200)
man/rules/meson.build
man/systemd-sysupdate.xml
man/sysupdate.components.xml [new file with mode: 0644]
man/sysupdate.d.xml
man/sysupdate.features.xml

index 3dafcc13decdc6a916e584606356b22deac18c65..eac4465769b04dbef4d13e8abea7743eac0ad7b6 100644 (file)
@@ -1379,6 +1379,7 @@ manpages = [
  ['systemd.timer', '5', [], ''],
  ['systemd.unit', '5', [], ''],
  ['systemd.v', '7', [], ''],
+ ['sysupdate.components', '5', [], 'ENABLE_SYSUPDATE'],
  ['sysupdate.d', '5', [], 'ENABLE_SYSUPDATE'],
  ['sysupdate.features', '5', [], 'ENABLE_SYSUPDATE'],
  ['sysusers.d', '5', [], 'ENABLE_SYSUSERS'],
index 28b6ac53c22536f8a34c568c497ab2508bca4153..7386a399e7c952c77a1a6fe61b19bb21ce5ecc06 100644 (file)
     <para><simplelist type="inline">
       <member><citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
       <member><citerefentry><refentrytitle>sysupdate.d</refentrytitle><manvolnum>5</manvolnum></citerefentry></member>
+      <member><citerefentry><refentrytitle>sysupdate.features</refentrytitle><manvolnum>5</manvolnum></citerefentry></member>
+      <member><citerefentry><refentrytitle>sysupdate.components</refentrytitle><manvolnum>5</manvolnum></citerefentry></member>
       <member><citerefentry><refentrytitle>systemd-sysupdated.service</refentrytitle><manvolnum>8</manvolnum></citerefentry></member>
       <member><citerefentry><refentrytitle>systemd-repart</refentrytitle><manvolnum>8</manvolnum></citerefentry></member>
     </simplelist></para>
diff --git a/man/sysupdate.components.xml b/man/sysupdate.components.xml
new file mode 100644 (file)
index 0000000..54cec98
--- /dev/null
@@ -0,0 +1,292 @@
+<?xml version='1.0'?>
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+  "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+<!-- SPDX-License-Identifier: LGPL-2.1-or-later -->
+
+<refentry id="sysupdate.components" conditional='ENABLE_SYSUPDATE'
+          xmlns:xi="http://www.w3.org/2001/XInclude">
+
+  <refentryinfo>
+    <title>sysupdate.components</title>
+    <productname>systemd</productname>
+  </refentryinfo>
+
+  <refmeta>
+    <refentrytitle>sysupdate.components</refentrytitle>
+    <manvolnum>5</manvolnum>
+  </refmeta>
+
+  <refnamediv>
+    <refname>sysupdate.components</refname>
+    <refpurpose>Definition Files for Update Components</refpurpose>
+  </refnamediv>
+
+  <refsynopsisdiv>
+    <para><simplelist>
+      <member><filename>/etc/sysupdate.<replaceable>component</replaceable>.component</filename></member>
+      <member><filename>/run/sysupdate.<replaceable>component</replaceable>.component</filename></member>
+      <member><filename>/usr/local/lib/sysupdate.<replaceable>component</replaceable>.component</filename></member>
+      <member><filename>/usr/lib/sysupdate.<replaceable>component</replaceable>.component</filename></member>
+    </simplelist></para>
+  </refsynopsisdiv>
+
+  <refsect1>
+    <title>Description</title>
+
+    <para>A "Component" is a set of
+    <citerefentry><refentrytitle>sysupdate.d</refentrytitle><manvolnum>5</manvolnum></citerefentry>
+    transfer definitions that
+    <citerefentry><refentrytitle>systemd-sysupdate</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+    updates independently from the rest of the OS.
+    Each component is a self-contained installation with its own version, and its own set of transfer files,
+    stored in a directory named after the component:
+    <filename>sysupdate.<replaceable>component</replaceable>.d/*.transfer</filename> (as opposed to the
+    default, component-less <filename>sysupdate.d/*.transfer</filename>).
+    Components are selected via the <option>--component=</option>, <option>--component-all</option> or
+    <option>--component-suggested</option> switches of
+    <citerefentry><refentrytitle>systemd-sysupdate</refentrytitle><manvolnum>8</manvolnum></citerefentry>, and
+    enumerated by its <command>components</command> command.</para>
+
+    <para>Because components are updated separately, they are the right tool for OS resources that shall be
+    versioned and updated independently from the base OS — for example a container image or a portable service
+    image that follows its own release cycle. This is the primary difference between a component and an
+    <citerefentry><refentrytitle>sysupdate.features</refentrytitle><manvolnum>5</manvolnum></citerefentry>
+    Optional Feature: the transfers belonging to a feature are updated in lock-step with the target they are
+    part of, while a component is a wholly separate installation. Do not use a component for resources that
+    shall always be updated synchronously with something else; use a feature (or simply additional transfer
+    files in the same directory) for those cases.</para>
+
+    <para>A component does not require a <filename>*.component</filename> file: as soon as a matching
+    <filename>sysupdate.<replaceable>component</replaceable>.d/</filename> directory with transfer definitions
+    exists, the component is available for updating. The <filename>*.component</filename> file described here
+    is optional, and carries metadata about the component (such as a human-readable description and a
+    documentation URL) as well as its enablement state.</para>
+
+    <para>When a component is disabled (via <varname>Enabled=false</varname>, see below), operations that
+    would download or install new versions — most importantly <command>update</command> — refuse to act on
+    it. Other operations, such as <command>vacuum</command> and <command>cleanup</command>, continue to
+    consider the component's transfers so that previously installed instances remain managed and can be
+    cleaned up. Components are enabled or disabled with the <command>enable-component</command> and
+    <command>disable-component</command> commands of
+    <citerefentry><refentrytitle>systemd-sysupdate</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+    which write an <varname>Enabled=</varname> setting into a drop-in next to the component definition.</para>
+
+    <para>Component definitions support drop-in files, which are most commonly used to override the
+    <varname>Enabled=</varname> setting. Drop-ins are read from
+    <filename>sysupdate.<replaceable>component</replaceable>.component.d/*.conf</filename> in the same set of
+    directories as the main file. They can also be masked to hide the component definition entirely.</para>
+
+    <para>Each <filename>*.component</filename> file contains one section: [Component].</para>
+  </refsect1>
+
+  <refsect1>
+    <title>[Component] Section Options</title>
+
+    <para>This section defines general properties of this component.</para>
+
+    <variablelist>
+      <varlistentry>
+        <term><varname>Description=</varname></term>
+
+        <listitem><para>A short human-readable description of this component.
+        This may be used as a label for this component, so the string should meaningfully identify the
+        component among the components available on the system.</para>
+
+        <xi:include href="version-info.xml" xpointer="v262"/></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>Documentation=</varname></term>
+
+        <listitem><para>A user-presentable URL to documentation about this component.
+        This setting supports specifier expansion; see below for details on supported specifiers.</para>
+
+        <xi:include href="version-info.xml" xpointer="v262"/></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>Enabled=</varname></term>
+
+        <listitem><para>Whether or not this component is enabled. If unspecified, the component is enabled
+        by default. When disabled, <command>systemd-sysupdate</command> refuses to download or install new
+        versions of this component, but continues to consider its transfers while vacuuming and in other
+        situations where it needs to determine ownership over previously downloaded system resources.</para>
+
+        <xi:include href="version-info.xml" xpointer="v262"/></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>Suggest=</varname></term>
+
+        <listitem><para>Takes a boolean argument. If true, this component is suggested for enablement, if
+        false it is not. This does not enable the component on its own, but is a hint surfaced by the update
+        tools (for example via the <option>--component-suggested</option> switch of
+        <citerefentry><refentrytitle>systemd-sysupdate</refentrytitle><manvolnum>8</manvolnum></citerefentry>)
+        so that the system administrator or higher-level tooling may act on it.</para>
+
+        <para>If this setting is not specified, the <varname>SuggestOn…=</varname> conditions described below
+        are evaluated instead to determine whether the component is suggested. If neither this setting nor any
+        <varname>SuggestOn…=</varname> condition is specified, the component is not suggested.</para>
+
+        <xi:include href="version-info.xml" xpointer="v262"/></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>SuggestOnArchitecture=</varname></term>
+        <term><varname>SuggestOnFirmware=</varname></term>
+        <term><varname>SuggestOnVirtualization=</varname></term>
+        <term><varname>SuggestOnHost=</varname></term>
+        <term><varname>SuggestOnFraction=</varname></term>
+        <term><varname>SuggestOnKernelCommandLine=</varname></term>
+        <term><varname>SuggestOnVersion=</varname></term>
+        <term><varname>SuggestOnCredential=</varname></term>
+        <term><varname>SuggestOnSecurity=</varname></term>
+        <term><varname>SuggestOnOSRelease=</varname></term>
+        <term><varname>SuggestOnMachineTag=</varname></term>
+
+        <listitem><para>Suggest this component for enablement depending on system properties. These settings
+        take the same arguments and implement the same semantics — including the leading <literal>!</literal>
+        for negation — as the identically-named
+        <varname>ConditionArchitecture=</varname>, <varname>ConditionFirmware=</varname>,
+        <varname>ConditionVirtualization=</varname>, <varname>ConditionHost=</varname>,
+        <varname>ConditionFraction=</varname>, <varname>ConditionKernelCommandLine=</varname>,
+        <varname>ConditionVersion=</varname>, <varname>ConditionCredential=</varname>,
+        <varname>ConditionSecurity=</varname>, <varname>ConditionOSRelease=</varname> and
+        <varname>ConditionMachineTag=</varname> settings for unit files, which are documented in
+        <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
+        The component is suggested if all specified conditions apply. As with the <varname>Condition…=</varname>
+        settings, assigning an empty string to one of these resets the list.</para>
+
+        <para>These conditions are only evaluated if <varname>Suggest=</varname> is not specified.</para>
+
+        <xi:include href="version-info.xml" xpointer="v262"/></listitem>
+      </varlistentry>
+    </variablelist>
+  </refsect1>
+
+  <refsect1>
+    <title>Specifiers</title>
+
+    <para>Specifiers may be used in the <varname>Documentation=</varname> setting. The following expansions
+    are understood:</para>
+
+    <table class='specifiers'>
+      <title>Specifiers available</title>
+      <tgroup cols='3' align='left' colsep='1' rowsep='1'>
+        <colspec colname="spec" />
+        <colspec colname="mean" />
+        <colspec colname="detail" />
+        <thead>
+          <row>
+            <entry>Specifier</entry>
+            <entry>Meaning</entry>
+            <entry>Details</entry>
+          </row>
+        </thead>
+        <tbody>
+          <xi:include href="standard-specifiers.xml" xpointer="a"/>
+          <xi:include href="standard-specifiers.xml" xpointer="A"/>
+          <xi:include href="standard-specifiers.xml" xpointer="b"/>
+          <xi:include href="standard-specifiers.xml" xpointer="B"/>
+          <xi:include href="standard-specifiers.xml" xpointer="H"/>
+          <xi:include href="standard-specifiers.xml" xpointer="l"/>
+          <xi:include href="standard-specifiers.xml" xpointer="m"/>
+          <xi:include href="standard-specifiers.xml" xpointer="M"/>
+          <xi:include href="standard-specifiers.xml" xpointer="o"/>
+          <xi:include href="standard-specifiers.xml" xpointer="v"/>
+          <xi:include href="standard-specifiers.xml" xpointer="w"/>
+          <xi:include href="standard-specifiers.xml" xpointer="W"/>
+          <xi:include href="standard-specifiers.xml" xpointer="T"/>
+          <xi:include href="standard-specifiers.xml" xpointer="V"/>
+          <xi:include href="standard-specifiers.xml" xpointer="percent"/>
+        </tbody>
+      </tgroup>
+    </table>
+  </refsect1>
+
+  <refsect1>
+    <title>Examples</title>
+
+    <example>
+      <title>A Separately Updated Container Image</title>
+
+      <para>We'll use the hypothetical "foobarOS" described in
+      <citerefentry><refentrytitle>sysupdate.d</refentrytitle><manvolnum>5</manvolnum></citerefentry> as our
+      example base OS.
+      foobarOS ships a container image that many, but not all, deployments want to run. The image has its own
+      release cadence and version number, entirely separate from the base OS, so it is a poor fit for an
+      Optional Feature (which would be version-locked to the OS). Instead, let's model it as a component named
+      <literal>webapp</literal>.</para>
+
+      <para>First, the component definition, carrying its metadata and marking it as disabled by default:</para>
+
+      <para><programlisting># /usr/lib/sysupdate.webapp.component
+[Component]
+Description=WebApp Container Image
+Documentation=https://docs.example.com/foobarOS/webapp
+Enabled=false
+</programlisting></para>
+
+      <para>Next, the transfer definition for the component, placed in the component's own directory
+      <filename>sysupdate.webapp.d/</filename>:</para>
+
+      <para><programlisting># /usr/lib/sysupdate.webapp.d/50-webapp.transfer
+[Source]
+Type=url-file
+Path=https://download.example.com/
+MatchPattern=webapp_@v.raw.xz
+
+[Target]
+Type=regular-file
+Path=/var/lib/machines
+MatchPattern=webapp_@v.raw
+Mode=0444
+InstancesMax=2
+</programlisting></para>
+
+      <para>With these two files, updates for the <literal>webapp</literal> component can be checked and
+      downloaded independently of the base OS, for example with
+      <command>systemd-sysupdate --component=webapp update</command>. Because
+      <varname>Enabled=false</varname> was set, the administrator must first opt in with
+      <command>systemd-sysupdate enable-component webapp</command>, which writes the following drop-in:</para>
+
+      <para><programlisting># /etc/sysupdate.webapp.component.d/50-systemd-sysupdate-enabled.conf
+# Generated via 'systemd-sysupdate enable-component'
+
+[Component]
+Enabled=true
+</programlisting></para>
+    </example>
+
+    <example>
+      <title>A Component Suggested Only on Bare Metal</title>
+
+      <para>Suppose foobarOS ships a component with firmware and microcode updates that is only relevant when
+      running on physical hardware, not inside a virtual machine. We can use <varname>SuggestOn…=</varname> to
+      hint that the component should be enabled in that case, without enabling it automatically:</para>
+
+      <para><programlisting># /usr/lib/sysupdate.firmware.component
+[Component]
+Description=Firmware and Microcode Updates
+Documentation=https://docs.example.com/foobarOS/firmware
+Enabled=false
+SuggestOnVirtualization=!vm
+</programlisting></para>
+
+      <para>Higher-level tooling can now query the suggested components (via
+      <command>systemd-sysupdate --component-suggested …</command>) and enable them as appropriate. On bare
+      metal the <literal>firmware</literal> component is suggested; inside a VM it is not.</para>
+    </example>
+  </refsect1>
+
+  <refsect1>
+    <title>See Also</title>
+    <para><simplelist type="inline">
+      <member><citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
+      <member><citerefentry><refentrytitle>systemd-sysupdate</refentrytitle><manvolnum>8</manvolnum></citerefentry></member>
+      <member><citerefentry><refentrytitle>sysupdate.d</refentrytitle><manvolnum>5</manvolnum></citerefentry></member>
+      <member><citerefentry><refentrytitle>sysupdate.features</refentrytitle><manvolnum>5</manvolnum></citerefentry></member>
+    </simplelist></para>
+  </refsect1>
+
+</refentry>
index 29daeda81a0bb70bd9d30165cd7492d97d6d78f8..9c27bf444a089031ed60b725938c13f356519379 100644 (file)
@@ -1068,6 +1068,8 @@ CurrentSymlink=myContainer</programlisting></para>
     <para><simplelist type="inline">
       <member><citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
       <member><citerefentry><refentrytitle>systemd-sysupdate</refentrytitle><manvolnum>8</manvolnum></citerefentry></member>
+      <member><citerefentry><refentrytitle>sysupdate.features</refentrytitle><manvolnum>5</manvolnum></citerefentry></member>
+      <member><citerefentry><refentrytitle>sysupdate.components</refentrytitle><manvolnum>5</manvolnum></citerefentry></member>
       <member><citerefentry><refentrytitle>systemd-repart</refentrytitle><manvolnum>8</manvolnum></citerefentry></member>
     </simplelist></para>
   </refsect1>
index d3a7a63810167e6b2e0e7879a0492597261f66cb..29f067f61bafdc38577e9e870e941b27ff7f7a4d 100644 (file)
@@ -381,6 +381,7 @@ InstancesMax=2
       <member><citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry></member>
       <member><citerefentry><refentrytitle>systemd-sysupdate</refentrytitle><manvolnum>8</manvolnum></citerefentry></member>
       <member><citerefentry><refentrytitle>sysupdate.d</refentrytitle><manvolnum>5</manvolnum></citerefentry></member>
+      <member><citerefentry><refentrytitle>sysupdate.components</refentrytitle><manvolnum>5</manvolnum></citerefentry></member>
     </simplelist></para>
   </refsect1>