mirror of
https://github.com/morgan9e/systemd
synced 2026-04-15 00:47:10 +09:00
fsck: add fsck.mode and fsck.repair credentials support
Maybe useful when kernel command line is hard to change, e.g. when UKI is used.
This commit is contained in:
@@ -110,6 +110,34 @@
|
|||||||
</variablelist>
|
</variablelist>
|
||||||
</refsect1>
|
</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>
|
<refsect1>
|
||||||
<title>See Also</title>
|
<title>See Also</title>
|
||||||
<para><simplelist type="inline">
|
<para><simplelist type="inline">
|
||||||
|
|||||||
@@ -510,6 +510,20 @@
|
|||||||
<xi:include href="version-info.xml" xpointer="v258"/>
|
<xi:include href="version-info.xml" xpointer="v258"/>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</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>
|
</variablelist>
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
#include "bus-error.h"
|
#include "bus-error.h"
|
||||||
#include "bus-locator.h"
|
#include "bus-locator.h"
|
||||||
#include "bus-util.h"
|
#include "bus-util.h"
|
||||||
|
#include "creds-util.h"
|
||||||
#include "device-util.h"
|
#include "device-util.h"
|
||||||
#include "fd-util.h"
|
#include "fd-util.h"
|
||||||
#include "fs-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;
|
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) {
|
static double percent(int pass, unsigned long cur, unsigned long max) {
|
||||||
/* Values stolen from e2fsck */
|
/* Values stolen from e2fsck */
|
||||||
|
|
||||||
@@ -256,6 +282,8 @@ static int run(int argc, char *argv[]) {
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
|
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;
|
bool show_progress = access("/run/systemd/show-status", F_OK) >= 0;
|
||||||
|
|
||||||
if (arg_mode == FSCK_SKIP)
|
if (arg_mode == FSCK_SKIP)
|
||||||
|
|||||||
@@ -250,7 +250,8 @@ static int write_fsck_sysroot_service(
|
|||||||
"Type=oneshot\n"
|
"Type=oneshot\n"
|
||||||
"RemainAfterExit=yes\n"
|
"RemainAfterExit=yes\n"
|
||||||
"ExecStart=" SYSTEMD_FSCK_PATH " %6$s\n"
|
"ExecStart=" SYSTEMD_FSCK_PATH " %6$s\n"
|
||||||
"TimeoutSec=infinity\n",
|
"TimeoutSec=infinity\n"
|
||||||
|
"ImportCredential=fsck.*\n",
|
||||||
escaped,
|
escaped,
|
||||||
unit,
|
unit,
|
||||||
device,
|
device,
|
||||||
|
|||||||
@@ -15,3 +15,4 @@ Type=oneshot
|
|||||||
RemainAfterExit=yes
|
RemainAfterExit=yes
|
||||||
ExecStart=/usr/lib/systemd/systemd-fsck /dev/sdx1
|
ExecStart=/usr/lib/systemd/systemd-fsck /dev/sdx1
|
||||||
TimeoutSec=infinity
|
TimeoutSec=infinity
|
||||||
|
ImportCredential=fsck.*
|
||||||
|
|||||||
@@ -15,3 +15,4 @@ Type=oneshot
|
|||||||
RemainAfterExit=yes
|
RemainAfterExit=yes
|
||||||
ExecStart=/usr/lib/systemd/systemd-fsck /dev/disk/by-label/Root
|
ExecStart=/usr/lib/systemd/systemd-fsck /dev/disk/by-label/Root
|
||||||
TimeoutSec=infinity
|
TimeoutSec=infinity
|
||||||
|
ImportCredential=fsck.*
|
||||||
|
|||||||
@@ -15,3 +15,4 @@ Type=oneshot
|
|||||||
RemainAfterExit=yes
|
RemainAfterExit=yes
|
||||||
ExecStart=/usr/lib/systemd/systemd-fsck /dev/disk/by-uuid/3f5ad593-4546-4a94-a374-bcfb68aa11f7
|
ExecStart=/usr/lib/systemd/systemd-fsck /dev/disk/by-uuid/3f5ad593-4546-4a94-a374-bcfb68aa11f7
|
||||||
TimeoutSec=infinity
|
TimeoutSec=infinity
|
||||||
|
ImportCredential=fsck.*
|
||||||
|
|||||||
@@ -15,3 +15,4 @@ Type=oneshot
|
|||||||
RemainAfterExit=yes
|
RemainAfterExit=yes
|
||||||
ExecStart=/usr/lib/systemd/systemd-fsck /dev/disk/by-partuuid/3f5ad593-4546-4a94-a374-bcfb68aa11f7
|
ExecStart=/usr/lib/systemd/systemd-fsck /dev/disk/by-partuuid/3f5ad593-4546-4a94-a374-bcfb68aa11f7
|
||||||
TimeoutSec=infinity
|
TimeoutSec=infinity
|
||||||
|
ImportCredential=fsck.*
|
||||||
|
|||||||
@@ -15,3 +15,4 @@ Type=oneshot
|
|||||||
RemainAfterExit=yes
|
RemainAfterExit=yes
|
||||||
ExecStart=/usr/lib/systemd/systemd-fsck /dev/sdx1
|
ExecStart=/usr/lib/systemd/systemd-fsck /dev/sdx1
|
||||||
TimeoutSec=infinity
|
TimeoutSec=infinity
|
||||||
|
ImportCredential=fsck.*
|
||||||
|
|||||||
@@ -15,3 +15,4 @@ Type=oneshot
|
|||||||
RemainAfterExit=yes
|
RemainAfterExit=yes
|
||||||
ExecStart=/usr/lib/systemd/systemd-fsck /dev/sdx1
|
ExecStart=/usr/lib/systemd/systemd-fsck /dev/sdx1
|
||||||
TimeoutSec=infinity
|
TimeoutSec=infinity
|
||||||
|
ImportCredential=fsck.*
|
||||||
|
|||||||
@@ -15,3 +15,4 @@ Type=oneshot
|
|||||||
RemainAfterExit=yes
|
RemainAfterExit=yes
|
||||||
ExecStart=/usr/lib/systemd/systemd-fsck /dev/sdx1
|
ExecStart=/usr/lib/systemd/systemd-fsck /dev/sdx1
|
||||||
TimeoutSec=infinity
|
TimeoutSec=infinity
|
||||||
|
ImportCredential=fsck.*
|
||||||
|
|||||||
@@ -15,3 +15,4 @@ Type=oneshot
|
|||||||
RemainAfterExit=yes
|
RemainAfterExit=yes
|
||||||
ExecStart=/usr/lib/systemd/systemd-fsck /dev/sdx5
|
ExecStart=/usr/lib/systemd/systemd-fsck /dev/sdx5
|
||||||
TimeoutSec=infinity
|
TimeoutSec=infinity
|
||||||
|
ImportCredential=fsck.*
|
||||||
|
|||||||
@@ -22,3 +22,4 @@ Type=oneshot
|
|||||||
RemainAfterExit=yes
|
RemainAfterExit=yes
|
||||||
ExecStart={{LIBEXECDIR}}/systemd-fsck
|
ExecStart={{LIBEXECDIR}}/systemd-fsck
|
||||||
TimeoutSec=infinity
|
TimeoutSec=infinity
|
||||||
|
ImportCredential=fsck.*
|
||||||
|
|||||||
@@ -22,3 +22,4 @@ Type=oneshot
|
|||||||
RemainAfterExit=yes
|
RemainAfterExit=yes
|
||||||
ExecStart={{LIBEXECDIR}}/systemd-fsck %f
|
ExecStart={{LIBEXECDIR}}/systemd-fsck %f
|
||||||
TimeoutSec=infinity
|
TimeoutSec=infinity
|
||||||
|
ImportCredential=fsck.*
|
||||||
|
|||||||
Reference in New Issue
Block a user