ISAR builds need to be executed in privileged mode. Currently,
kas-container uses sudo to start the container, but this is breaks
in environments that set the "no new privileges" flag (like the
VSCode shell). This can be solved by using run0 (which is a wrapper
around systemd-run) to let the init system directly start the
privileged workload (with PAM authentication and alike).
We now add experimental support for run0 to kas-container for targets
that conceptually support this (like the podman / docker execution).
We further add this as a fallback in case sudo is not installed.
Signed-off-by: Felix Moessbauer <
felix.mo...@siemens.com>
---
This has been tested with ISAR builds in a VSCode terminal.
As the execution model of run0 is fundamentally different than the
one of sudo, surprises are expected. Hence, we add a warning, that
this mode is still experimental.
Happy testing!
Felix
kas-container | 35 ++++++++++++++++++++++++++++++++---
1 file changed, 32 insertions(+), 3 deletions(-)
diff --git a/kas-container b/kas-container
index e8735884d..c46323238 100755
--- a/kas-container
+++ b/kas-container
@@ -64,7 +64,8 @@ usage()
printf "%b" "menu\t\t\tProvide configuration menu and trigger " \
"configured build.\n"
printf "%b" "\nOptional arguments:\n"
- printf "%b" "--isar\t\t\tUse kas-isar container to build Isar image.\n"
+ printf "%b" "--isar\t\t\tUse kas-isar container to build Isar image. To force\n"
+ printf "%b" " \t\t\tthe use of run0 over sudo, set KAS_SUDO_CMD=run0.\n"
printf "%b" "--with-loop-dev Pass a loop device to the " \
"container. Only required if\n"
printf "%b" "\t\t\tloop-mounting is used by recipes.\n"
@@ -117,6 +118,29 @@ trace()
"$@"
}
+prepare_sudo_cmd()
+{
+ if [ -z "${KAS_SUDO_CMD}" ]; then
+ # Try to auto-detect a container engine
+ if command -v sudo >/dev/null; then
+ KAS_SUDO_CMD="sudo"
+ elif command -v run0 >/dev/null; then
+ KAS_SUDO_CMD="run0"
+ else
+ fatal_error "No privileged executor found, need sudo or run0."
+ fi
+ fi
+
+ if [ "${KAS_SUDO_CMD}" = "sudo" ]; then
+ _KAS_SUDO_CMD="sudo --preserve-env"
+ elif [ "${KAS_SUDO_CMD}" = "run0" ]; then
+ _KAS_SUDO_CMD="run0 --background= --unit=kas-container@$$"
+ warning "Running under run0 is experimental"
+ else
+ fatal_error "Unsupported KAS_SUDO_CMD ('${KAS_SUDO_CMD}'), use sudo or run0."
+ fi
+}
+
enable_isar_mode()
{
if [ -n "${ISAR_MODE}" ]; then
@@ -127,16 +151,17 @@ enable_isar_mode()
KAS_CONTAINER_IMAGE_NAME_DEFAULT="kas-isar"
KAS_ISAR_ARGS="--privileged"
+ prepare_sudo_cmd
if [ "${KAS_CONTAINER_ENGINE}" = "podman" ]; then
# sudo is needed for a privileged podman container
- KAS_CONTAINER_COMMAND="sudo --preserve-env ${KAS_CONTAINER_COMMAND}"
+ KAS_CONTAINER_COMMAND="${_KAS_SUDO_CMD} ${KAS_CONTAINER_COMMAND}"
# preserved user PATH may lack sbin needed by privileged podman
export PATH="${PATH}:/usr/sbin"
elif [ "${KAS_DOCKER_ROOTLESS}" = "1" ]; then
export DOCKER_HOST="${DOCKER_HOST:-unix:///var/run/docker.sock}"
debug "kas-isar does not support rootless docker. Using system docker"
# force use of well-known system docker socket
- KAS_CONTAINER_COMMAND="sudo --preserve-env ${KAS_CONTAINER_COMMAND}"
+ KAS_CONTAINER_COMMAND="${_KAS_SUDO_CMD} ${KAS_CONTAINER_COMMAND}"
KAS_DOCKER_ROOTLESS=0
fi
}
@@ -339,6 +364,10 @@ while [ $# -gt 0 ]; do
if [ "$(id -u)" -eq 0 ]; then
fatal_error "loop device not available!"
fi
+ prepare_sudo_cmd
+ if [ "$KAS_SUDO_CMD" != "sudo" ]; then
+ fatal_error "--with-loop-dev requires sudo for device setup."
+ fi
sudo_command="/sbin/losetup -f"
sudo_message="[sudo] enter password to setup loop"
sudo_message="$sudo_message devices by calling"
--
2.50.0