mirror of
https://github.com/systemd/systemd.git
synced 2024-11-23 02:03:37 +08:00
Add $SYSTEMD_IN_CHROOT to override chroot detection
When running unprivileged, checking /proc/1/root doesn't work because it requires privileges. Instead, let's add an environment variable so the process that chroot's can tell (systemd) subprocesses whether they're running in a chroot or not.
This commit is contained in:
parent
f689f57c1e
commit
2701c2f67d
@ -23,17 +23,17 @@ All tools:
|
||||
* `$SYSTEMD_OFFLINE=[0|1]` — if set to `1`, then `systemctl` will refrain from
|
||||
talking to PID 1; this has the same effect as the historical detection of
|
||||
`chroot()`. Setting this variable to `0` instead has a similar effect as
|
||||
`$SYSTEMD_IGNORE_CHROOT=1`; i.e. tools will try to communicate with PID 1
|
||||
`$SYSTEMD_IN_CHROOT=0`; i.e. tools will try to communicate with PID 1
|
||||
even if a `chroot()` environment is detected. You almost certainly want to
|
||||
set this to `1` if you maintain a package build system or similar and are
|
||||
trying to use a modern container system and not plain `chroot()`.
|
||||
|
||||
* `$SYSTEMD_IGNORE_CHROOT=1` — if set, don't check whether being invoked in a
|
||||
`chroot()` environment. This is particularly relevant for systemctl, as it
|
||||
will not alter its behaviour for `chroot()` environments if set. Normally it
|
||||
refrains from talking to PID 1 in such a case; turning most operations such
|
||||
as `start` into no-ops. If that's what's explicitly desired, you might
|
||||
consider setting `$SYSTEMD_OFFLINE=1`.
|
||||
* `$SYSTEMD_IN_CHROOT=0|1` — takes a boolean. If set, overrides chroot detection.
|
||||
This is particularly relevant for systemctl, as it will not alter its behaviour
|
||||
for `chroot()` environments if `SYSTEMD_IN_CHROOT=0`. Normally it refrains from
|
||||
talking to PID 1 in such a case; turning most operations such as `start` into
|
||||
no-ops. If that's what's explicitly desired, you might consider setting
|
||||
`$SYSTEMD_OFFLINE=1`.
|
||||
|
||||
* `$SYSTEMD_FIRST_BOOT=0|1` — if set, assume "first boot" condition to be false
|
||||
or true, instead of checking the flag file created by PID 1.
|
||||
|
@ -896,6 +896,13 @@ int running_in_chroot(void) {
|
||||
* mount /proc, so all other programs can assume that if /proc is *not* available, we're in some
|
||||
* chroot. */
|
||||
|
||||
r = getenv_bool("SYSTEMD_IN_CHROOT");
|
||||
if (r >= 0)
|
||||
return r > 0;
|
||||
if (r != -ENXIO)
|
||||
log_debug_errno(r, "Failed to parse $SYSTEMD_IN_CHROOT, ignoring: %m");
|
||||
|
||||
/* Deprecated but kept for backwards compatibility. */
|
||||
if (getenv_bool("SYSTEMD_IGNORE_CHROOT") > 0)
|
||||
return 0;
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
set -ex
|
||||
|
||||
# Silence warning from running_in_chroot_or_offline()
|
||||
export SYSTEMD_IGNORE_CHROOT=1
|
||||
export SYSTEMD_IN_CHROOT=0
|
||||
|
||||
systemctl=${1:-systemctl}
|
||||
systemd_id128=${2:-systemd-id128}
|
||||
|
7
test/units/TEST-74-AUX-UTILS.detect-virt.sh
Executable file
7
test/units/TEST-74-AUX-UTILS.detect-virt.sh
Executable file
@ -0,0 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
# SPDX-License-Identifier: LGPL-2.1-or-later
|
||||
set -eux
|
||||
set -o pipefail
|
||||
|
||||
SYSTEMD_IN_CHROOT=1 systemd-detect-virt --chroot
|
||||
(! SYSTEMD_IN_CHROOT=0 systemd-detect-virt --chroot)
|
Loading…
Reference in New Issue
Block a user