mirror of
https://github.com/systemd/systemd.git
synced 2025-01-04 09:18:12 +03:00
units: introduce systemd-tmpfiles-setup-dev-early.service
This makes tmpfiles, sysusers, and udevd invoked in the following order:
1. systemd-tmpfiles-setup-dev-early.service
Create device nodes gracefully, that is, create device nodes anyway
by ignoring unknown users and groups.
2. systemd-sysusers.service
Create users and groups, to make later invocations of tmpfiles and
udevd can resolve necessary users and groups.
3. systemd-tmpfiles-setup-dev.service
Adjust owners of previously created device nodes.
4. systemd-udevd.service
Process all devices. Especially to make block devices active and can
be mountable.
5. systemd-tmpfiles-setup.service
Setup basic filesystem.
Follow-up for b42482af90
.
Fixes #28653.
Replaces #28681 and #28732.
This commit is contained in:
parent
12aac8ea45
commit
bb7f485f4b
@ -19,6 +19,7 @@
|
|||||||
<refnamediv>
|
<refnamediv>
|
||||||
<refname>systemd-tmpfiles</refname>
|
<refname>systemd-tmpfiles</refname>
|
||||||
<refname>systemd-tmpfiles-setup.service</refname>
|
<refname>systemd-tmpfiles-setup.service</refname>
|
||||||
|
<refname>systemd-tmpfiles-setup-dev-early.service</refname>
|
||||||
<refname>systemd-tmpfiles-setup-dev.service</refname>
|
<refname>systemd-tmpfiles-setup-dev.service</refname>
|
||||||
<refname>systemd-tmpfiles-clean.service</refname>
|
<refname>systemd-tmpfiles-clean.service</refname>
|
||||||
<refname>systemd-tmpfiles-clean.timer</refname>
|
<refname>systemd-tmpfiles-clean.timer</refname>
|
||||||
@ -35,6 +36,7 @@
|
|||||||
|
|
||||||
<para>System units:
|
<para>System units:
|
||||||
<literallayout><filename>systemd-tmpfiles-setup.service</filename>
|
<literallayout><filename>systemd-tmpfiles-setup.service</filename>
|
||||||
|
<filename>systemd-tmpfiles-setup-dev-early.service</filename>
|
||||||
<filename>systemd-tmpfiles-setup-dev.service</filename>
|
<filename>systemd-tmpfiles-setup-dev.service</filename>
|
||||||
<filename>systemd-tmpfiles-clean.service</filename>
|
<filename>systemd-tmpfiles-clean.service</filename>
|
||||||
<filename>systemd-tmpfiles-clean.timer</filename></literallayout></para>
|
<filename>systemd-tmpfiles-clean.timer</filename></literallayout></para>
|
||||||
@ -64,6 +66,7 @@
|
|||||||
searched for a matching file and the file found that has the highest priority is executed.</para>
|
searched for a matching file and the file found that has the highest priority is executed.</para>
|
||||||
|
|
||||||
<para>System services (<filename>systemd-tmpfiles-setup.service</filename>,
|
<para>System services (<filename>systemd-tmpfiles-setup.service</filename>,
|
||||||
|
<filename>systemd-tmpfiles-setup-dev-early.service</filename>,
|
||||||
<filename>systemd-tmpfiles-setup-dev.service</filename>,
|
<filename>systemd-tmpfiles-setup-dev.service</filename>,
|
||||||
<filename>systemd-tmpfiles-clean.service</filename>) invoke <command>systemd-tmpfiles</command> to create
|
<filename>systemd-tmpfiles-clean.service</filename>) invoke <command>systemd-tmpfiles</command> to create
|
||||||
system files and to perform system wide cleanup. Those services read administrator-controlled
|
system files and to perform system wide cleanup. Those services read administrator-controlled
|
||||||
|
@ -8,5 +8,9 @@ TEST_NO_NSPAWN=1
|
|||||||
# shellcheck source=test/test-functions
|
# shellcheck source=test/test-functions
|
||||||
. "${TEST_BASE_DIR:?}/test-functions"
|
. "${TEST_BASE_DIR:?}/test-functions"
|
||||||
|
|
||||||
|
test_append_files() {
|
||||||
|
instmods snd_seq snd_timer tun
|
||||||
|
generate_module_dependencies
|
||||||
|
}
|
||||||
|
|
||||||
do_test "$@"
|
do_test "$@"
|
||||||
|
57
test/units/testsuite-17.00.sh
Executable file
57
test/units/testsuite-17.00.sh
Executable file
@ -0,0 +1,57 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# SPDX-License-Identifier: LGPL-2.1-or-later
|
||||||
|
set -ex
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
|
# shellcheck source=test/units/util.sh
|
||||||
|
. "$(dirname "$0")"/util.sh
|
||||||
|
|
||||||
|
# Tests for issue #28588 and #28653.
|
||||||
|
|
||||||
|
# On boot, services need to be started in the following order:
|
||||||
|
# 1. systemd-tmpfiles-setup-dev-early.service
|
||||||
|
# 2. systemd-sysusers.service
|
||||||
|
# 3. systemd-tmpfiles-setup-dev.service
|
||||||
|
# 4. systemd-udevd.service
|
||||||
|
|
||||||
|
output="$(systemctl show --property After --value systemd-udevd.service)"
|
||||||
|
assert_in "systemd-tmpfiles-setup-dev-early.service" "$output"
|
||||||
|
assert_in "systemd-sysusers.service" "$output"
|
||||||
|
assert_in "systemd-tmpfiles-setup-dev.service" "$output"
|
||||||
|
|
||||||
|
output="$(systemctl show --property After --value systemd-tmpfiles-setup-dev.service)"
|
||||||
|
assert_in "systemd-tmpfiles-setup-dev-early.service" "$output"
|
||||||
|
assert_in "systemd-sysusers.service" "$output"
|
||||||
|
|
||||||
|
output="$(systemctl show --property After --value systemd-sysusers.service)"
|
||||||
|
assert_in "systemd-tmpfiles-setup-dev-early.service" "$output"
|
||||||
|
|
||||||
|
check_owner_and_mode() {
|
||||||
|
local dev=${1?}
|
||||||
|
local user=${2?}
|
||||||
|
local group=${3?}
|
||||||
|
local mode=${4:-}
|
||||||
|
|
||||||
|
if [[ -e "$dev" ]]; then
|
||||||
|
assert_in "$user" "$(stat --format=%U "$dev")"
|
||||||
|
assert_in "$group" "$(stat --format=%G "$dev")"
|
||||||
|
if [[ -n "$mode" ]]; then
|
||||||
|
assert_in "$mode" "$(stat --format=%#0a "$dev")"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check owner and access mode specified in static-nodes-permissions.conf
|
||||||
|
check_owner_and_mode /dev/snd/seq root audio 0660
|
||||||
|
check_owner_and_mode /dev/snd/timer root audio 0660
|
||||||
|
check_owner_and_mode /dev/loop-control root disk 0660
|
||||||
|
check_owner_and_mode /dev/net/tun root root 0666
|
||||||
|
check_owner_and_mode /dev/fuse root root 0666
|
||||||
|
check_owner_and_mode /dev/vfio/vfio root root 0666
|
||||||
|
check_owner_and_mode /dev/kvm root kvm
|
||||||
|
check_owner_and_mode /dev/vhost-net root kvm
|
||||||
|
check_owner_and_mode /dev/vhost-vsock root kvm
|
||||||
|
|
||||||
|
exit 0
|
@ -10,7 +10,7 @@
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=Create List of Static Device Nodes
|
Description=Create List of Static Device Nodes
|
||||||
DefaultDependencies=no
|
DefaultDependencies=no
|
||||||
Before=sysinit.target systemd-tmpfiles-setup-dev.service
|
Before=sysinit.target systemd-tmpfiles-setup-dev-early.service
|
||||||
ConditionCapability=CAP_SYS_MODULE
|
ConditionCapability=CAP_SYS_MODULE
|
||||||
ConditionFileNotEmpty=/lib/modules/%v/modules.devname
|
ConditionFileNotEmpty=/lib/modules/%v/modules.devname
|
||||||
|
|
||||||
|
@ -544,6 +544,11 @@ units = [
|
|||||||
'conditions' : ['ENABLE_TMPFILES'],
|
'conditions' : ['ENABLE_TMPFILES'],
|
||||||
'symlinks' : ['timers.target.wants/'],
|
'symlinks' : ['timers.target.wants/'],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
'file' : 'systemd-tmpfiles-setup-dev-early.service',
|
||||||
|
'conditions' : ['ENABLE_TMPFILES'],
|
||||||
|
'symlinks' : ['sysinit.target.wants/'],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
'file' : 'systemd-tmpfiles-setup-dev.service',
|
'file' : 'systemd-tmpfiles-setup-dev.service',
|
||||||
'conditions' : ['ENABLE_TMPFILES'],
|
'conditions' : ['ENABLE_TMPFILES'],
|
||||||
|
@ -16,6 +16,8 @@ ConditionCredential=|sysusers.extra
|
|||||||
|
|
||||||
DefaultDependencies=no
|
DefaultDependencies=no
|
||||||
After=systemd-remount-fs.service
|
After=systemd-remount-fs.service
|
||||||
|
After=systemd-tmpfiles-setup-dev-early.service
|
||||||
|
Before=systemd-tmpfiles-setup-dev.service
|
||||||
Before=sysinit.target systemd-update-done.service
|
Before=sysinit.target systemd-update-done.service
|
||||||
Conflicts=shutdown.target initrd-switch-root.target
|
Conflicts=shutdown.target initrd-switch-root.target
|
||||||
Before=shutdown.target initrd-switch-root.target
|
Before=shutdown.target initrd-switch-root.target
|
||||||
|
25
units/systemd-tmpfiles-setup-dev-early.service
Normal file
25
units/systemd-tmpfiles-setup-dev-early.service
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# SPDX-License-Identifier: LGPL-2.1-or-later
|
||||||
|
#
|
||||||
|
# This file is part of systemd.
|
||||||
|
#
|
||||||
|
# systemd is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU Lesser General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
|
||||||
|
[Unit]
|
||||||
|
Description=Create Static Device Nodes in /dev gracefully
|
||||||
|
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
|
||||||
|
|
||||||
|
DefaultDependencies=no
|
||||||
|
Before=sysinit.target local-fs-pre.target systemd-udevd.service
|
||||||
|
Wants=local-fs-pre.target
|
||||||
|
Conflicts=shutdown.target initrd-switch-root.target
|
||||||
|
Before=shutdown.target initrd-switch-root.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
RemainAfterExit=yes
|
||||||
|
ExecStart=systemd-tmpfiles --prefix=/dev --create --boot --graceful
|
||||||
|
SuccessExitStatus=DATAERR CANTCREAT
|
||||||
|
ImportCredential=tmpfiles.*
|
@ -12,6 +12,7 @@ Description=Create Static Device Nodes in /dev
|
|||||||
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
|
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
|
||||||
|
|
||||||
DefaultDependencies=no
|
DefaultDependencies=no
|
||||||
|
After=systemd-tmpfiles-setup-dev-early.service
|
||||||
Before=sysinit.target local-fs-pre.target systemd-udevd.service
|
Before=sysinit.target local-fs-pre.target systemd-udevd.service
|
||||||
Wants=local-fs-pre.target
|
Wants=local-fs-pre.target
|
||||||
Conflicts=shutdown.target initrd-switch-root.target
|
Conflicts=shutdown.target initrd-switch-root.target
|
||||||
@ -20,6 +21,6 @@ Before=shutdown.target initrd-switch-root.target
|
|||||||
[Service]
|
[Service]
|
||||||
Type=oneshot
|
Type=oneshot
|
||||||
RemainAfterExit=yes
|
RemainAfterExit=yes
|
||||||
ExecStart=systemd-tmpfiles --prefix=/dev --create --boot --graceful
|
ExecStart=systemd-tmpfiles --prefix=/dev --create --boot
|
||||||
SuccessExitStatus=DATAERR CANTCREAT
|
SuccessExitStatus=DATAERR CANTCREAT
|
||||||
ImportCredential=tmpfiles.*
|
ImportCredential=tmpfiles.*
|
||||||
|
@ -21,7 +21,7 @@ RefuseManualStop=yes
|
|||||||
[Service]
|
[Service]
|
||||||
Type=oneshot
|
Type=oneshot
|
||||||
RemainAfterExit=yes
|
RemainAfterExit=yes
|
||||||
ExecStart=systemd-tmpfiles --create --remove --boot
|
ExecStart=systemd-tmpfiles --create --remove --boot --exclude-prefix=/dev
|
||||||
SuccessExitStatus=DATAERR CANTCREAT
|
SuccessExitStatus=DATAERR CANTCREAT
|
||||||
ImportCredential=tmpfiles.*
|
ImportCredential=tmpfiles.*
|
||||||
ImportCredential=login.motd
|
ImportCredential=login.motd
|
||||||
|
Loading…
Reference in New Issue
Block a user