From: Daan De Meyer Date: Wed, 14 Aug 2024 10:43:05 +0000 (+0200) Subject: Add $SYSTEMD_IN_CHROOT to override chroot detection X-Git-Tag: v256.6~49^2 X-Git-Url: http://git-history.diyao.me/?a=commitdiff_plain;h=0eec580addf980080c60ed01b34c04eb1f0bd362;p=systemd%2F.git 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. (cherry picked from commit 2701c2f67de592fe2565b084cfaec1667767dbaf) --- diff --git a/docs/ENVIRONMENT.md b/docs/ENVIRONMENT.md index c8b75ac265..6081351580 100644 --- a/docs/ENVIRONMENT.md +++ b/docs/ENVIRONMENT.md @@ -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. diff --git a/src/basic/virt.c b/src/basic/virt.c index 09703506f9..2cb3a08393 100644 --- a/src/basic/virt.c +++ b/src/basic/virt.c @@ -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; diff --git a/test/test-systemctl-enable.sh b/test/test-systemctl-enable.sh index 5615c900f4..3fc59f6f9e 100644 --- a/test/test-systemctl-enable.sh +++ b/test/test-systemctl-enable.sh @@ -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} diff --git a/test/units/TEST-74-AUX-UTILS.detect-virt.sh b/test/units/TEST-74-AUX-UTILS.detect-virt.sh new file mode 100755 index 0000000000..fe1db4d2aa --- /dev/null +++ b/test/units/TEST-74-AUX-UTILS.detect-virt.sh @@ -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)