]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
fsck: add fsck.mode and fsck.repair credentials support
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 12 Jul 2025 19:25:26 +0000 (04:25 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 15 Jul 2025 20:47:38 +0000 (05:47 +0900)
Maybe useful when kernel command line is hard to change, e.g. when UKI
is used.

14 files changed:
man/systemd-fsck@.service.xml
man/systemd.system-credentials.xml
src/fsck/fsck.c
src/shared/generator.c
test/test-fstab-generator/test-12-dev-sdx.expected/systemd-fsck-root.service
test/test-fstab-generator/test-13-label.expected/systemd-fsck-root.service
test/test-fstab-generator/test-14-uuid.expected/systemd-fsck-root.service
test/test-fstab-generator/test-15-partuuid.expected/systemd-fsck-root.service
test/test-fstab-generator/test-17-initrd-sysroot.fstab.expected/systemd-fsck-root.service
test/test-fstab-generator/test-18-options.fstab.expected/systemd-fsck-root.service
test/test-fstab-generator/test-19-mounts-from-cmdline.expected/systemd-fsck-root.service
test/test-fstab-generator/test-19-mounts-from-cmdline.expected/systemd-fsck-usr.service
units/systemd-fsck-root.service.in
units/systemd-fsck@.service.in

index b0e2ebafbd235c6c4f39e01a12191dd1feb965f3..3df215ba1fee2ce575e24f2013365e6f155191bd 100644 (file)
     </variablelist>
   </refsect1>
 
+  <refsect1>
+    <title>Credentials</title>
+
+    <para><command>systemd-fsck</command> supports the service credentials logic as implemented by
+    <varname>ImportCredential=</varname>/<varname>LoadCredential=</varname>/<varname>SetCredential=</varname>
+    (see <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry> for
+    details). The following credentials are used when passed in:</para>
+
+    <variablelist class='system-credentials'>
+      <varlistentry>
+        <term><varname>fsck.mode</varname></term>
+        <term><varname>fsck.repair</varname></term>
+
+        <listitem>
+          <para>The contents of the credentials are parsed as same as the kernel command line options with
+          the same name. See above for more details.</para>
+
+          <xi:include href="version-info.xml" xpointer="v258"/>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+
+    <para>Note that by default the <filename>systemd-fsck@.service</filename>,
+    <filename>systemd-fsck-root.service</filename>, and <filename>systemd-fsck-usr.service</filename> unit
+    files are set up to inherit both <varname>fsck.mode</varname> and <varname>fsck.repair</varname>
+    credentials from the service manager.</para>
+  </refsect1>
+
   <refsect1>
     <title>See Also</title>
     <para><simplelist type="inline">
index d436cff5d489ab949e85429bf447076cbaff5d6e..0411061ca394986ce563d650e14a3fedaf972b54 100644 (file)
           <xi:include href="version-info.xml" xpointer="v258"/>
         </listitem>
       </varlistentry>
+
+      <varlistentry>
+        <term><varname>fsck.*</varname></term>
+
+        <listitem>
+          <para>Read by <filename>systemd-fsck@.service</filename>,
+          <filename>systemd-fsck-root.service</filename>, and <filename>systemd-fsck-usr.service</filename>.
+          See
+          <citerefentry><refentrytitle>systemd-fsck@.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+          for more details.</para>
+
+          <xi:include href="version-info.xml" xpointer="v258"/>
+        </listitem>
+      </varlistentry>
     </variablelist>
   </refsect1>
 
index 7f2b0f5d36e2e362c4bb1fa860e2446fe68d1bdb..1d7f4ea3afad2020583f8a78a3ecf588df676616 100644 (file)
@@ -16,6 +16,7 @@
 #include "bus-error.h"
 #include "bus-locator.h"
 #include "bus-util.h"
+#include "creds-util.h"
 #include "device-util.h"
 #include "fd-util.h"
 #include "fs-util.h"
@@ -129,6 +130,31 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat
         return 0;
 }
 
+static void parse_credentials(void) {
+        _cleanup_free_ char *value = NULL;
+        int r;
+
+        r = read_credential("fsck.mode", (void**) &value, /* ret_size = */ NULL);
+        if (r < 0)
+                log_debug_errno(r, "Failed to read credential 'fsck.mode', ignoring: %m");
+        else {
+                arg_mode = fsck_mode_from_string(value);
+                if (arg_mode < 0)
+                        log_warning_errno(arg_mode, "Invalid 'fsck.mode' credential, ignoring: %s", value);
+        }
+
+        value = mfree(value);
+
+        r = read_credential("fsck.repair", (void**) &value, /* ret_size = */ NULL);
+        if (r < 0)
+                log_debug_errno(r, "Failed to read credential 'fsck.repair', ignoring: %m");
+        else {
+                arg_repair = fsck_repair_from_string(value);
+                if (arg_repair < 0)
+                        log_warning_errno(arg_repair, "Invalid 'fsck.repair' credential, ignoring: %s", value);
+        }
+}
+
 static double percent(int pass, unsigned long cur, unsigned long max) {
         /* Values stolen from e2fsck */
 
@@ -256,6 +282,8 @@ static int run(int argc, char *argv[]) {
         if (r < 0)
                 log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
 
+        parse_credentials();
+
         bool show_progress = access("/run/systemd/show-status", F_OK) >= 0;
 
         if (arg_mode == FSCK_SKIP)
index ea665a6c33719bd80a3e0fda4e669f4b6eba97eb..f978d43fe897676cd2acebf7a724c3c05a762456 100644 (file)
@@ -250,7 +250,8 @@ static int write_fsck_sysroot_service(
                 "Type=oneshot\n"
                 "RemainAfterExit=yes\n"
                 "ExecStart=" SYSTEMD_FSCK_PATH " %6$s\n"
-                "TimeoutSec=infinity\n",
+                "TimeoutSec=infinity\n"
+                "ImportCredential=fsck.*\n",
                 escaped,
                 unit,
                 device,
index 147348899d1f15b0193fd120be91083fa8ef0b67..797ffa08db1004687caf225f21e3fffebe4e6a8b 100644 (file)
@@ -15,3 +15,4 @@ Type=oneshot
 RemainAfterExit=yes
 ExecStart=/usr/lib/systemd/systemd-fsck /dev/sdx1
 TimeoutSec=infinity
+ImportCredential=fsck.*
index 85c1936bce1420e9c344b4c7987c89c5f1b2960c..ee146aa3b2a6a0c7b281816a3ecc15b5b9352dac 100644 (file)
@@ -15,3 +15,4 @@ Type=oneshot
 RemainAfterExit=yes
 ExecStart=/usr/lib/systemd/systemd-fsck /dev/disk/by-label/Root
 TimeoutSec=infinity
+ImportCredential=fsck.*
index 1c7eaea10352249a84808f94d174556d27369328..73e9134fb17241df2588f495d3fecef99111b655 100644 (file)
@@ -15,3 +15,4 @@ Type=oneshot
 RemainAfterExit=yes
 ExecStart=/usr/lib/systemd/systemd-fsck /dev/disk/by-uuid/3f5ad593-4546-4a94-a374-bcfb68aa11f7
 TimeoutSec=infinity
+ImportCredential=fsck.*
index ab27bfd79cca9b9c9881eb286b159cf35999d94b..2d5c9bfbfd140adbe07c7b7a946ae3a5a8c36a33 100644 (file)
@@ -15,3 +15,4 @@ Type=oneshot
 RemainAfterExit=yes
 ExecStart=/usr/lib/systemd/systemd-fsck /dev/disk/by-partuuid/3f5ad593-4546-4a94-a374-bcfb68aa11f7
 TimeoutSec=infinity
+ImportCredential=fsck.*
index 147348899d1f15b0193fd120be91083fa8ef0b67..797ffa08db1004687caf225f21e3fffebe4e6a8b 100644 (file)
@@ -15,3 +15,4 @@ Type=oneshot
 RemainAfterExit=yes
 ExecStart=/usr/lib/systemd/systemd-fsck /dev/sdx1
 TimeoutSec=infinity
+ImportCredential=fsck.*
index 147348899d1f15b0193fd120be91083fa8ef0b67..797ffa08db1004687caf225f21e3fffebe4e6a8b 100644 (file)
@@ -15,3 +15,4 @@ Type=oneshot
 RemainAfterExit=yes
 ExecStart=/usr/lib/systemd/systemd-fsck /dev/sdx1
 TimeoutSec=infinity
+ImportCredential=fsck.*
index 147348899d1f15b0193fd120be91083fa8ef0b67..797ffa08db1004687caf225f21e3fffebe4e6a8b 100644 (file)
@@ -15,3 +15,4 @@ Type=oneshot
 RemainAfterExit=yes
 ExecStart=/usr/lib/systemd/systemd-fsck /dev/sdx1
 TimeoutSec=infinity
+ImportCredential=fsck.*
index 512e7b1636ccaea42c4acd6e285fd54303240930..61c0af0490adefef62733b55799317c980ab6e59 100644 (file)
@@ -15,3 +15,4 @@ Type=oneshot
 RemainAfterExit=yes
 ExecStart=/usr/lib/systemd/systemd-fsck /dev/sdx5
 TimeoutSec=infinity
+ImportCredential=fsck.*
index ebe8262a49e22442f41370bcf8257ba35cb4c341..22e86acadda29dcefae4abc0164690a9f827a292 100644 (file)
@@ -22,3 +22,4 @@ Type=oneshot
 RemainAfterExit=yes
 ExecStart={{LIBEXECDIR}}/systemd-fsck
 TimeoutSec=infinity
+ImportCredential=fsck.*
index 8eb4821d41f5e528384ff0142577fe09ef46fa99..d5caed6ae0cae77db712ba13f6ef5961686ef680 100644 (file)
@@ -22,3 +22,4 @@ Type=oneshot
 RemainAfterExit=yes
 ExecStart={{LIBEXECDIR}}/systemd-fsck %f
 TimeoutSec=infinity
+ImportCredential=fsck.*