Browse Source

version: 3.2.0.0

 This version uses the latest skarnet.org packages. It also changes the
default service startup timeout to infinite, and it adds support for
more unprivileged environments.

Signed-off-by: Laurent Bercot <[email protected]>
Laurent Bercot 1 year ago
parent
commit
e2738d136b

+ 12 - 0
CHANGELOG.md

@@ -6,6 +6,18 @@ Please view the git log to see all the minor changes made to the code. This docu
 
 
 ## Major changes
 ## Major changes
 
 
+### Version 3.2.0.0
+
+* There is no default global timeout for starting services anymore. Previously,
+if the services took more than 5 seconds to be brought up, they would
+fail; the intent was to detect hanged containers (waiting on a dysfunctional
+network connection, for instance) and make them fail early, but it has
+proven to create more problems than it was solving - so the timeout has
+been removed. If you need it, you can, as before, use the `S6_CMD_WAIT_FOR_SERVICES_MAXTIME`
+variable.
+* More unprivileged configurations are supported: you should now be
+able to use s6-overlay in containers created by Kubernetes, for instance.
+
 ### Version 3.1.0.0
 ### Version 3.1.0.0
 
 
 * `/etc/s6-overlay/config/global_path` isn't provided or taken into
 * `/etc/s6-overlay/config/global_path` isn't provided or taken into

+ 1 - 1
COPYING

@@ -1,7 +1,7 @@
 Internet Systems Consortium license
 Internet Systems Consortium license
 ===================================
 ===================================
 
 
-Copyright (c) 2021-2023 Laurent Bercot <[email protected]>, John Regan <[email protected]>
+Copyright (c) 2021-2024 Laurent Bercot <[email protected]>, John Regan <[email protected]>
 
 
 Permission to use, copy, modify, and distribute this software for any
 Permission to use, copy, modify, and distribute this software for any
 purpose with or without fee is hereby granted, provided that the above
 purpose with or without fee is hereby granted, provided that the above

+ 9 - 7
README.md

@@ -42,7 +42,7 @@ Build the following Dockerfile and try it out:
 ```
 ```
 # Use your favorite image
 # Use your favorite image
 FROM ubuntu
 FROM ubuntu
-ARG S6_OVERLAY_VERSION=3.1.6.2
+ARG S6_OVERLAY_VERSION=3.2.0.0
 
 
 RUN apt-get update && apt-get install -y nginx xz-utils
 RUN apt-get update && apt-get install -y nginx xz-utils
 RUN echo "daemon off;" >> /etc/nginx/nginx.conf
 RUN echo "daemon off;" >> /etc/nginx/nginx.conf
@@ -873,11 +873,13 @@ starting the `user2` bundle and the CMD, if any of these is defined. If
 will wait until the services in `/etc/services.d` are *ready* before proceeding
 will wait until the services in `/etc/services.d` are *ready* before proceeding
 with the rest of the sequence. Note that this is only significant if the services in `/etc/services.d`
 with the rest of the sequence. Note that this is only significant if the services in `/etc/services.d`
 [notify their readiness](https://skarnet.org/software/s6/notifywhenup.html) to s6.
 [notify their readiness](https://skarnet.org/software/s6/notifywhenup.html) to s6.
-* `S6_CMD_WAIT_FOR_SERVICES_MAXTIME` (default = 5000): The maximum time (in milliseconds) the services could take to bring up before proceding to CMD executing.
-Note that this value also includes the time setting up legacy container initialization (`/etc/cont-init.d`) and services (`/etc/services.d`),
-and that it is taken into account even if you are not running a CMD. In other words: no matter whether you're running a CMD or not,
-if you have scripts in `/etc/cont-init.d` that take a long time to run, you should set this variable to either 0, or a value high
-enough so that your scripts have time to finish without s6-overlay interrupting them and diagnosing an error.
+* `S6_CMD_WAIT_FOR_SERVICES_MAXTIME` (default = 0, i.e. infinite): The maximum time (in milliseconds) the services could take to bring up before proceding to CMD executing.
+Set this variable to a positive value if you have services that can potentially block indefinitely and you prefer the container to fail
+if not everything is up after a given time.
+Note that this value also includes the time setting up legacy container initialization (`/etc/cont-init.d`) and services (`/etc/services.d`), so
+take that into account when computing a suitable value. In versions of s6-overlay up to 3.1.6.2, the default was 5000 (five seconds),
+but it caused more unwanted container failures than it solved issues, so now there's no timeout by default: s6-overlay will wait as long as
+is necessary for all the services to be brought up.
 * `S6_READ_ONLY_ROOT` (default = 0): When running in a container whose root filesystem is read-only, set this env to **1** to inform init stage 2 that it should copy user-provided initialization scripts from `/etc` to `/run/s6/etc` before it attempts to change permissions, etc. See [Read-Only Root Filesystem](#read-only-root-filesystem) for more information.
 * `S6_READ_ONLY_ROOT` (default = 0): When running in a container whose root filesystem is read-only, set this env to **1** to inform init stage 2 that it should copy user-provided initialization scripts from `/etc` to `/run/s6/etc` before it attempts to change permissions, etc. See [Read-Only Root Filesystem](#read-only-root-filesystem) for more information.
 * `S6_SYNC_DISKS` (default = 0): Set this env to **1** to inform init stage 3 that it should attempt to sync filesystems before stopping the container. Note: this will likely sync all filesystems on the host.
 * `S6_SYNC_DISKS` (default = 0): Set this env to **1** to inform init stage 3 that it should attempt to sync filesystems before stopping the container. Note: this will likely sync all filesystems on the host.
 * `S6_STAGE2_HOOK` (default = none): If this variable exists, its contents
 * `S6_STAGE2_HOOK` (default = none): If this variable exists, its contents
@@ -956,7 +958,7 @@ RUN cd /tmp && sha256sum -c *.sha256
 
 
 ### `USER` directive
 ### `USER` directive
 
 
-As of version 3.1.6.2, s6-overlay has limited support for running as a user other than `root`:
+As of version 3.2.0.0, s6-overlay has limited support for running as a user other than `root`:
 
 
 * Tools like `fix-attrs` and `logutil-service` are unlikely to work (they rely
 * Tools like `fix-attrs` and `logutil-service` are unlikely to work (they rely
   on being able to change UIDs).
   on being able to change UIDs).

+ 2 - 2
conf/defaults.mk

@@ -3,7 +3,7 @@
 # e.g.: make SHEBANGDIR=/usr/bin VERSION=3.1.6.0
 # e.g.: make SHEBANGDIR=/usr/bin VERSION=3.1.6.0
 
 
 # The version of the software being built.
 # The version of the software being built.
-VERSION := 3.1.6.2
+VERSION := 3.2.0.0
 
 
 # Where stuff is going to be built. Change for out-of-tree builds.
 # Where stuff is going to be built. Change for out-of-tree builds.
 OUTPUT := output
 OUTPUT := output
@@ -21,7 +21,7 @@ TOOLCHAIN_PATH :=
 
 
 # When fetching one from the web, what version we want.
 # When fetching one from the web, what version we want.
 # Only a few versions are available, don't change blindly.
 # Only a few versions are available, don't change blindly.
-TOOLCHAIN_VERSION := 13.2.0
+TOOLCHAIN_VERSION := 14.1.0
 
 
 # For fetching toolchains: the download command.
 # For fetching toolchains: the download command.
 # Change to curl -O if you don't have wget.
 # Change to curl -O if you don't have wget.

+ 17 - 17
conf/versions

@@ -6,32 +6,32 @@
 BEARSSL_VERSION=79c060eea3eea1257797f15ea1608a9a9923aa6f
 BEARSSL_VERSION=79c060eea3eea1257797f15ea1608a9a9923aa6f
 # BEARSSL_VERSION=v0.6
 # BEARSSL_VERSION=v0.6
 
 
-# SKALIBS_VERSION=c0e625ea5d47d32110dae6b1cf7671060e5c47bf
-SKALIBS_VERSION=v2.14.0.1
+# SKALIBS_VERSION=4dcf9fa0521a1c4243c28fb2f657d8029317e55e
+SKALIBS_VERSION=v2.14.2.0
 
 
-# EXECLINE_VERSION=813a7ae859c0563f87c2afef79d346b853c20e36
-EXECLINE_VERSION=v2.9.4.0
+# EXECLINE_VERSION=9983edf33b1eb4d91bf1187f8e4b7c0c3d288e53
+EXECLINE_VERSION=v2.9.6.0
 
 
-# S6_VERSION=8d032b7ff814b08aba0b23c03cdd589eae98d22a
-S6_VERSION=v2.12.0.2
+# S6_VERSION=9778ca30e4415698dbb1f736cf5fe132a7cec04d
+S6_VERSION=v2.13.0.0
 
 
-# S6_RC_VERSION=940e4bb20f7927a54c9ee92bcea1c54f8b60666d
-S6_RC_VERSION=v0.5.4.2
+# S6_RC_VERSION=f3a8a60eb872096084c98ccaabf65656df349998
+S6_RC_VERSION=v0.5.4.3
 
 
-# S6_LINUX_INIT_VERSION=421ff132dee36124fd6fe4eaaffe3576179c3812
+# S6_LINUX_INIT_VERSION=28787fc0512f8df17809c1a0507da2bfed552082
 S6_LINUX_INIT_VERSION=v1.1.2.0
 S6_LINUX_INIT_VERSION=v1.1.2.0
 
 
-# S6_PORTABLE_UTILS_VERSION=aed143be3f5deace8e7b57ed48151fc17265cd9b
+# S6_PORTABLE_UTILS_VERSION=00ad09ecf7ad44e32c3cc54819bbf50e944fd4f9
 S6_PORTABLE_UTILS_VERSION=v2.3.0.3
 S6_PORTABLE_UTILS_VERSION=v2.3.0.3
 
 
-# S6_LINUX_UTILS_VERSION=d492e79229d1f5f96c5c618cbd5504ffb32e2d72
+# S6_LINUX_UTILS_VERSION=4ac235b523cd1b50bd681e31c8241a2b8bdd3060
 S6_LINUX_UTILS_VERSION=v2.6.2.0
 S6_LINUX_UTILS_VERSION=v2.6.2.0
 
 
-# S6_DNS_VERSION=20d8277451d8fd7cbce316b80a0018bc2639335d
-S6_DNS_VERSION=v2.3.7.0
+# S6_DNS_VERSION=33e4b9d9137b5dbb02a087956f1558ef30647aea
+S6_DNS_VERSION=v2.3.7.2
 
 
-# S6_NETWORKING_VERSION=8fe924c3da6ab919f512029a15464e77cbeede8a
-S6_NETWORKING_VERSION=v2.7.0.0
+# S6_NETWORKING_VERSION=42cb4c7b043964874caea0268b6c814e68a6e7a5
+S6_NETWORKING_VERSION=v2.7.0.3
 
 
-# S6_OVERLAY_HELPERS_VERSION=b23f96cbfabf23f686f71de826a482c272dd3645
-S6_OVERLAY_HELPERS_VERSION=v0.1.0.2
+# S6_OVERLAY_HELPERS_VERSION=a6281ad45dd43f4e8ddb6818a9b0513e391e64bb
+S6_OVERLAY_HELPERS_VERSION=v0.1.1.0

+ 1 - 1
layout/rootfs-overlay/package/admin/s6-overlay-@VERSION@/etc/s6-linux-init/skel/rc.init

@@ -41,7 +41,7 @@ s6-rc-compile -v"$cv" /run/s6/db "$etc/s6-overlay/s6-rc.d" /package/admin/s6-ove
 s6-rc-init -c /run/s6/db /run/service
 s6-rc-init -c /run/s6/db /run/service
 
 
 if timeout=`printcontenv S6_CMD_WAIT_FOR_SERVICES_MAXTIME` && eltest "$timeout" =~ '^[[:digit:]]+$' ; then : ; else
 if timeout=`printcontenv S6_CMD_WAIT_FOR_SERVICES_MAXTIME` && eltest "$timeout" =~ '^[[:digit:]]+$' ; then : ; else
-  timeout=5000
+  timeout=0
 fi
 fi
 
 
 set +e
 set +e

+ 37 - 5
layout/rootfs-overlay/package/admin/s6-overlay-@VERSION@/libexec/preinit

@@ -2,9 +2,19 @@
 
 
 # This script is spawned by s6-overlay-suexec, as the
 # This script is spawned by s6-overlay-suexec, as the
 # first thing in the userland boot process.
 # first thing in the userland boot process.
-# It is run as root even with a USER directive present.
-# If USER, then UID and GID hold the uid and gid of the user
-# (this is used by s6-chown -U).
+# It is normally run as root, but some configurations want to
+# run completely unprivileged and s6-overlay-suexec is denied
+# suid, in which case preinit will be unprivileged as well.
+
+# The point of preinit is to sanity check the system to make
+# sure s6-linux-init can run in a safe configuration. If we
+# are root, or if the system has been correctly prepared by the
+# container manager for a privilegeless execution, we can fix
+# any issue we encounter. Otherwise, we just report the problem
+# and abort execution.
+
+# The UID, USER, EUID, GID, GROUP and EGID variables are set for
+# us by s6-overlay-suexec, so we can check every possible case.
 
 
 prog=/package/admin/s6-overlay/libexec/preinit
 prog=/package/admin/s6-overlay/libexec/preinit
 
 
@@ -59,8 +69,30 @@ is likely to crash soon, if /run is (incorrectly) mounted noexec." 1>&2
 else
 else
   s6-mkdir -p -m 0755 /run
   s6-mkdir -p -m 0755 /run
 fi
 fi
-if test "0$UID" -ne 0 ; then
-  s6-chown -U -- /run
+
+eval `s6-overlay-stat /run`
+
+if test "0$S6_VERBOSITY" -gt 1 ; then
+  echo "$prog: info: container permissions: uid=$UID ($USER), euid=$EUID, gid=$GID ($GROUP), egid=$EGID"
+  echo "$prog: info: /run permissions: uid=$uid ($user), gid=$gid ($group), perms=$perms"
+fi
+
+if test "$UID" -ne "$uid" ; then  # /run does not belong to the container user
+  if test "$EUID" -eq 0 ; then
+    echo "$prog: info: /run belongs to uid $uid instead of $UID - fixing it"
+    s6-chown -U -- /run
+    s6-chmod 0755 /run
+  elif test "$GID" -eq 0 && test "$gid" -eq 0 ; then  # Unprivileged Kubernetes Environment
+    if echo "$perms" | s6-grep -qF gxgwgr && echo "$perms" | s6-grep -qvF ow ; then
+      echo "$prog: info: using /run with gid 0"
+    else
+      echo "$prog: fatal: wrong permissions on /run for a gid 0 setup" 
+      exit 100
+    fi
+  else
+    echo "$prog: fatal: /run belongs to uid $uid instead of $UID and we're lacking the privileges to fix it."
+    exit 100
+  fi
 fi
 fi
 
 
 # Ensure /var/run is a symlink to /run
 # Ensure /var/run is a symlink to /run

+ 1 - 1
layout/rootfs-overlay/package/admin/s6-overlay-@VERSION@/libexec/stage0

@@ -1,7 +1,7 @@
 #!/bin/sh -e
 #!/bin/sh -e
 
 
 # This script is run as pid 1 after preinit has exited.
 # This script is run as pid 1 after preinit has exited.
-# It doesn't need privileges: it will run with or without USER.
+# It doesn't need privileges: it should run in all configurations.
 # It invokes s6-linux-init-maker with options depending on run-time
 # It invokes s6-linux-init-maker with options depending on run-time
 # control variables, then execs into the init script created by
 # control variables, then execs into the init script created by
 # s6-linux-init-maker, which is stage 1.
 # s6-linux-init-maker, which is stage 1.