From: Sven Eden Date: Thu, 29 Jun 2017 09:14:20 +0000 (+0200) Subject: Prep v231.3: Add --with-cgroup-controller=name to configure X-Git-Tag: v231.3~4 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=daa9b80cd2a7d07c174ba5ee952bb6a995131260 Prep v231.3: Add --with-cgroup-controller=name to configure This option can be used, if elogind is built while a different cgroup controller than planned is active. A valid scenario could be a gentoo user switching from systemd to openrc+elogind. --- diff --git a/README b/README index 3d323cfb6..dabcacb6f 100644 --- a/README +++ b/README @@ -116,6 +116,32 @@ flag. The PAM module is called pam_elogind.so, not pam_systemd.so. +Elogind and the running cgroup controller +----------------------------------------- +While 'configure' runs, it will detect which controller is in place. +If no controller is in place, configure will determine, that elogind +should be its own controller, which will be a very limited one. + +This approach shoudl generally work, but if you just have no cgroup +controller in place, yet, or if you are currently switching to +another one, this approach will fail. + +In this case you can do one of the two following things: + + 1) Boot your system with the target init system and cgroup + controller, before configuring and building elogind, or + 2) Use the --with-cgroup-controller=name option. + +Example: If you plan to use openrc, but openrc has not yet booted + the machine, you can use + --with-cgroup-controller=openrc + to let elogind know that openrc will be the controller + in charge. + +However, if you set the controller at configure time to something +different than is in place, elogind will not start until that +controller is actively used as the primary controller. + License ------- diff --git a/configure.ac b/configure.ac index 563340653..2848827d0 100644 --- a/configure.ac +++ b/configure.ac @@ -111,20 +111,52 @@ fi # ------------------------------------------------------------------------------ -# Find running cgroup controller +# Let users set the cgroup controller to use, in case the target controller +# isn't currently running the show. +# Example: Gentoo Linux, user wants to switch from systemd to openrc+elogind, +# and emerges elogind before having booted the machine with openrc. +# See: https://github.com/elogind/elogind/issues/18 with_cgroupctrl= -AS_IF( [test -f /proc/self/cgroup], [ - # If the init system is a cgroup controler, it will be position 1. - # Secondary controllers, like cgmanager, do not work. - with_cgroupctrl=`grep "^1:name=" /proc/self/cgroup | cut -d ':' -f 2` - AS_IF( [test -z "$with_cgroupctrl"], [ - # Try to be our own cgroup controller - with_cgroupctrl="name=elogind" +AC_ARG_WITH([cgroup-controller], + AS_HELP_STRING([--with-cgroup-controller=name], + [Set the name of the cgroup controller to use. + Use this when the autodetection fails, or you plan to use your system with a different controller than the one in place now. + The value 'auto' (default) detects the running controller. + The values 'none' and 'elogind' will cause elogind to be its own (very limited) controller. + When elogind shall be its own controller, there *MUST NOT* be any other controller running! + Another popular controller would be 'openrc'.]), + [with_cgroupctrl=$withval], + [with_cgroupctrl=auto]) + +# ------------------------------------------------------------------------------ +# Find running cgroup controller, if none was set +AS_IF( [test "x$with_cgroupctrl" = "xauto"], [ + AS_IF([test -f /proc/self/cgroup], [ + # If the init system is a cgroup controler, it will be position 1. + # Secondary controllers, like cgmanager, do not work. + with_cgroupctrl=`grep "^1:name=" /proc/self/cgroup | \ + sed -n 's/.*=//p' | sed -e 's/:.*$//'` + AS_IF( [test -z "$with_cgroupctrl"], [ + # Try to be our own cgroup controller + with_cgroupctrl="elogind" + ]) + ], [ + # 'auto' but no cgroup fs is a problem. + with_cgroupctrl="" ]) ]) -AS_IF( [test -z "$with_cgroupctrl"], - AC_MSG_ERROR([No running cgroup controller found])) +# If the user specified 'none', switch to 'elogind'. +# 'none' is allowed, as this means "there is no controller now" +AS_IF( [test "x$with_cgroupctrl" = "xnone"], [with_cgroupctrl=elogind]) + +# If this was not possible, /proc/self/cgroup not mounted yet, and 'auto' +# chosen, error out. +AS_IF( [test -z "$with_cgroupctrl"], + AC_MSG_ERROR([No running cgroup controller found]), [ + # Otherwise add the 'name=' prefix + with_cgroupctrl="name=$with_cgroupctrl" +]) # ------------------------------------------------------------------------------ address_sanitizer_cflags=