From 93718e18551bb20ddf75544b6f0853cb26451f4a Mon Sep 17 00:00:00 2001 From: "Josh.5" Date: Fri, 29 Sep 2023 21:26:17 +1300 Subject: [PATCH] Update to how we choose if we are running udevd or dumb-udev This fixes some issues I found with startup. --- overlay/etc/cont-init.d/30-configure_udev.sh | 78 +++++++++----------- overlay/etc/supervisor.d/dumb-udev.ini | 15 ---- overlay/usr/bin/common-functions.sh | 3 +- overlay/usr/bin/start-dumb-udev.sh | 10 +-- overlay/usr/bin/start-udev.sh | 9 --- 5 files changed, 39 insertions(+), 76 deletions(-) delete mode 100644 overlay/etc/supervisor.d/dumb-udev.ini diff --git a/overlay/etc/cont-init.d/30-configure_udev.sh b/overlay/etc/cont-init.d/30-configure_udev.sh index 68459fc..7e189f5 100644 --- a/overlay/etc/cont-init.d/30-configure_udev.sh +++ b/overlay/etc/cont-init.d/30-configure_udev.sh @@ -9,50 +9,44 @@ # Modified By: Josh.5 (jsunnex@gmail.com) ### -# Running udev only works in privileged container -# Source: https://github.com/balena-io-playground/balena-base-images/ -tmp_mount='/tmp/privileged_test' -mkdir -p "${tmp_mount}" -if mount -t devtmpfs none "${tmp_mount}" &> /dev/null; then - is_privileged=true - umount "${tmp_mount}" -else - is_privileged=false -fi -rm -rf "${tmp_mount}" - - -if [[ "${is_privileged}" == "true" ]]; then - # Since this container may also be run with CAP_SYS_ADMIN, ensure we can actually execute "udevadm trigger" - if [ ! -w /sys ]; then - # Disable supervisord script since we are not able to write to sysfs - echo "**** Disable udev - /sys is mounted RO ****"; - sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/udev.ini - elif [ ! -w /run/udev ]; then - # Disable supervisord script since we are not able to write to udev/data path - echo "**** Disable udev - /run/udev is mounted RO ****"; - sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/udev.ini - elif udevadm trigger &> /dev/null; then - echo "**** Configure container to run udev management ****"; - # Enable supervisord script - sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/udev.ini - # Configure udev permissions - if [[ -f /lib/udev/rules.d/60-steam-input.rules ]]; then - sed -i 's/MODE="0660"/MODE="0666"/' /lib/udev/rules.d/60-steam-input.rules - fi - else - # Disable supervisord script since we are not able to execute "udevadm trigger" - echo "**** Disable udev service due to privilege restrictions ****"; - sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/udev.ini - fi -else - # Disable supervisord script - echo "**** Disable udev service ****"; +# Since this container may also be run with CAP_SYS_ADMIN, ensure we can actually execute "udevadm trigger" +run_dumb_udev="false" +if [ ! -w /sys ]; then + # Disable supervisord script since we are not able to write to sysfs + echo "**** Disable udevd - /sys is mounted RO ****"; sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/udev.ini - if [ ! -d /run/udev/data ]; then - echo "**** Enable dumb-udev service ****"; - sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/dumb-udev.ini + run_dumb_udev="true" +elif [ ! -d /run/udev ]; then + # Disable supervisord script since we are not able to write to udev/data path + echo "**** Disable udevd - /run/udev does not exist ****"; + sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/udev.ini + run_dumb_udev="true" +elif [ ! -w /run/udev ]; then + # Disable supervisord script since we are not able to write to udev/data path + echo "**** Disable udevd - /run/udev is mounted RO ****"; + sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/udev.ini + run_dumb_udev="false" +elif udevadm trigger &> /dev/null; then + echo "**** Configure container to run udev management ****"; + # Enable supervisord script + sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/udev.ini + # Configure udev permissions + if [[ -f /lib/udev/rules.d/60-steam-input.rules ]]; then + sed -i 's/MODE="0660"/MODE="0666"/' /lib/udev/rules.d/60-steam-input.rules fi + run_dumb_udev="false" +else + # Disable supervisord script since we are not able to execute "udevadm trigger" + echo "**** Disable udev service due to privilege restrictions ****"; + sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/udev.ini + run_dumb_udev="true" +fi + +if [ "${run_dumb_udev}" = "true" ]; then + # Enable dumb-udev instead of udevd + echo "**** Enable dumb-udev service ****"; + sed -i 's|^command.*=.*$|command=start-dumb-udev.sh|' /etc/supervisor.d/udev.ini + sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/udev.ini fi diff --git a/overlay/etc/supervisor.d/dumb-udev.ini b/overlay/etc/supervisor.d/dumb-udev.ini deleted file mode 100644 index 6fd904e..0000000 --- a/overlay/etc/supervisor.d/dumb-udev.ini +++ /dev/null @@ -1,15 +0,0 @@ - -[program:udev] -priority=10 -autostart=false -autorestart=true -user=root -directory=/ -command=start-dumb-udev.sh -stopsignal=INT -stdout_logfile=/var/log/supervisor/dumb-udev.log -stdout_logfile_maxbytes=10MB -stdout_logfile_backups=7 -stderr_logfile=/var/log/supervisor/dumb-udev.err.log -stderr_logfile_maxbytes=10MB -stderr_logfile_backups=7 diff --git a/overlay/usr/bin/common-functions.sh b/overlay/usr/bin/common-functions.sh index 5068fd5..a0a1a51 100755 --- a/overlay/usr/bin/common-functions.sh +++ b/overlay/usr/bin/common-functions.sh @@ -28,7 +28,7 @@ wait_for_x() { wait_for_udev() { MAX=10 CT=0 - while [ ! -f /tmp/.started-udev ]; do + while [ ! -e /run/udev/control ]; do sleep 1 CT=$(( CT + 1 )) if [ "$CT" -ge "$MAX" ]; then @@ -36,6 +36,7 @@ wait_for_udev() { exit 11 fi done + sleep 5 } # Wait for dockerd to start diff --git a/overlay/usr/bin/start-dumb-udev.sh b/overlay/usr/bin/start-dumb-udev.sh index a979cdc..e21bae0 100755 --- a/overlay/usr/bin/start-dumb-udev.sh +++ b/overlay/usr/bin/start-dumb-udev.sh @@ -17,18 +17,10 @@ _term() { trap _term SIGTERM SIGINT -# CONFIGURE: -# Remove lockfile -rm -f /tmp/.started-udev - - # EXECUTE PROCESS: # Start dumb-udev -dumb-udev +dumb-udev & dumb_udev_pid=$! -# Touch lockfile -sleep 1 -touch /tmp/.started-udev # WAIT FOR CHILD PROCESS: wait "$dumb_udev_pid" diff --git a/overlay/usr/bin/start-udev.sh b/overlay/usr/bin/start-udev.sh index d79e766..1311f3c 100755 --- a/overlay/usr/bin/start-udev.sh +++ b/overlay/usr/bin/start-udev.sh @@ -16,12 +16,6 @@ _term() { } trap _term SIGTERM SIGINT - -# CONFIGURE: -# Remove lockfile -rm -f /tmp/.started-udev - - # EXECUTE PROCESS: # Start udev if command -v udevd &>/dev/null; then @@ -32,9 +26,6 @@ fi # Monitor kernel uevents udevadm monitor & monitor_pid=$! -# Touch lockfile -sleep 1 -touch /tmp/.started-udev # Wait for 10 seconds, then request device events from the kernel sleep 10 udevadm trigger